From b9c55ff11c030f7670b4e756a681a49ecdafed55 Mon Sep 17 00:00:00 2001
From: Jacek Antonelli
Date: Tue, 3 Aug 2010 02:04:04 -0500
Subject: Use the correct setting name for LightShare.
---
linden/indra/newview/lightshare.cpp | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/lightshare.cpp b/linden/indra/newview/lightshare.cpp
index b422236..78d27b5 100644
--- a/linden/indra/newview/lightshare.cpp
+++ b/linden/indra/newview/lightshare.cpp
@@ -101,7 +101,7 @@ WindlightMessage::~WindlightMessage()
// static
void WindlightMessage::processWindlight(LLMessageSystem* msg, void**)
{
- if( gSavedSettings.getU32("UseLightShare") <= LIGHTSHARE_NEVER )
+ if( gSavedSettings.getU32("LightShareAllowed") <= LIGHTSHARE_NEVER )
return;
WindlightMessage* wl = new WindlightMessage(msg);
@@ -114,7 +114,7 @@ void WindlightMessage::processWindlight(LLMessageSystem* msg, void**)
// If they are using region settings already, or LightShare is
// always allowed, just apply the new settings, don't bother asking.
- if( gSavedSettings.getU32("UseLightShare") == LIGHTSHARE_ALWAYS ||
+ if( gSavedSettings.getU32("LightShareAllowed") == LIGHTSHARE_ALWAYS ||
(sky == sSkyPresetName && water == sWaterPresetName) )
{
wl->apply();
@@ -138,7 +138,7 @@ void WindlightMessage::processWindlight(LLMessageSystem* msg, void**)
return;
}
- if( gSavedSettings.getU32("UseLightShare") == LIGHTSHARE_ASK &&
+ if( gSavedSettings.getU32("LightShareAllowed") == LIGHTSHARE_ASK &&
sMostRecent == NULL )
{
// No most recent, so store this and create notification
--
cgit v1.1
From a8378eec3801b524b5f90ce4f00af1c8bdca6cd1 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Tue, 3 Aug 2010 09:56:02 -0700
Subject: Avatar sounds now don't disable when from a region above current
maturity
---
linden/indra/newview/llviewermessage.cpp | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llviewermessage.cpp b/linden/indra/newview/llviewermessage.cpp
index bc1aedb..140b517 100644
--- a/linden/indra/newview/llviewermessage.cpp
+++ b/linden/indra/newview/llviewermessage.cpp
@@ -3931,8 +3931,10 @@ void process_sound_trigger(LLMessageSystem *msg, void **)
msg->getF32Fast(_PREHASH_SoundData, _PREHASH_Gain, gain);
//If we have sounds muted, don't even try to load or trigger the sound.
- if(gSavedSettings.getBOOL("MuteSounds") || gain == 0.0)
+ if (gSavedSettings.getBOOL("MuteSounds") || gain == 0.0)
+ {
return;
+ }
// adjust sound location to true global coords
LLVector3d pos_global = from_region_handle(region_handle);
@@ -3940,9 +3942,6 @@ void process_sound_trigger(LLMessageSystem *msg, void **)
pos_global.mdV[VY] += pos_local.mV[VY];
pos_global.mdV[VZ] += pos_local.mV[VZ];
- // Don't play sounds if sound settings are muted.
- if (gSavedSettings.getBOOL("MuteSounds")) return;
-
// Don't play a trigger sound if you can't hear it due
// to parcel "local audio only" settings.
if (!LLViewerParcelMgr::getInstance()->canHearSound(pos_global)) return;
@@ -3961,10 +3960,11 @@ void process_sound_trigger(LLMessageSystem *msg, void **)
}
// Don't play sounds from a region with maturity above current agent maturity
- if( !gAgent.canAccessMaturityInRegion( region_handle ) )
+ // Actually, let's -- MC
+ /*if( !gAgent.canAccessMaturityInRegion( region_handle ) )
{
return;
- }
+ }*/
gAudiop->triggerSound(sound_id, owner_id, gain, LLAudioEngine::AUDIO_TYPE_SFX, pos_global);
}
--
cgit v1.1
From 9336f3666cdb3269d143d151a113d583c4cfab9c Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Tue, 3 Aug 2010 11:48:16 -0700
Subject: Scratching an ooooold itch: added 'Gestures' slider and mute button
to the audio controls
---
linden/indra/llaudio/audioengine.h | 3 ++-
linden/indra/newview/app_settings/settings.xml | 22 +++++++++++++++++++++
linden/indra/newview/llvieweraudio.cpp | 2 ++
linden/indra/newview/llviewercontrol.cpp | 2 ++
linden/indra/newview/llviewermessage.cpp | 23 ++++++++++++++++++----
.../skins/default/xui/en-us/panel_audio.xml | 8 ++++++++
.../xui/en-us/panel_media_remote_expanded.xml | 4 ++--
.../default/xui/en-us/panel_preferences_audio.xml | 8 ++++----
8 files changed, 61 insertions(+), 11 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/llaudio/audioengine.h b/linden/indra/llaudio/audioengine.h
index e990eb7..e46091c 100644
--- a/linden/indra/llaudio/audioengine.h
+++ b/linden/indra/llaudio/audioengine.h
@@ -93,7 +93,8 @@ public:
AUDIO_TYPE_SFX = 1,
AUDIO_TYPE_UI = 2,
AUDIO_TYPE_AMBIENT = 3,
- AUDIO_TYPE_COUNT = 4 // last
+ AUDIO_TYPE_GESTURE = 4,
+ AUDIO_TYPE_COUNT = 5 // last
};
LLAudioEngine();
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index aae182c..d71cf09 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -15,6 +15,17 @@
Value
0
+ AudioLevelGestures
+
AutoCloseOOC
+ MuteGestures
+
MuteWind
ToolboxAutoMove
--
cgit v1.1
From 9bda54ca1d94fe136d2edd1198ca4ee3c9bc01fb Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Tue, 17 Aug 2010 19:55:57 -0700
Subject: Commented out SLVoiceAgent.app from viewer_manifest.py since it's no
longer used
---
linden/indra/newview/viewer_manifest.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/viewer_manifest.py b/linden/indra/newview/viewer_manifest.py
index ace6173..b3dbbcd 100755
--- a/linden/indra/newview/viewer_manifest.py
+++ b/linden/indra/newview/viewer_manifest.py
@@ -691,7 +691,7 @@ class DarwinManifest(ViewerManifest):
self.path("vivox-runtime/universal-darwin/libortp.dylib", "libortp.dylib")
self.path("vivox-runtime/universal-darwin/libvivoxsdk.dylib", "libvivoxsdk.dylib")
self.path("vivox-runtime/universal-darwin/SLVoice", "SLVoice")
- self.path("vivox-runtime/universal-darwin/SLVoiceAgent.app", "SLVoiceAgent.app")
+ #self.path("vivox-runtime/universal-darwin/SLVoiceAgent.app", "SLVoiceAgent.app")
#libfmodwrapper.dylib
#self.path(self.args['configuration'] + "/libfmodwrapper.dylib", "libfmodwrapper.dylib")
--
cgit v1.1
From bb50881577649baab3349d90d4495c816bba1478 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Tue, 17 Aug 2010 23:07:58 -0700
Subject: Increased the size of the script editor font to 9
---
linden/indra/newview/skins/default/xui/en-us/fonts.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/fonts.xml b/linden/indra/newview/skins/default/xui/en-us/fonts.xml
index f9c5926..a450bb6 100644
--- a/linden/indra/newview/skins/default/xui/en-us/fonts.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/fonts.xml
@@ -86,7 +86,7 @@
Type
Boolean
Value
- 1
+ 0
PersistShowLookAt
--
cgit v1.1
From 9302b9658ee8a2bc8547d5131faed42b6efa5575 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Thu, 19 Aug 2010 10:54:12 -0700
Subject: Applied RLVa-1.0.5e_fix.patch by Kitty Barnett to fix RLVa up to
1.0.5.e
---
linden/indra/newview/CMakeLists.txt | 4 +-
linden/indra/newview/llagent.cpp | 21 +--
linden/indra/newview/llappviewer.cpp | 6 +
linden/indra/newview/llchatbar.cpp | 10 +-
linden/indra/newview/llfirstuse.cpp | 41 ++++-
linden/indra/newview/llfirstuse.h | 2 +-
linden/indra/newview/llfloaterabout.cpp | 2 +-
linden/indra/newview/llfloateravatarpicker.cpp | 24 +++
linden/indra/newview/llfloaterchat.cpp | 5 +-
linden/indra/newview/llfloatermap.cpp | 22 ++-
linden/indra/newview/llfloatermap.h | 4 +-
linden/indra/newview/llfloaterobjectiminfo.cpp | 33 +++-
linden/indra/newview/llhudeffectlookat.cpp | 3 +
linden/indra/newview/llinventorybridge.cpp | 45 +++--
linden/indra/newview/llnetmap.cpp | 57 +++----
linden/indra/newview/llnotify.cpp | 2 +-
linden/indra/newview/llpanelavatar.cpp | 2 +-
linden/indra/newview/llpanelcontents.cpp | 18 ++
linden/indra/newview/llpanelgeneral.cpp | 1 +
linden/indra/newview/llpanelinventory.cpp | 4 +-
linden/indra/newview/llpanellogin.cpp | 10 +-
linden/indra/newview/llpanelobject.cpp | 4 +-
linden/indra/newview/llpanelpermissions.cpp | 13 +-
linden/indra/newview/llselectmgr.cpp | 12 +-
linden/indra/newview/llstartup.cpp | 11 +-
linden/indra/newview/lltoolbar.cpp | 14 ++
linden/indra/newview/lltoolpie.cpp | 28 ++--
linden/indra/newview/lltoolplacer.cpp | 2 +-
linden/indra/newview/llviewercontrol.cpp | 28 ++--
linden/indra/newview/llviewermenu.cpp | 42 ++---
linden/indra/newview/llviewermessage.cpp | 185 ++++++++++++++++++---
linden/indra/newview/llviewerobject.cpp | 2 +-
linden/indra/newview/llviewertexteditor.cpp | 2 +-
linden/indra/newview/llvoavatar.cpp | 41 +++--
linden/indra/newview/llworldmapview.cpp | 11 +-
linden/indra/newview/panelradar.cpp | 11 +-
linden/indra/newview/rlvdefines.h | 4 +-
linden/indra/newview/rlvextensions.cpp | 2 +-
linden/indra/newview/rlvhandler.cpp | 25 ++-
linden/indra/newview/rlvhelper.cpp | 7 -
.../skins/default/xui/en-us/notifications.xml | 48 ++++++
41 files changed, 573 insertions(+), 235 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/CMakeLists.txt b/linden/indra/newview/CMakeLists.txt
index e0a35cb..a7b78f1 100644
--- a/linden/indra/newview/CMakeLists.txt
+++ b/linden/indra/newview/CMakeLists.txt
@@ -909,8 +909,6 @@ set(viewer_HEADER_FILES
pipeline.h
primbackup.h
randgauss.h
- VertexCache.h
- VorbisFramework.h
rlvdefines.h
rlvevent.h
rlvhandler.h
@@ -918,6 +916,8 @@ set(viewer_HEADER_FILES
rlvmultistringsearch.h
rlvextensions.h
rlvfloaterbehaviour.h
+ VertexCache.h
+ VorbisFramework.h
viewertime.h
viewerversion.h
)
diff --git a/linden/indra/newview/llagent.cpp b/linden/indra/newview/llagent.cpp
index ef05fae..38e1c0f 100644
--- a/linden/indra/newview/llagent.cpp
+++ b/linden/indra/newview/llagent.cpp
@@ -4307,16 +4307,14 @@ void LLAgent::changeCameraToCustomizeAvatar(BOOL avatar_animate, BOOL camera_ani
return;
}
+// if(gSavedSettings.getBOOL("AppearanceAnimate"))
// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
- if(gSavedSettings.getBOOL("AppearanceAnimate"))
- if ( (gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) && (mAvatarObject.notNull()) && (mAvatarObject->mIsSitting) )
- {
- return;
- }
+ if ( (gSavedSettings.getBOOL("AppearanceAnimate")) &&
+ ((!gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) || ((mAvatarObject.notNull()) && (!mAvatarObject->mIsSitting))) )
// [/RLVa:KB]
-
- if(gSavedSettings.getBOOL("AppearanceAnimate"))
+ {
setControlFlags(AGENT_CONTROL_STAND_UP); // force stand up
+ }
gViewerWindow->getWindow()->resetBusyCount();
if (gFaceEditToolset)
@@ -6285,8 +6283,7 @@ void LLAgent::setTeleportState(ETeleportState state)
// We're outa here. Save "back" slurl.
mTeleportSourceSLURL = getSLURL();
}
-
-// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-07 (RLVa-1.0.0d) | Added: RLVa-0.2.0b
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-07 (RLVa-1.0.0d) | Added: RLVa-0.2.0b
if ( (rlv_handler_t::isEnabled()) && (TELEPORT_NONE == mTeleportState) )
{
gRlvHandler.setCanCancelTp(true);
@@ -7473,7 +7470,7 @@ void LLAgent::removeWearable( EWearableType type )
return;
}
-// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-07 (RLVa-1.0.0d)
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-07 (RLVa-1.0.0d)
if ( (rlv_handler_t::isEnabled()) && (!gRlvHandler.isRemovable(type)) )
{
return;
@@ -7616,9 +7613,9 @@ void LLAgent::setWearableOutfit(
wearables_to_remove[WT_UNDERSHIRT] = (!gAgent.isTeen()) && remove && gRlvHandler.isRemovable(WT_UNDERSHIRT);
wearables_to_remove[WT_UNDERPANTS] = (!gAgent.isTeen()) && remove && gRlvHandler.isRemovable(WT_UNDERPANTS);
wearables_to_remove[WT_SKIRT] = remove && gRlvHandler.isRemovable(WT_SKIRT);
+ wearables_to_remove[WT_ALPHA] = remove && gRlvHandler.isRemovable(WT_ALPHA);
+ wearables_to_remove[WT_TATTOO] = remove && gRlvHandler.isRemovable(WT_TATTOO);
// [/RLVa:KB]
- wearables_to_remove[WT_ALPHA] = remove;
- wearables_to_remove[WT_TATTOO] = remove;
S32 count = wearables.count();
llassert( items.count() == count );
diff --git a/linden/indra/newview/llappviewer.cpp b/linden/indra/newview/llappviewer.cpp
index f1cd447..d757ba6 100644
--- a/linden/indra/newview/llappviewer.cpp
+++ b/linden/indra/newview/llappviewer.cpp
@@ -1826,6 +1826,12 @@ bool LLAppViewer::initConfiguration()
LLFirstUse::addConfigVariable("FirstMedia");
LLFirstUse::addConfigVariable("FirstLoginScreen");
+// [RLVa:KB] - Checked: RLVa-1.0.3a (2009-09-10) | Added: RLVa-1.0.3a
+ //LLFirstUse::addConfigVariable(RLV_SETTING_FIRSTUSE_DETACH);
+ //LLFirstUse::addConfigVariable(RLV_SETTING_FIRSTUSE_ENABLEWEAR);
+ //LLFirstUse::addConfigVariable(RLV_SETTING_FIRSTUSE_FARTOUCH);
+// [/RLVa:KB]
+
// - read command line settings.
LLControlGroupCLP clp;
std::string cmd_line_config = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,
diff --git a/linden/indra/newview/llchatbar.cpp b/linden/indra/newview/llchatbar.cpp
index 5a7586e..3c977dd 100644
--- a/linden/indra/newview/llchatbar.cpp
+++ b/linden/indra/newview/llchatbar.cpp
@@ -558,16 +558,16 @@ void LLChatBar::onInputEditorKeystroke( LLLineEditor* caller, void* userdata )
S32 length = raw_text.length();
- //if( (length > 0) && (raw_text[0] != '/') ) // forward slash is used for escape (eg. emote) sequences
-// [RLVa:KB] - Checked: 2009-07-07 (RLVa-1.0.0d)
- if ( (length > 0) && (raw_text[0] != '/') && (!gRlvHandler.hasBehaviour(RLV_BHVR_REDIRCHAT)) )
-// [/RLVa:KB]
+ if( (length > 0) && (raw_text[0] != '/') ) // forward slash is used for escape (eg. emote) sequences
{
if (self->mChanCtrlEnabled && (S32)(self->mChannelControl->get()) != 0)
{
gAgent.stopTyping();
}
- else
+// else
+// [RLVa:KB] - Checked: 2009-07-07 (RLVa-1.0.0d)
+ else if (!gRlvHandler.hasBehaviour(RLV_BHVR_REDIRCHAT))
+// [/RLVa:KB]
{
gAgent.startTyping();
}
diff --git a/linden/indra/newview/llfirstuse.cpp b/linden/indra/newview/llfirstuse.cpp
index c0f07e5..886bb94 100644
--- a/linden/indra/newview/llfirstuse.cpp
+++ b/linden/indra/newview/llfirstuse.cpp
@@ -49,10 +49,6 @@
#include "floatergriddefault.h"
#include "hippoGridManager.h"
-// [RLVa:KB] - Version: 1.22.11
-#include "llviewerwindow.h"
-// [/RLVa:KB]
-
// static
std::set LLFirstUse::sConfigVariables;
@@ -310,6 +306,43 @@ void LLFirstUse::useMedia()
}
}
+// [RLVa:KB] - Version: 1.23.4 | Checked: RLVa-1.0.3a (2009-09-10) | Added: RLVa-1.0.3a
+
+bool rlvHasVisibleFirstUseNotification()
+{
+ LLNotificationChannelPtr activeNotifications = LLNotifications::instance().getChannel("Notifications");
+ for (LLNotificationChannel::Iterator itNotif = activeNotifications->begin(); itNotif != activeNotifications->end(); itNotif++)
+ if ((*itNotif)->getName().find(RLV_SETTING_FIRSTUSE_PREFIX) == 0)
+ return true;
+ return false;
+}
+
+void LLFirstUse::showRlvFirstUseNotification(const std::string& strName)
+{
+ if ( (gSavedSettings.getWarning(strName)) && (!rlvHasVisibleFirstUseNotification()) )
+ {
+ gSavedSettings.setWarning(strName, FALSE);
+ LLNotifications::instance().add(strName);
+ }
+}
+
+void LLFirstUse::warnRlvGiveToRLV()
+{
+ if ( (gSavedSettings.getWarning(RLV_SETTING_FIRSTUSE_GIVETORLV)) && (RlvSettings::getForbidGiveToRLV()) )
+ LLNotifications::instance().add(RLV_SETTING_FIRSTUSE_GIVETORLV, LLSD(), LLSD(), &LLFirstUse::onRlvGiveToRLVConfirmation);
+}
+
+void LLFirstUse::onRlvGiveToRLVConfirmation(const LLSD& notification, const LLSD& response)
+{
+ gSavedSettings.setWarning(RLV_SETTING_FIRSTUSE_GIVETORLV, FALSE);
+
+ S32 idxOption = LLNotification::getSelectedOption(notification, response);
+ if ( (0 == idxOption) || (1 == idxOption) )
+ gSavedSettings.setBOOL(RLV_SETTING_FORBIDGIVETORLV, (idxOption == 1));
+}
+
+// [/RLVa:KB]
+
void LLFirstUse::callbackClientTags(const LLSD& notification, const LLSD& response)
{
gSavedSettings.setWarning("ClientTags", FALSE);
diff --git a/linden/indra/newview/llfirstuse.h b/linden/indra/newview/llfirstuse.h
index bd44ece..c77f0b2 100644
--- a/linden/indra/newview/llfirstuse.h
+++ b/linden/indra/newview/llfirstuse.h
@@ -129,7 +129,7 @@ public:
static void warnRlvGiveToRLV();
protected:
- static void onRlvGiveToRLVConfirmation(S32 idxOption, void* pUserParam);
+ static void onRlvGiveToRLVConfirmation(const LLSD& notification, const LLSD& response);
// [/RLVa:KB]
};
diff --git a/linden/indra/newview/llfloaterabout.cpp b/linden/indra/newview/llfloaterabout.cpp
index 7e6c43f..1945df4 100644
--- a/linden/indra/newview/llfloaterabout.cpp
+++ b/linden/indra/newview/llfloaterabout.cpp
@@ -141,7 +141,7 @@ LLFloaterAbout::LLFloaterAbout()
// Position
LLViewerRegion* region = gAgent.getRegion();
-// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-04 (RLVa-1.0.0a)
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-04 (RLVa-1.0.0a)
if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
{
support.append(rlv_handler_t::cstrHidden);
diff --git a/linden/indra/newview/llfloateravatarpicker.cpp b/linden/indra/newview/llfloateravatarpicker.cpp
index c5a6a37..4eca8af 100644
--- a/linden/indra/newview/llfloateravatarpicker.cpp
+++ b/linden/indra/newview/llfloateravatarpicker.cpp
@@ -351,6 +351,30 @@ void LLFloaterAvatarPicker::populateNearMe()
void LLFloaterAvatarPicker::draw()
{
LLFloater::draw();
+
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-1.0.0e
+ // TODO-RLVa: this code needs revisiting
+ if (rlv_handler_t::isEnabled())
+ {
+ LLPanel* pNearMePanel = getChild("NearMePanel");
+ if ( (pNearMePanel) && (childGetVisibleTab("ResidentChooserTabs") == pNearMePanel) )
+ {
+ if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
+ {
+ if (mNearMeListComplete)
+ {
+ getChild("NearMe")->deleteAllItems();
+ childSetEnabled("Select", false);
+ }
+ mNearMeListComplete = FALSE;
+ pNearMePanel->setCtrlsEnabled(FALSE);
+ return;
+ }
+ pNearMePanel->setCtrlsEnabled(TRUE);
+ }
+ }
+// [/RLVa:KB]
+
if (!mNearMeListComplete && childGetVisibleTab("ResidentChooserTabs") == getChild("NearMePanel"))
{
populateNearMe();
diff --git a/linden/indra/newview/llfloaterchat.cpp b/linden/indra/newview/llfloaterchat.cpp
index 7613e36..b14930b 100644
--- a/linden/indra/newview/llfloaterchat.cpp
+++ b/linden/indra/newview/llfloaterchat.cpp
@@ -208,10 +208,11 @@ void add_timestamped_line(LLViewerTextEditor* edit, LLChat chat, const LLColor4&
// extract out the sender name and replace it with the hotlinked name.
if (chat.mSourceType == CHAT_SOURCE_AGENT &&
chat.mFromID != LLUUID::null &&
+// chat.mFromID != gAgent.getID())
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e)
chat.mFromID != gAgent.getID() &&
-// [RLVa] - Version: 1.22.11 | Checked: 2009-07-08 (RLVa-1.0.0e)
(!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) )
-// [/RLVa]
+// [/RLVa:KB]
{
chat.mURL = llformat("secondlife:///app/agent/%s/about",chat.mFromID.asString().c_str());
}
diff --git a/linden/indra/newview/llfloatermap.cpp b/linden/indra/newview/llfloatermap.cpp
index bfbc8bb..b56fb5f 100644
--- a/linden/indra/newview/llfloatermap.cpp
+++ b/linden/indra/newview/llfloatermap.cpp
@@ -154,18 +154,6 @@ void LLFloaterMap::draw()
}
}
-// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-05 (RLVa-1.0.0c)
-void LLFloaterMap::open()
-{
- if (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWMINIMAP))
- {
- LLFloater::open();
- LLFirstUse::useMiniMap();
- }
-}
-// [/RLVa:KB]
-
-
PanelRadar* LLFloaterMap::getRadar()
{
return mPanelRadar;
@@ -263,3 +251,13 @@ void LLFloaterMap::adjustLayout( bool expand )
toggle->setRect( temp_rect );
}
}
+
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-05 (RLVa-1.0.0c)
+void LLFloaterMap::open()
+{
+ if (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWMINIMAP))
+ {
+ LLFloater::open();
+ }
+}
+// [/RLVa:KB]
diff --git a/linden/indra/newview/llfloatermap.h b/linden/indra/newview/llfloatermap.h
index 5b0497f..6f7281e 100644
--- a/linden/indra/newview/llfloatermap.h
+++ b/linden/indra/newview/llfloatermap.h
@@ -55,8 +55,8 @@ public:
/*virtual*/ void onOpen();
/*virtual*/ void onClose(bool app_quitting);
/*virtual*/ BOOL canClose();
-// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-05 (RLVa-1.0.0c)
- /*virtual*/ void open();
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-05 (RLVa-1.0.0c)
+ /*virtual*/ void open();
// [/RLVa:KB]
PanelRadar* getRadar();
diff --git a/linden/indra/newview/llfloaterobjectiminfo.cpp b/linden/indra/newview/llfloaterobjectiminfo.cpp
index 7ef3af2..fa7964c 100644
--- a/linden/indra/newview/llfloaterobjectiminfo.cpp
+++ b/linden/indra/newview/llfloaterobjectiminfo.cpp
@@ -47,6 +47,10 @@
#include "llurldispatcher.h"
#include "llviewercontrol.h"
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-04 (RLVa-1.0.0a) | Added: RLVa-0.2.0g
+#include "rlvhandler.h"
+// [/RLVa:KB]
+
////////////////////////////////////////////////////////////////////////////
// LLFloaterObjectIMInfo
class LLFloaterObjectIMInfo : public LLFloater, public LLFloaterSingleton
@@ -100,7 +104,10 @@ void LLFloaterObjectIMInfo::update(const LLUUID& object_id, const std::string& n
{
// When talking to an old region we won't have a slurl.
// The object id isn't really the object id either but we don't use it so who cares.
- bool have_slurl = !slurl.empty();
+ //bool have_slurl = !slurl.empty();
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-04 (RLVa-1.0.0a) | Added: RLVa-0.2.0g
+ bool have_slurl = (!slurl.empty()) && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC));
+// [/RLVa:KB]
childSetVisible("Unknown_Slurl",!have_slurl);
childSetVisible("Slurl",have_slurl);
@@ -108,7 +115,10 @@ void LLFloaterObjectIMInfo::update(const LLUUID& object_id, const std::string& n
childSetText("Slurl",slurl);
childSetText("OwnerName",std::string(""));
- bool my_object = (owner_id == gAgentID);
+// bool my_object = (owner_id == gAgentID);
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-0.2.0g
+ bool my_object = (owner_id == gAgentID) || ((gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (gRlvHandler.isAgentNearby(owner_id)));
+// [/RLVa:KB]
childSetEnabled("Mute",!my_object);
mObjectID = object_id;
@@ -139,7 +149,10 @@ void LLFloaterObjectIMInfo::onClickOwner(void* data)
{
LLFloaterGroupInfo::showFromUUID(self->mOwnerID);
}
- else
+// else
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-0.2.0g
+ else if ( (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) || (!gRlvHandler.isAgentNearby(self->mOwnerID)) )
+// [/RLVa:KB]
{
LLFloaterAvatarInfo::showFromObject(self->mOwnerID);
}
@@ -151,6 +164,13 @@ void LLFloaterObjectIMInfo::onClickMute(void* data)
LLFloaterObjectIMInfo* self = (LLFloaterObjectIMInfo*)data;
LLMute::EType mute_type = (self->mOwnerIsGroup) ? LLMute::GROUP : LLMute::AGENT;
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-0.2.0g
+ if ( (LLMute::GROUP != mute_type) && (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (gRlvHandler.isAgentNearby(self->mOwnerID)) )
+ {
+ return;
+ }
+// [/RLVa:KB]
+
LLMute mute(self->mOwnerID, self->mOwnerName, mute_type);
LLMuteList::getInstance()->add(mute);
LLFloaterMute::showInstance();
@@ -167,6 +187,13 @@ void LLFloaterObjectIMInfo::nameCallback(const LLUUID& id, const std::string& fi
self->mOwnerName += " " + last;
}
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-0.2.0g
+ if ( (!is_group) && (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (gRlvHandler.isAgentNearby(id)) )
+ {
+ self->mOwnerName = gRlvHandler.getAnonym(self->mOwnerName);
+ }
+// [/RLVa:KB]
+
self->childSetText("OwnerName",self->mOwnerName);
}
diff --git a/linden/indra/newview/llhudeffectlookat.cpp b/linden/indra/newview/llhudeffectlookat.cpp
index a997910..561fce5 100644
--- a/linden/indra/newview/llhudeffectlookat.cpp
+++ b/linden/indra/newview/llhudeffectlookat.cpp
@@ -41,6 +41,7 @@
#include "llagent.h"
#include "llvoavatar.h"
#include "lldrawable.h"
+#include "llviewercontrol.h"
#include "llviewerobjectlist.h"
#include "llviewerwindow.h"
#include "llrendersphere.h"
@@ -593,11 +594,13 @@ void LLHUDEffectLookAt::render()
LLColor4 Color = LLColor4( (*mAttentions)[mTargetType].mColor, 1.0f );
std::string text = ((LLVOAvatar*)(LLViewerObject*)mSourceObject)->getFullname();
+// [RLVa:KB] - Imprudence-1.3.0
// Show anonyms in place of actual names when @shownames=n restricted
if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
{
text = gRlvHandler.getAnonym(text);
}
+// [/RLVa:KB]
gViewerWindow->setupViewport();
hud_render_utf8text(text, render_pos, *fontp, LLFontGL::NORMAL, -0.5f * fontp->getWidthF32(text), 3.f, Color, FALSE );
diff --git a/linden/indra/newview/llinventorybridge.cpp b/linden/indra/newview/llinventorybridge.cpp
index fe56ae0..41af123 100644
--- a/linden/indra/newview/llinventorybridge.cpp
+++ b/linden/indra/newview/llinventorybridge.cpp
@@ -3463,10 +3463,32 @@ void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attach
if (attachment && attachment->getObject())
{
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-10-10 (RLVa-1.0.5a) | Modified: RLVa-1.0.5a
+ if ( (rlv_handler_t::isEnabled()) && // Can't replace an existing object if it's undetachable
+ (gRlvHandler.isLockedAttachment(attach_pt, RLV_LOCK_ANY)) ) // or if we're not allowed to attach to that attach point
+ {
+ return;
+ }
+// [/RLVa:KB]
LLNotifications::instance().add("ReplaceAttachment", LLSD(), payload, confirm_replace_attachment_rez);
}
else
{
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-10-10 (RLVa-1.0.5) | Modified: RLVa-1.0.5
+ if ( (rlv_handler_t::isEnabled()) && (gRlvHandler.hasLockedAttachment(RLV_LOCK_ANY)) )
+ {
+ if (0 == attach_pt) // Can't wear on the default attachment point
+ {
+ if (!RlvSettings::getEnableWear()) // (unless "Enable Wear" is enabled)
+ return;
+ gRlvHandler.onWearAttachment(item->getUUID());
+ }
+ else if (gRlvHandler.isLockedAttachment(attach_pt, RLV_LOCK_ADD)) // and we can never wear on a non-attachable attach point
+ {
+ return;
+ }
+ }
+// [/RLVa:KB]
LLNotifications::instance().forceResponse(LLNotification::Params("ReplaceAttachment").payload(payload), 0/*YES*/);
}
}
@@ -3553,7 +3575,7 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
items.push_back(std::string("RestoreToWorld Separator"));
items.push_back(std::string("Restore to Last Position"));
-// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-10-10 (RLVa-1.0.5a) | Modified: RLVa-1.0.5a
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-10-10 (RLVa-1.0.5a) | Modified: RLVa-1.0.5a
if ( (rlv_handler_t::isEnabled()) && (!RlvSettings::getEnableWear()) && (gRlvHandler.hasLockedAttachment(RLV_LOCK_ANY)) )
{
LLViewerJointAttachment* pAttachPt = gRlvHandler.getAttachPoint(item, true); // The item's name should specify
@@ -4113,7 +4135,7 @@ void wear_inventory_category_on_avatar_step2( BOOL proceed, void* userdata )
is_gesture);
S32 gest_count = gest_item_array.count();
-// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-10-10 (RLVa-1.0.5a) | Modified: RLVa-1.0.5a
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-10-10 (RLVa-1.0.5a) | Modified: RLVa-1.0.5a
if ( (rlv_handler_t::isEnabled()) && (gRlvHandler.hasLockedAttachment(RLV_LOCK_ANY)) )
{
// Filter anything that we shouldn't be attaching
@@ -4395,10 +4417,11 @@ void wear_attachments_on_avatar(const LLInventoryModel::item_array_t& items, BOO
msg->addU8Fast(_PREHASH_TotalObjects, count );
// msg->addBOOLFast(_PREHASH_FirstDetachAll, remove );
// [RLVa:KB] - Checked: 2009-10-10 (RLVa-1.0.5a) | Added: RLVa-1.0.5a
- // This really should just *always* be FALSE since TRUE can result in loss of the current asset state
- msg->addBOOLFast(_PREHASH_FirstDetachAll, remove && (!gRlvHandler.hasLockedAttachment(RLV_LOCK_ANY)) );
+ // This really should just *always* be FALSE since TRUE can result in loss of the current asset state
+ msg->addBOOLFast(_PREHASH_FirstDetachAll,
+ (remove) && (!gRlvHandler.hasLockedAttachment(RLV_LOCK_ANY)) );
// [/RLVa:KB]
- }
+ }
LLInventoryItem* item = items.get(i);
msg->nextBlockFast(_PREHASH_ObjectData );
@@ -4406,10 +4429,10 @@ void wear_attachments_on_avatar(const LLInventoryModel::item_array_t& items, BOO
msg->addUUIDFast(_PREHASH_OwnerID, item->getPermissions().getOwner());
// msg->addU8Fast(_PREHASH_AttachmentPt, 0 ); // Wear at the previous or default attachment point
// [RLVa:KB] - Checked: 2009-10-10 (RLVa-1.0.5a) | Added: RLVa-1.0.5a
- msg->addU8Fast(_PREHASH_AttachmentPt,
- ( (!rlv_handler_t::isEnabled()) || (RlvSettings::getEnableWear()) || (!gRlvHandler.hasLockedAttachment(RLV_LOCK_ANY)) )
- ? 0
- : gRlvHandler.getAttachPointIndex(gRlvHandler.getAttachPoint(item, true)));
+ msg->addU8Fast(_PREHASH_AttachmentPt,
+ ( (!rlv_handler_t::isEnabled()) || (RlvSettings::getEnableWear()) || (!gRlvHandler.hasLockedAttachment(RLV_LOCK_ANY)) )
+ ? 0
+ : gRlvHandler.getAttachPointIndex(gRlvHandler.getAttachPoint(item, true)));
// [/RLVa:KB]
pack_permissions_slam(msg, item->getFlags(), item->getPermissions());
msg->addStringFast(_PREHASH_Name, item->getName());
@@ -4930,11 +4953,11 @@ void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable,
{
EWearableType type = wearable->getType();
- //if( !(type==WT_SHAPE || type==WT_SKIN || type==WT_HAIR ) ) //&&
- //!((!gAgent.isTeen()) && ( type==WT_UNDERPANTS || type==WT_UNDERSHIRT )) )
+// if( !(type==WT_SHAPE || type==WT_SKIN || type==WT_HAIR ) ) //&&
// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-0.2.2a | SL big fix
if( !(type==WT_SHAPE || type==WT_SKIN || type==WT_HAIR || type==WT_EYES) )
// [/RLVa:KB]
+ //!((!gAgent.isTeen()) && ( type==WT_UNDERPANTS || type==WT_UNDERSHIRT )) )
{
gAgent.removeWearable( type );
}
diff --git a/linden/indra/newview/llnetmap.cpp b/linden/indra/newview/llnetmap.cpp
index 2b9810d..ec04337 100644
--- a/linden/indra/newview/llnetmap.cpp
+++ b/linden/indra/newview/llnetmap.cpp
@@ -370,7 +370,14 @@ void LLNetMap::draw()
else
{
// Show them muted even if they're friends
- if (LLMuteList::getInstance()->isMuted(avatar_ids[i]))
+// [RLVa:KB] - Version: 1.23.4 | Alternate: Imprudence-1.3 | Checked: 2009-07-08 (RLVa-1.0.0e) | Modified: RLVa-0.2.0b
+ if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
+ {
+ glyph_color = avatar_color;
+ }
+ else if (LLMuteList::getInstance()->isMuted(avatar_ids[i]))
+// [/RLVa:KB]
+// if (LLMuteList::getInstance()->isMuted(avatar_ids[i]))
{
glyph_color = muted_color;
}
@@ -388,15 +395,6 @@ void LLNetMap::draw()
}
}
-// [RLVa:KB] - Alternate: Imprudence-1.2.0
- if ( gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES) )
- {
- // User is not allowed to see who it is, or even if it's a friend,
- // due to RLV settings.
- glyph_color = avatar_color;
- }
-// [/RLVa:KB]
-
LLWorldMapView::drawAvatar(
pos_map.mV[VX], pos_map.mV[VY],
glyph_color,
@@ -624,26 +622,17 @@ BOOL LLNetMap::handleToolTip( S32 x, S32 y, std::string& msg, LLRect* sticky_rec
std::string fullname;
if(mClosestAgentToCursor.notNull() && gCacheName->getFullName(mClosestAgentToCursor, fullname))
{
-// [RLVa:KB] - Alternate: Imprudence-1.2.0
- // User is not allowed to see who it is, due to RLV settings.
+// msg.append(fullname);
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e) | Modified: RLVa-0.2.0b
msg.append( (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) ? fullname : gRlvHandler.getAnonym(fullname) );
+// [/RLVa:KB]
msg.append("\n");
- // [/RLVa:KB]
}
-// [RLVa:KB] - Alternate: Imprudence-1.2.0
- if ( gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC) )
- {
- // User is not allowed to see where they are, due to RLV settings.
- msg.append( rlv_handler_t::cstrHidden );
- }
- else
- {
- msg.append( region->getName() );
- }
+// msg.append( region->getName() );
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-04 (RLVa-1.0.0a) | Modified: RLVa-0.2.0b
+ msg.append( (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) ? region->getName() : rlv_handler_t::cstrHidden );
// [/RLVa:KB]
-
-
msg.append("\n");
gSavedSettings.getBOOL( "MiniMapTeleport" ) ?
msg.append(getString("tooltip_tp")) : msg.append(getString("tooltip_map"));
@@ -1043,24 +1032,24 @@ bool LLNetMap::LLEnableTracking::handleEvent(LLPointer event, const LLS
bool LLNetMap::LLShowAgentProfile::handleEvent(LLPointer event, const LLSD& userdata)
{
-// [RLVa:KB] - Alternate: Imprudence-1.2.0
- if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
+ LLNetMap *self = mPtr;
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e) | Modified: RLVa-0.2.0b
+ if (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
{
- return true;
+ LLFloaterAvatarInfo::show(self->mClosestAgentAtLastRightClick);
}
// [/RLVa:KB]
-
- LLNetMap *self = mPtr;
- LLFloaterAvatarInfo::show(self->mClosestAgentAtLastRightClick);
+ //LLFloaterAvatarInfo::show(self->mClosestAgentAtLastRightClick);
return true;
}
bool LLNetMap::LLEnableProfile::handleEvent(LLPointer event, const LLSD& userdata)
{
LLNetMap *self = mPtr;
- //self->findControl(userdata["control"].asString())->setValue(self->isAgentUnderCursor());
-// [RLVa:KB] - Alternate: Imprudence-1.2.0
- self->findControl(userdata["control"].asString())->setValue(self->isAgentUnderCursor() && !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES));
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e) | Modified: RLVa-0.2.0b
+ self->findControl(userdata["control"].asString())->setValue(
+ (self->isAgentUnderCursor()) && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) );
// [/RLVa:KB]
+ //self->findControl(userdata["control"].asString())->setValue(self->isAgentUnderCursor());
return true;
}
diff --git a/linden/indra/newview/llnotify.cpp b/linden/indra/newview/llnotify.cpp
index 2afd185..ef57aaf 100644
--- a/linden/indra/newview/llnotify.cpp
+++ b/linden/indra/newview/llnotify.cpp
@@ -57,7 +57,7 @@
#include "hippoGridManager.h"
-// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-10 (RLVa-1.0.0e) | Added: RLVa-0.2.0b
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-10 (RLVa-1.0.0e) | Added: RLVa-0.2.0b
#include "rlvhandler.h"
// [/RLVa:KB]
diff --git a/linden/indra/newview/llpanelavatar.cpp b/linden/indra/newview/llpanelavatar.cpp
index 1701f69..ad0f47f 100644
--- a/linden/indra/newview/llpanelavatar.cpp
+++ b/linden/indra/newview/llpanelavatar.cpp
@@ -869,7 +869,7 @@ void LLPanelAvatarClassified::processAvatarClassifiedReply(LLMessageSystem* msg,
// static
void LLPanelAvatarClassified::onClickNew(void* data)
{
-// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-04 (RLVa-1.0.0a)
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-04 (RLVa-1.0.0a)
if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
{
return;
diff --git a/linden/indra/newview/llpanelcontents.cpp b/linden/indra/newview/llpanelcontents.cpp
index 33cebec..e5c4f79 100644
--- a/linden/indra/newview/llpanelcontents.cpp
+++ b/linden/indra/newview/llpanelcontents.cpp
@@ -123,6 +123,24 @@ void LLPanelContents::getState(LLViewerObject *objectp )
&& ( objectp->permYouOwner() || ( !group_id.isNull() && gAgent.isInGroup(group_id) ))); // solves SL-23488
BOOL all_volume = LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME );
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-10-10 (RLVa-1.0.5a) | Modified: RLVa-1.0.5a
+ if ( (rlv_handler_t::isEnabled()) && (editable) )
+ {
+ // Don't allow creation of new scripts if it's undetachable
+ editable = !gRlvHandler.isLockedAttachment(objectp, RLV_LOCK_REMOVE);
+
+ // Don't allow creation of new scripts if we're @unsit=n or @sittp=n restricted and we're sitting on the selection
+ if ( (editable) && ((gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) || (gRlvHandler.hasBehaviour(RLV_BHVR_SITTP))) )
+ {
+ LLVOAvatar* pAvatar = gAgent.getAvatarObject();
+ // Only check the first (non-)root object because nothing else would result in enabling the button (see below)
+ LLViewerObject* pObj = LLSelectMgr::getInstance()->getSelection()->getFirstRootObject(TRUE);
+
+ editable = (pObj) && (pAvatar) && ((!pAvatar->mIsSitting) || (pAvatar->getRoot() != pObj->getRootEdit()));
+ }
+ }
+// [/RLVa:KB]
+
// Edit script button - ok if object is editable and there's an unambiguous destination for the object.
childSetEnabled("button new script",
editable &&
diff --git a/linden/indra/newview/llpanelgeneral.cpp b/linden/indra/newview/llpanelgeneral.cpp
index 538eb22..287ee41 100644
--- a/linden/indra/newview/llpanelgeneral.cpp
+++ b/linden/indra/newview/llpanelgeneral.cpp
@@ -44,6 +44,7 @@
#include "floatergridmanager.h"
#include "llagent.h"
+#include "llappviewer.h"
#include "llpanellogin.h"
#include "llviewerregion.h"
#include "viewertime.h"
diff --git a/linden/indra/newview/llpanelinventory.cpp b/linden/indra/newview/llpanelinventory.cpp
index f882362..85f6ea2 100644
--- a/linden/indra/newview/llpanelinventory.cpp
+++ b/linden/indra/newview/llpanelinventory.cpp
@@ -82,12 +82,12 @@
#include "llviewerwindow.h"
#include "llwearable.h"
+#include "hippoGridManager.h"
+
// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
#include "llvoavatar.h"
// [/RLVa:KB]
-#include "hippoGridManager.h"
-
///----------------------------------------------------------------------------
/// Local function declarations, constants, enums, and typedefs
///----------------------------------------------------------------------------
diff --git a/linden/indra/newview/llpanellogin.cpp b/linden/indra/newview/llpanellogin.cpp
index 460c67f..23b7785 100644
--- a/linden/indra/newview/llpanellogin.cpp
+++ b/linden/indra/newview/llpanellogin.cpp
@@ -83,7 +83,7 @@
#include "llglheaders.h"
-// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-08 (RLVa-1.0.0e)
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e)
#include "rlvhandler.h"
// [/RLVa:KB]
@@ -737,18 +737,16 @@ void LLPanelLogin::refreshLocation( bool force_visible )
if ( ! force_visible )
show_start = gSavedSettings.getBOOL("ShowStartLocation");
-
// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
-// TODO-RLVa: figure out some way to make this work with RLV_EXTENSION_STARTLOCATION
-#ifndef RLV_EXTENSION_STARTLOCATION
+ // TODO-RLVa: figure out some way to make this work with RLV_EXTENSION_STARTLOCATION
+ #ifndef RLV_EXTENSION_STARTLOCATION
if (rlv_handler_t::isEnabled())
{
show_start = FALSE;
}
-#endif // RLV_EXTENSION_STARTLOCATION
+ #endif // RLV_EXTENSION_STARTLOCATION
// [/RLVa:KB]
-
sInstance->childSetVisible("start_location_combo", show_start);
sInstance->childSetVisible("start_location_text", show_start);
diff --git a/linden/indra/newview/llpanelobject.cpp b/linden/indra/newview/llpanelobject.cpp
index a0736f1..9ef7f91 100644
--- a/linden/indra/newview/llpanelobject.cpp
+++ b/linden/indra/newview/llpanelobject.cpp
@@ -76,10 +76,12 @@
#include "lldrawpool.h"
+#include "hippoLimits.h"
+
// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
#include "llvoavatar.h"
// [/RLVa:KB]
-#include "hippoLimits.h"
+
//
// Constants
//
diff --git a/linden/indra/newview/llpanelpermissions.cpp b/linden/indra/newview/llpanelpermissions.cpp
index cd1aee7..a97d177 100644
--- a/linden/indra/newview/llpanelpermissions.cpp
+++ b/linden/indra/newview/llpanelpermissions.cpp
@@ -354,10 +354,7 @@ void LLPanelPermissions::refresh()
fRlvEnableOwner && owners_identical && (mOwnerID.notNull() || LLSelectMgr::getInstance()->selectIsGroupOwned()));
// [/RLVa:KB]
- //if (owner_name != last_owner_name)
-// [RLVa:KB]
- if ( (owner_name != last_owner_name) && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) )
-// [/RLVa:KB]
+ if (owner_name != last_owner_name)
{
childSetEnabled("Last Owner:", TRUE);
childSetText("Last Owner Name", last_owner_name);
@@ -903,7 +900,13 @@ void LLPanelPermissions::onClickLastOwner(void *data)
if ( self->mLastOwnerID.notNull() )
{
- LLFloaterAvatarInfo::showFromObject(self->mLastOwnerID);
+// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
+ if (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
+ {
+ LLFloaterAvatarInfo::showFromObject(self->mLastOwnerID);
+ }
+// [/RLVa:KB]
+// LLFloaterAvatarInfo::showFromObject(self->mLastOwnerID);
}
}
diff --git a/linden/indra/newview/llselectmgr.cpp b/linden/indra/newview/llselectmgr.cpp
index 8064245..83abcf4 100644
--- a/linden/indra/newview/llselectmgr.cpp
+++ b/linden/indra/newview/llselectmgr.cpp
@@ -3439,12 +3439,20 @@ void LLSelectMgr::deselectAllIfTooFar()
}
LLVector3d selectionCenter = getSelectionCenterGlobal();
- if (gSavedSettings.getBOOL("LimitSelectDistance")
+
+// if (gSavedSettings.getBOOL("LimitSelectDistance")
+// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0f
+ BOOL fRlvFartouch = gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH) && gFloaterTools->getVisible();
+ if ( (gSavedSettings.getBOOL("LimitSelectDistance") || (fRlvFartouch) )
+// [/RLVa:KB]
&& (!mSelectedObjects->getPrimaryObject() || !mSelectedObjects->getPrimaryObject()->isAvatar())
&& !mSelectedObjects->isAttachment()
&& !selectionCenter.isExactlyZero())
{
- F32 deselect_dist = gSavedSettings.getF32("MaxSelectDistance");
+// F32 deselect_dist = gSavedSettings.getF32("MaxSelectDistance");
+// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0f
+ F32 deselect_dist = (!fRlvFartouch) ? gSavedSettings.getF32("MaxSelectDistance") : 1.5f;
+// [/RLVa:KB]
F32 deselect_dist_sq = deselect_dist * deselect_dist;
LLVector3d select_delta = gAgent.getPositionGlobal() - selectionCenter;
diff --git a/linden/indra/newview/llstartup.cpp b/linden/indra/newview/llstartup.cpp
index cec2c4b..b12c253 100644
--- a/linden/indra/newview/llstartup.cpp
+++ b/linden/indra/newview/llstartup.cpp
@@ -399,7 +399,7 @@ bool idle_startup()
// Initialize stuff that doesn't need data from simulators
//
-// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.1d
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.1d
if ( (gSavedSettings.controlExists(RLV_SETTING_MAIN)) && (gSavedSettings.getBOOL(RLV_SETTING_MAIN)) )
rlv_handler_t::setEnabled(TRUE);
// [/RLVa:KB]
@@ -2757,11 +2757,6 @@ bool idle_startup()
// reset keyboard focus to sane state of pointing at world
gFocusMgr.setKeyboardFocus(NULL);
-#if 0 // sjb: enable for auto-enabling timer display
- gDebugView->mFastTimerView->setVisible(TRUE);
-#endif
-
-
// [RLVa:KB] - Alternate: Snowglobe-1.0 | Checked: 2009-08-05 (RLVa-1.0.1e) | Modified: RLVa-1.0.1e
// RELEASE-RLVa: this should go in LLAppViewer::handleLoginComplete() but Imprudence doesn't call that function
gRlvHandler.initLookupTables();
@@ -2779,6 +2774,10 @@ bool idle_startup()
}
// [/RLVa:KB]
+#if 0 // sjb: enable for auto-enabling timer display
+ gDebugView->mFastTimerView->setVisible(TRUE);
+#endif
+
return TRUE;
}
diff --git a/linden/indra/newview/lltoolbar.cpp b/linden/indra/newview/lltoolbar.cpp
index cc6d4b8..645d29a 100644
--- a/linden/indra/newview/lltoolbar.cpp
+++ b/linden/indra/newview/lltoolbar.cpp
@@ -303,6 +303,20 @@ void LLToolBar::refresh()
}
gSavedSettings.setBOOL("BuildBtnState", build_mode);
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-10 (RLVa-1.0.0g)
+ // Called per-frame so this really can't be slow
+ if (rlv_handler_t::isEnabled())
+ {
+ // If we're rez-restricted, we can still edit => allow build floater
+ // If we're edit-restricted, we can still rez => allow build floater
+ childSetEnabled("build_btn", !(gRlvHandler.hasBehaviour(RLV_BHVR_REZ) && gRlvHandler.hasBehaviour(RLV_BHVR_EDIT)) );
+
+ childSetEnabled("map_btn", !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWWORLDMAP) );
+ childSetEnabled("radar_btn", !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWMINIMAP) );
+ childSetEnabled("inventory_btn", !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWINV) );
+ }
+// [/RLVa:KB]
+
if (isInVisibleChain())
{
updateCommunicateList();
diff --git a/linden/indra/newview/lltoolpie.cpp b/linden/indra/newview/lltoolpie.cpp
index c2be831..262c349 100644
--- a/linden/indra/newview/lltoolpie.cpp
+++ b/linden/indra/newview/lltoolpie.cpp
@@ -373,22 +373,22 @@ BOOL LLToolPie::pickAndShowMenu(BOOL always_show)
//gMutePieMenu->setLabel("Mute");
}
+// gPieAvatar->show(x, y, mPieMouseButtonDown);
// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Added: RLVa-0.2.0f
-#ifdef RLV_EXPERIMENTAL_FARTOUCH_FEEDBACK
- // If we have an empty selection under @fartouch=n don't show the pie menu but play the "operation block" sound
- if ( (!gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH)) || (!LLSelectMgr::getInstance()->getSelection()->isEmpty()) )
- {
-#endif // RLV_EXPERIMENTAL_FARTOUCH_FEEDBACK
- gPieAvatar->show(x, y, mPieMouseButtonDown);
-#ifdef RLV_EXPERIMENTAL_FARTOUCH_FEEDBACK
- }
- else
- {
- make_ui_sound("UISndInvalidOp");
- }
-#endif // RLV_EXPERIMENTAL_FARTOUCH_FEEDBACK
+ #ifdef RLV_EXPERIMENTAL_FARTOUCH_FEEDBACK
+ // If we have an empty selection under @fartouch=n don't show the pie menu but play the "operation block" sound
+ if ( (!gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH)) || (!LLSelectMgr::getInstance()->getSelection()->isEmpty()) )
+ {
+ #endif // RLV_EXPERIMENTAL_FARTOUCH_FEEDBACK
+ gPieAvatar->show(x, y, mPieMouseButtonDown);
+ #ifdef RLV_EXPERIMENTAL_FARTOUCH_FEEDBACK
+ }
+ else
+ {
+ make_ui_sound("UISndInvalidOp");
+ }
+ #endif // RLV_EXPERIMENTAL_FARTOUCH_FEEDBACK
// [/RLVa:KB]
-
}
else if (object->isAttachment() && !object->isHUDAttachment())
{
diff --git a/linden/indra/newview/lltoolplacer.cpp b/linden/indra/newview/lltoolplacer.cpp
index ba065b1..d5c4de1 100644
--- a/linden/indra/newview/lltoolplacer.cpp
+++ b/linden/indra/newview/lltoolplacer.cpp
@@ -288,7 +288,7 @@ BOOL LLToolPlacer::addObject( LLPCode pcode, S32 x, S32 y, U8 use_physics )
gMessageSystem->addU8Fast(_PREHASH_Material, material);
U32 flags = 0; // not selected
- //if (create_selected)
+// if (create_selected)
// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0b) | Added: RLVa-1.0.0b
if ( (create_selected) && (!gRlvHandler.hasBehaviour(RLV_BHVR_EDIT)) )
// [/RLVa:KB]
diff --git a/linden/indra/newview/llviewercontrol.cpp b/linden/indra/newview/llviewercontrol.cpp
index 0edb2c4..e1507d4 100644
--- a/linden/indra/newview/llviewercontrol.cpp
+++ b/linden/indra/newview/llviewercontrol.cpp
@@ -485,20 +485,6 @@ bool handleVoiceClientPrefsChanged(const LLSD& newvalue)
return true;
}
-// [RLVa:KB] - Checked: 2009-08-11 (RLVa-1.0.1h) | Added: RLVa-1.0.1h
-bool rlvHandleEnableLegacyNamingChanged(const LLSD& newvalue)
-{
- rlv_handler_t::fLegacyNaming = newvalue.asBoolean();
- return true;
-}
-
-bool rlvHandleShowNameTagsChanged(const LLSD& newvalue)
-{
- RlvSettings::fShowNameTags = newvalue.asBoolean();
- return true;
-}
-// [/RLVa:KB]
-
bool handleMediaDebugLevelChanged(const LLSD& newvalue)
{
LLMediaManager *mgr = LLMediaManager::getInstance();
@@ -521,6 +507,20 @@ bool handleSliderScrollWheelMultiplierChanged(const LLSD& newvalue)
return true;
}
+// [RLVa:KB] - Checked: 2009-08-11 (RLVa-1.0.1h) | Added: RLVa-1.0.1h
+bool rlvHandleEnableLegacyNamingChanged(const LLSD& newvalue)
+{
+ rlv_handler_t::fLegacyNaming = newvalue.asBoolean();
+ return true;
+}
+
+bool rlvHandleShowNameTagsChanged(const LLSD& newvalue)
+{
+ RlvSettings::fShowNameTags = newvalue.asBoolean();
+ return true;
+}
+// [/RLVa:KB]
+
////////////////////////////////////////////////////////////////////////////
void settings_setup_listeners()
diff --git a/linden/indra/newview/llviewermenu.cpp b/linden/indra/newview/llviewermenu.cpp
index 594694d..c5ce236 100644
--- a/linden/indra/newview/llviewermenu.cpp
+++ b/linden/indra/newview/llviewermenu.cpp
@@ -1424,7 +1424,7 @@ void init_debug_baked_texture_menu(LLMenuGL* menu)
menu->createJumpKeys();
}
-// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-1.0.0g
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-1.0.0g
void init_debug_rlva_menu(LLMenuGL* menu)
{
// Debug options
@@ -1710,7 +1710,7 @@ class LLObjectEnableTouch : public view_listener_t
{
LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
bool new_value = obj && obj->flagHandleTouch();
-// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-10 (RLVa-1.0.0g) | Added: RLVa-0.2.0f
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-10 (RLVa-1.0.0g) | Added: RLVa-0.2.0f
// TODO-RLVa: this code is rather redundant since we'll never get an active selection to show a pie menu for
if ( (new_value) && (gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH)) && ((!obj->isAttachment()) || (!obj->permYouOwner())) &&
(dist_vec_squared(gAgent.getPositionAgent(), LLToolPie::getInstance()->getPick().mIntersection) > 1.5f * 1.5f) )
@@ -2525,13 +2525,6 @@ class LLObjectImportUpload : public view_listener_t
bool handle_go_to_confirm()
{
-// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
- if ( (rlv_handler_t::isEnabled()) && (gAgent.forwardGrabbed()) && (gRlvHandler.hasLockedAttachment(RLV_LOCK_REMOVE)) )
- {
- return true;
- }
-// [/RLVa:KB]
-
std::string action = gSavedSettings.getString("GoAction");
LLStringUtil::toLower(action);
@@ -2554,7 +2547,7 @@ bool handle_go_to()
{
return true;
}
- // [/RLVa:KB]
+// [/RLVa:KB]
handle_go_to_callback( LLSD(), LLSD(0) );
@@ -2672,17 +2665,14 @@ class LLAvatarFreeze : public view_listener_t
std::string fullname = avatar->getFullname();
LLSD payload;
payload["avatar_id"] = avatar->getID();
-// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-08 (RLVa-1.0.0e)
- if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (!fullname.empty()) )
- {
- fullname = gRlvHandler.getAnonym(fullname);
- }
-// [/RLVa:KB]
if (!fullname.empty())
{
LLSD args;
- args["AVATAR_NAME"] = fullname;
+// args["AVATAR_NAME"] = fullname;
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e)
+ args["AVATAR_NAME"] = (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) ? fullname : gRlvHandler.getAnonym(fullname);
+// [/RLVa:KB]
LLNotifications::instance().add("FreezeAvatarFullname",
args,
payload,
@@ -2807,7 +2797,7 @@ class LLAvatarEject : public view_listener_t
LLSD payload;
payload["avatar_id"] = avatar->getID();
std::string fullname = avatar->getFullname();
-// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-08 (RLVa-1.0.0e)
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e)
if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (!fullname.empty()) )
{
fullname = gRlvHandler.getAnonym(fullname);
@@ -4153,10 +4143,10 @@ class LLObjectReturn : public view_listener_t
bool handleEvent(LLPointer event, const LLSD& userdata)
{
if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) return true;
-// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-05 (RLVa-1.0.0b)
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-05 (RLVa-1.0.0b)
if ( (rlv_handler_t::isEnabled()) && (!rlvCanDeleteOrReturn()) ) return true;
// [/RLVa:KB]
-
+
mObjectSelection = LLSelectMgr::getInstance()->getEditSelection();
LLNotifications::instance().add("ReturnToOwner", LLSD(), LLSD(), boost::bind(&LLObjectReturn::onReturnToOwner, this, _1, _2));
@@ -4873,8 +4863,6 @@ class LLToolsEnableUnlink : public view_listener_t
}
// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0g
- // The user might not be allowed to unlink this object due to RLV settings,
- // because it would unsit them if they are sitting on the object.
if ( (new_value) && (gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) &&
(gAgent.getAvatarObject()) && (gAgent.getAvatarObject()->mIsSitting) )
{
@@ -4896,8 +4884,6 @@ class LLToolsUnlink : public view_listener_t
bool handleEvent(LLPointer event, const LLSD& userdata)
{
// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0g
- // The user might not be allowed to unlink this object due to RLV settings,
- // because it would unsit them if they are sitting on the object.
if ( (gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) && (gAgent.getAvatarObject()) && (gAgent.getAvatarObject()->mIsSitting) )
{
// Allow if the avie isn't sitting on any of the selected objects
@@ -10916,6 +10902,7 @@ class LLAdvancedCheckMaxBuildConstraints : public view_listener_t
///////////////
+// [RLVa:KB] - Alternate: Imprudence-1.2.0
class RLVaMainToggle : public view_listener_t
{
bool handleEvent(LLPointer event, const LLSD& userdata)
@@ -10935,7 +10922,7 @@ class RLVaMainCheck : public view_listener_t
return true;
}
};
-
+// [/RLVa:KB]
////////////////////
@@ -10943,6 +10930,7 @@ class RLVaMainCheck : public view_listener_t
////////////////////
+// [RLVa:KB] - Alternate: Imprudence-1.2.0
class RLVaBehaviorsShow : public view_listener_t
{
bool handleEvent(LLPointer event, const LLSD& userdata)
@@ -10951,7 +10939,7 @@ class RLVaBehaviorsShow : public view_listener_t
return true;
}
};
-
+// [/RLVa:KB]
static void addMenu(view_listener_t *menu, const char *name)
@@ -11369,8 +11357,10 @@ void initialize_menus()
addMenu(new LLAdvancedCheckMaxBuildConstraints(), "Advanced.CheckMaxBuildConstraints");
// RLVa
+// [RLVa:KB] - Alternate: Imprudence-1.2.0
addMenu(new RLVaMainToggle(), "RLVa.Main.Toggle");
addMenu(new RLVaMainCheck(), "RLVa.Main.Enabled");
addMenu(new RLVaBehaviorsShow(), "RLVa.Behaviors.Show");
+// [/RLVa:KB]
}
diff --git a/linden/indra/newview/llviewermessage.cpp b/linden/indra/newview/llviewermessage.cpp
index 7f2504c..af4b8d8 100644
--- a/linden/indra/newview/llviewermessage.cpp
+++ b/linden/indra/newview/llviewermessage.cpp
@@ -151,17 +151,17 @@
#include "llwindebug.h" // For the invalid message handler
#endif
-// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
-#include "llfloateravatarinfo.h"
-extern LLMap< const LLUUID, LLFloaterAvatarInfo* > gAvatarInfoInstances; // Only defined in llfloateravatarinfo.cpp
-// [/RLVa:KB]
-
//silly spam define D:
bool dialogSpamOn;
static LLFrameTimer d_spam;
std::map< std::string , S32 > lastd_names;
LLDynamicArray< std::string > blacklisted_names;
+// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
+#include "llfloateravatarinfo.h"
+extern LLMap< const LLUUID, LLFloaterAvatarInfo* > gAvatarInfoInstances; // Only defined in llfloateravatarinfo.cpp
+// [/RLVa:KB]
+
//
// Constants
//
@@ -1116,8 +1116,17 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
std::string first_name, last_name;
if (gCacheName->getName(mFromID, first_name, last_name))
{
- from_string = std::string("An object named '") + mFromName + "' owned by " + first_name + " " + last_name;
- chatHistory_string = mFromName + " owned by " + first_name + " " + last_name;
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e)
+ std::string full_name = first_name + " " + last_name;
+ if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (gRlvHandler.isAgentNearby(mFromID)) )
+ {
+ full_name = gRlvHandler.getAnonym(full_name);
+ }
+ from_string = std::string("An object named '") + mFromName + "' owned by " + full_name;
+ chatHistory_string = mFromName + " owned by " + full_name;
+// [/RLVa:KB]
+ //from_string = std::string("An object named '") + mFromName + "' owned by " + first_name + " " + last_name;
+ //chatHistory_string = mFromName + " owned by " + first_name + " " + last_name;
}
else
{
@@ -1136,6 +1145,21 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
switch(button)
{
case IOR_ACCEPT:
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-10 (RLVa-1.0.0g) | Added: RLVa-0.2.2a
+ // Only change the inventory offer's destination folder to the shared root if:
+ // - the user has enabled the feature
+ // - the inventory offer came from a script (and specifies a folder)
+ // - the name starts with the prefix [mDesc format (quotes are part of the string): "[OBJECTNAME] ( http://slurl.com/... )"]
+ if ( (rlv_handler_t::isEnabled()) && (!RlvSettings::getForbidGiveToRLV()) &&
+ (IM_TASK_INVENTORY_OFFERED == mIM) && (LLAssetType::AT_CATEGORY == mType) && (mDesc.find(RLV_PUTINV_PREFIX) == 1) )
+ {
+ LLViewerInventoryCategory* pRlvRoot = gRlvHandler.getSharedRoot();
+ if (pRlvRoot)
+ {
+ mFolderID = pRlvRoot->getUUID();
+ }
+ }
+// [/RLVa:KB]
// ACCEPT. The math for the dialog works, because the accept
// for inventory_offered, task_inventory_offer or
// group_notice_inventory is 1 greater than the offer integer value.
@@ -1303,7 +1327,7 @@ void inventory_offer_handler(LLOfferInfo* info, BOOL from_task)
if(indx >= 0)
{
LLStringUtil::truncate(msg, indx);
-// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-04 (RLVa-1.0.0a) | Added: RLVa-1.0.0a
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-04 (RLVa-1.0.0a) | Added: RLVa-1.0.0a
// TODO-RLVa: needs revisiting when LL saves open notifications to disk to accept them on the next relog
if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
{
@@ -1352,6 +1376,13 @@ void inventory_offer_handler(LLOfferInfo* info, BOOL from_task)
std::string first_name, last_name;
if (gCacheName->getName(info->mFromID, first_name, last_name))
{
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e)
+ if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (gRlvHandler.isAgentNearby(info->mFromID)) )
+ {
+ first_name = gRlvHandler.getAnonym(first_name.append(" ").append(last_name));
+ last_name.clear();
+ }
+// [/RLVa:KB]
args["FIRST"] = first_name;
args["LAST"] = last_name;
name_found = TRUE;
@@ -1371,6 +1402,12 @@ void inventory_offer_handler(LLOfferInfo* info, BOOL from_task)
}
else
{
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e)
+ if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (gRlvHandler.isAgentNearby(info->mFromID)) )
+ {
+ args["NAME"] = gRlvHandler.getAnonym(info->mFromName);
+ }
+// [/RLVa:KB]
p.name = "UserGiveItem";
}
@@ -1628,11 +1665,11 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
to_id.isNull() )
do_auto_response = false;
- // if( do_auto_response )
- // [RLVa:KB] - Alternate: Emerald-370
+// if( do_auto_response )
+// [RLVa:KB] - Alternate: Emerald-370
// Emerald specific: auto-response should be blocked if the avie is RLV @sendim=n restricted and the recipient is not an exception
if ( (do_auto_response) && ( (!gRlvHandler.hasBehaviour(RLV_BHVR_SENDIM)) || (gRlvHandler.isException(RLV_BHVR_SENDIM, from_id)) ) )
- // [/RLVa:KB]
+// [/RLVa:KB]
{
if((dialog == IM_NOTHING_SPECIAL && !is_auto_response) ||
(dialog == IM_TYPING_START && gSavedPerAccountSettings.getBOOL("InstantMessageShowOnTyping"))
@@ -1860,7 +1897,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
}
else if (to_id.isNull())
{
-// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-08 (RLVa-1.0.0e)
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e)
// Filter region messages that weren't sent by a Linden
if ( (rlv_handler_t::isEnabled()) && (LLMuteList::getInstance()) &&
(!LLMuteList::getInstance()->isLinden(name)) && (from_id != gAgent.getID()) )
@@ -2160,6 +2197,14 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
}
else
{
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-09-10 (RLVa-1.0.3a)
+ if ( (rlv_handler_t::isEnabled()) && (dialog == IM_TASK_INVENTORY_OFFERED) &&
+ (info->mDesc.find(RLV_PUTINV_PREFIX) == 1) && (gRlvHandler.getSharedRoot()) )
+ {
+ LLFirstUse::warnRlvGiveToRLV();
+ }
+// [/RLVa:KB]
+
inventory_offer_handler(info, dialog == IM_TASK_INVENTORY_OFFERED);
}
}
@@ -2167,13 +2212,23 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
case IM_INVENTORY_ACCEPTED:
{
- args["NAME"] = name;
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e) | Modified: RLVa-0.2.0b
+ bool fRlvObfuscate = (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) &&
+ (gRlvHandler.isAgentNearby(from_id)) && (!gAvatarInfoInstances.checkData(from_id));
+ args["NAME"] = (!fRlvObfuscate) ? name : gRlvHandler.getAnonym(name);
+// [/RLVa:KB]
+ //args["NAME"] = name;
LLNotifications::instance().add("InventoryAccepted", args);
break;
}
case IM_INVENTORY_DECLINED:
{
- args["NAME"] = name;
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e) | Modified: RLVa-0.2.0b
+ bool fRlvObfuscate = (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) &&
+ (gRlvHandler.isAgentNearby(from_id)) && (!gAvatarInfoInstances.checkData(from_id));
+ args["NAME"] = (!fRlvObfuscate) ? name : gRlvHandler.getAnonym(name);
+// [/RLVa:KB]
+ //args["NAME"] = name;
LLNotifications::instance().add("InventoryDeclined", args);
break;
}
@@ -2324,7 +2379,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
return;
}
{
-// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-08 (RLVa-1.0.0e)
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e)
// TODO-RLVa: what actually generates this?
if (rlv_handler_t::isEnabled())
{
@@ -2367,6 +2422,27 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
}
else
{
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-07 (RLVa-1.0.0d)
+ if (rlv_handler_t::isEnabled())
+ {
+ // Disallow if: 1) @tplure=n restricted (sender isn't an exception), or 2) @unsit=n restricted and currently sitting
+ LLVOAvatar* pAvatar = gAgent.getAvatarObject();
+ if ( ( (gRlvHandler.hasBehaviour(RLV_BHVR_TPLURE)) && (!gRlvHandler.isException(RLV_BHVR_TPLURE, from_id)) ) ||
+ ( (gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) && (pAvatar) && (pAvatar->mIsSitting) ) )
+ {
+ rlvSendBusyMessage(from_id, rlv_handler_t::cstrMsgTpLure);
+ return;
+ }
+
+ // Censor teleport message if: 1) @revcim=n restricted (sender isn't an exception), or 2) @showloc=n restricted
+ if ( ( (gRlvHandler.hasBehaviour(RLV_BHVR_RECVIM)) && (!gRlvHandler.isException(RLV_BHVR_RECVIM, from_id)) ) ||
+ (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) )
+ {
+ message = rlv_handler_t::cstrHidden;
+ }
+ }
+// [/RLVa:KB]
+
LLSD args;
// *TODO:translate -> [FIRST] [LAST] (maybe)
args["NAME"] = name;
@@ -2375,7 +2451,21 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
payload["from_id"] = from_id;
payload["lure_id"] = session_id;
payload["godlike"] = FALSE;
- LLNotifications::instance().add("TeleportOffered", args, payload);
+ //LLNotifications::instance().add("TeleportOffered", args, payload);
+
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-07 (RLVa-1.0.0d) | Modified: RLVa-0.2.0b
+ if ( (rlv_handler_t::isEnabled()) &&
+ ((gRlvHandler.hasBehaviour(RLV_BHVR_ACCEPTTP)) || (gRlvHandler.isException(RLV_BHVR_ACCEPTTP, from_id))) )
+ {
+ gRlvHandler.setCanCancelTp(false);
+ LLNotifications::instance().forceResponse(LLNotification::Params("TeleportOffered").payload(payload), 0);
+ }
+ else
+ {
+ LLNotifications::instance().add("TeleportOffered", args, payload);
+ }
+// [/RLVa:KB]
+ //LLNotifications::instance().add("TeleportOffered", args, payload);
}
}
break;
@@ -2657,8 +2747,9 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
// Make swirly things only for talking objects. (not script debug messages, though)
// if (chat.mSourceType == CHAT_SOURCE_OBJECT
// && chat.mChatType != CHAT_TYPE_DEBUG_MSG)
-// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
+// [RLVa:KB] - Alternate: Snowglobe-1.2.4 | Checked: 2009-07-10 (RLVa-1.0.0g)
// Don't show swirly things for llOwnerSay() chat here because we handle those further down
+ // RELEASE-RLVa: if this code changes, remember to change the code down below as well
if ( (chat.mSourceType == CHAT_SOURCE_OBJECT && chat.mChatType != CHAT_TYPE_DEBUG_MSG) &&
((!rlv_handler_t::isEnabled()) || (CHAT_TYPE_OWNER != chat.mChatType)) )
// [/RLVa:KB]
@@ -2985,7 +3076,7 @@ void process_teleport_start(LLMessageSystem *msg, void**)
U32 teleport_flags = 0x0;
msg->getU32("Info", "TeleportFlags", teleport_flags);
- //if (teleport_flags & TELEPORT_FLAGS_DISABLE_CANCEL)
+// if (teleport_flags & TELEPORT_FLAGS_DISABLE_CANCEL)
// [RLVa:KB] - Checked: 2009-07-07 (RLVa-1.0.0d) | Added: RLVa-0.2.0b
if ( (teleport_flags & TELEPORT_FLAGS_DISABLE_CANCEL) || (!gRlvHandler.getCanCancelTp()) )
// [/RLVa:KB]
@@ -5365,8 +5456,32 @@ void process_script_question(LLMessageSystem *msg, void **user_data)
payload["object_name"] = object_name;
payload["owner_name"] = owner_name;
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0e
+ S32 rlvQuestionsOther = questions;
+
+ if ( (rlv_handler_t::isEnabled()) && (gRlvHandler.hasBehaviour(RLV_BHVR_ACCEPTPERMISSION)) )
+ {
+ LLViewerObject* pObj = gObjectList.findObject(taskid);
+ if (pObj)
+ {
+ if (pObj->permYouOwner())
+ {
+ // PERMISSION_TAKE_CONTROLS and PERMISSION_ATTACH are only auto-granted to objects this avie owns
+ rlvQuestionsOther &= ~(LSCRIPTRunTimePermissionBits[SCRIPT_PERMISSION_TAKE_CONTROLS] |
+ LSCRIPTRunTimePermissionBits[SCRIPT_PERMISSION_ATTACH]);
+ }
+ }
+ }
+
+ if ( (!caution) && (!rlvQuestionsOther) )
+ {
+ LLNotifications::instance().forceResponse(
+ LLNotification::Params("ScriptQuestion").substitutions(args).payload(payload), 0/*YES*/);
+ }
+ else if (gSavedSettings.getBOOL("PermissionsCautionEnabled"))
+// [/RLVa:KB]
// check whether cautions are even enabled or not
- if (gSavedSettings.getBOOL("PermissionsCautionEnabled"))
+ //if (gSavedSettings.getBOOL("PermissionsCautionEnabled"))
{
// display the caution permissions prompt
LLNotifications::instance().add(caution ? "ScriptQuestionCaution" : "ScriptQuestion", args, payload);
@@ -5697,6 +5812,21 @@ bool handle_lure_callback(const LLSD& notification, const LLSD& response)
if(0 == option)
{
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0b
+ if (gRlvHandler.hasBehaviour(RLV_BHVR_SENDIM))
+ {
+ for (LLSD::array_const_iterator it = notification["payload"]["ids"].beginArray();
+ it != notification["payload"]["ids"].endArray(); ++it)
+ {
+ if (!gRlvHandler.isException(RLV_BHVR_SENDIM, it->asUUID()))
+ {
+ text = rlv_handler_t::cstrHidden;
+ break;
+ }
+ }
+ }
+// [/RLVa:KB]
+
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_StartLure);
msg->nextBlockFast(_PREHASH_AgentData);
@@ -5729,13 +5859,28 @@ void handle_lure(const LLUUID& invitee)
void handle_lure(LLDynamicArray& ids)
{
LLSD edit_args;
- edit_args["REGION"] = gAgent.getRegion()->getName();
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-04 (RLVa-1.0.0a)
+ edit_args["REGION"] = (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) ? gAgent.getRegion()->getName() : rlv_handler_t::cstrHidden;
+// [/RLVa:KB]
+ //edit_args["REGION"] = gAgent.getRegion()->getName();
LLSD payload;
for (LLDynamicArray::iterator it = ids.begin();
it != ids.end();
++it)
{
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-07 (RLVa-1.0.0d) | Modified: RLVa-1.0.0a
+ // Only allow offering teleports if everyone is a @tplure exception or able to map this avie under @showloc=n
+ if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
+ {
+ const LLRelationship* pBuddyInfo = LLAvatarTracker::instance().getBuddyInfo(*it);
+ if ( (!gRlvHandler.isException(RLV_BHVR_TPLURE, *it, RLV_CHECK_PERMISSIVE)) &&
+ ((!pBuddyInfo) || (!pBuddyInfo->isOnline()) || (!pBuddyInfo->isRightGrantedTo(LLRelationship::GRANT_MAP_LOCATION))) )
+ {
+ return;
+ }
+ }
+// [/RLVa:KB]
payload["ids"].append(*it);
}
if (gAgent.isGodlike())
diff --git a/linden/indra/newview/llviewerobject.cpp b/linden/indra/newview/llviewerobject.cpp
index 6e74caf..a854583 100644
--- a/linden/indra/newview/llviewerobject.cpp
+++ b/linden/indra/newview/llviewerobject.cpp
@@ -1419,7 +1419,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
coloru.mV[3] = 255 - coloru.mV[3];
mText->setColor(LLColor4(coloru));
mText->setStringUTF8(temp_string);
-// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-09 (RLVa-1.0.0f) | Added: RLVa-1.0.0f
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-09 (RLVa-1.0.0f) | Added: RLVa-1.0.0f
if (rlv_handler_t::isEnabled())
{
mText->setObjectText(temp_string);
diff --git a/linden/indra/newview/llviewertexteditor.cpp b/linden/indra/newview/llviewertexteditor.cpp
index cee346e..0e16282 100644
--- a/linden/indra/newview/llviewertexteditor.cpp
+++ b/linden/indra/newview/llviewertexteditor.cpp
@@ -1387,7 +1387,7 @@ BOOL LLViewerTextEditor::openEmbeddedItem(LLInventoryItem* item, llwchar wc)
void LLViewerTextEditor::openEmbeddedTexture( LLInventoryItem* item, llwchar wc )
{
-// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-10-13 (RLVa-1.0.5c) | Added: RLVa-1.0.5c
+// [RLVa:KB] - Checked: 2009-10-13 (RLVa-1.0.5c) | Added: RLVa-1.0.5c
if (gRlvHandler.hasBehaviour(RLV_BHVR_VIEWTEXTURE))
{
return;
diff --git a/linden/indra/newview/llvoavatar.cpp b/linden/indra/newview/llvoavatar.cpp
index f3eec54..513d43c 100644
--- a/linden/indra/newview/llvoavatar.cpp
+++ b/linden/indra/newview/llvoavatar.cpp
@@ -93,10 +93,12 @@
#else
#include "boost/lexical_cast.hpp"
#endif
+#include "hippoLimits.h"// getMaxPrimScale
+
// [RLVa:KB]
#include "llstartup.h"
// [/RLVa:KB]
-#include "hippoLimits.h"// getMaxPrimScale
+
using namespace LLVOAvatarDefines;
//-----------------------------------------------------------------------------
@@ -3626,30 +3628,33 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
|| is_appearance != mNameAppearance || client.length() != 0)
{
std::string line;
-
- if (mRenderGroupTitles && title && title->getString() && title->getString()[0] != '\0')
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-0.2.0b
+ if (!fRlvShowNames)
{
- line += title->getString();
- //LLStringFn::replace_ascii_controlchars(line,LL_UNKNOWN_CHAR); IMP-136 -- McCabe
- line += "\n";
- line += firstname->getString();
+// [/RLVa:KB]
+ if (mRenderGroupTitles && title && title->getString() && title->getString()[0] != '\0')
+ {
+ line += title->getString();
+ //LLStringFn::replace_ascii_controlchars(line,LL_UNKNOWN_CHAR); IMP-136 -- McCabe
+ line += "\n";
+ line += firstname->getString();
+ }
+ else
+ {
+ line += firstname->getString();
+ }
+
+ line += " ";
+ line += lastname->getString();
+// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-0.2.0b
}
else
{
- line += firstname->getString();
- }
-
- line += " ";
- line += lastname->getString();
-
-// [RLVa:KB]
- if (fRlvShowNames)
- {
- // User is not allowed to see who it is, due to RLV settings.
- line = gRlvHandler.getAnonym(line);
+ line = gRlvHandler.getAnonym(line.assign(firstname->getString()).append(" ").append(lastname->getString()));
}
// [/RLVa:KB]
+
BOOL need_comma = FALSE;
bool show_client = client.length() != 0 && gSavedSettings.getBOOL("ShowClientNameTag");
diff --git a/linden/indra/newview/llworldmapview.cpp b/linden/indra/newview/llworldmapview.cpp
index c10faa5..2e28d18 100644
--- a/linden/indra/newview/llworldmapview.cpp
+++ b/linden/indra/newview/llworldmapview.cpp
@@ -1246,13 +1246,16 @@ BOOL LLWorldMapView::handleToolTip( S32 x, S32 y, std::string& msg, LLRect* stic
{
LLViewerRegion *region = gAgent.getRegion();
+// std::string message =
+// llformat("%s (%s)",
+// info->mName.c_str(),
+// LLViewerRegion::accessToString(info->mAccess).c_str());
+// [RLVa:KB] - Alternate: Snowglobe-1.0 | Checked: 2009-07-04 (RLVa-1.0.0a)
std::string message =
llformat("%s (%s)",
- //info->mName.c_str(),
-// [RLVa:KB] - Alternate: Snowglobe-1.0 | Checked: 2009-07-04 (RLVa-1.0.0a)
- (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) ? info->mName.c_str() : rlv_handler_t::cstrHidden.c_str(),
-// [/RLVa:KB]
+ (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) ? info->mName.c_str() : rlv_handler_t::cstrHidden.c_str(),
LLViewerRegion::accessToString(info->mAccess).c_str());
+// [/RLVa:KB]
if (info->mAccess != SIM_ACCESS_DOWN)
{
diff --git a/linden/indra/newview/panelradar.cpp b/linden/indra/newview/panelradar.cpp
index c5fc3db..b323a77 100644
--- a/linden/indra/newview/panelradar.cpp
+++ b/linden/indra/newview/panelradar.cpp
@@ -47,6 +47,7 @@
#include "llscrolllistctrl.h"
#include "lltracker.h"
#include "lluictrlfactory.h"
+#include "llviewercontrol.h"
#include "llviewerobjectlist.h"
#include "llviewermenu.h"
#include "llviewermessage.h"
@@ -291,12 +292,12 @@ void PanelRadar::updateRadarDisplay()
element["id"] = entry->getID();
element["columns"][0]["column"] = "avatar_name";
element["columns"][0]["type"] = "text";
+// element["columns"][0]["value"] = typing + entry->getName() + " " + mute_text;
// [RLVa:KB] - Alternate: Imprudence-1.2.0
- //element["columns"][0]["value"] = typing + entry->getName() + " " + mute_text;
- std::string fullname = (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) ?
- gRlvHandler.getAnonym(fullname) :
- typing + entry->getName() + " " + mute_text;
- element["columns"][0]["value"] = fullname;
+ element["columns"][0]["value"] =
+ (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
+ ? gRlvHandler.getAnonym(entry->getName())
+ : typing + entry->getName() + " " + mute_text;
// [/RLVa:KB]
element["columns"][1]["column"] = "avatar_distance";
element["columns"][1]["type"] = "text";
diff --git a/linden/indra/newview/rlvdefines.h b/linden/indra/newview/rlvdefines.h
index 3785b0a..21d7105 100644
--- a/linden/indra/newview/rlvdefines.h
+++ b/linden/indra/newview/rlvdefines.h
@@ -71,7 +71,7 @@ const S32 RLVa_VERSION_BUILD = 4;
// Uncomment to enable the Advanced / RLVa / Unit Tests menu (non-public)
//#define RLV_DEBUG_TESTS
#else
- // Uncomment if you want extended debugging information on release builds
+ // Uncomment if you want extended debugging information in release builds
//#define RLV_DEBUG
// Don't halt execution on errors in release
#define RLV_ERRS LL_WARNS("RLV")
@@ -82,7 +82,7 @@ const S32 RLVa_VERSION_BUILD = 4;
#define RLV_ROOT_FOLDER "#RLV"
#define RLV_CMD_PREFIX '@'
#define RLV_PUTINV_PREFIX "#RLV/~"
-#define RLV_SETROT_OFFSET F_PI_BY_TWO // @setrot is off by 90° with the rest of SL
+#define RLV_SETROT_OFFSET F_PI_BY_TWO // @setrot is off by 90° with the rest of SL
#define RLV_FOLDER_FLAG_NOSTRIP "nostrip"
#define RLV_FOLDER_PREFIX_HIDDEN '.'
diff --git a/linden/indra/newview/rlvextensions.cpp b/linden/indra/newview/rlvextensions.cpp
index 769d3cc..f31c62e 100644
--- a/linden/indra/newview/rlvextensions.cpp
+++ b/linden/indra/newview/rlvextensions.cpp
@@ -97,7 +97,7 @@ BOOL RlvExtGetSet::processCommand(const LLUUID& idObj, const RlvCommand& rlvCmd)
F32 nAngle = 0.0f;
if (LLStringUtil::convertToF32(rlvCmd.getOption(), nAngle))
{
- nAngle = RLV_SETROT_OFFSET - nAngle;
+ nAngle += RLV_SETROT_OFFSET;
gAgent.startCameraAnimation();
diff --git a/linden/indra/newview/rlvhandler.cpp b/linden/indra/newview/rlvhandler.cpp
index 68453af..904ed37 100644
--- a/linden/indra/newview/rlvhandler.cpp
+++ b/linden/indra/newview/rlvhandler.cpp
@@ -31,6 +31,10 @@
#include "rlvextensions.h"
#include "rlvhandler.h"
+// Only defined in llinventorybridge.cpp
+#if RLV_TARGET < RLV_MAKE_TARGET(1, 23, 0) // Version: 1.22.11
+ void confirm_replace_attachment_rez(S32 option, void* user_data);
+#endif
// Only defined in llinventorymodel.cpp
extern const char* NEW_CATEGORY_NAME;
@@ -112,7 +116,7 @@ static bool rlvParseNotifyOption(const std::string& strOption, S32& nChannel, st
// Checked: 2009-08-04 (RLVa-1.0.1d) | Modified: RLVa-1.0.1d
RlvHandler::RlvHandler()
- : m_fCanCancelTp(true), m_idCurObject(LLUUID::null), m_pCurCommand(NULL), m_pGCTimer(NULL), m_pWLSnapshot(NULL), m_pBhvrNotify(NULL)
+ : m_fCanCancelTp(false), m_idCurObject(LLUUID::null), m_pCurCommand(NULL), m_pGCTimer(NULL), m_pWLSnapshot(NULL), m_pBhvrNotify(NULL)
{
// Array auto-initialization to 0 is non-standard? (Compiler warning in VC-8.0)
memset(m_LayersAdd, 0, sizeof(S16) * WT_COUNT);
@@ -596,8 +600,13 @@ BOOL RlvHandler::processAddCommand(const LLUUID& uuid, const RlvCommand& rlvCmd)
case RLV_BHVR_SHOWMINIMAP: // @showminimap=n - Checked: 2009-07-05 (RLVa-1.0.0c)
{
// Simulate clicking the Minimap button [see LLToolBar::onClickRadar()]
- if (LLFloaterMap::instanceVisible())
+ #if RLV_TARGET < RLV_MAKE_TARGET(1, 23, 0) // Version: 1.22.11
+ if (gFloaterMap->getVisible())
+ LLFloaterMap::toggle(NULL);
+ #else // Version: 1.23.4
+ if (LLFloaterMap::instanceVisible())
LLFloaterMap::hideInstance();
+ #endif
}
break;
#ifdef RLV_EXTENSION_STARTLOCATION
@@ -1097,8 +1106,8 @@ BOOL RlvHandler::processReplyCommand(const LLUUID& uuid, const RlvCommand& rlvCm
const EWearableType layerTypes[] =
{
- WT_GLOVES, WT_JACKET, WT_PANTS, WT_SHIRT, WT_SHOES, WT_SKIRT, WT_ALPHA, WT_TATTOO, WT_SOCKS,
- WT_UNDERPANTS, WT_UNDERSHIRT, WT_SKIN, WT_EYES, WT_HAIR, WT_SHAPE
+ WT_GLOVES, WT_JACKET, WT_PANTS, WT_SHIRT, WT_SHOES, WT_SKIRT, WT_SOCKS,
+ WT_UNDERPANTS, WT_UNDERSHIRT, WT_SKIN, WT_EYES, WT_HAIR, WT_SHAPE, WT_ALPHA, WT_TATTOO
};
#ifdef RLV_EXPERIMENTAL_COMPOSITE_FOLDING
@@ -1601,8 +1610,8 @@ void RlvHandler::filterNames(std::string& strUTF8Text) const
// -> the cost of multi string matching them all at once seems to be about the same as calling rlvStringReplace
// twice so that would be a tremendous gain (and we'd get first name and word matching for free)
#if RLV_TARGET < RLV_MAKE_TARGET(1, 23, 0) // Version: 1.22.11
- for (LLWorld::region_list_t::const_iterator itRegion = LLWorld::getInstance()->getRegionList().begin();
- itRegion != LLWorld::getInstance()->getRegionList().end(); ++itRegion)
+ for (LLWorld::region_list_t::const_iterator itRegion = LLWorld::getInstance()->mActiveRegionList.begin();
+ itRegion != LLWorld::getInstance()->mActiveRegionList.end(); ++itRegion)
{
LLViewerRegion* pRegion = *itRegion;
@@ -1688,8 +1697,8 @@ bool RlvHandler::redirectChatOrEmote(const std::string& strUTF8Text) const
BOOL RlvHandler::isAgentNearby(const LLUUID& uuid) const
{
#if RLV_TARGET < RLV_MAKE_TARGET(1, 23, 0) // Version: 1.22.11
- for (LLWorld::region_list_t::const_iterator itRegion = LLWorld::getInstance()->getRegionList().begin();
- itRegion != LLWorld::getInstance()->getRegionList().end(); ++itRegion)
+ for (LLWorld::region_list_t::const_iterator itRegion = LLWorld::getInstance()->mActiveRegionList.begin();
+ itRegion != LLWorld::getInstance()->mActiveRegionList.end(); ++itRegion)
{
LLViewerRegion* pRegion = *itRegion;
diff --git a/linden/indra/newview/rlvhelper.cpp b/linden/indra/newview/rlvhelper.cpp
index 67ffbe2..f509a43 100644
--- a/linden/indra/newview/rlvhelper.cpp
+++ b/linden/indra/newview/rlvhelper.cpp
@@ -1,7 +1,6 @@
#include "llviewerprecompiledheaders.h"
#include "llagent.h"
#include "llfloaterwindlight.h"
-#include "llinventoryview.h"
#include "llviewerobject.h"
#include "llviewerstats.h"
#include "llviewerwindow.h"
@@ -12,12 +11,6 @@
#include "rlvevent.h"
#include "rlvhandler.h"
-// Only defined in llinventorybridge.cpp
-#if RLV_TARGET < RLV_MAKE_TARGET(1, 23, 0) // Version: 1.22.11
- #include "llinventorybridge.h"
- void confirm_replace_attachment_rez(S32 option, void* user_data);
-#endif
-
// ============================================================================
// Static variable initialization
//
diff --git a/linden/indra/newview/skins/default/xui/en-us/notifications.xml b/linden/indra/newview/skins/default/xui/en-us/notifications.xml
index 8eb2233..108728d 100644
--- a/linden/indra/newview/skins/default/xui/en-us/notifications.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/notifications.xml
@@ -56,6 +56,20 @@ Always choose this option
+
+
+
+
+
+
+
+ gridnickosgrid
+ gridnameOSGrid
+ platformOpenSim
+ loginurihttp://osgrid.org:8002/
+ loginpagehttp://osgrid.org/loginscreen.php
+ helperurihttp://osgrid.org/
+ websitehttp://osgrid.org/
+ supporthttp://osgrid.org/
+ registerhttp://osgrid.org/elgg/account/register.php
+ passwordhttp://osgrid.org/elgg/account/forgotten_password.php
+ version1
+
+
+
+
+ gridnicklegendcityonline
+ gridnameLegend City Online
+ platformOpenSim
+ loginurihttp://login.legendcityonline.com
+ loginpagehttp://www.legendcityonline.com/welcome.php
+ helperurihttps://secure.legendcityonline.com/
+ websitehttp://www.legendcityonline.com/
+ supporthttp://www.legendcityonline.com/
+ registerhttp://www.legendcityonline.com/
+ passwordhttp://www.legendcityonline.com/
+ version0
+
+
+
+
+ gridnickworldsimterra
+ gridnameWorldSimTerra
+ platformOpenSim
+ loginurihttp://wsterra.com:8002
+ loginpagehttp://wsterra.com/log.php
+ helperurihttp://wsterra.com/
+ websitehttp://www.worldsimterra.com/
+ supporthttp://www.worldsimterra.com/
+ registerhttp://www.worldsimterra.com/
+ passwordhttp://www.worldsimterra.com/
+ version0
+
+
+
+
+ gridnickyouralternativelife
+ gridnameYour Alternative Life
+ platformOpenSim
+ loginurihttp://grid01.from-ne.com:8002/
+ loginpagehttp://grid01.from-ne.com/tios/loginscreen3.php
+ helperurihttp://grid01.from-ne.com/tios/services/
+ websitehttp://www.youralternativelife.com
+ supporthttp://www.youralternativelife.com
+ registerhttp://www.youralternativelife.com
+ passwordhttp://www.youralternativelife.com
+ version0
+
+
+
+
+
+ gridnickthenewworldgrid
+ gridnameThe New World Grid
+ platformOpenSim
+ loginurihttp://grid.newworldgrid.com:8002/
+ loginpagehttp://account.newworldgrid.com/loginscreen.php
+ helperurihttp://account.newworldgrid.com/
+ websitehttp://www.newworldgrid.com/
+ supporthttp://www.newworldgrid.com/
+ registerhttp://www.newworldgrid.com/register
+ passwordhttp://account.newworldgrid.com/
+ version0
+
+
+
+
+ gridnickreactiongrid
+ gridnameReactionGrid
+ platformOpenSim
+ loginurihttp://reactiongrid.com:8008/
+ loginpagehttp://gsquared.info/portal
+ websitehttp://reactiongrid.com/Default.aspx
+ supporthttp://reactiongrid.com/Support.aspx
+ registerhttp://reactiongrid.com/Register.aspx
+ passwordhttp://reactiongrid.com/Support/ResetPassword.aspx
+ version0
+
+
+
+
+ gridnickcyberlandia
+ gridnameCyberlandia
+ platformOpenSim
+ loginurihttp://grid.cyberlandia.net:8002
+ loginpage
+ helperuri
+ websitehttp://www.cyberlandia.net
+ version0
+
+
+
+
+ gridnickroleplayworlds
+ gridnameRole Play Worlds
+ platformOpenSim
+ loginurihttp://grid.roleplayworlds.net:8002/
+ loginpagehttp://grid.roleplayworlds.net/loginscreen.php
+ helperurihttp://grid.roleplayworlds.net/
+ websitehttp://roleplayworlds.net/
+ registerhttp://grid.roleplayworlds.net/index.php?page=create
+ passwordhttp://grid.roleplayworlds.net/index.php?page=change
+ version0
+
+
+
+
+ gridnickgiantgrid
+ gridnameGiantGrid
+ platformOpenSim
+ loginurihttp://Gianttest.no-ip.biz:8002/
+ loginpagehttp://gianttest.no-ip.biz:80/gridsplash?method=login
+ helperurihttp://gianttest.no-ip.biz/giantmap/
+ version0
+
+
+
+
+ gridnick3rdrock
+ gridname3rd Rock Grid
+ platformOpenSim
+ loginurihttp://grid.3rdrockgrid.com:8002/
+ loginpagehttp://3rdrockgrid.com/startpage.php
+ helperurihttp://grid.3rdrockgrid.com/money/
+ websitehttp://3rdrockgrid.com/
+ registerhttp://3rdrockgrid.com/
+ passwordhttp://3rdrockgrid.com/
+ supporthttp://3rdrockgrid.com/
+ version1
+
+
+
+
+ gridname Inworldz
+ gridnick inworldz
+ platform OpenSim
+ loginuri http://inworldz.com:8002/
+ loginpage http://inworldz.com/loginscreen.php
+ helperuri http://inworldz.com/
+ password http://inworldz.com/wpassword
+ register http://inworldz.com/register
+ support http://inworldz.com/help
+ website http://inworldz.com/about/
+ version 1
+
+
+
+
+ gridname Meta7
+ gridnick meta7
+ platform OpenSim
+ loginuri http://login.meta7.com/
+ loginpage http://api.meta7.com/loginscreen.php
+ helperuri https://secure.meta7.com/
+ password http://www.meta7.com/resetpass.php
+ register http://www.meta7.com/register.php
+ support http://www.meta7.com/support.php
+ website http://meta7.com/
+ version 0
+
+
+
+
+ gridname ScienceSim
+ gridnick sciencesim
+ platform OpenSim
+ loginuri http://grid.sciencesim.com/
+ loginpage http://island.sciencesim.com/scisim/loginscreen.php
+ helperuri
+ password http://island.sciencesim.com/scisim
+ register http://island.sciencesim.com/scisim
+ support http://island.sciencesim.com/wiki
+ website http://island.sciencesim.com/about/
+ version 0
--
cgit v1.1
From 51c0f61c3a6d92d67a3df20f58b220d1ca11bb6d Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sat, 21 Aug 2010 11:59:57 -0700
Subject: Changed version to Weekly: 2010-08-21
---
linden/indra/newview/app_settings/viewerversion.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/viewerversion.xml b/linden/indra/newview/app_settings/viewerversion.xml
index 4d6f1a3..37cfe0a 100644
--- a/linden/indra/newview/app_settings/viewerversion.xml
+++ b/linden/indra/newview/app_settings/viewerversion.xml
@@ -20,6 +20,6 @@ need to be changed manually - MC
-
+
--
cgit v1.1
From 7364049359bd554f1f0d20335b7d14b31f35e7a8 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sat, 21 Aug 2010 14:07:40 -0700
Subject: Added info about outfit changing to derender notification
---
linden/indra/newview/skins/default/xui/en-us/notifications.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/notifications.xml b/linden/indra/newview/skins/default/xui/en-us/notifications.xml
index 108728d..d830e7e 100644
--- a/linden/indra/newview/skins/default/xui/en-us/notifications.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/notifications.xml
@@ -6807,7 +6807,7 @@ Are you sure you want to move here?
type="alert">
Are you sure you want to derender [NAME]?
-[NAME] will be hidden until you exit the region.
+[NAME] will be hidden until you exit the region or they change outfits.
+
+
+
@@ -2150,11 +2155,6 @@
userdata="ShowCrosshairs" />
-
-
-
--
cgit v1.1
From 260ec5d581f964ba01d2422f7ca96ad20c0baf92 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Tue, 8 Jun 2010 18:56:16 -0700
Subject: WIP: show all avatars the viewer can find if you have EM privelges on
the sim
---
linden/indra/newview/panelradar.cpp | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/panelradar.cpp b/linden/indra/newview/panelradar.cpp
index b323a77..ce91da2 100644
--- a/linden/indra/newview/panelradar.cpp
+++ b/linden/indra/newview/panelradar.cpp
@@ -175,6 +175,11 @@ void PanelRadar::updateRadarInfo()
}
else // avatar_ids empty
{
+ // Just in case
+ if (!mAvatars.empty())
+ {
+ mAvatars.clear();
+ }
mRadarList->deleteAllItems();
mRadarList->addCommentText(getString("no_one_near"), ADD_TOP);
LLUIString av_count_string = getString("avatars_in_plural");
@@ -211,6 +216,8 @@ void PanelRadar::updateRadarDisplay()
F32 range = gSavedSettings.getF32("NearMeRange");
bool notify_chat = gSavedSettings.getBOOL("MiniMapNotifyChatRange");
bool notify_sim = gSavedSettings.getBOOL("MiniMapNotifySimRange");
+ // We show avatars outside the estate even if you can't manage it in case griefers are lying on the border
+ bool is_manager = gAgent.getRegion()->canManageEstate();
// [RLVa:KB] - Alternate: Imprudence-1.2.0
if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
{
@@ -279,7 +286,7 @@ void PanelRadar::updateRadarDisplay()
}
// Only display avatars in range
- if (entry->getDistance() <= range)
+ if (is_manager || entry->getDistance() <= range)
{
// Append typing string
std::string typing = "";
--
cgit v1.1
From 26972e4f12900a2662d74b7d95da3f693ba48c28 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sun, 22 Aug 2010 21:30:15 -0700
Subject: Changed 'main console' to 'main chat' for showing IMs
---
linden/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml
index 0904815..b0dd026 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml
@@ -34,7 +34,7 @@
getHoverObjects()->getObjectCount();
+ line.append(llformat("Prims: %d", prim_count));
+ mText.push_back(line);
+
+ line.clear();
+ line.append("Position: ");
+
+ LLViewerRegion *region = gAgent.getRegion();
+ LLVector3 position = region->getPosRegionFromGlobal(hit_object->getPositionGlobal());//regionp->getOriginAgent();
+ LLVector3 mypos = region->getPosRegionFromGlobal(gAgent.getPositionGlobal());
+
+
+ LLVector3 delta = position - mypos;
+ F32 distance = (F32)delta.magVec();
+
+ line.append(llformat("<%.02f,%.02f,%.02f>",position.mV[0],position.mV[1],position.mV[2]));
+ mText.push_back(line);
+ line.clear();
+ line.append(llformat("Distance: %.02fm",distance));
+ mText.push_back(line);
// If the hover tip shouldn't be shown, delete all the object text
if (suppressObjectHoverDisplay)
--
cgit v1.1
From a71cbc6917a6ab0c24c3a71f98db0c762571c35e Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Mon, 23 Aug 2010 01:25:21 -0700
Subject: Updated the about window to include the Cool VL Viewer and mention
Kitty as the author of RLVa
---
linden/indra/newview/skins/default/xui/en-us/floater_about.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_about.xml b/linden/indra/newview/skins/default/xui/en-us/floater_about.xml
index d9c1798..557c1d7 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_about.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_about.xml
@@ -17,7 +17,7 @@
For their WindLight presets, we thank Ana Lutetia, CodeBastard Redgrave, and Torley Linden.
- Thanks also to the developers of the Green Life Emerald Viewer, Hippo Viewer, and Meerkat Viewer for viewer enhancements we have incorporated. Special thanks to the folks at Linden Lab for releasing the viewer source, without which this endeavor would have been impossible.
+ Thanks also to the developer(s) of the Emerald Viewer, Hippo Viewer, Cool VL Viewer, and Meerkat Viewer for viewer enhancements we have incorporated, as well as Kitty Barnett for RLVa. Special thanks to the folks at Linden Lab for releasing the viewer source, without which this endeavor would have been impossible.
For a complete list of who did what, read the release notes!
--
cgit v1.1
From bc1263e920eb673f3c93edb8757b97b9a8a7125a Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Mon, 23 Aug 2010 01:29:47 -0700
Subject: Toggle between limited and sim-wide range for radar
---
linden/indra/newview/app_settings/settings.xml | 11 ++++++++
linden/indra/newview/panelradar.cpp | 33 ++++++++++++++++++++--
linden/indra/newview/panelradar.h | 3 ++
.../skins/default/xui/en-us/panel_radar.xml | 14 ++++++---
4 files changed, 54 insertions(+), 7 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index f0d6376..c8a247f 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -524,6 +524,17 @@
Value
0
+ RadarSimWide
+
+ Comment
+ If true, radar shows everyone in the sim
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 0
+
SavedRenderFarClip
Comment
diff --git a/linden/indra/newview/panelradar.cpp b/linden/indra/newview/panelradar.cpp
index ce91da2..cfaffde 100644
--- a/linden/indra/newview/panelradar.cpp
+++ b/linden/indra/newview/panelradar.cpp
@@ -29,6 +29,7 @@
#include "panelradar.h"
+#include "hippoLimits.h"
#include "llagent.h"
#include "llchat.h"
#include "llfloateravatarinfo.h"
@@ -45,6 +46,7 @@
#include "llregionposition.h"
#include "roles_constants.h"
#include "llscrolllistctrl.h"
+#include "llspinctrl.h"
#include "lltracker.h"
#include "lluictrlfactory.h"
#include "llviewercontrol.h"
@@ -77,6 +79,11 @@ BOOL PanelRadar::postBuild()
childSetCommitCallback("RadarList", onUseRadarList, this);
mRadarList->setDoubleClickCallback(onClickIM);
+ childSetCommitCallback("simwide_checkbox", onCheckSimWide, this);
+
+ // Set max range to max height
+ getChild("near_me_range")->setMaxValue(gHippoLimits->getMaxHeight());
+
childSetAction("im_btn", onClickIM, this);
childSetAction("profile_btn", onClickProfile, this);
childSetAction("offer_teleport_btn", onClickOfferTeleport, this);
@@ -216,8 +223,6 @@ void PanelRadar::updateRadarDisplay()
F32 range = gSavedSettings.getF32("NearMeRange");
bool notify_chat = gSavedSettings.getBOOL("MiniMapNotifyChatRange");
bool notify_sim = gSavedSettings.getBOOL("MiniMapNotifySimRange");
- // We show avatars outside the estate even if you can't manage it in case griefers are lying on the border
- bool is_manager = gAgent.getRegion()->canManageEstate();
// [RLVa:KB] - Alternate: Imprudence-1.2.0
if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
{
@@ -286,7 +291,7 @@ void PanelRadar::updateRadarDisplay()
}
// Only display avatars in range
- if (is_manager || entry->getDistance() <= range)
+ if (mSimWide || entry->getDistance() <= range)
{
// Append typing string
std::string typing = "";
@@ -549,6 +554,28 @@ void PanelRadar::onUseRadarList(LLUICtrl* ctrl, void* user_data)
}
+// static
+void PanelRadar::onCheckSimWide(LLUICtrl* ctrl, void* user_data)
+{
+ PanelRadar* self = (PanelRadar*)user_data;
+ if (self)
+ {
+ self->updateRangeControls();
+ }
+}
+
+
+void PanelRadar::updateRangeControls()
+{
+ LLSpinCtrl* near_me = getChild("near_me_range");
+ if (near_me)
+ {
+ near_me->setEnabled(!gSavedSettings.getBOOL("RadarSimWide"));
+ }
+ mSimWide = gSavedSettings.getBOOL("RadarSimWide");
+}
+
+
bool PanelRadar::visibleItemsSelected() const
{
return (mRadarList->getFirstSelectedIndex() >= 0);
diff --git a/linden/indra/newview/panelradar.h b/linden/indra/newview/panelradar.h
index 59e6aff..4d53b56 100644
--- a/linden/indra/newview/panelradar.h
+++ b/linden/indra/newview/panelradar.h
@@ -77,6 +77,7 @@ private:
LLScrollListCtrl* mRadarList;
LLUUID mSelectedAvatar;
F32 mSelectedDistance;
+ bool mSimWide;
bool visibleItemsSelected() const;
bool isKickable(const LLUUID& agent_id);
@@ -88,6 +89,8 @@ private:
static void onUseRadarList(LLUICtrl* ctrl, void* user_data);
static void onRangeChange(LLFocusableElement* focus, void* user_data);
+ static void onCheckSimWide(LLUICtrl* ctrl, void* user_data);
+ void updateRangeControls();
static void onClickProfile(void* user_data);
static void onClickIM(void* user_data);
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_radar.xml b/linden/indra/newview/skins/default/xui/en-us/panel_radar.xml
index 603f2d8..d02ff0d 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_radar.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_radar.xml
@@ -40,13 +40,13 @@
0 avatars in
-
+
+
childSetCommitCallback("Object Description",LLPanelPermissions::onCommitDesc,this);
this->childSetPrevalidate("Object Description",LLLineEditor::prevalidatePrintableNotPipe);
-
- this->childSetAction("button owner profile",LLPanelPermissions::onClickOwner,this);
- this->childSetAction("button last owner profile",LLPanelPermissions::onClickLastOwner,this);
- this->childSetAction("button creator profile",LLPanelPermissions::onClickCreator,this);
+ this->getChild("Creator Name")->setClickedCallback(onClickCreator, this);
+ this->getChild("Owner Name")->setClickedCallback(onClickOwner, this);
+ this->getChild("Last Owner Name")->setClickedCallback(onClickLastOwner, this);
+ this->getChild("Group Name Proxy")->setClickedCallback(onClickGroupName, this);
this->childSetAction("button set group",LLPanelPermissions::onClickGroup,this);
@@ -116,8 +116,13 @@ BOOL LLPanelPermissions::postBuild()
LLTextBox* group_rect_proxy = getChild("Group Name Proxy");
if(group_rect_proxy )
{
+ // God I hate leaving this hardcoded styling here, ick ick ick -- MC
mLabelGroupName = new LLNameBox("Group Name", group_rect_proxy->getRect());
addChild(mLabelGroupName);
+ mLabelGroupName->setClickedCallback(onClickGroupName, this);
+ mLabelGroupName->setHoverActive(TRUE);
+ mLabelGroupName->setHoverColor(LLColor4(50, 115, 185));
+ mLabelGroupName->setFontStyle(LLFontGL::UNDERLINE);
}
else
{
@@ -177,17 +182,14 @@ void LLPanelPermissions::refresh()
childSetEnabled("Creator:",false);
childSetText("Creator Name",LLStringUtil::null);
childSetEnabled("Creator Name",false);
- childSetEnabled("button creator profile",false);
childSetEnabled("Owner:",false);
childSetText("Owner Name",LLStringUtil::null);
childSetEnabled("Owner Name",false);
- childSetEnabled("button owner profile",false);
childSetEnabled("Last Owner:",false);
childSetText("Last Owner Name",LLStringUtil::null);
childSetEnabled("Last Owner Name",false);
- childSetEnabled("button last owner profile",false);
childSetEnabled("Group:",false);
childSetText("Group Name",LLStringUtil::null);
@@ -297,8 +299,7 @@ void LLPanelPermissions::refresh()
creator_name);
childSetText("Creator Name",creator_name);
- childSetEnabled("Creator Name",TRUE);
- childSetEnabled("button creator profile", creators_identical && mCreatorID.notNull() );
+ childSetEnabled("Creator Name",creators_identical && mCreatorID.notNull());
// Update owner text field
childSetEnabled("Owner:",true);
@@ -347,10 +348,9 @@ void LLPanelPermissions::refresh()
// [/RLVa:KB]
childSetText("Owner Name",owner_name);
- childSetEnabled("Owner Name",TRUE);
-// childSetEnabled("button owner profile",owners_identical && (mOwnerID.notNull() || LLSelectMgr::getInstance()->selectIsGroupOwned()));
-// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
- childSetEnabled("button owner profile",
+// childSetEnabled("Owner Name",TRUE);
+// [RLVa:KB] - Checked: 2010-08-23 (RLVa-imp-edit)
+ childSetEnabled("Owner Name",
fRlvEnableOwner && owners_identical && (mOwnerID.notNull() || LLSelectMgr::getInstance()->selectIsGroupOwned()));
// [/RLVa:KB]
@@ -359,14 +359,12 @@ void LLPanelPermissions::refresh()
childSetEnabled("Last Owner:", TRUE);
childSetText("Last Owner Name", last_owner_name);
childSetEnabled("Last Owner Name", TRUE);
- childSetEnabled("button last owner profile", TRUE);
}
else
{
childSetEnabled("Last Owner:", FALSE);
childSetText("Last Owner Name", LLStringUtil::null);
childSetEnabled("Last Owner Name", FALSE);
- childSetEnabled("button last owner profile", FALSE);
}
// update group text field
@@ -868,7 +866,10 @@ void LLPanelPermissions::onClickCreator(void *data)
{
LLPanelPermissions *self = (LLPanelPermissions *)data;
- LLFloaterAvatarInfo::showFromObject(self->mCreatorID);
+ if (self->mCreatorID.notNull())
+ {
+ LLFloaterAvatarInfo::showFromObject(self->mCreatorID);
+ }
}
// static
@@ -882,7 +883,7 @@ void LLPanelPermissions::onClickOwner(void *data)
LLSelectMgr::getInstance()->selectGetGroup(group_id);
LLFloaterGroupInfo::showFromUUID(group_id);
}
- else
+ else if (self->mOwnerID.notNull())
{
// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
if (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
@@ -910,6 +911,15 @@ void LLPanelPermissions::onClickLastOwner(void *data)
}
}
+void LLPanelPermissions::onClickGroupName(void *data)
+{
+ LLUUID group_id;
+ if (LLSelectMgr::getInstance()->selectGetGroup(group_id))
+ {
+ LLFloaterGroupInfo::showFromUUID(group_id);
+ }
+}
+
void LLPanelPermissions::onClickGroup(void* data)
{
LLPanelPermissions* panelp = (LLPanelPermissions*)data;
diff --git a/linden/indra/newview/llpanelpermissions.h b/linden/indra/newview/llpanelpermissions.h
index 9aa5573..9fa4cce 100644
--- a/linden/indra/newview/llpanelpermissions.h
+++ b/linden/indra/newview/llpanelpermissions.h
@@ -70,6 +70,7 @@ protected:
static void onClickCreator(void*);
static void onClickOwner(void*);
static void onClickLastOwner(void*);
+ static void onClickGroupName(void*);
static void onClickGroup(void*);
static void cbGroupID(LLUUID group_id, void* userdata);
static void onClickDeedToGroup(void*);
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml b/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
index 465abdc..5f61e3c 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
@@ -349,6 +349,7 @@
follows="left|top|right" font="SansSerifSmall" height="16" left="88"
max_length="127" mouse_opaque="true" name="Object Description"
select_all_on_focus_received="true" width="172" />
+
- Thrax Linden
-
-
-
+ Imprudent Linden
+
+
+
- Owner:
-
-
+
- Thrax Linden
-
-
+ mouse_opaque="true" name="Owner Name" v_pad="0" width="174"
+ hover="true" hover_color="50 115 185" font-style="UNDERLINE">
+ Imprudent Linden
+
+
- Thrax Linden
+ mouse_opaque="true" name="Last Owner Name" v_pad="0" width="174"
+ hover="true" hover_color="50 115 185" font-style="UNDERLINE">
+ Imprudent Linden
-
-
- Group:
-
-
+
+ width="88" hover="true" hover_color="50 115 185" font-style="UNDERLINE">
The Lindens
-
-
-
-
-
- Price: [CURRENCY]
-
-
+
-
-
- Original
-
-
+
- Copy
-
-
+
- Contents
-
-
+ Contents
+
+
+
+ Anyone Can:
+
+
+
getConnectedGrid()->getGridName().empty()) ?
+ gHippoGridManager->getConnectedGrid()->getGridNick() :
+ gHippoGridManager->getConnectedGrid()->getGridName();
+ std::string title_text = LLTrans::getString("TitleBarMultiple", args);
+ gWindowTitle = gSecondLife + " - " + title_text;
LLStringUtil::truncate(gWindowTitle, 255);
gViewerWindow->getWindow()->setWindowTitle(gWindowTitle);
}
diff --git a/linden/indra/newview/skins/default/xui/en-us/strings.xml b/linden/indra/newview/skins/default/xui/en-us/strings.xml
index 5bd0924..a17d0de 100644
--- a/linden/indra/newview/skins/default/xui/en-us/strings.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/strings.xml
@@ -17,6 +17,9 @@
January:February:March:April:May:June:July:August:September:October:November:December
+
+ [FIRST_NAME] [LAST_NAME] on [GRID_NAME]
+
Logging in. [APP_NAME] may appear frozen. Please wait.
--
cgit v1.1
From 8cbb7451e6e88bcf4dfb67f900089720c71f8f28 Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Mon, 23 Aug 2010 17:24:07 +0200
Subject: Emerald: copy/paste buttons for prim pos/rot/scale in panelobject
---
linden/indra/newview/llpanelobject.cpp | 237 +++++++++++++++++++++
linden/indra/newview/llpanelobject.h | 30 +++
.../skins/default/xui/en-us/floater_tools.xml | 30 +++
3 files changed, 297 insertions(+)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llpanelobject.cpp b/linden/indra/newview/llpanelobject.cpp
index 9ef7f91..1a9d8bf 100644
--- a/linden/indra/newview/llpanelobject.cpp
+++ b/linden/indra/newview/llpanelobject.cpp
@@ -106,6 +106,10 @@ enum {
MI_HOLE_COUNT
};
+LLVector3 LLPanelObject::mClipboardPos;
+LLVector3 LLPanelObject::mClipboardSize;
+LLVector3 LLPanelObject::mClipboardRot;
+
//*TODO:translate (depricated, so very low priority)
static const std::string LEGACY_FULLBRIGHT_DESC("Fullbright (Legacy)");
@@ -167,6 +171,27 @@ BOOL LLPanelObject::postBuild()
mCtrlRotZ = getChild("Rot Z");
childSetCommitCallback("Rot Z",onCommitRotation,this);
+ mBtnCopyPos = getChild("copypos");
+ childSetAction("copypos",onCopyPos, this);
+ mBtnPastePos = getChild("pastepos");
+ childSetAction("pastepos",onPastePos, this);
+ mBtnPastePosClip = getChild("pasteposclip");
+ childSetAction("pasteposclip",onPastePosClip, this);
+
+ mBtnCopySize = getChild("copysize");
+ childSetAction("copysize",onCopySize, this);
+ mBtnPasteSize = getChild("pastesize");
+ childSetAction("pastesize",onPasteSize, this);
+ mBtnPasteSizeClip = getChild("pastesizeclip");
+ childSetAction("pastesizeclip",onPasteSizeClip, this);
+
+ mBtnCopyRot = getChild("copyrot");
+ childSetAction("copyrot",onCopyRot, this);
+ mBtnPasteRot = getChild("pasterot");
+ childSetAction("pasterot",onPasteRot, this);
+ mBtnPasteRotClip = getChild("pasterotclip");
+ childSetAction("pasterotclip",onPasteRotClip, this);
+
//--------------------------------------------------------
// material type popup
@@ -427,6 +452,9 @@ void LLPanelObject::getState( )
mCtrlPosX->setEnabled(enable_move);
mCtrlPosY->setEnabled(enable_move);
mCtrlPosZ->setEnabled(enable_move);
+ mBtnCopyPos->setEnabled(enable_move);
+ mBtnPastePos->setEnabled(enable_move);
+ mBtnPastePosClip->setEnabled(enable_move);
mCtrlPosZ->setMaxValue(gHippoLimits->getMaxHeight());
@@ -454,6 +482,9 @@ void LLPanelObject::getState( )
mCtrlScaleX->setEnabled( enable_scale );
mCtrlScaleY->setEnabled( enable_scale );
mCtrlScaleZ->setEnabled( enable_scale );
+ mBtnCopySize->setEnabled( enable_scale );
+ mBtnPasteSize->setEnabled( enable_scale );
+ mBtnPasteSizeClip->setEnabled( enable_scale );
LLQuaternion object_rot = objectp->getRotationEdit();
object_rot.getEulerAngles(&(mCurEulerDegrees.mV[VX]), &(mCurEulerDegrees.mV[VY]), &(mCurEulerDegrees.mV[VZ]));
@@ -485,6 +516,9 @@ void LLPanelObject::getState( )
mCtrlRotX->setEnabled( enable_rotate );
mCtrlRotY->setEnabled( enable_rotate );
mCtrlRotZ->setEnabled( enable_rotate );
+ mBtnCopyRot->setEnabled( enable_rotate );
+ mBtnPasteRot->setEnabled( enable_rotate );
+ mBtnPasteRotClip->setEnabled( enable_rotate );
BOOL owners_identical;
LLUUID owner_id;
@@ -2140,3 +2174,206 @@ void LLPanelObject::onClickBuildConstants(void *)
{
LLNotifications::instance().add("ClickBuildConstants");
}
+
+std::string shortfloat(F32 in)
+{
+ std::string out = llformat("%f", in);
+ int i = out.size();
+ while(out[--i] == '0') out.erase(i, 1);
+ return out;
+}
+
+void LLPanelObject::onCopyPos(void* user_data)
+{
+ LLPanelObject* self = (LLPanelObject*) user_data;
+ LLVector3 newpos(self->mCtrlPosX->get(), self->mCtrlPosY->get(), self->mCtrlPosZ->get());
+ self->mClipboardPos = newpos;
+
+ std::string stringVec = "<";
+ stringVec.append(shortfloat(newpos.mV[VX]));
+ stringVec.append(", ");
+ stringVec.append(shortfloat(newpos.mV[VY]));
+ stringVec.append(", ");
+ stringVec.append(shortfloat(newpos.mV[VZ]));
+ stringVec.append(">");
+
+ gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(stringVec));
+}
+
+void LLPanelObject::onCopySize(void* user_data)
+{
+ LLPanelObject* self = (LLPanelObject*) user_data;
+ LLVector3 newpos(self->mCtrlScaleX->get(), self->mCtrlScaleY->get(), self->mCtrlScaleZ->get());
+ self->mClipboardSize = newpos;
+
+ std::string stringVec = "<";
+ stringVec.append(shortfloat(newpos.mV[VX]));
+ stringVec.append(", ");
+ stringVec.append(shortfloat(newpos.mV[VY]));
+ stringVec.append(", ");
+ stringVec.append(shortfloat(newpos.mV[VZ]));
+ stringVec.append(">");
+
+ gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(stringVec));
+}
+
+void LLPanelObject::onCopyRot(void* user_data)
+{
+ LLPanelObject* self = (LLPanelObject*) user_data;
+ LLVector3 newpos(self->mCtrlRotX->get(), self->mCtrlRotY->get(), self->mCtrlRotZ->get());
+ self->mClipboardRot = newpos;
+
+ std::string stringVec = "<";
+ stringVec.append(shortfloat(newpos.mV[VX]));
+ stringVec.append(", ");
+ stringVec.append(shortfloat(newpos.mV[VY]));
+ stringVec.append(", ");
+ stringVec.append(shortfloat(newpos.mV[VZ]));
+ stringVec.append(">");
+
+ gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(stringVec));
+}
+
+
+
+void LLPanelObject::onPastePos(void* user_data)
+{
+ if(mClipboardPos.isNull()) return;
+
+ LLPanelObject* self = (LLPanelObject*) user_data;
+ LLCalc* calcp = LLCalc::getInstance();
+ mClipboardPos.mV[VX] = llclamp( mClipboardPos.mV[VX], 0.f, 256.f);
+ mClipboardPos.mV[VY] = llclamp( mClipboardPos.mV[VY], 0.f, 256.f);
+ mClipboardPos.mV[VZ] = llclamp( mClipboardPos.mV[VZ], 0.f, 4096.f);
+
+ self->mCtrlPosX->set( mClipboardPos.mV[VX] );
+ self->mCtrlPosY->set( mClipboardPos.mV[VY] );
+ self->mCtrlPosZ->set( mClipboardPos.mV[VZ] );
+
+ calcp->setVar(LLCalc::X_POS, mClipboardPos.mV[VX]);
+ calcp->setVar(LLCalc::Y_POS, mClipboardPos.mV[VY]);
+ calcp->setVar(LLCalc::Z_POS, mClipboardPos.mV[VZ]);
+ self->sendPosition(FALSE);
+}
+
+void LLPanelObject::onPasteSize(void* user_data)
+{
+ if(mClipboardSize.isNull()) return;
+
+ LLPanelObject* self = (LLPanelObject*) user_data;
+ LLCalc* calcp = LLCalc::getInstance();
+ mClipboardSize.mV[VX] = llclamp(mClipboardSize.mV[VX], 0.01f, 10.f);
+ mClipboardSize.mV[VY] = llclamp(mClipboardSize.mV[VY], 0.01f, 10.f);
+ mClipboardSize.mV[VZ] = llclamp(mClipboardSize.mV[VZ], 0.01f, 10.f);
+
+ self->mCtrlScaleX->set( mClipboardSize.mV[VX] );
+ self->mCtrlScaleY->set( mClipboardSize.mV[VY] );
+ self->mCtrlScaleZ->set( mClipboardSize.mV[VZ] );
+
+ calcp->setVar(LLCalc::X_SCALE, mClipboardSize.mV[VX]);
+ calcp->setVar(LLCalc::Y_SCALE, mClipboardSize.mV[VY]);
+ calcp->setVar(LLCalc::Z_SCALE, mClipboardSize.mV[VZ]);
+ self->sendScale(FALSE);
+}
+
+void LLPanelObject::onPasteRot(void* user_data)
+{
+ LLPanelObject* self = (LLPanelObject*) user_data;
+ LLCalc* calcp = LLCalc::getInstance();
+
+ self->mCtrlRotX->set( mClipboardRot.mV[VX] );
+ self->mCtrlRotY->set( mClipboardRot.mV[VY] );
+ self->mCtrlRotZ->set( mClipboardRot.mV[VZ] );
+
+ calcp->setVar(LLCalc::X_ROT, mClipboardRot.mV[VX]);
+ calcp->setVar(LLCalc::Y_ROT, mClipboardRot.mV[VY]);
+ calcp->setVar(LLCalc::Z_ROT, mClipboardRot.mV[VZ]);
+ self->sendRotation(FALSE);
+}
+
+BOOL getvectorfromclip(const std::string& buf, LLVector3* value)
+{
+ if( buf.empty() || value == NULL)
+ {
+ return FALSE;
+ }
+
+ LLVector3 v;
+ S32 count = sscanf( buf.c_str(), "<%f, %f, %f>", v.mV + 0, v.mV + 1, v.mV + 2 );
+ if( 3 == count )
+ {
+ value->setVec( v );
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
+void LLPanelObject::onPastePosClip(void* user_data)
+{
+ LLPanelObject* self = (LLPanelObject*) user_data;
+ LLCalc* calcp = LLCalc::getInstance();
+
+ LLWString temp_string;
+ LLView::getWindow()->pasteTextFromClipboard(temp_string);
+
+ std::string stringVec = wstring_to_utf8str(temp_string);
+ if(!getvectorfromclip(stringVec, &mClipboardPos)) return;
+
+ mClipboardPos.mV[VX] = llclamp(mClipboardPos.mV[VX], 0.f, 256.f);
+ mClipboardPos.mV[VY] = llclamp(mClipboardPos.mV[VY], 0.f, 256.f);
+ mClipboardPos.mV[VZ] = llclamp(mClipboardPos.mV[VZ], 0.f, 4096.f);
+
+ self->mCtrlPosX->set( mClipboardPos.mV[VX] );
+ self->mCtrlPosY->set( mClipboardPos.mV[VY] );
+ self->mCtrlPosZ->set( mClipboardPos.mV[VZ] );
+ calcp->setVar(LLCalc::X_POS, mClipboardPos.mV[VX]);
+ calcp->setVar(LLCalc::Y_POS, mClipboardPos.mV[VY]);
+ calcp->setVar(LLCalc::Z_POS, mClipboardPos.mV[VZ]);
+ self->sendPosition(FALSE);
+}
+
+void LLPanelObject::onPasteSizeClip(void* user_data)
+{
+ LLPanelObject* self = (LLPanelObject*) user_data;
+ LLCalc* calcp = LLCalc::getInstance();
+
+ LLWString temp_string;
+ LLView::getWindow()->pasteTextFromClipboard(temp_string);
+
+ std::string stringVec = wstring_to_utf8str(temp_string);
+ if(!getvectorfromclip(stringVec, &mClipboardSize)) return;
+
+ mClipboardSize.mV[VX] = llclamp(mClipboardSize.mV[VX], 0.01f, 10.f);
+ mClipboardSize.mV[VY] = llclamp(mClipboardSize.mV[VY], 0.01f, 10.f);
+ mClipboardSize.mV[VZ] = llclamp(mClipboardSize.mV[VZ], 0.01f, 10.f);
+
+ self->mCtrlScaleX->set( mClipboardSize.mV[VX] );
+ self->mCtrlScaleY->set( mClipboardSize.mV[VY] );
+ self->mCtrlScaleZ->set( mClipboardSize.mV[VZ] );
+ calcp->setVar(LLCalc::X_SCALE, mClipboardSize.mV[VX]);
+ calcp->setVar(LLCalc::Y_SCALE, mClipboardSize.mV[VY]);
+ calcp->setVar(LLCalc::Z_SCALE, mClipboardSize.mV[VZ]);
+ self->sendScale(FALSE);
+}
+
+void LLPanelObject::onPasteRotClip(void* user_data)
+{
+ LLPanelObject* self = (LLPanelObject*) user_data;
+ LLCalc* calcp = LLCalc::getInstance();
+
+ LLWString temp_string;
+ LLView::getWindow()->pasteTextFromClipboard(temp_string);
+
+ std::string stringVec = wstring_to_utf8str(temp_string);
+ if(!getvectorfromclip(stringVec, &mClipboardRot)) return;
+
+ self->mCtrlRotX->set( mClipboardRot.mV[VX] );
+ self->mCtrlRotY->set( mClipboardRot.mV[VY] );
+ self->mCtrlRotZ->set( mClipboardRot.mV[VZ] );
+ calcp->setVar(LLCalc::X_ROT, mClipboardRot.mV[VX]);
+ calcp->setVar(LLCalc::Y_ROT, mClipboardRot.mV[VY]);
+ calcp->setVar(LLCalc::Z_ROT, mClipboardRot.mV[VZ]);
+ self->sendRotation(FALSE);
+ }
diff --git a/linden/indra/newview/llpanelobject.h b/linden/indra/newview/llpanelobject.h
index 2aa5ae1..f86eb46 100644
--- a/linden/indra/newview/llpanelobject.h
+++ b/linden/indra/newview/llpanelobject.h
@@ -74,6 +74,16 @@ public:
static void onCommitPhantom( LLUICtrl* ctrl, void* userdata);
static void onCommitCastShadows( LLUICtrl* ctrl, void* userdata);
+ static void onCopyPos( void* user_data);
+ static void onPastePos( void* user_data);
+ static void onPastePosClip( void* user_data);
+ static void onCopySize( void* user_data);
+ static void onPasteSize( void* user_data);
+ static void onPasteSizeClip( void* user_data);
+ static void onCopyRot( void* user_data);
+ static void onPasteRot( void* user_data);
+ static void onPasteRotClip( void* user_data);
+
static void onCommitParametric(LLUICtrl* ctrl, void* userdata);
static void onCommitMaterial( LLUICtrl* ctrl, void* userdata);
@@ -101,6 +111,11 @@ protected:
void getVolumeParams(LLVolumeParams& volume_params);
protected:
+
+ static LLVector3 mClipboardPos;
+ static LLVector3 mClipboardSize;
+ static LLVector3 mClipboardRot;
+
S32 mComboMaterialItemCount;
LLTextBox* mLabelMaterial;
@@ -163,6 +178,21 @@ protected:
LLSpinCtrl* mCtrlRotY;
LLSpinCtrl* mCtrlRotZ;
+ LLButton *mBtnCopyPos;
+ LLButton *mBtnPastePos;
+ LLButton *mBtnPastePosClip;
+
+ LLButton *mBtnCopySize;
+ LLButton *mBtnPasteSize;
+ LLButton *mBtnPasteSizeClip;
+
+ LLButton *mBtnCopyRot;
+ LLButton *mBtnPasteRot;
+ LLButton *mBtnPasteRotClip;
+
+ LLButton *mBtnCopyParams;
+ LLButton *mBtnPasteParams;
+
LLCheckBoxCtrl *mCheckLock;
LLCheckBoxCtrl *mCheckPhysics;
LLCheckBoxCtrl *mCheckTemporary;
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml b/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
index a82e308..58c6443 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
@@ -645,6 +645,16 @@
increment="0.01" initial_val="0" label="Z" label_width="10" left="10"
max_val="4096" min_val="0" mouse_opaque="true" name="Pos Z"
text_enabled_color="0, 67, 132, 255" width="96" />
+
+
+
+
+
+
+
+
+
+
+
+
getMaxHeight());
self->mCtrlPosX->set( mClipboardPos.mV[VX] );
self->mCtrlPosY->set( mClipboardPos.mV[VY] );
@@ -2262,9 +2262,9 @@ void LLPanelObject::onPasteSize(void* user_data)
LLPanelObject* self = (LLPanelObject*) user_data;
LLCalc* calcp = LLCalc::getInstance();
- mClipboardSize.mV[VX] = llclamp(mClipboardSize.mV[VX], 0.01f, 10.f);
- mClipboardSize.mV[VY] = llclamp(mClipboardSize.mV[VY], 0.01f, 10.f);
- mClipboardSize.mV[VZ] = llclamp(mClipboardSize.mV[VZ], 0.01f, 10.f);
+ mClipboardSize.mV[VX] = llclamp(mClipboardSize.mV[VX], gHippoLimits->getMinPrimScale(), gHippoLimits->getMaxPrimScale());
+ mClipboardSize.mV[VY] = llclamp(mClipboardSize.mV[VY], gHippoLimits->getMinPrimScale(), gHippoLimits->getMaxPrimScale());
+ mClipboardSize.mV[VZ] = llclamp(mClipboardSize.mV[VZ], gHippoLimits->getMinPrimScale(), gHippoLimits->getMaxPrimScale());
self->mCtrlScaleX->set( mClipboardSize.mV[VX] );
self->mCtrlScaleY->set( mClipboardSize.mV[VY] );
@@ -2323,7 +2323,7 @@ void LLPanelObject::onPastePosClip(void* user_data)
mClipboardPos.mV[VX] = llclamp(mClipboardPos.mV[VX], 0.f, 256.f);
mClipboardPos.mV[VY] = llclamp(mClipboardPos.mV[VY], 0.f, 256.f);
- mClipboardPos.mV[VZ] = llclamp(mClipboardPos.mV[VZ], 0.f, 4096.f);
+ mClipboardPos.mV[VZ] = llclamp(mClipboardPos.mV[VZ], 0.f, gHippoLimits->getMaxHeight());
self->mCtrlPosX->set( mClipboardPos.mV[VX] );
self->mCtrlPosY->set( mClipboardPos.mV[VY] );
@@ -2345,9 +2345,9 @@ void LLPanelObject::onPasteSizeClip(void* user_data)
std::string stringVec = wstring_to_utf8str(temp_string);
if(!getvectorfromclip(stringVec, &mClipboardSize)) return;
- mClipboardSize.mV[VX] = llclamp(mClipboardSize.mV[VX], 0.01f, 10.f);
- mClipboardSize.mV[VY] = llclamp(mClipboardSize.mV[VY], 0.01f, 10.f);
- mClipboardSize.mV[VZ] = llclamp(mClipboardSize.mV[VZ], 0.01f, 10.f);
+ mClipboardSize.mV[VX] = llclamp(mClipboardSize.mV[VX], gHippoLimits->getMinPrimScale(), gHippoLimits->getMaxPrimScale());
+ mClipboardSize.mV[VY] = llclamp(mClipboardSize.mV[VY], gHippoLimits->getMinPrimScale(), gHippoLimits->getMaxPrimScale());
+ mClipboardSize.mV[VZ] = llclamp(mClipboardSize.mV[VZ], gHippoLimits->getMinPrimScale(), gHippoLimits->getMaxPrimScale());
self->mCtrlScaleX->set( mClipboardSize.mV[VX] );
self->mCtrlScaleY->set( mClipboardSize.mV[VY] );
--
cgit v1.1
From 8e9305f67843672a758cbc15c9dcd2123c87613c Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Mon, 23 Aug 2010 11:28:14 -0700
Subject: Added 'Copy Key' button to the build general tab
---
linden/indra/newview/llpanelpermissions.cpp | 52 ++++++++++++++++++++++
linden/indra/newview/llpanelpermissions.h | 1 +
.../skins/default/xui/en-us/floater_tools.xml | 4 ++
.../newview/skins/default/xui/en-us/strings.xml | 3 ++
4 files changed, 60 insertions(+)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llpanelpermissions.cpp b/linden/indra/newview/llpanelpermissions.cpp
index d541bce..afe2de4 100644
--- a/linden/indra/newview/llpanelpermissions.cpp
+++ b/linden/indra/newview/llpanelpermissions.cpp
@@ -54,13 +54,16 @@
#include "llstatusbar.h" // for getBalance()
#include "lllineeditor.h"
#include "llradiogroup.h"
+#include "llchat.h"
#include "llcombobox.h"
#include "llfloateravatarinfo.h"
+#include "llfloaterchat.h"
#include "lluiconstants.h"
#include "lldbstrings.h"
#include "llfloatergroupinfo.h"
#include "llfloatergroups.h"
#include "llnamebox.h"
+#include "lltrans.h"
#include "llviewercontrol.h"
#include "lluictrlfactory.h"
#include "roles_constants.h"
@@ -96,6 +99,8 @@ BOOL LLPanelPermissions::postBuild()
this->childSetAction("button deed",LLPanelPermissions::onClickDeedToGroup,this);
+ this->childSetAction("button copy key",LLPanelPermissions::onClickCopyObjKey,this);
+
this->childSetCommitCallback("checkbox allow everyone move",LLPanelPermissions::onCommitEveryoneMove,this);
this->childSetCommitCallback("checkbox allow everyone copy",LLPanelPermissions::onCommitEveryoneCopy,this);
@@ -259,6 +264,8 @@ void LLPanelPermissions::refresh()
childSetVisible("N:",false);
childSetVisible("F:",false);
+ childSetEnabled("button copy key",false);
+
return;
}
@@ -844,6 +851,8 @@ void LLPanelPermissions::refresh()
}
childSetEnabled("label click action",is_perm_modify && all_volume);
childSetEnabled("clickaction",is_perm_modify && all_volume);
+
+ childSetEnabled("button copy key",true);
}
@@ -977,6 +986,49 @@ void LLPanelPermissions::onClickDeedToGroup(void* data)
LLNotifications::instance().add( "DeedObjectToGroup", args, LLSD(), callback_deed_to_group);
}
+void LLPanelPermissions::onClickCopyObjKey(void* data)
+{
+ std::string output;
+ std::string keys;
+ const std::string separator = ", ";
+ LLChat chat;
+ chat.mSourceType = CHAT_SOURCE_SYSTEM;
+
+ for (LLObjectSelection::root_iterator iter = LLSelectMgr::getInstance()->getSelection()->root_begin();
+ iter != LLSelectMgr::getInstance()->getSelection()->root_end(); iter++)
+ {
+ LLSelectNode* selectNode = *iter;
+ LLViewerObject* object = selectNode->getObject();
+ if (object)
+ {
+ if (!output.empty())
+ {
+ output.append(separator);
+ }
+ output.append(selectNode->mName);
+ output.append(": ");
+ output.append(object->getID().asString());
+
+ if (!keys.empty())
+ {
+ keys.append(separator);
+ }
+ keys.append(object->getID().asString());
+ }
+ }
+
+ if (!output.empty())
+ {
+ chat.mText = LLTrans::getString("copy_obj_key_info") + "\n" + output;
+ LLFloaterChat::addChat(chat);
+ }
+
+ if (!keys.empty())
+ {
+ gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(keys));
+ }
+}
+
///----------------------------------------------------------------------------
/// Permissions checkboxes
///----------------------------------------------------------------------------
diff --git a/linden/indra/newview/llpanelpermissions.h b/linden/indra/newview/llpanelpermissions.h
index 9fa4cce..d8451e4 100644
--- a/linden/indra/newview/llpanelpermissions.h
+++ b/linden/indra/newview/llpanelpermissions.h
@@ -74,6 +74,7 @@ protected:
static void onClickGroup(void*);
static void cbGroupID(LLUUID group_id, void* userdata);
static void onClickDeedToGroup(void*);
+ static void onClickCopyObjKey(void*);
static void onCommitPerm(LLUICtrl *ctrl, void *data, U8 field, U32 perm);
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml b/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
index 58c6443..6210cdd 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
@@ -466,6 +466,10 @@
Contents
+
[FIRST_NAME] [LAST_NAME] on [GRID_NAME]
+
+ Copied key(s) for:
+
Logging in. [APP_NAME] may appear frozen. Please wait.
--
cgit v1.1
From 837a8292c07d6f5c067dc37fc3fb15db2d9f32c0 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Mon, 23 Aug 2010 11:32:27 -0700
Subject: Fixed 'Anyone can:' text not disabling in the build window
---
linden/indra/newview/llpanelpermissions.cpp | 3 +++
linden/indra/newview/skins/default/xui/en-us/floater_tools.xml | 2 +-
2 files changed, 4 insertions(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llpanelpermissions.cpp b/linden/indra/newview/llpanelpermissions.cpp
index afe2de4..fc05744 100644
--- a/linden/indra/newview/llpanelpermissions.cpp
+++ b/linden/indra/newview/llpanelpermissions.cpp
@@ -222,6 +222,7 @@ void LLPanelPermissions::refresh()
childSetEnabled("checkbox allow everyone copy",false);
//Next owner can:
+ childSetEnabled("Anyone can:",false);
childSetEnabled("Next owner can:",false);
childSetValue("checkbox next owner can modify",FALSE);
childSetEnabled("checkbox next owner can modify",false);
@@ -651,12 +652,14 @@ void LLPanelPermissions::refresh()
if (has_change_perm_ability)
{
+ childSetEnabled("Anyone can:", TRUE);
childSetEnabled("checkbox share with group",true);
childSetEnabled("checkbox allow everyone move",owner_mask_on & PERM_MOVE);
childSetEnabled("checkbox allow everyone copy",owner_mask_on & PERM_COPY && owner_mask_on & PERM_TRANSFER);
}
else
{
+ childSetEnabled("Anyone can:", FALSE);
childSetEnabled("checkbox share with group", FALSE);
childSetEnabled("checkbox allow everyone move", FALSE);
childSetEnabled("checkbox allow everyone copy", FALSE);
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml b/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
index 6210cdd..29cd547 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
@@ -473,7 +473,7 @@
+ mouse_opaque="true" name="Anyone can:" v_pad="0" width="250">
Anyone Can:
- Path cut Begin and End:
+ Path Cut Begin and End:
- Profile cut Begin and End:
+ Profile Cut Begin and End:
Value
0
+ VivoxLicenseAccepted
+
+ Comment
+ By setting to true, you agree to accept the Vivox personal license agreement at http://www.vivox.com/vivox_aup.html
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 0
+
WarnFirstAO
Comment
@@ -910,6 +921,17 @@
Value
1
+ WarnFirstVoiceLicense
+
+ Comment
+ Enables FirstVoiceLicense window on login
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 1
+
DefaultGrid
Comment
@@ -4564,7 +4586,7 @@
Type
Boolean
Value
- 1
+ 0
EnergyFromTop
diff --git a/linden/indra/newview/floatervoicelicense.cpp b/linden/indra/newview/floatervoicelicense.cpp
new file mode 100644
index 0000000..4004290
--- /dev/null
+++ b/linden/indra/newview/floatervoicelicense.cpp
@@ -0,0 +1,237 @@
+/**
+* @file floatervoicelicense.cpp
+* @brief prompts user to agree to the Vivox license in order to enable voice
+*
+* $LicenseInfo:firstyear=2009&license=viewergpl$
+*
+* Copyright (c) 2010, McCabe Maxsted
+*
+* Imprudence Viewer Source Code
+* The source code in this file ("Source Code") is provided to you
+* under the terms of the GNU General Public License, version 2.0
+* ("GPL"). Terms of the GPL can be found in doc/GPL-license.txt in
+* this distribution, or online at
+* http://secondlifegrid.net/programs/open_source/licensing/gplv2
+*
+* There are special exceptions to the terms and conditions of the GPL as
+* it is applied to this Source Code. View the full text of the exception
+* in the file doc/FLOSS-exception.txt in this software distribution, or
+* online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+*
+* By copying, modifying or distributing this software, you acknowledge
+* that you have read and understood your obligations described above,
+* and agree to abide by those obligations.
+*
+* ALL SOURCE CODE IS PROVIDED "AS IS." THE AUTHOR MAKES NO
+* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+* COMPLETENESS OR PERFORMANCE.
+* $/LicenseInfo$
+*/
+
+#include "llviewerprecompiledheaders.h"
+
+#include "floatervoicelicense.h"
+
+// viewer includes
+#include "llagent.h"
+#include "llappviewer.h"
+#include "llstartup.h"
+#include "llviewercontrol.h"
+#include "llviewerstats.h"
+#include "llviewertexteditor.h"
+#include "llviewerwindow.h"
+
+// linden library includes
+#include "llbutton.h"
+#include "llhttpclient.h"
+#include "llhttpstatuscodes.h" // for HTTP_FOUND
+#include "llradiogroup.h"
+#include "lltextbox.h"
+#include "llui.h"
+#include "lluictrlfactory.h"
+#include "llvfile.h"
+#include "message.h"
+
+
+FloaterVoiceLicense::FloaterVoiceLicense(const LLSD& key)
+: LLModalDialog( std::string(" "), 100, 100 ),
+ mWebBrowserWindowId( 0 ),
+ mLoadCompleteCount( 0 )
+{
+ LLUICtrlFactory::getInstance()->buildFloater(this, "floater_voice_license.xml");
+}
+
+// helper class that trys to download a URL from a web site and calls a method
+// on parent class indicating if the web server is working or not
+class LLIamHere : public LLHTTPClient::Responder
+{
+ private:
+ LLIamHere( FloaterVoiceLicense* parent ) :
+ mParent( parent )
+ {}
+
+ FloaterVoiceLicense* mParent;
+
+ public:
+
+ static boost::intrusive_ptr< LLIamHere > build( FloaterVoiceLicense* parent )
+ {
+ return boost::intrusive_ptr< LLIamHere >( new LLIamHere( parent ) );
+ };
+
+ virtual void setParent( FloaterVoiceLicense* parentIn )
+ {
+ mParent = parentIn;
+ };
+
+ virtual void result( const LLSD& content )
+ {
+ if ( mParent )
+ mParent->setSiteIsAlive( true );
+ };
+
+ virtual void error( U32 status, const std::string& reason )
+ {
+ if ( mParent )
+ {
+ // *HACK: For purposes of this alive check, 302 Found
+ // (aka Moved Temporarily) is considered alive. The web site
+ // redirects this link to a "cache busting" temporary URL. JC
+ bool alive = (status == HTTP_FOUND);
+ mParent->setSiteIsAlive( alive );
+ }
+ };
+};
+
+// this is global and not a class member to keep crud out of the header file
+namespace {
+ boost::intrusive_ptr< LLIamHere > gResponsePtr = 0;
+};
+
+BOOL FloaterVoiceLicense::postBuild()
+{
+ childSetAction("Continue", onContinue, this);
+ childSetAction("Cancel", onCancel, this);
+ childSetCommitCallback("agree_chk", updateAgree, this);
+
+ // disable Agree to License radio button until the page has fully loaded
+ LLCheckBoxCtrl* license_agreement = getChild("agree_chk");
+ license_agreement->setEnabled( false );
+
+ // hide the SL text widget if we're displaying license with using a browser widget.
+ LLTextEditor *editor = getChild("license_text");
+ editor->setVisible( FALSE );
+
+ LLWebBrowserCtrl* web_browser = getChild("license_html");
+ if ( web_browser )
+ {
+ // start to observe it so we see navigate complete events
+ web_browser->addObserver( this );
+
+ gResponsePtr = LLIamHere::build( this );
+ LLHTTPClient::get( getString( "real_url" ), gResponsePtr );
+ }
+
+ return TRUE;
+}
+
+void FloaterVoiceLicense::setSiteIsAlive( bool alive )
+{
+ LLWebBrowserCtrl* web_browser = getChild("license_html");
+ // if the contents of the site was retrieved
+ if ( alive )
+ {
+ if ( web_browser )
+ {
+ // navigate to the "real" page
+ web_browser->navigateTo( getString( "real_url" ) );
+ }
+ }
+ else
+ {
+ // normally this is set when navigation to license page completes (so you can't accept before it loads)
+ // but if the page is unavailable, we need to do this now
+ LLCheckBoxCtrl* license_agreement = getChild("agree_chk");
+ license_agreement->setEnabled( true );
+ }
+}
+
+FloaterVoiceLicense::~FloaterVoiceLicense()
+{
+ // stop observing events
+ LLWebBrowserCtrl* web_browser = getChild("license_html");
+ if ( web_browser )
+ {
+ web_browser->remObserver( this );
+ }
+
+ // tell the responder we're not here anymore
+ if ( gResponsePtr )
+ {
+ gResponsePtr->setParent( 0 );
+ }
+}
+
+// virtual
+void FloaterVoiceLicense::draw()
+{
+ // draw children
+ LLModalDialog::draw();
+}
+
+// static
+void FloaterVoiceLicense::updateAgree(LLUICtrl*, void* userdata )
+{
+ FloaterVoiceLicense* self = (FloaterVoiceLicense*) userdata;
+ bool agree = self->childGetValue("agree_chk").asBoolean();
+ self->childSetEnabled("Continue", agree);
+}
+
+// static
+void FloaterVoiceLicense::onContinue( void* userdata )
+{
+ FloaterVoiceLicense* self = (FloaterVoiceLicense*) userdata;
+ llinfos << "User agreed to the Vivox personal license" << llendl;
+
+ // enabling voice by default here seems like the best behavior
+ gSavedSettings.setBOOL("EnableVoiceChat", TRUE);
+ gSavedSettings.setBOOL("VivoxLicenseAccepted", TRUE);
+
+ // save these settings in case something bad happens later
+ gSavedSettings.saveToFile(gSavedSettings.getString("ClientSettingsFile"), TRUE);
+
+ if (LLStartUp::getStartupState() == STATE_LOGIN_VOICE_LICENSE)
+ {
+ LLStartUp::setStartupState( STATE_LOGIN_AUTH_INIT ); // Go back and finish authentication
+ }
+ self->close(); // destroys this object
+}
+
+// static
+void FloaterVoiceLicense::onCancel( void* userdata )
+{
+ FloaterVoiceLicense* self = (FloaterVoiceLicense*) userdata;
+ llinfos << "User disagreed with the vivox personal license" << llendl;
+ gSavedSettings.setBOOL("EnableVoiceChat", FALSE);
+ gSavedSettings.setBOOL("VivoxLicenseAccepted", FALSE);
+
+ if (LLStartUp::getStartupState() == STATE_LOGIN_VOICE_LICENSE)
+ {
+ LLStartUp::setStartupState( STATE_LOGIN_AUTH_INIT ); // Go back and finish authentication
+ }
+ self->mLoadCompleteCount = 0; // reset counter for next time we come here
+ self->close(); // destroys this object
+}
+
+//virtual
+void FloaterVoiceLicense::onNavigateComplete( const EventType& eventIn )
+{
+ // skip past the loading screen navigate complete
+ if ( ++mLoadCompleteCount == 2 )
+ {
+ llinfos << "NAVIGATE COMPLETE" << llendl;
+ // enable Agree to License radio button now that page has loaded
+ LLCheckBoxCtrl * license_agreement = getChild("agree_chk");
+ license_agreement->setEnabled( true );
+ }
+}
diff --git a/linden/indra/newview/floatervoicelicense.h b/linden/indra/newview/floatervoicelicense.h
new file mode 100644
index 0000000..4130d22
--- /dev/null
+++ b/linden/indra/newview/floatervoicelicense.h
@@ -0,0 +1,72 @@
+/**
+* @file floatervoicelicense.h
+* @brief prompts user to agree to the Vivox license in order to enable voice
+*
+* $LicenseInfo:firstyear=2009&license=viewergpl$
+*
+* Copyright (c) 2010, McCabe Maxsted
+*
+* Imprudence Viewer Source Code
+* The source code in this file ("Source Code") is provided to you
+* under the terms of the GNU General Public License, version 2.0
+* ("GPL"). Terms of the GPL can be found in doc/GPL-license.txt in
+* this distribution, or online at
+* http://secondlifegrid.net/programs/open_source/licensing/gplv2
+*
+* There are special exceptions to the terms and conditions of the GPL as
+* it is applied to this Source Code. View the full text of the exception
+* in the file doc/FLOSS-exception.txt in this software distribution, or
+* online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+*
+* By copying, modifying or distributing this software, you acknowledge
+* that you have read and understood your obligations described above,
+* and agree to abide by those obligations.
+*
+* ALL SOURCE CODE IS PROVIDED "AS IS." THE AUTHOR MAKES NO
+* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+* COMPLETENESS OR PERFORMANCE.
+* $/LicenseInfo$
+*/
+
+#ifndef FLOATERVOICELICENSE_H
+#define FLOATERVOICELICENSE_H
+
+#include "llfloater.h"
+
+#include "llmodaldialog.h"
+#include "llassetstorage.h"
+#include "llwebbrowserctrl.h"
+
+class LLButton;
+class LLRadioGroup;
+class LLVFS;
+class LLTextEditor;
+class LLUUID;
+
+class FloaterVoiceLicense :
+ public LLModalDialog,
+ public LLWebBrowserCtrlObserver,
+ public LLFloaterSingleton
+{
+public:
+ FloaterVoiceLicense(const LLSD& key);
+ virtual ~FloaterVoiceLicense();
+
+ BOOL postBuild();
+
+ virtual void draw();
+
+ static void updateAgree( LLUICtrl *, void* userdata );
+ static void onContinue( void* userdata );
+ static void onCancel( void* userdata );
+
+ void setSiteIsAlive( bool alive );
+
+ virtual void onNavigateComplete( const EventType& eventIn );
+
+private:
+ int mWebBrowserWindowId;
+ int mLoadCompleteCount;
+};
+
+#endif // FLOATERVOICELICENSE_H
diff --git a/linden/indra/newview/llfirstuse.cpp b/linden/indra/newview/llfirstuse.cpp
index 886bb94..e82aa96 100644
--- a/linden/indra/newview/llfirstuse.cpp
+++ b/linden/indra/newview/llfirstuse.cpp
@@ -45,9 +45,11 @@
#include "llappviewer.h"
#include "lltracker.h"
-#include "llvoavatar.h"
#include "floatergriddefault.h"
+#include "floatervoicelicense.h"
#include "hippoGridManager.h"
+#include "llstartup.h"
+#include "llvoavatar.h"
// static
std::set LLFirstUse::sConfigVariables;
@@ -387,3 +389,19 @@ void LLFirstUse::useLoginScreen()
FloaterGridDefault::getInstance()->center();
}
}
+
+// static
+void LLFirstUse::voiceLicenseAgreement()
+{
+ if (gSavedSettings.getWarning("FirstVoiceLicense"))
+ {
+ gSavedSettings.setWarning("FirstVoiceLicense", FALSE);
+
+ FloaterVoiceLicense::getInstance()->open();
+ FloaterVoiceLicense::getInstance()->center();
+ }
+ else // currently in STATE_LOGIN_VOICE_LICENSE when arriving here
+ {
+ LLStartUp::setStartupState(STATE_LOGIN_AUTH_INIT);
+ }
+}
diff --git a/linden/indra/newview/llfirstuse.h b/linden/indra/newview/llfirstuse.h
index c77f0b2..b0bf05f 100644
--- a/linden/indra/newview/llfirstuse.h
+++ b/linden/indra/newview/llfirstuse.h
@@ -115,6 +115,7 @@ public:
static void useLoginScreen();
static void callbackClientTags(const LLSD& notification, const LLSD& response);
static void ClientTags();
+ static void voiceLicenseAgreement();
protected:
static std::set sConfigVariables;
diff --git a/linden/indra/newview/llprefsvoice.cpp b/linden/indra/newview/llprefsvoice.cpp
index 167e079..2d6eeb0 100644
--- a/linden/indra/newview/llprefsvoice.cpp
+++ b/linden/indra/newview/llprefsvoice.cpp
@@ -35,6 +35,7 @@
#include "llprefsvoice.h"
+#include "floatervoicelicense.h"
#include "llcheckboxctrl.h"
#include "llfloatervoicedevicesettings.h"
#include "llfocusmgr.h"
@@ -136,8 +137,6 @@ BOOL LLPrefsVoice::postBuild()
void LLPrefsVoice::apply()
{
- gSavedSettings.setBOOL("EnableVoiceChat", childGetValue("enable_voice_check"));
-
gSavedSettings.setString("PushToTalkButton", childGetValue("modifier_combo"));
gSavedSettings.setBOOL("VoiceCallsFriendsOnly", childGetValue("voice_call_friends_only_check"));
gSavedSettings.setBOOL("AutoDisengageMic", childGetValue("auto_disengage_mic_check"));
@@ -149,6 +148,18 @@ void LLPrefsVoice::apply()
{
voice_device_settings->apply();
}
+
+ bool enable_voice = childGetValue("enable_voice_check");
+ if (enable_voice && !gSavedSettings.getBOOL("VivoxLicenseAccepted"))
+ {
+ // This window enables voice chat if license is accepted
+ FloaterVoiceLicense::getInstance()->open();
+ FloaterVoiceLicense::getInstance()->center();
+ }
+ else
+ {
+ gSavedSettings.setBOOL("EnableVoiceChat", enable_voice);
+ }
}
void LLPrefsVoice::cancel()
diff --git a/linden/indra/newview/llstartup.cpp b/linden/indra/newview/llstartup.cpp
index e438f0c..3f55fd8 100644
--- a/linden/indra/newview/llstartup.cpp
+++ b/linden/indra/newview/llstartup.cpp
@@ -1045,12 +1045,30 @@ bool idle_startup()
// color init must be after saved settings loaded
init_colors();
- // skipping over STATE_UPDATE_CHECK because that just waits for input
- LLStartUp::setStartupState( STATE_LOGIN_AUTH_INIT );
+ if (gSavedSettings.getBOOL("VivoxLicenseAccepted"))
+ {
+ // skipping over STATE_LOGIN_VOICE_LICENSE since we don't need it
+ // skipping over STATE_UPDATE_CHECK because that just waits for input
+ LLStartUp::setStartupState( STATE_LOGIN_AUTH_INIT );
+ }
+ else
+ {
+ LLStartUp::setStartupState(STATE_LOGIN_VOICE_LICENSE);
+ LLFirstUse::voiceLicenseAgreement();
+ }
return FALSE;
}
+ if (STATE_LOGIN_VOICE_LICENSE == LLStartUp::getStartupState())
+ {
+ LL_DEBUGS("AppInitStartupState") << "STATE_LOGIN_VOICE_LICENSE" << LL_ENDL;
+ // prompt the user to agree to the voice license before enabling voice.
+ // only send users here on first login, otherwise continue
+ // on to STATE_LOGIN_AUTH_INIT
+ return FALSE;
+ }
+
if (STATE_UPDATE_CHECK == LLStartUp::getStartupState())
{
LL_DEBUGS("AppInitStartupState") << "STATE_UPDATE_CHECK" << LL_ENDL;
@@ -3642,6 +3660,7 @@ std::string LLStartUp::startupStateToString(EStartupState state)
RTNENUM( STATE_LOGIN_SHOW );
RTNENUM( STATE_LOGIN_WAIT );
RTNENUM( STATE_LOGIN_CLEANUP );
+ RTNENUM( STATE_LOGIN_VOICE_LICENSE );
RTNENUM( STATE_UPDATE_CHECK );
RTNENUM( STATE_LOGIN_AUTH_INIT );
RTNENUM( STATE_LOGIN_AUTHENTICATE );
diff --git a/linden/indra/newview/llstartup.h b/linden/indra/newview/llstartup.h
index 65bfc68..9a3c91c 100644
--- a/linden/indra/newview/llstartup.h
+++ b/linden/indra/newview/llstartup.h
@@ -50,6 +50,7 @@ typedef enum {
STATE_LOGIN_SHOW, // Show login screen
STATE_LOGIN_WAIT, // Wait for user input at login screen
STATE_LOGIN_CLEANUP, // Get rid of login screen and start login
+ STATE_LOGIN_VOICE_LICENSE, // Show license agreement for using voice
STATE_UPDATE_CHECK, // Wait for user at a dialog box (updates, term-of-service, etc)
STATE_LOGIN_AUTH_INIT, // Start login to SL servers
STATE_LOGIN_AUTHENTICATE, // Do authentication voodoo
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_voice_license.xml b/linden/indra/newview/skins/default/xui/en-us/floater_voice_license.xml
new file mode 100644
index 0000000..3a2b0be
--- /dev/null
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_voice_license.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+Please read the following license carefully.
+To use voice, you must accept the license agreement.
+
+
+ LICENSE_TEXT
+
+
+
+
+ http://www.vivox.com/vivox_aup.html
+
+
\ No newline at end of file
--
cgit v1.1
From 07bc301791229bb46691cb2a721b9788f8de6ed0 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Mon, 23 Aug 2010 21:10:44 -0700
Subject: Renamed 'Reset Voice' to 'Reconnect to Voice' for clarity
---
.../indra/newview/skins/default/xui/en-us/panel_preferences_voice.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_voice.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_voice.xml
index 8e6fc0d..1ec3fcd 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_voice.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_voice.xml
@@ -77,8 +77,8 @@
label="Device Settings" left="28" mouse_opaque="true"
name="device_settings_btn" width="155" />
+ label="Reconnect to Voice" left_delta="160" mouse_opaque="true"
+ name="reset_voice" width="160" />
childSetEnabled("set_voice_hotkey_button", enable);
self->childSetEnabled("set_voice_middlemouse_button", enable);
self->childSetEnabled("device_settings_btn", enable);
+ self->childSetEnabled("reset_voice", enable);
}
//static
--
cgit v1.1
From b190be8d292b2d2fbd02b370ba143103e0adfaaa Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sun, 22 Aug 2010 19:38:52 -0700
Subject: Wip - mute group chat
---
linden/indra/newview/llappviewer.cpp | 2 +
linden/indra/newview/llimview.cpp | 116 +++++++++++++++++++++
linden/indra/newview/llimview.h | 8 ++
linden/indra/newview/llpanelgroupgeneral.cpp | 29 ++++++
linden/indra/newview/llpanelgroupgeneral.h | 1 +
linden/indra/newview/llviewerwindow.cpp | 4 +
.../default/xui/en-us/panel_group_general.xml | 5 +
7 files changed, 165 insertions(+)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llappviewer.cpp b/linden/indra/newview/llappviewer.cpp
index d757ba6..52535bc 100644
--- a/linden/indra/newview/llappviewer.cpp
+++ b/linden/indra/newview/llappviewer.cpp
@@ -3734,6 +3734,8 @@ void LLAppViewer::idleShutdown()
// close IM interface
if(gIMMgr)
{
+ // Save group chat ignore list -- MC
+ gIMMgr->saveIgnoreGroup();
gIMMgr->disconnectAllSessions();
}
diff --git a/linden/indra/newview/llimview.cpp b/linden/indra/newview/llimview.cpp
index 790e20b..2ad743b 100644
--- a/linden/indra/newview/llimview.cpp
+++ b/linden/indra/newview/llimview.cpp
@@ -53,6 +53,7 @@
#include "llhttpnode.h"
#include "llimpanel.h"
#include "llresizebar.h"
+#include "llsdserialize.h"
#include "lltabcontainer.h"
#include "llviewercontrol.h"
#include "llfloater.h"
@@ -534,6 +535,8 @@ LLIMMgr::LLIMMgr() :
mPendingInvitations = LLSD::emptyMap();
mPendingAgentListUpdates = LLSD::emptyMap();
+
+ loadIgnoreGroup();
}
LLIMMgr::~LLIMMgr()
@@ -594,6 +597,30 @@ void LLIMMgr::addMessage(
// create IM window as necessary
if(!floater)
{
+ if (!mIgnoreGroupList.empty())
+ {
+ // Check to see if we're blocking this group's chat
+ LLGroupData *group_data = NULL;
+
+ // Search for this group in the agent's groups list
+ LLDynamicArray::iterator i;
+
+ for (i = gAgent.mGroups.begin(); i != gAgent.mGroups.end(); i++)
+ {
+ if (i->mID == session_id)
+ {
+ group_data = &*i;
+ break;
+ }
+ }
+
+ // If the group is in our list then return
+ if (group_data && (mIgnoreGroupList.count(group_data->mID) == 1))
+ {
+ return;
+ }
+ }
+
std::string name = from;
if(!session_name.empty() && session_name.size()>1)
{
@@ -1275,6 +1302,95 @@ void LLIMMgr::updateFloaterSessionID(
}
}
+void LLIMMgr::loadIgnoreGroup()
+{
+ // Load groups we want to ignore in chat -- MC
+ std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "ignore_groups.xml");
+
+ LLSD settings_llsd;
+ llifstream file;
+ file.open(filename);
+ if (file.is_open())
+ {
+ llinfos << "loading ignore_groups.xml" << llendl;
+ LLSDSerialize::fromXML(settings_llsd, file);
+ }
+ else
+ {
+ llinfos << "creating blank ignore_groups.xml" << llendl;
+ FILE* fp = LLFile::fopen(filename, "w+");
+ fclose(fp);
+ }
+
+ for (LLSD::map_const_iterator iter = settings_llsd.beginMap();
+ iter != settings_llsd.endMap(); ++iter)
+ {
+ llinfos << "group chat for id " << iter->first << " is ignored? " << iter->second << llendl;
+ mIgnoreGroupList.insert(std::make_pair(LLUUID(iter->first), (bool)(iter->second.asBoolean())));
+ }
+}
+
+void LLIMMgr::saveIgnoreGroup()
+{
+ // Save groups we want to ignore in chat before killing gIMMgr
+ std::string user_dir = gDirUtilp->getLindenUserDir();
+ if (!user_dir.empty())
+ {
+ llinfos << "saving ignore_groups.xml" << llendl;
+ std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "ignore_groups.xml");
+ LLSD settings_llsd;
+
+ for(std::map::iterator iter = mIgnoreGroupList.begin();
+ iter != mIgnoreGroupList.end(); ++iter)
+ {
+ settings_llsd[iter->first.asString()] = iter->second;
+ }
+
+ llofstream file;
+ file.open(filename);
+ LLSDSerialize::toPrettyXML(settings_llsd, file);
+ }
+}
+
+void LLIMMgr::updateIgnoreGroup(const LLUUID& group_id, const bool& ignore)
+{
+ if (group_id.notNull())
+ {
+ std::map::iterator found_it = mIgnoreGroupList.find(group_id);
+ if (found_it != mIgnoreGroupList.end())
+ {
+ llinfos << "existing group " << group_id << " updated to " << ignore << llendl;
+ mIgnoreGroupList[group_id] = ignore;
+ }
+ else
+ {
+ llinfos << "new group " << group_id << " created and set to " << ignore << llendl;
+ mIgnoreGroupList.insert(std::make_pair(group_id, ignore));
+ }
+ }
+}
+
+bool LLIMMgr::getIgnoreGroup(const LLUUID& group_id)
+{
+ if (group_id.notNull())
+ {
+ std::map::iterator found_it = mIgnoreGroupList.find(group_id);
+ if (found_it != mIgnoreGroupList.end())
+ {
+ llinfos << "group found in ignore_groups.xml, " << found_it->second << llendl;
+ return found_it->second;
+ }
+ }
+ llinfos << "no group info found in ignore_groups.xml" << llendl;
+ return false;
+}
+
+
+//////////////////////
+///// ChatterBox /////
+//////////////////////
+
+
LLFloaterChatterBox* LLIMMgr::getFloater()
{
return LLFloaterChatterBox::getInstance(LLSD());
diff --git a/linden/indra/newview/llimview.h b/linden/indra/newview/llimview.h
index b03036b..a7a088a 100644
--- a/linden/indra/newview/llimview.h
+++ b/linden/indra/newview/llimview.h
@@ -172,6 +172,12 @@ public:
//HACK: need a better way of enumerating existing session, or listening to session create/destroy events
const std::set >& getIMFloaterHandles() { return mFloaters; }
+ void loadIgnoreGroup();
+ void saveIgnoreGroup();
+ void updateIgnoreGroup(const LLUUID& group_id, const bool& ignore);
+ // Returns true if group chat is ignored for the UUID, false if not
+ bool getIgnoreGroup(const LLUUID& group_id);
+
private:
// create a panel and update internal representation for
// consistency. Returns the pointer, caller (the class instance
@@ -211,6 +217,8 @@ private:
LLSD mPendingInvitations;
LLSD mPendingAgentListUpdates;
+
+ std::map mIgnoreGroupList;
};
diff --git a/linden/indra/newview/llpanelgroupgeneral.cpp b/linden/indra/newview/llpanelgroupgeneral.cpp
index 8006981..402929e 100644
--- a/linden/indra/newview/llpanelgroupgeneral.cpp
+++ b/linden/indra/newview/llpanelgroupgeneral.cpp
@@ -47,6 +47,7 @@
#include "llcheckboxctrl.h"
#include "llcombobox.h"
#include "lldbstrings.h"
+#include "llimview.h"
#include "lllineeditor.h"
#include "llnamebox.h"
#include "llnamelistctrl.h"
@@ -89,6 +90,7 @@ LLPanelGroupGeneral::LLPanelGroupGeneral(const std::string& name,
mCtrlEnrollmentFee(NULL),
mSpinEnrollmentFee(NULL),
mCtrlReceiveNotices(NULL),
+ mCtrlReceiveChat(NULL),
mCtrlListGroup(NULL),
mActiveTitleLabel(NULL),
mComboActiveTitle(NULL)
@@ -217,6 +219,15 @@ BOOL LLPanelGroupGeneral::postBuild()
mCtrlReceiveNotices->set(accept_notices);
mCtrlReceiveNotices->setEnabled(data.mID.notNull());
}
+
+ mCtrlReceiveChat = getChild("receive_chat", recurse);
+ if (mCtrlReceiveChat)
+ {
+ mCtrlReceiveChat->setCommitCallback(onCommitUserOnly);
+ mCtrlReceiveChat->setCallbackUserData(this);
+ mCtrlReceiveChat->set(!gIMMgr->getIgnoreGroup(mGroupID));
+ mCtrlReceiveChat->setEnabled(mGroupID.notNull());
+ }
mCtrlListGroup = getChild("list_groups_in_profile", recurse);
if (mCtrlListGroup)
@@ -534,6 +545,7 @@ bool LLPanelGroupGeneral::apply(std::string& mesg)
}
BOOL receive_notices = false;
+ BOOL receive_chat = false;
BOOL list_in_profile = false;
if (mCtrlReceiveNotices)
receive_notices = mCtrlReceiveNotices->get();
@@ -542,6 +554,15 @@ bool LLPanelGroupGeneral::apply(std::string& mesg)
gAgent.setUserGroupFlags(mGroupID, receive_notices, list_in_profile);
+ if (mCtrlReceiveChat)
+ {
+ receive_chat = mCtrlReceiveChat->get();
+ }
+
+ gIMMgr->updateIgnoreGroup(mGroupID, receive_chat);
+ // Save here too in case we crash somewhere down the road -- MC
+ gIMMgr->saveIgnoreGroup();
+
mChanged = FALSE;
return true;
@@ -758,6 +779,13 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)
mCtrlReceiveNotices->resetDirty();
}
+ if (mCtrlReceiveChat)
+ {
+ mCtrlReceiveChat->setVisible(is_member);
+ mCtrlReceiveChat->setEnabled(TRUE);
+ mCtrlReceiveChat->resetDirty();
+ }
+
if (mInsignia) mInsignia->setEnabled(mAllowEdit && can_change_ident);
if (mEditCharter) mEditCharter->setEnabled(mAllowEdit && can_change_ident);
@@ -902,6 +930,7 @@ void LLPanelGroupGeneral::updateChanged()
mCtrlEnrollmentFee,
mSpinEnrollmentFee,
mCtrlReceiveNotices,
+ mCtrlReceiveChat,
mCtrlListGroup,
mActiveTitleLabel,
mComboActiveTitle
diff --git a/linden/indra/newview/llpanelgroupgeneral.h b/linden/indra/newview/llpanelgroupgeneral.h
index 7135667..c4572e2 100644
--- a/linden/indra/newview/llpanelgroupgeneral.h
+++ b/linden/indra/newview/llpanelgroupgeneral.h
@@ -107,6 +107,7 @@ private:
LLCheckBoxCtrl *mCtrlEnrollmentFee;
LLSpinCtrl *mSpinEnrollmentFee;
LLCheckBoxCtrl *mCtrlReceiveNotices;
+ LLCheckBoxCtrl *mCtrlReceiveChat;
LLCheckBoxCtrl *mCtrlListGroup;
LLTextBox *mActiveTitleLabel;
LLComboBox *mComboActiveTitle;
diff --git a/linden/indra/newview/llviewerwindow.cpp b/linden/indra/newview/llviewerwindow.cpp
index c89e0c5..dd27726 100644
--- a/linden/indra/newview/llviewerwindow.cpp
+++ b/linden/indra/newview/llviewerwindow.cpp
@@ -1660,6 +1660,10 @@ void LLViewerWindow::initWorldUI()
mRootView->addChild(gHoverView);
gIMMgr = LLIMMgr::getInstance();
+ if (gIMMgr)
+ {
+ gIMMgr->loadIgnoreGroup();
+ }
if ( gSavedPerAccountSettings.getBOOL("LogShowHistory") )
{
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_group_general.xml b/linden/indra/newview/skins/default/xui/en-us/panel_group_general.xml
index 3e2a34a..a967a90 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_group_general.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_group_general.xml
@@ -129,6 +129,11 @@ Hover your mouse over the options for more help.
mouse_opaque="true" name="receive_notices" radio_style="false"
tool_tip="Sets whether you want to receive Notices from this group. Uncheck this box if this group is spamming you."
width="95" />
+
mID) == 1))
+ if (group_data && getIgnoreGroup(group_data->mID))
{
+ // llinfos << "ignoring chat from group " << group_data->mID << llendl;
return;
}
}
@@ -1304,7 +1303,6 @@ void LLIMMgr::updateFloaterSessionID(
void LLIMMgr::loadIgnoreGroup()
{
- // Load groups we want to ignore in chat -- MC
std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "ignore_groups.xml");
LLSD settings_llsd;
@@ -1312,38 +1310,41 @@ void LLIMMgr::loadIgnoreGroup()
file.open(filename);
if (file.is_open())
{
- llinfos << "loading ignore_groups.xml" << llendl;
+ // llinfos << "loading group chat ignore from " << filename << "..." << llendl;
LLSDSerialize::fromXML(settings_llsd, file);
+
+ mIgnoreGroupList.clear();
+
+ for(LLSD::array_const_iterator iter = settings_llsd.beginArray();
+ iter != settings_llsd.endArray(); ++iter)
+ {
+ // llinfos << "added " << iter->asUUID()
+ // << " to group chat ignore list" << llendl;
+ mIgnoreGroupList.push_back( iter->asUUID() );
+ }
}
else
{
- llinfos << "creating blank ignore_groups.xml" << llendl;
- FILE* fp = LLFile::fopen(filename, "w+");
- fclose(fp);
- }
-
- for (LLSD::map_const_iterator iter = settings_llsd.beginMap();
- iter != settings_llsd.endMap(); ++iter)
- {
- llinfos << "group chat for id " << iter->first << " is ignored? " << iter->second << llendl;
- mIgnoreGroupList.insert(std::make_pair(LLUUID(iter->first), (bool)(iter->second.asBoolean())));
+ // llinfos << "can't load " << filename
+ // << " (probably it doesn't exist yet)" << llendl;
}
}
void LLIMMgr::saveIgnoreGroup()
{
- // Save groups we want to ignore in chat before killing gIMMgr
+ // llinfos << "saving ignore_groups.xml" << llendl;
+
std::string user_dir = gDirUtilp->getLindenUserDir();
if (!user_dir.empty())
{
- llinfos << "saving ignore_groups.xml" << llendl;
std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "ignore_groups.xml");
- LLSD settings_llsd;
- for(std::map::iterator iter = mIgnoreGroupList.begin();
- iter != mIgnoreGroupList.end(); ++iter)
+ LLSD settings_llsd = LLSD::emptyArray();
+
+ for(std::list::iterator iter = mIgnoreGroupList.begin();
+ iter != mIgnoreGroupList.end(); ++iter)
{
- settings_llsd[iter->first.asString()] = iter->second;
+ settings_llsd.append(*iter);
}
llofstream file;
@@ -1356,16 +1357,27 @@ void LLIMMgr::updateIgnoreGroup(const LLUUID& group_id, const bool& ignore)
{
if (group_id.notNull())
{
- std::map::iterator found_it = mIgnoreGroupList.find(group_id);
- if (found_it != mIgnoreGroupList.end())
+ std::list::iterator found =
+ std::find( mIgnoreGroupList.begin(), mIgnoreGroupList.end(),
+ group_id);
+
+ if (found != mIgnoreGroupList.end() && !ignore)
{
- llinfos << "existing group " << group_id << " updated to " << ignore << llendl;
- mIgnoreGroupList[group_id] = ignore;
+ // change from ignored to not ignored
+ // llinfos << "unignoring group " << group_id << llendl;
+ mIgnoreGroupList.remove(group_id);
+ }
+ else if (found == mIgnoreGroupList.end() && ignore)
+ {
+ // change from not ignored to ignored
+ // llinfos << "ignoring group " << group_id << llendl;
+ mIgnoreGroupList.push_back(group_id);
}
else
{
- llinfos << "new group " << group_id << " created and set to " << ignore << llendl;
- mIgnoreGroupList.insert(std::make_pair(group_id, ignore));
+ // nothing to do
+ // llinfos << "no change to group " << group_id << ", it is already "
+ // << (ignore ? "" : "not ") << "ignored" << llendl;
}
}
}
@@ -1374,14 +1386,17 @@ bool LLIMMgr::getIgnoreGroup(const LLUUID& group_id)
{
if (group_id.notNull())
{
- std::map::iterator found_it = mIgnoreGroupList.find(group_id);
- if (found_it != mIgnoreGroupList.end())
+ std::list::iterator found =
+ std::find( mIgnoreGroupList.begin(), mIgnoreGroupList.end(),
+ group_id);
+
+ if (found != mIgnoreGroupList.end())
{
- llinfos << "group found in ignore_groups.xml, " << found_it->second << llendl;
- return found_it->second;
+ // llinfos << "group " << group_id << " is ignored." << llendl;
+ return true;
}
}
- llinfos << "no group info found in ignore_groups.xml" << llendl;
+ // llinfos << "group " << group_id << " is not ignored." << llendl;
return false;
}
diff --git a/linden/indra/newview/llimview.h b/linden/indra/newview/llimview.h
index a7a088a..8f665d2 100644
--- a/linden/indra/newview/llimview.h
+++ b/linden/indra/newview/llimview.h
@@ -218,7 +218,7 @@ private:
LLSD mPendingInvitations;
LLSD mPendingAgentListUpdates;
- std::map mIgnoreGroupList;
+ std::list mIgnoreGroupList;
};
diff --git a/linden/indra/newview/llpanelgroupgeneral.cpp b/linden/indra/newview/llpanelgroupgeneral.cpp
index 402929e..55e1b33 100644
--- a/linden/indra/newview/llpanelgroupgeneral.cpp
+++ b/linden/indra/newview/llpanelgroupgeneral.cpp
@@ -545,7 +545,6 @@ bool LLPanelGroupGeneral::apply(std::string& mesg)
}
BOOL receive_notices = false;
- BOOL receive_chat = false;
BOOL list_in_profile = false;
if (mCtrlReceiveNotices)
receive_notices = mCtrlReceiveNotices->get();
@@ -556,13 +555,12 @@ bool LLPanelGroupGeneral::apply(std::string& mesg)
if (mCtrlReceiveChat)
{
- receive_chat = mCtrlReceiveChat->get();
+ bool receive_chat = mCtrlReceiveChat->get();
+ gIMMgr->updateIgnoreGroup(mGroupID, !receive_chat);
+ // Save here too in case we crash somewhere down the road -- MC
+ gIMMgr->saveIgnoreGroup();
}
- gIMMgr->updateIgnoreGroup(mGroupID, receive_chat);
- // Save here too in case we crash somewhere down the road -- MC
- gIMMgr->saveIgnoreGroup();
-
mChanged = FALSE;
return true;
diff --git a/linden/indra/newview/llstartup.cpp b/linden/indra/newview/llstartup.cpp
index 3f55fd8..0464e99 100644
--- a/linden/indra/newview/llstartup.cpp
+++ b/linden/indra/newview/llstartup.cpp
@@ -111,6 +111,7 @@
#include "llhudmanager.h"
#include "llhttpclient.h"
#include "llimagebmp.h"
+#include "llimview.h" // for gIMMgr
#include "llinventorymodel.h"
#include "llinventoryview.h"
#include "llkeyboard.h"
@@ -1716,6 +1717,9 @@ bool idle_startup()
gHippoGridManager->saveFile();
gHippoLimits->setLimits();
+ // Load list of groups to ignore incoming chat from.
+ gIMMgr->loadIgnoreGroup();
+
// JC: gesture loading done below, when we have an asset system
// in place. Don't delete/clear user_credentials until then.
diff --git a/linden/indra/newview/llviewerwindow.cpp b/linden/indra/newview/llviewerwindow.cpp
index dd27726..c89e0c5 100644
--- a/linden/indra/newview/llviewerwindow.cpp
+++ b/linden/indra/newview/llviewerwindow.cpp
@@ -1660,10 +1660,6 @@ void LLViewerWindow::initWorldUI()
mRootView->addChild(gHoverView);
gIMMgr = LLIMMgr::getInstance();
- if (gIMMgr)
- {
- gIMMgr->loadIgnoreGroup();
- }
if ( gSavedPerAccountSettings.getBOOL("LogShowHistory") )
{
--
cgit v1.1
From 84f27010e68df8b078c9ce5b87ccbb9d5edc9ceb Mon Sep 17 00:00:00 2001
From: Patrick Sapinski
Date: Tue, 24 Aug 2010 03:13:27 -0400
Subject: automatically add all XUI to solution
---
linden/indra/newview/CMakeLists.txt | 233 +++---------------------------------
1 file changed, 14 insertions(+), 219 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/CMakeLists.txt b/linden/indra/newview/CMakeLists.txt
index 6decbf6..7dfe3d2 100644
--- a/linden/indra/newview/CMakeLists.txt
+++ b/linden/indra/newview/CMakeLists.txt
@@ -1095,228 +1095,23 @@ if (WINDOWS)
endif (WINDOWS)
# Add the xui files. This is handy for searching for xui elements
-# from within the IDE
+# from within the IDE.
+
+file(GLOB viewer_XUI_FILE_GLOB_LIST
+ ${CMAKE_CURRENT_SOURCE_DIR}/skins/default/xui/en-us/*.xml)
+
set(viewer_XUI_FILES
- skins/default/colors.xml
- skins/default/colors_base.xml
- skins/default/xui/en-us/alerts.xml
- skins/default/xui/en-us/floater_about_land.xml
- skins/default/xui/en-us/floater_about.xml
- skins/default/xui/en-us/floater_active_speakers.xml
- skins/default/xui/en-us/floater_animation_list.xml
- skins/default/xui/en-us/floater_animation_preview.xml
- skins/default/xui/en-us/floater_ao.xml
- skins/default/xui/en-us/floater_area_search.xml
- skins/default/xui/en-us/floater_asset_browser.xml
- skins/default/xui/en-us/floater_auction.xml
- skins/default/xui/en-us/floater_audio_volume.xml
- skins/default/xui/en-us/floater_avatar_picker.xml
- skins/default/xui/en-us/floater_avatar_textures.xml
- skins/default/xui/en-us/floater_beacons.xml
- skins/default/xui/en-us/floater_build_options.xml
- skins/default/xui/en-us/floater_bulk_perms.xml
- skins/default/xui/en-us/floater_bumps.xml
- skins/default/xui/en-us/floater_busy.xml
- skins/default/xui/en-us/floater_buy_contents.xml
- skins/default/xui/en-us/floater_buy_currency.xml
- skins/default/xui/en-us/floater_buy_land.xml
- skins/default/xui/en-us/floater_buy_object.xml
- skins/default/xui/en-us/floater_camera.xml
- skins/default/xui/en-us/floater_chat_history.xml
- skins/default/xui/en-us/floater_chatterbox.xml
- skins/default/xui/en-us/floater_chatterbox_vertical.xml
- skins/default/xui/en-us/floater_choose_group.xml
- skins/default/xui/en-us/floater_color_picker.xml
- skins/default/xui/en-us/floater_critical.xml
- skins/default/xui/en-us/floater_customize.xml
- skins/default/xui/en-us/floater_day_cycle_options.xml
- skins/default/xui/en-us/floater_device_settings.xml
- skins/default/xui/en-us/floater_directory.xml
- skins/default/xui/en-us/floater_env_settings.xml
- skins/default/xui/en-us/floater_font_test.xml
- skins/default/xui/en-us/floater_gesture.xml
- skins/default/xui/en-us/floater_god_tools.xml
- skins/default/xui/en-us/floater_grid_default_selector.xml
- skins/default/xui/en-us/floater_grid_manager.xml
- skins/default/xui/en-us/floater_group_info.xml
- skins/default/xui/en-us/floater_group_titles.xml
- skins/default/xui/en-us/floater_hardware_settings.xml
- skins/default/xui/en-us/floater_html.xml
- skins/default/xui/en-us/floater_html_simple.xml
- skins/default/xui/en-us/floater_hud.xml
- skins/default/xui/en-us/floater_image_preview.xml
- skins/default/xui/en-us/floater_im.xml
- skins/default/xui/en-us/floater_inspect.xml
- skins/default/xui/en-us/floater_instant_message_ad_hoc.xml
- skins/default/xui/en-us/floater_instant_message_group.xml
- skins/default/xui/en-us/floater_instant_message.xml
- skins/default/xui/en-us/floater_inventory_item_properties.xml
- skins/default/xui/en-us/floater_inventory_view_finder.xml
- skins/default/xui/en-us/floater_inventory.xml
- skins/default/xui/en-us/floater_joystick.xml
- skins/default/xui/en-us/floater_lagmeter.xml
- skins/default/xui/en-us/floater_land_holdings.xml
- skins/default/xui/en-us/floater_landmark_ctrl.xml
- skins/default/xui/en-us/floater_live_lsleditor.xml
- skins/default/xui/en-us/floater_lsl_guide.xml
- skins/default/xui/en-us/floater_media_browser.xml
- skins/default/xui/en-us/floater_mem_leaking.xml
- skins/default/xui/en-us/floater_mini_map.xml
- skins/default/xui/en-us/floater_moveview.xml
- skins/default/xui/en-us/floater_mute_object.xml
- skins/default/xui/en-us/floater_mute.xml
- skins/default/xui/en-us/floater_my_friends.xml
- skins/default/xui/en-us/floater_name_description.xml
- skins/default/xui/en-us/floater_new_im.xml
- skins/default/xui/en-us/floater_new_outfit_dialog.xml
- skins/default/xui/en-us/floater_notifications_console.xml
- skins/default/xui/en-us/floater_notification.xml
- skins/default/xui/en-us/floater_object_im_info.xml
- skins/default/xui/en-us/floater_openobject.xml
- skins/default/xui/en-us/floater_pay_object.xml
- skins/default/xui/en-us/floater_pay.xml
- skins/default/xui/en-us/floater_postcard.xml
- skins/default/xui/en-us/floater_post_process.xml
- skins/default/xui/en-us/floater_perm_prefs.xml
- skins/default/xui/en-us/floater_preferences.xml
- skins/default/xui/en-us/floater_preview_animation.xml
- skins/default/xui/en-us/floater_preview_classified.xml
- skins/default/xui/en-us/floater_preview_embedded_texture.xml
- skins/default/xui/en-us/floater_preview_event.xml
- skins/default/xui/en-us/floater_preview_existing_landmark.xml
- skins/default/xui/en-us/floater_preview_gesture.xml
- skins/default/xui/en-us/floater_preview_notecard_keep_discard.xml
- skins/default/xui/en-us/floater_preview_notecard.xml
- skins/default/xui/en-us/floater_preview_sound.xml
- skins/default/xui/en-us/floater_preview_texture_keep_discard.xml
- skins/default/xui/en-us/floater_preview_texture.xml
- skins/default/xui/en-us/floater_preview_url.xml
- skins/default/xui/en-us/floater_price_for_listing.xml
- skins/default/xui/en-us/floater_profile.xml
- skins/default/xui/en-us/floater_region_info.xml
- skins/default/xui/en-us/floater_report_abuse.xml
- skins/default/xui/en-us/floater_report_bug.xml
- skins/default/xui/en-us/floater_rlv_behaviour.xml
- skins/default/xui/en-us/floater_script_debug.xml
- skins/default/xui/en-us/floater_script_ed_panel.xml
- skins/default/xui/en-us/floater_script_preview.xml
- skins/default/xui/en-us/floater_script_queue.xml
- skins/default/xui/en-us/floater_script_search.xml
- skins/default/xui/en-us/floater_search_replace.xml
- skins/default/xui/en-us/floater_select_key.xml
- skins/default/xui/en-us/floater_sell_land.xml
- skins/default/xui/en-us/floater_settings_debug.xml
- skins/default/xui/en-us/floater_sim_release_message.xml
- skins/default/xui/en-us/floater_snapshot.xml
- skins/default/xui/en-us/floater_sound_preview.xml
- skins/default/xui/en-us/floater_statistics.xml
- skins/default/xui/en-us/floater_telehub.xml
- skins/default/xui/en-us/floater_test.xml
- skins/default/xui/en-us/floater_texture_ctrl.xml
- skins/default/xui/en-us/floater_tools.xml
- skins/default/xui/en-us/floater_top_objects.xml
- skins/default/xui/en-us/floater_tos.xml
- skins/default/xui/en-us/floater_url_entry.xml
- skins/default/xui/en-us/floater_voice_license.xml
- skins/default/xui/en-us/floater_voice_wizard.xml
- skins/default/xui/en-us/floater_water.xml
- skins/default/xui/en-us/floater_wearable_save_as.xml
- skins/default/xui/en-us/floater_windlight_options.xml
- skins/default/xui/en-us/floater_world_map.xml
- skins/default/xui/en-us/fonts.xml
- skins/default/xui/en-us/legacy_menu_pie_attachment.xml
- skins/default/xui/en-us/legacy_menu_pie_avatar.xml
- skins/default/xui/en-us/legacy_menu_pie_land.xml
- skins/default/xui/en-us/legacy_menu_pie_object.xml
- skins/default/xui/en-us/legacy_menu_pie_self.xml
- skins/default/xui/en-us/menu_inventory.xml
- skins/default/xui/en-us/menu_login.xml
- skins/default/xui/en-us/menu_mini_map.xml
- skins/default/xui/en-us/menu_pie_attachment.xml
- skins/default/xui/en-us/menu_pie_avatar.xml
- skins/default/xui/en-us/menu_pie_hud.xml
- skins/default/xui/en-us/menu_pie_land.xml
- skins/default/xui/en-us/menu_pie_object.xml
- skins/default/xui/en-us/menu_pie_self.xml
- skins/default/xui/en-us/menu_slurl.xml
- skins/default/xui/en-us/menu_viewer.xml
- skins/default/xui/en-us/mime_types.xml
- skins/default/xui/en-us/notifications.xml
- skins/default/xui/en-us/notify.xml
- skins/default/xui/en-us/panel_ao_remote_controls.xml
- skins/default/xui/en-us/panel_ao_remote.xml
- skins/default/xui/en-us/panel_ao_remote_expanded.xml
- skins/default/xui/en-us/panel_audio_device.xml
- skins/default/xui/en-us/panel_audio.xml
- skins/default/xui/en-us/panel_avatar_classified.xml
- skins/default/xui/en-us/panel_avatar_pick.xml
- skins/default/xui/en-us/panel_avatar.xml
- skins/default/xui/en-us/panel_bars.xml
- skins/default/xui/en-us/panel_bg_tab.xml
- skins/default/xui/en-us/panel_bg_toolbar.xml
- skins/default/xui/en-us/panel_chat_bar.xml
- skins/default/xui/en-us/panel_classified.xml
- skins/default/xui/en-us/panel_event.xml
- skins/default/xui/en-us/panel_friends.xml
- skins/default/xui/en-us/panel_group_finder.xml
- skins/default/xui/en-us/panel_group_general.xml
- skins/default/xui/en-us/panel_group_invite.xml
- skins/default/xui/en-us/panel_group_land_money.xml
- skins/default/xui/en-us/panel_group_notices.xml
- skins/default/xui/en-us/panel_group_roles.xml
- skins/default/xui/en-us/panel_groups.xml
- skins/default/xui/en-us/panel_group_voting.xml
- skins/default/xui/en-us/panel_group.xml
- skins/default/xui/en-us/panel_login.xml
- skins/default/xui/en-us/panel_master_volume.xml
- skins/default/xui/en-us/panel_media_controls.xml
- skins/default/xui/en-us/panel_media_remote_expanded.xml
- skins/default/xui/en-us/panel_media_remote.xml
- skins/default/xui/en-us/panel_mini_map.xml
- skins/default/xui/en-us/panel_notifications_channel.xml
- skins/default/xui/en-us/panel_overlaybar.xml
- skins/default/xui/en-us/panel_place_small.xml
- skins/default/xui/en-us/panel_place.xml
- skins/default/xui/en-us/panel_preferences_advanced.xml
- skins/default/xui/en-us/panel_preferences_audio.xml
- skins/default/xui/en-us/panel_preferences_chat.xml
- skins/default/xui/en-us/panel_preferences_general.xml
- skins/default/xui/en-us/panel_preferences_graphics1.xml
- skins/default/xui/en-us/panel_preferences_im.xml
- skins/default/xui/en-us/panel_preferences_input.xml
- skins/default/xui/en-us/panel_preferences_network.xml
- skins/default/xui/en-us/panel_preferences_popups.xml
- skins/default/xui/en-us/panel_preferences_skins.xml
- skins/default/xui/en-us/panel_preferences_voice.xml
- skins/default/xui/en-us/panel_preferences_web.xml
- skins/default/xui/en-us/panel_progress.xml
- skins/default/xui/en-us/panel_radar.xml
- skins/default/xui/en-us/panel_region_covenant.xml
- skins/default/xui/en-us/panel_region_debug.xml
- skins/default/xui/en-us/panel_region_estate.xml
- skins/default/xui/en-us/panel_region_general.xml
- skins/default/xui/en-us/panel_region_terrain.xml
- skins/default/xui/en-us/panel_region_texture.xml
- skins/default/xui/en-us/panel_scrolling_param.xml
- skins/default/xui/en-us/panel_speaker_controls.xml
- skins/default/xui/en-us/panel_status_bar.xml
- skins/default/xui/en-us/panel_toolbar.xml
- skins/default/xui/en-us/panel_top_pick.xml
- skins/default/xui/en-us/panel_voice_controls.xml
- skins/default/xui/en-us/panel_voice_enable.xml
- skins/default/xui/en-us/panel_voice_options.xml
- skins/default/xui/en-us/panel_voice_remote_expanded.xml
- skins/default/xui/en-us/panel_voice_remote.xml
- skins/default/xui/en-us/panel_windlight_controls.xml
- skins/default/xui/en-us/panel_windlight_remote.xml
- skins/default/xui/en-us/panel_windlight_remote_expanded.xml
- skins/default/xui/en-us/role_actions.xml
- skins/default/xui/en-us/strings.xml
- skins/default/xui/en-us/teleport_strings.xml
- skins/default/xui/en-us/ui_strings.xml
- skins/default/xui/en-us/xui_version.xml
+
+ ${CMAKE_CURRENT_SOURCE_DIR}/skins/default/colors.xml
+ ${CMAKE_CURRENT_SOURCE_DIR}/skins/default/colors_base.xml
+
+
+
)
+list(APPEND viewer_XUI_FILES ${viewer_XUI_FILE_GLOB_LIST})
+list(SORT viewer_XUI_FILES)
+
source_group("XUI Files" FILES ${viewer_XUI_FILES})
set_source_files_properties(${viewer_XUI_FILES}
--
cgit v1.1
From 7d7f0c9dace25b67f8d01de99a61816a9ffae753 Mon Sep 17 00:00:00 2001
From: Frederick Martian
Date: Tue, 24 Aug 2010 08:54:38 +0200
Subject: Added column in friends list to display the fact if they let us map
them
---
linden/indra/newview/llfloaterfriends.cpp | 17 +++++++++++++++++
linden/indra/newview/llfloaterfriends.h | 2 ++
.../newview/skins/default/xui/de/panel_friends.xml | 2 ++
.../newview/skins/default/xui/en-us/panel_friends.xml | 2 ++
4 files changed, 23 insertions(+)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llfloaterfriends.cpp b/linden/indra/newview/llfloaterfriends.cpp
index d7b00d6..e18e705 100644
--- a/linden/indra/newview/llfloaterfriends.cpp
+++ b/linden/indra/newview/llfloaterfriends.cpp
@@ -265,6 +265,18 @@ BOOL LLPanelFriends::addFriend(const LLUUID& agent_id)
edit_my_object_column["type"] = "checkbox";
edit_my_object_column["value"] = relationInfo->isRightGrantedTo(LLRelationship::GRANT_MODIFY_OBJECTS);
+// LLSD& online_their_column = element["columns"][LIST_VISIBLE_ONLINE_THEIRS];
+// online_their_column["column"] = "icon_visible_online_theirs";
+// online_their_column["type"] = "checkbox";
+// online_their_column["enabled"] = "";
+// online_their_column["value"] = relationInfo->isRightGrantedFrom(LLRelationship::GRANT_ONLINE_STATUS);
+
+ LLSD& map_their_column = element["columns"][LIST_VISIBLE_MAP_THEIRS];
+ map_their_column["column"] = "icon_visible_map_theirs";
+ map_their_column["type"] = "checkbox";
+ map_their_column["enabled"] = "";
+ map_their_column["value"] = relationInfo->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION);
+
LLSD& edit_their_object_column = element["columns"][LIST_EDIT_THEIRS];
edit_their_object_column["column"] = "icon_edit_theirs";
edit_their_object_column["type"] = "checkbox";
@@ -313,6 +325,11 @@ BOOL LLPanelFriends::updateFriendItem(const LLUUID& agent_id, const LLRelationsh
itemp->getColumn(LIST_VISIBLE_ONLINE)->setValue(info->isRightGrantedTo(LLRelationship::GRANT_ONLINE_STATUS));
itemp->getColumn(LIST_VISIBLE_MAP)->setValue(info->isRightGrantedTo(LLRelationship::GRANT_MAP_LOCATION));
itemp->getColumn(LIST_EDIT_MINE)->setValue(info->isRightGrantedTo(LLRelationship::GRANT_MODIFY_OBJECTS));
+
+// itemp->getColumn(LIST_VISIBLE_ONLINE_THEIRS)->setValue(info->isRightGrantedFrom(LLRelationship::GRANT_ONLINE_STATUS));
+ itemp->getColumn(LIST_VISIBLE_MAP_THEIRS)->setValue(info->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION));
+ itemp->getColumn(LIST_EDIT_THEIRS)->setValue(info->isRightGrantedFrom(LLRelationship::GRANT_MODIFY_OBJECTS));
+
S32 change_generation = have_name ? info->getChangeSerialNum() : -1;
itemp->getColumn(LIST_FRIEND_UPDATE_GEN)->setValue(change_generation);
diff --git a/linden/indra/newview/llfloaterfriends.h b/linden/indra/newview/llfloaterfriends.h
index a5c94ee..f7f0b32 100644
--- a/linden/indra/newview/llfloaterfriends.h
+++ b/linden/indra/newview/llfloaterfriends.h
@@ -92,6 +92,8 @@ private:
LIST_VISIBLE_ONLINE,
LIST_VISIBLE_MAP,
LIST_EDIT_MINE,
+// LIST_VISIBLE_ONLINE_THEIRS,
+ LIST_VISIBLE_MAP_THEIRS,
LIST_EDIT_THEIRS,
LIST_FRIEND_UPDATE_GEN
};
diff --git a/linden/indra/newview/skins/default/xui/de/panel_friends.xml b/linden/indra/newview/skins/default/xui/de/panel_friends.xml
index bb2adb3..cd56366 100644
--- a/linden/indra/newview/skins/default/xui/de/panel_friends.xml
+++ b/linden/indra/newview/skins/default/xui/de/panel_friends.xml
@@ -11,6 +11,8 @@
+
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_friends.xml b/linden/indra/newview/skins/default/xui/en-us/panel_friends.xml
index bf7acd4..0854c99 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_friends.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_friends.xml
@@ -17,6 +17,8 @@
tool_tip="Friend can locate you on the map" width="20" />
+
--
cgit v1.1
From 5b2516d28d199b328e98e78feb8b7f16edac8a42 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Wed, 25 Aug 2010 00:17:04 -0700
Subject: Fixed minimum size of the Contacts window
---
linden/indra/newview/skins/default/xui/en-us/floater_my_friends.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_my_friends.xml b/linden/indra/newview/skins/default/xui/en-us/floater_my_friends.xml
index c5d817b..d4ebfb8 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_my_friends.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_my_friends.xml
@@ -1,6 +1,6 @@
_@
---
linden/indra/llvfs/lldir.cpp | 24 ++++++++++++++++--------
1 file changed, 16 insertions(+), 8 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/llvfs/lldir.cpp b/linden/indra/llvfs/lldir.cpp
index e4df977..af55593 100644
--- a/linden/indra/llvfs/lldir.cpp
+++ b/linden/indra/llvfs/lldir.cpp
@@ -542,19 +542,23 @@ void LLDir::setLindenUserDir(const std::string &grid, const std::string &first,
{
// some platforms have case-sensitive filesystems, so be
// utterly consistent with our firstname/lastname case.
- std::string gridlower(grid);
- LLStringUtil::toLower(gridlower);
std::string firstlower(first);
LLStringUtil::toLower(firstlower);
std::string lastlower(last);
LLStringUtil::toLower(lastlower);
mLindenUserDir = getOSUserAppDir();
mLindenUserDir += mDirDelimiter;
- mLindenUserDir += gridlower;
- mLindenUserDir += "-";
mLindenUserDir += firstlower;
mLindenUserDir += "_";
mLindenUserDir += lastlower;
+
+ if (!grid.empty())
+ {
+ std::string gridlower(grid);
+ LLStringUtil::toLower(gridlower);
+ mLindenUserDir += "@";
+ mLindenUserDir += gridlower;
+ }
}
else
{
@@ -583,19 +587,23 @@ void LLDir::setPerAccountChatLogsDir(const std::string &grid, const std::string
{
// some platforms have case-sensitive filesystems, so be
// utterly consistent with our firstname/lastname case.
- std::string gridlower(grid);
- LLStringUtil::toLower(gridlower);
std::string firstlower(first);
LLStringUtil::toLower(firstlower);
std::string lastlower(last);
LLStringUtil::toLower(lastlower);
mPerAccountChatLogsDir = getChatLogsDir();
mPerAccountChatLogsDir += mDirDelimiter;
- mPerAccountChatLogsDir += gridlower;
- mPerAccountChatLogsDir += "-";
mPerAccountChatLogsDir += firstlower;
mPerAccountChatLogsDir += "_";
mPerAccountChatLogsDir += lastlower;
+
+ if (!grid.empty())
+ {
+ std::string gridlower(grid);
+ LLStringUtil::toLower(gridlower);
+ mPerAccountChatLogsDir += "@";
+ mPerAccountChatLogsDir += gridlower;
+ }
}
else
{
--
cgit v1.1
From ca51311fbdfc46617184fea7d9c801f7353ee00a Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Wed, 25 Aug 2010 03:17:55 -0700
Subject: Fixed event names overrunning search window
---
.../newview/skins/default/xui/en-us/panel_event.xml | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_event.xml b/linden/indra/newview/skins/default/xui/en-us/panel_event.xml
index cd1eaa6..99156ee 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_event.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_event.xml
@@ -6,7 +6,8 @@
name="event_name_label">
Name:
-
+
(none)
- (none)
-
-
+ (none)
+
+
- Location:
-
-
+ Location:
+
+
(none)
Value
0
+ ShowcaseURLDefault
+
+ Comment
+ URL to load for the Showcase tab in Second Life
+ Persist
+ 1
+ Type
+ String
+ Value
+ http://secondlife.com/app/showcase/index.php?
+
ShowAOSitPopup
Comment
diff --git a/linden/indra/newview/llpaneldirfind.cpp b/linden/indra/newview/llpaneldirfind.cpp
index 4ad75fa..609f5cc 100644
--- a/linden/indra/newview/llpaneldirfind.cpp
+++ b/linden/indra/newview/llpaneldirfind.cpp
@@ -274,7 +274,15 @@ void LLPanelDirFind::navigateToDefaultPage()
{
if (gHippoGridManager->getConnectedGrid()->isSecondLife())
{
- start_url = gSavedSettings.getString("SearchURLDefault");
+ if (mBrowserName == "showcase_browser")
+ {
+ // note that the showcase URL in floater_directory.xml is no longer used
+ start_url = gSavedSettings.getString("ShowcaseURLDefault");
+ }
+ else
+ {
+ start_url = gSavedSettings.getString("SearchURLDefault");
+ }
}
else
{
--
cgit v1.1
From 2261204bb0d5b248e668b0c758f572001b136d07 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Wed, 25 Aug 2010 07:38:55 -0700
Subject: Made disable max build constraints also disable max position spinner
values
---
linden/indra/newview/llfloatertools.cpp | 4 ++++
1 file changed, 4 insertions(+)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llfloatertools.cpp b/linden/indra/newview/llfloatertools.cpp
index 4f31c3c..7a9efcb 100644
--- a/linden/indra/newview/llfloatertools.cpp
+++ b/linden/indra/newview/llfloatertools.cpp
@@ -186,6 +186,10 @@ void LLFloaterTools::updateToolsSizeLimits()
getChild("Scale X")->setMaxValue(F32_MAX);
getChild("Scale Y")->setMaxValue(F32_MAX);
getChild("Scale Z")->setMaxValue(F32_MAX);
+
+ getChild("Pos X")->setMaxValue(F32_MAX);
+ getChild("Pos Y")->setMaxValue(F32_MAX);
+ getChild("Pos Z")->setMaxValue(F32_MAX);
}
else
{
--
cgit v1.1
From f248ce248c8ac0f75fd0219542f4c329204d00f4 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Wed, 25 Aug 2010 08:18:10 -0700
Subject: Ported local textures from Emerald (requires boost filesystem and
system libs to work)
---
linden/indra/newview/CMakeLists.txt | 2 +
linden/indra/newview/app_settings/settings.xml | 16 +
linden/indra/newview/floaterlocalassetbrowse.H | 305 ++++++
linden/indra/newview/floaterlocalassetbrowse.cpp | 1028 ++++++++++++++++++++
linden/indra/newview/lltexturectrl.cpp | 129 +++
linden/indra/newview/lltexturectrl.h | 1 +
linden/indra/newview/llviewerimage.h | 3 +
linden/indra/newview/llviewerobjectlist.h | 2 +
linden/indra/newview/llvovolume.h | 3 +
.../xui/en-us/floater_local_asset_browse.xml | 261 +++++
.../default/xui/en-us/floater_texture_ctrl.xml | 67 +-
11 files changed, 1799 insertions(+), 18 deletions(-)
create mode 100644 linden/indra/newview/floaterlocalassetbrowse.H
create mode 100644 linden/indra/newview/floaterlocalassetbrowse.cpp
create mode 100644 linden/indra/newview/skins/default/xui/en-us/floater_local_asset_browse.xml
(limited to 'linden/indra')
diff --git a/linden/indra/newview/CMakeLists.txt b/linden/indra/newview/CMakeLists.txt
index 7dfe3d2..13c972a 100644
--- a/linden/indra/newview/CMakeLists.txt
+++ b/linden/indra/newview/CMakeLists.txt
@@ -71,6 +71,7 @@ set(viewer_SOURCE_FILES
floaterbusy.cpp
floatergriddefault.cpp
floatergridmanager.cpp
+ floaterlocalassetbrowse.cpp
floatervoicelicense.cpp
hbfloatergrouptitles.cpp
hippoGridManager.cpp
@@ -504,6 +505,7 @@ set(viewer_HEADER_FILES
floaterbusy.h
floatergriddefault.h
floatergridmanager.h
+ floaterlocalassetbrowse.h
floatervoicelicense.h
hbfloatergrouptitles.h
hippoGridManager.h
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index 53a708e..b01544a 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -239,6 +239,22 @@
0
+ FloaterLocalbitmapbrowserRect
+
+ Comment
+ LOLRectangle
+ Persist
+ 1
+ Type
+ Rect
+ Value
+
+ 0
+ 400
+ 400
+ 0
+
+
FloaterPrimImport
Comment
diff --git a/linden/indra/newview/floaterlocalassetbrowse.H b/linden/indra/newview/floaterlocalassetbrowse.H
new file mode 100644
index 0000000..6ee1c75
--- /dev/null
+++ b/linden/indra/newview/floaterlocalassetbrowse.H
@@ -0,0 +1,305 @@
+/**
+* @file floaterlocalassetbrowse.h
+* @brief Local texture support
+*
+* $LicenseInfo:firstyear=2009&license=viewergpl$
+*
+* Copyright (c) 2010, author unknown
+*
+* Imprudence Viewer Source Code
+* The source code in this file ("Source Code") is provided to you
+* under the terms of the GNU General Public License, version 2.0
+* ("GPL"). Terms of the GPL can be found in doc/GPL-license.txt in
+* this distribution, or online at
+* http://secondlifegrid.net/programs/open_source/licensing/gplv2
+*
+* There are special exceptions to the terms and conditions of the GPL as
+* it is applied to this Source Code. View the full text of the exception
+* in the file doc/FLOSS-exception.txt in this software distribution, or
+* online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+*
+* By copying, modifying or distributing this software, you acknowledge
+* that you have read and understood your obligations described above,
+* and agree to abide by those obligations.
+*
+* ALL SOURCE CODE IS PROVIDED "AS IS." THE AUTHOR MAKES NO
+* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+* COMPLETENESS OR PERFORMANCE.
+* $/LicenseInfo$
+*/
+
+/* Local Asset Browser: header
+
+tag: vaa emerald local_asset_browser
+
+*/
+
+
+#ifndef VAA_LOCALBROWSER
+#define VAA_LOCALBROWSER
+
+#include "llfloater.h"
+#include "llscrolllistctrl.h"
+#include "lltexturectrl.h"
+#include "lldrawable.h"
+
+
+/*=======================================*/
+/* Global structs / enums / defines */
+/*=======================================*/
+
+#define LF_FLOATER_EXPAND_WIDTH 735
+#define LF_FLOATER_CONTRACT_WIDTH 415
+#define LF_FLOATER_HEIGHT 260
+
+#define LOCAL_USE_MIPMAPS true
+#define LOCAL_DISCARD_LEVEL 0
+#define NO_IMAGE LLUUID::null
+
+#define TIMER_HEARTBEAT 3.0
+
+#define SLAM_FOR_DEBUG true
+
+enum bitmaplist_cols
+{
+ BITMAPLIST_COL_NAME,
+ BITMAPLIST_COL_ID
+};
+
+/* upload & sculpt update related */
+struct affected_object
+{
+ LLViewerObject* object;
+ std::vector face_list;
+ bool local_sculptmap;
+
+};
+
+/* texture picker defines */
+
+#define LOCAL_TEXTURE_PICKER_NAME "texture picker"
+#define LOCAL_TEXTURE_PICKER_LIST_NAME "local_name_list"
+#define LOCAL_TEXTURE_PICKER_RECURSE true
+#define LOCAL_TEXTURE_PICKER_CREATEIFMISSING true
+
+
+/*=======================================*/
+/* LocalBitmap: unit class */
+/*=======================================*/
+/*
+ The basic unit class responsible for
+ containing one loaded local texture.
+*/
+
+class LocalBitmap
+{
+ public:
+ LocalBitmap(std::string filename);
+ virtual ~LocalBitmap(void);
+ friend class LocalAssetBrowser;
+
+ public: /* [enums, typedefs, etc] */
+ enum link_status
+ {
+ LINK_UNKNOWN, /* default fallback */
+ LINK_ON,
+ LINK_OFF,
+ LINK_BROKEN,
+ LINK_UPDATING /* currently redundant, but left in case necessary later. */
+ };
+
+ enum extension_type
+ {
+ IMG_EXTEN_BMP,
+ IMG_EXTEN_TGA,
+ IMG_EXTEN_JPG,
+ IMG_EXTEN_PNG
+ };
+
+ enum bitmap_type
+ {
+ TYPE_TEXTURE = 0,
+ TYPE_SCULPT = 1,
+ TYPE_LAYER = 2
+ };
+
+ public: /* [information query functions] */
+ std::string getShortName(void);
+ std::string getFileName(void);
+ LLUUID getID(void);
+ LLSD getLastModified(void);
+ std::string getLinkStatus(void);
+ bool getUpdateBool(void);
+ void setType( S32 );
+ bool getIfValidBool(void);
+ S32 getType(void);
+ void getDebugInfo(void);
+
+ private: /* [maintenence functions] */
+ void updateSelf(void);
+ bool decodeSelf(LLImageRaw* rawimg);
+ void setUpdateBool(void);
+
+ LocalBitmap* getThis(void);
+ std::vector getFaceUsesThis(LLDrawable*);
+ std::vector getUsingObjects(bool seek_by_type = true,
+ bool seek_textures = false, bool seek_sculptmaps = false);
+
+ protected: /* [basic properties] */
+ std::string shortname;
+ std::string filename;
+ extension_type extension;
+ LLUUID id;
+ LLSD last_modified;
+ link_status linkstatus;
+ bool keep_updating;
+ bool valid;
+ S32 bitmap_type;
+ bool sculpt_dirty;
+ bool volume_dirty;
+};
+
+/*=======================================*/
+/* LocalAssetBrowser: main class */
+/*=======================================*/
+/*
+ Responsible for internal workings.
+ Instantiated at the top of the source file.
+ Sits in memory until the viewer is closed.
+
+*/
+
+
+class LocalAssetBrowser
+{
+ public:
+ LocalAssetBrowser();
+ virtual ~LocalAssetBrowser();
+ friend class FloaterLocalAssetBrowser;
+ friend class LocalAssetBrowserTimer;
+ static void UpdateTextureCtrlList(LLScrollListCtrl*);
+ static void setLayerUpdated(bool toggle) { mLayerUpdated = toggle; }
+ static void setSculptUpdated(bool toggle) { mSculptUpdated = toggle; }
+ static void AddBitmap(void);
+ static void DelBitmap( std::vector, S32 column = BITMAPLIST_COL_ID );
+
+ /* UpdateTextureCtrlList was made public cause texturectrl requests it once on spawn
+ ( added: when it's own add/remove funcs are used. )
+ i've made it update on spawn instead of on pressing 'local' because the former does it once,
+ the latter - each time the button's pressed. */
+
+ private:
+ static void onChangeHappened(void);
+ static void onUpdateBool(LLUUID);
+ static void onSetType(LLUUID, S32);
+ static LocalBitmap* GetBitmapUnit(LLUUID);
+ static bool IsDoingUpdates(void);
+ static void PingTimer(void);
+ static void PerformTimedActions(void);
+ static void PerformSculptUpdates(LocalBitmap*);
+
+ protected:
+ static std::vector loaded_bitmaps;
+ typedef std::vector::iterator local_list_iter;
+ static bool mLayerUpdated;
+ static bool mSculptUpdated;
+};
+
+/*==================================================*/
+/* FloaterLocalAssetBrowser : interface class */
+/*==================================================*/
+/*
+ Responsible for talking to the user.
+ Instantiated by user request.
+ Destroyed when the floater is closed.
+
+*/
+class FloaterLocalAssetBrowser : public LLFloater
+{
+public:
+ FloaterLocalAssetBrowser();
+ virtual ~FloaterLocalAssetBrowser();
+ static void show(void*);
+
+
+
+private:
+ /* Widget related callbacks */
+ // Button callback declarations
+ static void onClickAdd(void* userdata);
+ static void onClickDel(void* userdata);
+ static void onClickMore(void* userdata);
+ static void onClickLess(void* userdata);
+ static void onClickUpload(void* userdata);
+
+ // ScrollList callback declarations
+ static void onChooseBitmapList(LLUICtrl* ctrl, void* userdata);
+
+ // Checkbox callback declarations
+ static void onClickUpdateChkbox(LLUICtrl* ctrl, void* userdata);
+
+ // Combobox type select
+ static void onCommitTypeCombo(LLUICtrl* ctrl, void* userdata);
+
+ // Widgets
+ LLButton* mAddBtn;
+ LLButton* mDelBtn;
+ LLButton* mMoreBtn;
+ LLButton* mLessBtn;
+ LLButton* mUploadBtn;
+
+ LLScrollListCtrl* mBitmapList;
+ LLScrollListCtrl* mUsedList;
+ LLTextureCtrl* mTextureView;
+ LLCheckBoxCtrl* mUpdateChkBox;
+
+ LLLineEditor* mPathTxt;
+ LLLineEditor* mUUIDTxt;
+ LLLineEditor* mNameTxt;
+
+ LLTextBox* mLinkTxt;
+ LLTextBox* mTimeTxt;
+ LLComboBox* mTypeComboBox;
+
+ LLTextBox* mCaptionPathTxt;
+ LLTextBox* mCaptionUUIDTxt;
+ LLTextBox* mCaptionLinkTxt;
+ LLTextBox* mCaptionNameTxt;
+ LLTextBox* mCaptionTimeTxt;
+
+ /* static pointer to self, wai? oh well. */
+ static FloaterLocalAssetBrowser* sLFInstance;
+
+ // non-widget functions
+ static void FloaterResize(bool expand);
+ static void UpdateRightSide(void);
+
+public:
+ static void UpdateBitmapScrollList(void);
+
+
+};
+
+/*==================================================*/
+/* LocalAssetBrowserTimer : timer class */
+/*==================================================*/
+/*
+ A small, simple timer class inheriting from
+ LLEventTimer, responsible for pinging the
+ LocalAssetBrowser class to perform it's
+ updates / checks / etc.
+
+*/
+class LocalAssetBrowserTimer : public LLEventTimer
+{
+ public:
+ LocalAssetBrowserTimer();
+ ~LocalAssetBrowserTimer();
+ virtual BOOL tick();
+ void start();
+ void stop();
+ bool isRunning();
+};
+
+#endif
+
diff --git a/linden/indra/newview/floaterlocalassetbrowse.cpp b/linden/indra/newview/floaterlocalassetbrowse.cpp
new file mode 100644
index 0000000..bf1bcad
--- /dev/null
+++ b/linden/indra/newview/floaterlocalassetbrowse.cpp
@@ -0,0 +1,1028 @@
+/**
+* @file floaterlocalassetbrowse.cpp
+* @brief Local texture support
+*
+* $LicenseInfo:firstyear=2009&license=viewergpl$
+*
+* Copyright (c) 2010, author unknown
+*
+* Imprudence Viewer Source Code
+* The source code in this file ("Source Code") is provided to you
+* under the terms of the GNU General Public License, version 2.0
+* ("GPL"). Terms of the GPL can be found in doc/GPL-license.txt in
+* this distribution, or online at
+* http://secondlifegrid.net/programs/open_source/licensing/gplv2
+*
+* There are special exceptions to the terms and conditions of the GPL as
+* it is applied to this Source Code. View the full text of the exception
+* in the file doc/FLOSS-exception.txt in this software distribution, or
+* online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+*
+* By copying, modifying or distributing this software, you acknowledge
+* that you have read and understood your obligations described above,
+* and agree to abide by those obligations.
+*
+* ALL SOURCE CODE IS PROVIDED "AS IS." THE AUTHOR MAKES NO
+* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+* COMPLETENESS OR PERFORMANCE.
+* $/LicenseInfo$
+*/
+
+/*
+
+tag: vaa emerald local_asset_browser
+
+this feature is still a work in progress.
+
+*/
+
+/* basic headers */
+#include "llviewerprecompiledheaders.h"
+#include "lluictrlfactory.h"
+
+/* boost madness from hell */
+#ifdef equivalent
+ #undef equivalent
+#endif
+#include
+
+/* own class header && upload floater header */
+#include "floaterlocalassetbrowse.h"
+//#include "floaterlocaluploader.h" <- in development.
+
+/* image compression headers. */
+#include "llimagebmp.h"
+#include "llimagetga.h"
+#include "llimagejpeg.h"
+#include "llimagepng.h"
+
+/* misc headers */
+#include
+#include
+#include "llviewerimagelist.h"
+#include "llviewerobjectlist.h"
+#include "llfilepicker.h"
+#include "llviewermenufile.h"
+#include "llfloaterimagepreview.h"
+
+/* repeated in header */
+#include "lltexturectrl.h"
+#include "llscrolllistctrl.h"
+#include "llviewercontrol.h"
+
+/* including to force rebakes when needed */
+#include "llagent.h"
+#include "llvoavatar.h"
+
+/* sculpt refresh */
+#include "llvovolume.h"
+#include "llface.h"
+
+
+/*=======================================*/
+/* Instantiating manager class */
+/* and formally declaring it's list */
+/*=======================================*/
+LocalAssetBrowser* gLocalBrowser;
+LocalAssetBrowserTimer* gLocalBrowserTimer;
+std::vector LocalAssetBrowser::loaded_bitmaps;
+bool LocalAssetBrowser::mLayerUpdated;
+bool LocalAssetBrowser::mSculptUpdated;
+
+/*=======================================*/
+/* LocalBitmap: unit class */
+/*=======================================*/
+/*
+ The basic unit class responsible for
+ containing one loaded local texture.
+*/
+
+LocalBitmap::LocalBitmap(std::string fullpath)
+{
+ this->valid = false;
+ if ( gDirUtilp->fileExists(fullpath) )
+ {
+ /* taking care of basic properties */
+ this->id.generate();
+ this->filename = fullpath;
+ this->linkstatus = LINK_OFF;
+ this->keep_updating = false;
+ this->shortname = gDirUtilp->getBaseFileName(this->filename, true);
+ this->bitmap_type = TYPE_TEXTURE;
+ this->sculpt_dirty = false;
+ this->volume_dirty = false;
+ this->valid = false;
+
+ /* taking care of extension type now to avoid switch madness */
+ std::string temp_exten = gDirUtilp->getExtension(this->filename);
+
+ if (temp_exten == "bmp") { this->extension = IMG_EXTEN_BMP; }
+ else if (temp_exten == "tga") { this->extension = IMG_EXTEN_TGA; }
+ else if (temp_exten == "jpg" || temp_exten == "jpeg") { this->extension = IMG_EXTEN_JPG; }
+ else if (temp_exten == "png") { this->extension = IMG_EXTEN_PNG; }
+ else { return; } // no valid extension.
+
+ /* getting file's last modified */
+ const std::time_t time = boost::filesystem::last_write_time( boost::filesystem::path( this->filename ) );
+ this->last_modified = asctime( localtime(&time) );
+
+ /* checking if the bitmap is valid && decoding if it is */
+ LLImageRaw* raw_image = new LLImageRaw();
+ if ( this->decodeSelf(raw_image) )
+ {
+ /* creating a shell LLViewerImage and fusing raw image into it */
+ LLViewerImage* viewer_image = new LLViewerImage( "file://"+this->filename, this->id, LOCAL_USE_MIPMAPS );
+ viewer_image->createGLTexture( LOCAL_DISCARD_LEVEL, raw_image );
+ viewer_image->mCachedRawImage = raw_image;
+
+ /* making damn sure gImageList will not delete it prematurely */
+ viewer_image->ref();
+
+ /* finalizing by adding LLViewerImage instance into gImageList */
+ gImageList.addImage(viewer_image);
+
+ /* filename is valid, bitmap is decoded and valid, i can haz liftoff! */
+ this->valid = true;
+ }
+ }
+}
+
+LocalBitmap::~LocalBitmap()
+{
+}
+
+/* [maintenence functions] */
+void LocalBitmap::updateSelf()
+{
+ if ( this->linkstatus == LINK_ON || this->linkstatus == LINK_UPDATING )
+ {
+ /* making sure file still exists */
+ if ( !gDirUtilp->fileExists(this->filename) ) { this->linkstatus = LINK_BROKEN; return; }
+
+ /* exists, let's check if it's lastmod has changed */
+ const std::time_t temp_time = boost::filesystem::last_write_time( boost::filesystem::path( this->filename ) );
+ LLSD new_last_modified = asctime( localtime(&temp_time) );
+ if ( this->last_modified.asString() == new_last_modified.asString() ) { return; }
+
+ /* here we update the image */
+ LLImageRaw* new_imgraw = new LLImageRaw();
+
+ if ( !decodeSelf(new_imgraw) ) { this->linkstatus = LINK_UPDATING; return; }
+ else { this->linkstatus = LINK_ON; }
+
+ LLViewerImage* image = gImageList.hasImage(this->id);
+
+ if (!image->mForSculpt)
+ { image->createGLTexture( LOCAL_DISCARD_LEVEL, new_imgraw ); }
+ else
+ { image->mCachedRawImage = new_imgraw; }
+
+ /* finalizing by updating lastmod to current */
+ this->last_modified = new_last_modified;
+
+ /* setting unit property to reflect that it has been changed */
+ switch (this->bitmap_type)
+ {
+ case TYPE_TEXTURE:
+ { break; }
+
+ case TYPE_SCULPT:
+ {
+ /* sets a bool to run through all visible sculpts in one go, and update the ones necessary. */
+ this->sculpt_dirty = true;
+ this->volume_dirty = true;
+ gLocalBrowser->setSculptUpdated( true );
+ break;
+ }
+
+ case TYPE_LAYER:
+ {
+ /* sets a bool to rebake layers after the iteration is done with */
+ gLocalBrowser->setLayerUpdated( true );
+ break;
+ }
+
+ default:
+ { break; }
+
+ }
+ }
+
+}
+
+bool LocalBitmap::decodeSelf(LLImageRaw* rawimg)
+{
+ switch (this->extension)
+ {
+ case IMG_EXTEN_BMP:
+ {
+ LLPointer bmp_image = new LLImageBMP;
+ if ( !bmp_image->load(filename) ) { break; }
+ if ( !bmp_image->decode(rawimg, 0.0f) ) { break; }
+
+ rawimg->biasedScaleToPowerOfTwo( LLViewerImage::MAX_IMAGE_SIZE_DEFAULT );
+ return true;
+ }
+
+ case IMG_EXTEN_TGA:
+ {
+ LLPointer tga_image = new LLImageTGA;
+ if ( !tga_image->load(filename) ) { break; }
+ if ( !tga_image->decode(rawimg) ) { break; }
+
+ if( ( tga_image->getComponents() != 3) &&
+ ( tga_image->getComponents() != 4) ) { break; }
+
+ rawimg->biasedScaleToPowerOfTwo( LLViewerImage::MAX_IMAGE_SIZE_DEFAULT );
+ return true;
+ }
+
+ case IMG_EXTEN_JPG:
+ {
+ LLPointer jpeg_image = new LLImageJPEG;
+ if ( !jpeg_image->load(filename) ) { break; }
+ if ( !jpeg_image->decode(rawimg, 0.0f) ) { break; }
+
+ rawimg->biasedScaleToPowerOfTwo( LLViewerImage::MAX_IMAGE_SIZE_DEFAULT );
+ return true;
+ }
+
+ case IMG_EXTEN_PNG:
+ {
+ LLPointer png_image = new LLImagePNG;
+ if ( !png_image->load(filename) ) { break; }
+ if ( !png_image->decode(rawimg, 0.0f) ) { break; }
+
+ rawimg->biasedScaleToPowerOfTwo( LLViewerImage::MAX_IMAGE_SIZE_DEFAULT );
+ return true;
+ }
+
+ default:
+ break;
+ }
+ return false;
+}
+
+void LocalBitmap::setUpdateBool()
+{
+ if ( this->linkstatus != LINK_BROKEN )
+ {
+ if ( !this->keep_updating )
+ {
+ this->linkstatus = LINK_ON;
+ this->keep_updating = true;
+ }
+ else
+ {
+ this->linkstatus = LINK_OFF;
+ this->keep_updating = false;
+ }
+ }
+ else
+ {
+ this->keep_updating = false;
+ }
+}
+
+void LocalBitmap::setType( S32 type )
+{
+ this->bitmap_type = type;
+}
+
+/* [information query functions] */
+std::string LocalBitmap::getShortName()
+{
+ return this->shortname;
+}
+
+std::string LocalBitmap::getFileName()
+{
+ return this->filename;
+}
+
+LLUUID LocalBitmap::getID()
+{
+ return this->id;
+}
+
+LLSD LocalBitmap::getLastModified()
+{
+ return this->last_modified;
+}
+
+std::string LocalBitmap::getLinkStatus()
+{
+ switch(this->linkstatus)
+ {
+ case LINK_ON:
+ return "On";
+
+ case LINK_OFF:
+ return "Off";
+
+ case LINK_BROKEN:
+ return "Broken";
+
+ case LINK_UPDATING:
+ return "Updating";
+
+ default:
+ return "Unknown";
+ }
+}
+
+bool LocalBitmap::getUpdateBool()
+{
+ return this->keep_updating;
+}
+
+bool LocalBitmap::getIfValidBool()
+{
+ return this->valid;
+}
+
+LocalBitmap* LocalBitmap::getThis()
+{
+ return this;
+}
+
+S32 LocalBitmap::getType()
+{
+ return this->bitmap_type;
+}
+
+std::vector LocalBitmap::getFaceUsesThis(LLDrawable* drawable)
+{
+ std::vector matching_faces;
+
+ for ( S32 face_iter = 0; face_iter <= drawable->getNumFaces(); face_iter++ )
+ {
+ LLFace* newface = drawable->getFace(face_iter);
+
+ if ( this->id == newface->getTexture()->getID() )
+ { matching_faces.push_back(newface); }
+ }
+
+ return matching_faces;
+}
+
+std::vector LocalBitmap::getUsingObjects(bool seek_by_type, bool seek_textures, bool seek_sculptmaps)
+{
+ std::vector affected_vector;
+
+ for( LLDynamicArrayPtr< LLPointer, 256 >::iterator iter = gObjectList.mObjects.begin();
+ iter != gObjectList.mObjects.end(); iter++ )
+ {
+ LLViewerObject* obj = *iter;
+ affected_object shell;
+ shell.object = obj;
+ shell.local_sculptmap = false;
+ bool obj_relevant = false;
+
+ if ( obj && obj->mDrawable )
+ {
+ /* looking for textures */
+ if ( seek_textures || ( seek_by_type && this->bitmap_type == TYPE_TEXTURE ) )
+ {
+ std::vector affected_faces = this->getFaceUsesThis( obj->mDrawable );
+ if ( !affected_faces.empty() )
+ {
+ shell.face_list = affected_faces;
+ obj_relevant = true;
+ }
+ }
+
+ /* looking for sculptmaps */
+ if ( ( seek_sculptmaps || ( seek_by_type && this->bitmap_type == TYPE_SCULPT ) )
+ && obj->isSculpted() && obj->getVolume()
+ && this->id == obj->getVolume()->getParams().getSculptID()
+ )
+ {
+ shell.local_sculptmap = true;
+ obj_relevant = true;
+ }
+ }
+
+ if (obj_relevant)
+ { affected_vector.push_back(shell); }
+ }
+
+
+
+ return affected_vector;
+}
+
+void LocalBitmap::getDebugInfo()
+{
+ /* debug function: dumps everything human readable into llinfos */
+ llinfos << "===[local bitmap debug]===" << "\n"
+ << "path: " << this->filename << "\n"
+ << "name: " << this->shortname << "\n"
+ << "extension: " << this->extension << "\n"
+ << "uuid: " << this->id << "\n"
+ << "last modified: " << this->last_modified << "\n"
+ << "link status: " << this->getLinkStatus() << "\n"
+ << "keep updated: " << this->keep_updating << "\n"
+ << "type: " << this->bitmap_type << "\n"
+ << "is valid: " << this->valid << "\n"
+ << "==========================" << llendl;
+
+}
+
+/*=======================================*/
+/* LocalAssetBrowser: internal class */
+/*=======================================*/
+/*
+ Responsible for internal workings.
+ Instantiated at the top of the source file.
+ Sits in memory until the viewer is closed.
+*/
+
+LocalAssetBrowser::LocalAssetBrowser()
+{
+ this->mLayerUpdated = false;
+ this->mSculptUpdated = false;
+}
+
+LocalAssetBrowser::~LocalAssetBrowser()
+{
+
+}
+
+void LocalAssetBrowser::AddBitmap()
+{
+ LLFilePicker& picker = LLFilePicker::instance();
+ if ( !picker.getMultipleOpenFiles(LLFilePicker::FFLOAD_IMAGE) )
+ { return; }
+
+ bool change_happened = false;
+ std::string filename = picker.getFirstFile();
+ while( !filename.empty() )
+ {
+ LocalBitmap* unit = new LocalBitmap( filename );
+
+ if ( unit->getIfValidBool() )
+ {
+ loaded_bitmaps.push_back( unit );
+ change_happened = true;
+ }
+
+ filename = picker.getNextFile();
+ }
+
+ if ( change_happened )
+ { onChangeHappened(); }
+}
+
+void LocalAssetBrowser::DelBitmap( std::vector delete_vector, S32 column )
+{
+ bool change_happened = false;
+ for( std::vector::iterator list_iter = delete_vector.begin();
+ list_iter != delete_vector.end(); list_iter++ )
+ {
+ LLScrollListItem* list_item = *list_iter;
+ if ( list_item )
+ {
+ LLUUID id = list_item->getColumn(column)->getValue().asUUID();
+ for (local_list_iter iter = loaded_bitmaps.begin();
+ iter != loaded_bitmaps.end();)
+ {
+ LocalBitmap* unit = (*iter)->getThis();
+
+ if ( unit->getID() == id )
+ {
+ LLViewerImage* image = gImageList.hasImage(id);
+ gImageList.deleteImage( image );
+ image->unref();
+
+ iter = loaded_bitmaps.erase(iter);
+ delete unit;
+ unit = NULL;
+
+ change_happened = true;
+ }
+ else
+ { iter++; }
+ }
+ }
+ }
+
+ if ( change_happened )
+ { onChangeHappened(); }
+}
+
+void LocalAssetBrowser::onUpdateBool(LLUUID id)
+{
+ LocalBitmap* unit = GetBitmapUnit( id );
+ if ( unit )
+ {
+ unit->setUpdateBool();
+ PingTimer();
+ }
+}
+
+void LocalAssetBrowser::onSetType(LLUUID id, S32 type)
+{
+ LocalBitmap* unit = GetBitmapUnit( id );
+ if ( unit )
+ { unit->setType(type); }
+}
+
+LocalBitmap* LocalAssetBrowser::GetBitmapUnit(LLUUID id)
+{
+ local_list_iter iter = loaded_bitmaps.begin();
+ for (; iter != loaded_bitmaps.end(); iter++)
+ {
+ if ( (*iter)->getID() == id )
+ {
+ return (*iter)->getThis();
+ }
+ }
+
+ return NULL;
+}
+
+bool LocalAssetBrowser::IsDoingUpdates()
+{
+ local_list_iter iter = loaded_bitmaps.begin();
+ for (; iter != loaded_bitmaps.end(); iter++)
+ {
+ if ( (*iter)->getUpdateBool() )
+ { return true; } /* if at least one unit in the list needs updates - we need a timer. */
+ }
+
+ return false;
+}
+
+
+/* Reaction to a change in bitmaplist, this function finds a texture picker floater's appropriate scrolllist
+ and passes this scrolllist's pointer to UpdateTextureCtrlList for processing.
+ it also processes timer start/stops as needed */
+void LocalAssetBrowser::onChangeHappened()
+{
+ /* own floater update */
+ FloaterLocalAssetBrowser::UpdateBitmapScrollList();
+
+ /* texturepicker related */
+ const LLView::child_list_t* child_list = gFloaterView->getChildList();
+ LLView::child_list_const_iter_t child_list_iter = child_list->begin();
+
+ for (; child_list_iter != child_list->end(); child_list_iter++)
+ {
+ LLView* view = *child_list_iter;
+ if ( view->getName() == LOCAL_TEXTURE_PICKER_NAME )
+ {
+ LLScrollListCtrl* ctrl = view->getChild
+ ( LOCAL_TEXTURE_PICKER_LIST_NAME,
+ LOCAL_TEXTURE_PICKER_RECURSE,
+ LOCAL_TEXTURE_PICKER_CREATEIFMISSING );
+
+ if ( ctrl ) { UpdateTextureCtrlList(ctrl); }
+ }
+ }
+
+ /* poking timer to see if it's still needed/still not needed */
+ PingTimer();
+
+}
+
+void LocalAssetBrowser::PingTimer()
+{
+ if ( !loaded_bitmaps.empty() && IsDoingUpdates() )
+ {
+ if (!gLocalBrowserTimer)
+ { gLocalBrowserTimer = new LocalAssetBrowserTimer(); }
+
+ if ( !gLocalBrowserTimer->isRunning() )
+ { gLocalBrowserTimer->start(); }
+ }
+
+ else
+ {
+ if (gLocalBrowserTimer)
+ {
+ if ( gLocalBrowserTimer->isRunning() )
+ { gLocalBrowserTimer->stop(); }
+ }
+ }
+}
+
+/* This function refills the texture picker floater's scrolllist with the updated contents of bitmaplist */
+void LocalAssetBrowser::UpdateTextureCtrlList(LLScrollListCtrl* ctrl)
+{
+ if ( ctrl ) // checking again in case called externally for some silly reason.
+ {
+ ctrl->clearRows();
+ if ( !loaded_bitmaps.empty() )
+ {
+ local_list_iter iter = loaded_bitmaps.begin();
+ for ( ; iter != loaded_bitmaps.end(); iter++ )
+ {
+ LLSD element;
+ element["columns"][0]["column"] = "unit_name";
+ element["columns"][0]["type"] = "text";
+ element["columns"][0]["value"] = (*iter)->shortname;
+
+ element["columns"][1]["column"] = "unit_id_HIDDEN";
+ element["columns"][1]["type"] = "text";
+ element["columns"][1]["value"] = (*iter)->id;
+
+ ctrl->addElement(element);
+ }
+ }
+ }
+}
+
+void LocalAssetBrowser::PerformTimedActions(void)
+{
+ // perform checking if updates are needed && update if so.
+ local_list_iter iter;
+ for (iter = loaded_bitmaps.begin(); iter != loaded_bitmaps.end(); iter++)
+ { (*iter)->updateSelf(); }
+
+ // one or more sculpts have been updated, refreshing them.
+ if ( mSculptUpdated )
+ {
+ LocalAssetBrowser::local_list_iter iter;
+ for(iter = loaded_bitmaps.begin(); iter != loaded_bitmaps.end(); iter++)
+ {
+ if ( (*iter)->sculpt_dirty )
+ {
+ PerformSculptUpdates( (*iter)->getThis() );
+ (*iter)->sculpt_dirty = false;
+ }
+ }
+ mSculptUpdated = false;
+ }
+
+ // one of the layer bitmaps has been updated, we need to rebake.
+ if ( mLayerUpdated )
+ {
+ LLVOAvatar* avatar = gAgent.getAvatarObject();
+ if (avatar) { avatar->forceBakeAllTextures(SLAM_FOR_DEBUG); }
+
+ mLayerUpdated = false;
+ }
+}
+
+void LocalAssetBrowser::PerformSculptUpdates(LocalBitmap* unit)
+{
+
+ /* looking for sculptmap using objects only */
+ std::vector object_list = unit->getUsingObjects(false, false, true);
+ if (object_list.empty()) { return; }
+
+ for( std::vector::iterator iter = object_list.begin();
+ iter != object_list.end(); iter++ )
+ {
+ affected_object aobj = *iter;
+ if ( aobj.object )
+ {
+ if ( !aobj.local_sculptmap ) { continue; } // should never get here. only in case of misuse.
+
+ // update code [begin]
+ if ( unit->volume_dirty )
+ {
+ LLImageRaw* rawimage = gImageList.hasImage( unit->getID() )->getCachedRawImage();
+
+ aobj.object->getVolume()->sculpt(rawimage->getWidth(), rawimage->getHeight(),
+ rawimage->getComponents(), rawimage->getData(), 0);
+ unit->volume_dirty = false;
+ }
+
+ // tell affected drawable it's got updated
+ aobj.object->mDrawable->getVOVolume()->setSculptChanged( true );
+ aobj.object->mDrawable->getVOVolume()->markForUpdate( true );
+ // update code [end]
+ }
+
+ }
+
+}
+
+/*==================================================*/
+/* FloaterLocalAssetBrowser : floater class */
+/*==================================================*/
+/*
+ Responsible for talking to the user.
+ Instantiated by user request.
+ Destroyed when the floater is closed.
+
+*/
+
+// Floater Globals
+FloaterLocalAssetBrowser* FloaterLocalAssetBrowser::sLFInstance = NULL;
+
+// widgets:
+ LLButton* mAddBtn;
+ LLButton* mDelBtn;
+ LLButton* mMoreBtn;
+ LLButton* mLessBtn;
+ LLButton* mUploadBtn;
+
+
+ LLScrollListCtrl* mBitmapList;
+ LLTextureCtrl* mTextureView;
+ LLCheckBoxCtrl* mUpdateChkBox;
+
+ LLLineEditor* mPathTxt;
+ LLLineEditor* mUUIDTxt;
+ LLLineEditor* mNameTxt;
+
+ LLTextBox* mLinkTxt;
+ LLTextBox* mTimeTxt;
+ LLComboBox* mTypeComboBox;
+
+ LLTextBox* mCaptionPathTxt;
+ LLTextBox* mCaptionUUIDTxt;
+ LLTextBox* mCaptionLinkTxt;
+ LLTextBox* mCaptionNameTxt;
+ LLTextBox* mCaptionTimeTxt;
+
+FloaterLocalAssetBrowser::FloaterLocalAssetBrowser()
+: LLFloater(std::string("local_bitmap_browser_floater"))
+{
+ // xui creation:
+ LLUICtrlFactory::getInstance()->buildFloater(this, "floater_local_asset_browse.xml");
+
+ // setting element/xui children:
+ mAddBtn = getChild("add_btn");
+ mDelBtn = getChild("del_btn");
+ mMoreBtn = getChild("more_btn");
+ mLessBtn = getChild("less_btn");
+ mUploadBtn = getChild("upload_btn");
+
+ mBitmapList = getChild("bitmap_list");
+ mTextureView = getChild("texture_view");
+ mUpdateChkBox = getChild("keep_updating_checkbox");
+
+ mPathTxt = getChild("path_text");
+ mUUIDTxt = getChild("uuid_text");
+ mNameTxt = getChild("name_text");
+
+ mLinkTxt = getChild("link_text");
+ mTimeTxt = getChild("time_text");
+ mTypeComboBox = getChild("type_combobox");
+
+ mCaptionPathTxt = getChild("path_caption_text");
+ mCaptionUUIDTxt = getChild("uuid_caption_text");
+ mCaptionLinkTxt = getChild("link_caption_text");
+ mCaptionNameTxt = getChild("name_caption_text");
+ mCaptionTimeTxt = getChild("time_caption_text");
+
+ // pre-disabling line editors, they're for view only and buttons that shouldn't be on on-spawn.
+ mPathTxt->setEnabled( false );
+ mUUIDTxt->setEnabled( false );
+ mNameTxt->setEnabled( false );
+
+ mDelBtn->setEnabled( false );
+ mUploadBtn->setEnabled( false );
+
+ // setting button callbacks:
+ mAddBtn->setClickedCallback( onClickAdd, this);
+ mDelBtn->setClickedCallback( onClickDel, this);
+ mMoreBtn->setClickedCallback( onClickMore, this);
+ mLessBtn->setClickedCallback( onClickLess, this);
+ mUploadBtn->setClickedCallback( onClickUpload, this);
+
+ // combo callback
+ mTypeComboBox->setCommitCallback(onCommitTypeCombo);
+
+ // scrolllist callbacks
+ mBitmapList->setCommitCallback(onChooseBitmapList);
+
+ // checkbox callbacks
+ mUpdateChkBox->setCommitCallback(onClickUpdateChkbox);
+
+}
+
+void FloaterLocalAssetBrowser::show(void*)
+{
+ if (!sLFInstance)
+ sLFInstance = new FloaterLocalAssetBrowser();
+ sLFInstance->open();
+ sLFInstance->UpdateBitmapScrollList();
+}
+
+FloaterLocalAssetBrowser::~FloaterLocalAssetBrowser()
+{
+ sLFInstance=NULL;
+}
+
+void FloaterLocalAssetBrowser::onClickAdd(void* userdata)
+{
+ gLocalBrowser->AddBitmap();
+}
+
+void FloaterLocalAssetBrowser::onClickDel(void* userdata)
+{
+ gLocalBrowser->DelBitmap( sLFInstance->mBitmapList->getAllSelected() );
+}
+
+/* what stopped me from using a single button and simply changing it's label
+ is the fact that i'd need to hardcode the button labels here, and that is griff. */
+void FloaterLocalAssetBrowser::onClickMore(void* userdata)
+{
+ FloaterResize(true);
+}
+
+void FloaterLocalAssetBrowser::onClickLess(void* userdata)
+{
+ FloaterResize(false);
+}
+
+void FloaterLocalAssetBrowser::onClickUpload(void* userdata)
+{
+ std::string filename = gLocalBrowser->GetBitmapUnit(
+ (LLUUID)sLFInstance->mBitmapList->getSelectedItemLabel(BITMAPLIST_COL_ID) )->getFileName();
+
+ if ( !filename.empty() )
+ {
+ LLFloaterImagePreview* floaterp = new LLFloaterImagePreview(filename);
+ LLUICtrlFactory::getInstance()->buildFloater(floaterp, "floater_image_preview.xml");
+ }
+}
+
+void FloaterLocalAssetBrowser::onChooseBitmapList(LLUICtrl* ctrl, void *userdata)
+{
+ bool button_status = sLFInstance->mBitmapList->isEmpty();
+ sLFInstance->mDelBtn->setEnabled(!button_status);
+ sLFInstance->mUploadBtn->setEnabled(!button_status);
+
+ sLFInstance->UpdateRightSide();
+}
+
+void FloaterLocalAssetBrowser::onClickUpdateChkbox(LLUICtrl *ctrl, void *userdata)
+{
+ std::string temp_str = sLFInstance->mBitmapList->getSelectedItemLabel(BITMAPLIST_COL_ID);
+ if ( !temp_str.empty() )
+ {
+ gLocalBrowser->onUpdateBool( (LLUUID)temp_str );
+ sLFInstance->UpdateRightSide();
+ }
+}
+
+void FloaterLocalAssetBrowser::onCommitTypeCombo(LLUICtrl* ctrl, void *userdata)
+{
+ std::string temp_str = sLFInstance->mBitmapList->getSelectedItemLabel(BITMAPLIST_COL_ID);
+
+ if ( !temp_str.empty() )
+ {
+ S32 selection = sLFInstance->mTypeComboBox->getCurrentIndex();
+ gLocalBrowser->onSetType( (LLUUID)temp_str, selection );
+
+ }
+}
+
+void FloaterLocalAssetBrowser::FloaterResize(bool expand)
+{
+ sLFInstance->mMoreBtn->setVisible(!expand);
+ sLFInstance->mLessBtn->setVisible(expand);
+ sLFInstance->mTextureView->setVisible(expand);
+ sLFInstance->mUpdateChkBox->setVisible(expand);
+ sLFInstance->mCaptionPathTxt->setVisible(expand);
+ sLFInstance->mCaptionUUIDTxt->setVisible(expand);
+ sLFInstance->mCaptionLinkTxt->setVisible(expand);
+ sLFInstance->mCaptionNameTxt->setVisible(expand);
+ sLFInstance->mCaptionTimeTxt->setVisible(expand);
+ sLFInstance->mTypeComboBox->setVisible(expand);
+
+ sLFInstance->mTimeTxt->setVisible(expand);
+ sLFInstance->mPathTxt->setVisible(expand);
+ sLFInstance->mUUIDTxt->setVisible(expand);
+ sLFInstance->mLinkTxt->setVisible(expand);
+ sLFInstance->mNameTxt->setVisible(expand);
+
+ if(expand)
+ {
+ sLFInstance->reshape(LF_FLOATER_EXPAND_WIDTH, LF_FLOATER_HEIGHT);
+ sLFInstance->setResizeLimits(LF_FLOATER_EXPAND_WIDTH, LF_FLOATER_HEIGHT);
+ sLFInstance->UpdateRightSide();
+ }
+ else
+ {
+ sLFInstance->reshape(LF_FLOATER_CONTRACT_WIDTH, LF_FLOATER_HEIGHT);
+ sLFInstance->setResizeLimits(LF_FLOATER_CONTRACT_WIDTH, LF_FLOATER_HEIGHT);
+ }
+
+}
+
+void FloaterLocalAssetBrowser::UpdateBitmapScrollList()
+{
+ if ( !sLFInstance ) { return; }
+
+ sLFInstance->mBitmapList->clearRows();
+ if (!gLocalBrowser->loaded_bitmaps.empty())
+ {
+
+ LocalAssetBrowser::local_list_iter iter;
+ for(iter = gLocalBrowser->loaded_bitmaps.begin(); iter != gLocalBrowser->loaded_bitmaps.end(); iter++)
+ {
+ LLSD element;
+ element["columns"][BITMAPLIST_COL_NAME]["column"] = "bitmap_name";
+ element["columns"][BITMAPLIST_COL_NAME]["type"] = "text";
+ element["columns"][BITMAPLIST_COL_NAME]["value"] = (*iter)->getShortName();
+
+ element["columns"][BITMAPLIST_COL_ID]["column"] = "bitmap_uuid";
+ element["columns"][BITMAPLIST_COL_ID]["type"] = "text";
+ element["columns"][BITMAPLIST_COL_ID]["value"] = (*iter)->getID();
+
+ sLFInstance->mBitmapList->addElement(element);
+ }
+
+ }
+ sLFInstance->UpdateRightSide();
+}
+
+void FloaterLocalAssetBrowser::UpdateRightSide()
+{
+ /*
+ Since i'm not keeping a bool on if the floater is expanded or not, i'll
+ just check if one of the widgets that shows when the floater is expanded is visible.
+
+ Also obviously before updating - checking if something IS actually selected :o
+ */
+
+ if ( !sLFInstance->mTextureView->getVisible() ) { return; }
+
+ if ( !sLFInstance->mBitmapList->getAllSelected().empty() )
+ {
+ LocalBitmap* unit = gLocalBrowser->GetBitmapUnit( LLUUID(sLFInstance->mBitmapList->getSelectedItemLabel(BITMAPLIST_COL_ID)) );
+
+ if ( unit )
+ {
+ sLFInstance->mTextureView->setImageAssetID( unit->getID() );
+ sLFInstance->mUpdateChkBox->set( unit->getUpdateBool() );
+ sLFInstance->mPathTxt->setText( unit->getFileName() );
+ sLFInstance->mUUIDTxt->setText( unit->getID().asString() );
+ sLFInstance->mNameTxt->setText( unit->getShortName() );
+ sLFInstance->mTimeTxt->setText( unit->getLastModified().asString() );
+ sLFInstance->mLinkTxt->setText( unit->getLinkStatus() );
+ sLFInstance->mTypeComboBox->selectNthItem( unit->getType() );
+
+ sLFInstance->mTextureView->setEnabled(true);
+ sLFInstance->mUpdateChkBox->setEnabled(true);
+ sLFInstance->mTypeComboBox->setEnabled(true);
+ }
+ }
+ else
+ {
+ sLFInstance->mTextureView->setImageAssetID( NO_IMAGE );
+ sLFInstance->mTextureView->setEnabled( false );
+ sLFInstance->mUpdateChkBox->set( false );
+ sLFInstance->mUpdateChkBox->setEnabled( false );
+
+ sLFInstance->mTypeComboBox->selectFirstItem();
+ sLFInstance->mTypeComboBox->setEnabled( false );
+
+ sLFInstance->mPathTxt->setText( LLStringExplicit("None") );
+ sLFInstance->mUUIDTxt->setText( LLStringExplicit("None") );
+ sLFInstance->mNameTxt->setText( LLStringExplicit("None") );
+ sLFInstance->mLinkTxt->setText( LLStringExplicit("None") );
+ sLFInstance->mTimeTxt->setText( LLStringExplicit("None") );
+ }
+}
+
+
+/*==================================================*/
+/* LocalAssetBrowserTimer: timer class */
+/*==================================================*/
+/*
+ A small, simple timer class inheriting from
+ LLEventTimer, responsible for pinging the
+ LocalAssetBrowser class to perform it's
+ updates / checks / etc.
+
+*/
+
+LocalAssetBrowserTimer::LocalAssetBrowserTimer() : LLEventTimer( (F32)TIMER_HEARTBEAT )
+{
+
+}
+
+LocalAssetBrowserTimer::~LocalAssetBrowserTimer()
+{
+
+}
+
+BOOL LocalAssetBrowserTimer::tick()
+{
+ gLocalBrowser->PerformTimedActions();
+ return FALSE;
+}
+
+void LocalAssetBrowserTimer::start()
+{
+ mEventTimer.start();
+}
+
+void LocalAssetBrowserTimer::stop()
+{
+ mEventTimer.stop();
+}
+
+bool LocalAssetBrowserTimer::isRunning()
+{
+ return mEventTimer.getStarted();
+}
+
diff --git a/linden/indra/newview/lltexturectrl.cpp b/linden/indra/newview/lltexturectrl.cpp
index 7946604..38849f9 100644
--- a/linden/indra/newview/lltexturectrl.cpp
+++ b/linden/indra/newview/lltexturectrl.cpp
@@ -68,6 +68,12 @@
#include "lluictrlfactory.h"
#include "lltrans.h"
+// tag: vaa emerald local_asset_browser [begin]
+#include "floaterlocalassetbrowse.h"
+#include "llscrolllistctrl.h"
+#include "llfilepicker.h"
+#define LOCALLIST_COL_ID 1
+// tag: vaa emerald local_asset_browser [end]
static const S32 CLOSE_BTN_WIDTH = 100;
const S32 PIPETTE_BTN_WIDTH = 32;
@@ -163,6 +169,18 @@ public:
static void onSearchEdit(const std::string& search_string, void* user_data );
static void onTextureSelect( const LLTextureEntry& te, void *data );
+ // tag: vaa emerald local_asset_browser [begin]
+// static void onBtnLocal( void* userdata );
+// static void onBtnServer( void* userdata );
+// static void switchModes( bool localmode, void* userdata );
+
+ static void onBtnAdd( void* userdata );
+ static void onBtnRemove( void* userdata );
+ static void onBtnBrowser( void* userdata );
+
+ static void onLocalScrollCommit ( LLUICtrl* ctrl, void *userdata );
+ // tag: vaa emerald local_asset_browser [end]
+
protected:
LLPointer mTexturep;
LLTextureCtrl* mOwner;
@@ -192,6 +210,7 @@ protected:
BOOL mNoCopyTextureSelected;
F32 mContextConeOpacity;
LLSaveFolderState mSavedFolderState;
+ LLScrollListCtrl* mLocalScrollCtrl; // tag: vaa emerald local_asset_browser
};
LLFloaterTexturePicker::LLFloaterTexturePicker(
@@ -236,6 +255,18 @@ LLFloaterTexturePicker::LLFloaterTexturePicker(
childSetAction("Blank", LLFloaterTexturePicker::onBtnWhite,this);
childSetAction("Invisible", LLFloaterTexturePicker::onBtnInvisible,this);
+ // tag: vaa emerald local_asset_browser [begin]
+// childSetAction("Local", LLFloaterTexturePicker::onBtnLocal, this);
+// childSetAction("Server", LLFloaterTexturePicker::onBtnServer, this);
+ childSetAction("Add", LLFloaterTexturePicker::onBtnAdd, this);
+ childSetAction("Remove", LLFloaterTexturePicker::onBtnRemove, this);
+ childSetAction("Browser", LLFloaterTexturePicker::onBtnBrowser, this);
+
+ mLocalScrollCtrl = getChild("local_name_list");
+ mLocalScrollCtrl->setCallbackUserData(this);
+ mLocalScrollCtrl->setCommitCallback(onLocalScrollCommit);
+ LocalAssetBrowser::UpdateTextureCtrlList( mLocalScrollCtrl );
+ // tag: vaa emerald local_asset_browser [end]
childSetCommitCallback("show_folders_check", onShowFolders, this);
childSetVisible("show_folders_check", FALSE);
@@ -763,6 +794,70 @@ void LLFloaterTexturePicker::onBtnSelect(void* userdata)
self->close();
}
+// tag: vaa emerald local_asset_browser [begin]
+
+// static, switches between showing inventory instance for global bitmaps
+// to showing the scroll list for local ones and back.
+/*
+void LLFloaterTexturePicker::onBtnLocal(void *userdata)
+{
+ switchModes( true, userdata );
+}
+
+void LLFloaterTexturePicker::onBtnServer(void *userdata)
+{
+ switchModes( false, userdata );
+}
+
+void LLFloaterTexturePicker::switchModes(bool localmode, void *userdata)
+{
+ LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
+
+ // servermode widgets
+ self->childSetVisible("Local", !localmode);
+ self->childSetVisible("Default", !localmode);
+ self->childSetVisible("None", !localmode);
+ self->childSetVisible("Blank", !localmode);
+ self->mSearchEdit->setVisible(!localmode);
+ self->mInventoryPanel->setVisible(!localmode);
+
+ // localmode widgets
+ self->childSetVisible("Server", localmode);
+ self->childSetVisible("Add", localmode);
+ self->childSetVisible("Remove", localmode);
+ self->childSetVisible("Browser", localmode);
+ self->mLocalScrollCtrl->setVisible(localmode);
+}
+*/
+void LLFloaterTexturePicker::onBtnAdd(void *userdata)
+{
+ LocalAssetBrowser::AddBitmap();
+}
+
+void LLFloaterTexturePicker::onBtnRemove(void *userdata)
+{
+ LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
+ LocalAssetBrowser::DelBitmap( self->mLocalScrollCtrl->getAllSelected(), LOCALLIST_COL_ID );
+}
+
+void LLFloaterTexturePicker::onBtnBrowser(void *userdata)
+{
+ FloaterLocalAssetBrowser::show(NULL);
+}
+
+// static, reacts to user clicking a valid field in the local scroll list.
+void LLFloaterTexturePicker::onLocalScrollCommit(LLUICtrl *ctrl, void *userdata)
+{
+ LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
+ LLUUID id = (LLUUID)self->mLocalScrollCtrl->getSelectedItemLabel( LOCALLIST_COL_ID );
+
+ self->mOwner->setImageAssetID( id );
+ if ( self->childGetValue("apply_immediate_check").asBoolean() )
+ { self->mOwner->onFloaterCommit(LLTextureCtrl::TEXTURE_CHANGE, id); } // calls an overridden function.
+}
+
+// tag: vaa emerald local_asset_browser [end]
+
// static
void LLFloaterTexturePicker::onBtnPipette( void* userdata )
{
@@ -1272,6 +1367,40 @@ void LLTextureCtrl::onFloaterCommit(ETexturePickOp op)
}
}
+// tag: vaa emerald local_asset_browser [begin]
+
+/*
+ overriding onFloaterCommit to forcefeed it a uuid.
+ also, i still don't get the difference beween mImageItemID and mImageAssetID,
+ they seem to affect the same thing? using mImageAssetID.
+*/
+void LLTextureCtrl::onFloaterCommit(ETexturePickOp op, LLUUID id)
+{
+ LLFloaterTexturePicker* floaterp = (LLFloaterTexturePicker*)mFloaterHandle.get();
+
+ if( floaterp && getEnabled())
+ {
+ mImageItemID = id;
+ mImageAssetID = id; //floaterp->getAssetID(); // using same as on above func.
+ // seems to work anyway.
+
+ if (op == TEXTURE_SELECT && mOnSelectCallback)
+ {
+ mOnSelectCallback(this, mCallbackUserData);
+ }
+ else if (op == TEXTURE_CANCEL && mOnCancelCallback)
+ {
+ mOnCancelCallback(this, mCallbackUserData);
+ }
+ else
+ {
+ onCommit();
+ }
+ }
+}
+
+// tag: vaa emerald local_asset_browser [end]
+
void LLTextureCtrl::setImageAssetID( const LLUUID& asset_id )
{
if( mImageAssetID != asset_id )
diff --git a/linden/indra/newview/lltexturectrl.h b/linden/indra/newview/lltexturectrl.h
index dccdbc5..27ac1e1 100644
--- a/linden/indra/newview/lltexturectrl.h
+++ b/linden/indra/newview/lltexturectrl.h
@@ -140,6 +140,7 @@ public:
void onFloaterClose();
void onFloaterCommit(ETexturePickOp op);
+ void onFloaterCommit(ETexturePickOp op, LLUUID id); // tag: vaa emerald local_asset_browser
// This call is returned when a drag is detected. Your callback
// should return TRUE if the drag is acceptable.
diff --git a/linden/indra/newview/llviewerimage.h b/linden/indra/newview/llviewerimage.h
index fc27f17..c82b68b 100644
--- a/linden/indra/newview/llviewerimage.h
+++ b/linden/indra/newview/llviewerimage.h
@@ -313,6 +313,9 @@ public:
void addFace(LLFace* facep) ;
void removeFace(LLFace* facep) ;
+
+ friend class LocalBitmap; // tag: vaa emerald local_asset_browser
+
private:
/*virtual*/ void cleanup(); // Cleanup the LLViewerImage (so we can reinitialize it)
diff --git a/linden/indra/newview/llviewerobjectlist.h b/linden/indra/newview/llviewerobjectlist.h
index 721bab1..07920cb 100644
--- a/linden/indra/newview/llviewerobjectlist.h
+++ b/linden/indra/newview/llviewerobjectlist.h
@@ -65,6 +65,8 @@ public:
~LLViewerObjectList();
void destroy();
+
+ friend class LocalBitmap; // tag: vaa emerald local_asset_browser
// For internal use only. Does NOT take a local id, takes an index into
// an internal dynamic array.
diff --git a/linden/indra/newview/llvovolume.h b/linden/indra/newview/llvovolume.h
index 960f6da..a78aa37 100644
--- a/linden/indra/newview/llvovolume.h
+++ b/linden/indra/newview/llvovolume.h
@@ -211,6 +211,9 @@ public:
BOOL isVolumeGlobal() const;
BOOL canBeFlexible() const;
BOOL setIsFlexible(BOOL is_flexible);
+
+ // tag: vaa emerald local_asset_browser
+ void setSculptChanged(BOOL has_changed) { mSculptChanged = has_changed; }
protected:
S32 computeLODDetail(F32 distance, F32 radius);
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_local_asset_browse.xml b/linden/indra/newview/skins/default/xui/en-us/floater_local_asset_browse.xml
new file mode 100644
index 0000000..3ea7ce4
--- /dev/null
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_local_asset_browse.xml
@@ -0,0 +1,261 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Local path:
+
+
+
+
+
+ Local UdddUID:
+
+
+
+
+
+
+
+
+
+ Texture
+
+
+
+ Sculptmap
+
+
+
+ Clothing
+
+
+
+
+
+ Time:
+
+
+
+ (date here)
+
+
+
+ Link:
+
+
+
+ (link status)
+
+
+
+ Name:
+
+
+
+
+
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_texture_ctrl.xml b/linden/indra/newview/skins/default/xui/en-us/floater_texture_ctrl.xml
index 97b12e0..34cb851 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_texture_ctrl.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_texture_ctrl.xml
@@ -1,8 +1,8 @@
+ can_resize="true" can_tear_off="true" enabled="true" height="330"
+ left="478" min_height="330" min_width="460" mouse_opaque="true"
+ name="texture picker" title="Pick: Texture" width="460">
Click to choose a picture
@@ -30,31 +30,62 @@
-
-
-
-
+
+
-
-
-
+
+ left="280" mouse_opaque="true" name="Select" scale_image="true" width="100" />
Pick:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
--
cgit v1.1
From 34f73c8a0b3347fa1eee19393a742415cb6a4e2c Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Wed, 25 Aug 2010 09:04:07 -0700
Subject: Tidied up texture picker, added explanatory text
---
.../xui/en-us/floater_local_asset_browse.xml | 2 +-
.../default/xui/en-us/floater_texture_ctrl.xml | 57 ++++++++++++++--------
2 files changed, 37 insertions(+), 22 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_local_asset_browse.xml b/linden/indra/newview/skins/default/xui/en-us/floater_local_asset_browse.xml
index 3ea7ce4..c63f989 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_local_asset_browse.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_local_asset_browse.xml
@@ -128,7 +128,7 @@
height="16"
visible="false"
>
- Local UdddUID:
+ Local UUID:
- Pick:
+ Pick:
@@ -65,26 +65,41 @@
-
-
-
-
-
-
-
+
+ Select texture on your computer to preview inworld
+
+
+
+
+
+
+
+
--
cgit v1.1
From 6d6e8d3ecdcc641e3243778c4790dbd4f08fcb5a Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Tue, 13 Oct 2009 01:42:15 -0700
Subject: Reapply 575931: Disable avatar appearance facelight when local
lighting turned off. Prolly an old patch from Emerald that got lost in the
last rebase
---
linden/indra/newview/pipeline.cpp | 5 +++++
1 file changed, 5 insertions(+)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/pipeline.cpp b/linden/indra/newview/pipeline.cpp
index 6b00ca6..14896e1 100644
--- a/linden/indra/newview/pipeline.cpp
+++ b/linden/indra/newview/pipeline.cpp
@@ -4204,6 +4204,11 @@ void LLPipeline::enableLightsAvatar()
void LLPipeline::enableLightsAvatarEdit(const LLColor4& color)
{
+ if (mLightingDetail < 1)
+ {
+ return;
+ }
+
U32 mask = 0x2002; // Avatar backlight only, set ambient
setupAvatarLights(TRUE);
enableLights(mask);
--
cgit v1.1
From db610bd60ed2c099cc3f1e3c9cf1bed1b7c69dfe Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Wed, 25 Aug 2010 16:32:09 +0200
Subject: fix missing quotes in linux scripts
---
linden/indra/newview/linux_tools/getvoice.sh | 2 +-
linden/indra/newview/linux_tools/wrapper.sh | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/linux_tools/getvoice.sh b/linden/indra/newview/linux_tools/getvoice.sh
index f119e82..13b632f 100755
--- a/linden/indra/newview/linux_tools/getvoice.sh
+++ b/linden/indra/newview/linux_tools/getvoice.sh
@@ -4,7 +4,7 @@ SCRIPTSRC=`readlink -f "$0" || echo "$0"`
RUN_PATH=`dirname "${SCRIPTSRC}" || echo .`
#if mozilla-runtime-linux-x86_64 is present we are using 64bit Imprudence on 64bit Linux
-if [ -d ${RUN_PATH}/app_settings/mozilla-runtime-linux-x86_64/ ]; then
+if [ -d "${RUN_PATH}/app_settings/mozilla-runtime-linux-x86_64/" ]; then
LIB_INSTALLDIR="lib32/" # It's 32bit voice on 64bit Linux and 64bit viewer. Not using lib/ for avoiding ambiguity.
else
LIB_INSTALLDIR="lib/" # It's 32bit voice on 32 or 64bit Linux and 32bit viewer.
diff --git a/linden/indra/newview/linux_tools/wrapper.sh b/linden/indra/newview/linux_tools/wrapper.sh
index 8a81843..bc2c127 100755
--- a/linden/indra/newview/linux_tools/wrapper.sh
+++ b/linden/indra/newview/linux_tools/wrapper.sh
@@ -107,7 +107,7 @@ if [ -n "$LL_TCMALLOC" ]; then
fi
fi
-if ([ "`uname -m`" = "x86_64" ] && [ -d ${RUN_PATH}/app_settings/mozilla-runtime-linux-x86_64/ ]); then
+if([ "`uname -m`" = "x86_64" ] && [ -d "${RUN_PATH}/app_settings/mozilla-runtime-linux-x86_64/" ]); then
export GST_PLUGIN_PATH="${GST_PLUGIN_PATH}:${RUN_PATH}/lib64/gstreamer-plugins/"
export SL_ENV='LD_LIBRARY_PATH="`pwd`"/lib64:"`pwd`"/lib32:"`pwd`"/app_settings/mozilla-runtime-linux-x86_64:"${LD_LIBRARY_PATH}"'
--
cgit v1.1
From 6e3f797995c3dc54abd92ed8bfb707cd7730c6c1 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Wed, 25 Aug 2010 19:56:50 -0700
Subject: Cleaned up UI of the local texture properties window (todo: fix the
texture_picker inside it being clickable)
---
linden/indra/newview/floaterlocalassetbrowse.H | 3 -
linden/indra/newview/floaterlocalassetbrowse.cpp | 63 ++-------
.../xui/en-us/floater_local_asset_browse.xml | 152 +++++++++------------
.../default/xui/en-us/floater_texture_ctrl.xml | 4 +-
4 files changed, 77 insertions(+), 145 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/floaterlocalassetbrowse.H b/linden/indra/newview/floaterlocalassetbrowse.H
index 6ee1c75..4827daa 100644
--- a/linden/indra/newview/floaterlocalassetbrowse.H
+++ b/linden/indra/newview/floaterlocalassetbrowse.H
@@ -244,8 +244,6 @@ private:
// Widgets
LLButton* mAddBtn;
LLButton* mDelBtn;
- LLButton* mMoreBtn;
- LLButton* mLessBtn;
LLButton* mUploadBtn;
LLScrollListCtrl* mBitmapList;
@@ -271,7 +269,6 @@ private:
static FloaterLocalAssetBrowser* sLFInstance;
// non-widget functions
- static void FloaterResize(bool expand);
static void UpdateRightSide(void);
public:
diff --git a/linden/indra/newview/floaterlocalassetbrowse.cpp b/linden/indra/newview/floaterlocalassetbrowse.cpp
index bf1bcad..dba4e85 100644
--- a/linden/indra/newview/floaterlocalassetbrowse.cpp
+++ b/linden/indra/newview/floaterlocalassetbrowse.cpp
@@ -59,6 +59,7 @@ this feature is still a work in progress.
/* misc headers */
#include
#include
+#include "hippoGridManager.h"
#include "llviewerimagelist.h"
#include "llviewerobjectlist.h"
#include "llfilepicker.h"
@@ -748,8 +749,6 @@ FloaterLocalAssetBrowser::FloaterLocalAssetBrowser()
// setting element/xui children:
mAddBtn = getChild("add_btn");
mDelBtn = getChild("del_btn");
- mMoreBtn = getChild("more_btn");
- mLessBtn = getChild("less_btn");
mUploadBtn = getChild("upload_btn");
mBitmapList = getChild("bitmap_list");
@@ -781,8 +780,6 @@ FloaterLocalAssetBrowser::FloaterLocalAssetBrowser()
// setting button callbacks:
mAddBtn->setClickedCallback( onClickAdd, this);
mDelBtn->setClickedCallback( onClickDel, this);
- mMoreBtn->setClickedCallback( onClickMore, this);
- mLessBtn->setClickedCallback( onClickLess, this);
mUploadBtn->setClickedCallback( onClickUpload, this);
// combo callback
@@ -794,13 +791,18 @@ FloaterLocalAssetBrowser::FloaterLocalAssetBrowser()
// checkbox callbacks
mUpdateChkBox->setCommitCallback(onClickUpdateChkbox);
+ mUpdateChkBox->set(true);
+ mUploadBtn->setLabelArg("[UPLOADFEE]", gHippoGridManager->getConnectedGrid()->getCurrencySymbol());
}
void FloaterLocalAssetBrowser::show(void*)
{
if (!sLFInstance)
- sLFInstance = new FloaterLocalAssetBrowser();
+ {
+ sLFInstance = new FloaterLocalAssetBrowser();
+ }
sLFInstance->open();
+ sLFInstance->center();
sLFInstance->UpdateBitmapScrollList();
}
@@ -819,18 +821,6 @@ void FloaterLocalAssetBrowser::onClickDel(void* userdata)
gLocalBrowser->DelBitmap( sLFInstance->mBitmapList->getAllSelected() );
}
-/* what stopped me from using a single button and simply changing it's label
- is the fact that i'd need to hardcode the button labels here, and that is griff. */
-void FloaterLocalAssetBrowser::onClickMore(void* userdata)
-{
- FloaterResize(true);
-}
-
-void FloaterLocalAssetBrowser::onClickLess(void* userdata)
-{
- FloaterResize(false);
-}
-
void FloaterLocalAssetBrowser::onClickUpload(void* userdata)
{
std::string filename = gLocalBrowser->GetBitmapUnit(
@@ -874,39 +864,6 @@ void FloaterLocalAssetBrowser::onCommitTypeCombo(LLUICtrl* ctrl, void *userdata)
}
}
-void FloaterLocalAssetBrowser::FloaterResize(bool expand)
-{
- sLFInstance->mMoreBtn->setVisible(!expand);
- sLFInstance->mLessBtn->setVisible(expand);
- sLFInstance->mTextureView->setVisible(expand);
- sLFInstance->mUpdateChkBox->setVisible(expand);
- sLFInstance->mCaptionPathTxt->setVisible(expand);
- sLFInstance->mCaptionUUIDTxt->setVisible(expand);
- sLFInstance->mCaptionLinkTxt->setVisible(expand);
- sLFInstance->mCaptionNameTxt->setVisible(expand);
- sLFInstance->mCaptionTimeTxt->setVisible(expand);
- sLFInstance->mTypeComboBox->setVisible(expand);
-
- sLFInstance->mTimeTxt->setVisible(expand);
- sLFInstance->mPathTxt->setVisible(expand);
- sLFInstance->mUUIDTxt->setVisible(expand);
- sLFInstance->mLinkTxt->setVisible(expand);
- sLFInstance->mNameTxt->setVisible(expand);
-
- if(expand)
- {
- sLFInstance->reshape(LF_FLOATER_EXPAND_WIDTH, LF_FLOATER_HEIGHT);
- sLFInstance->setResizeLimits(LF_FLOATER_EXPAND_WIDTH, LF_FLOATER_HEIGHT);
- sLFInstance->UpdateRightSide();
- }
- else
- {
- sLFInstance->reshape(LF_FLOATER_CONTRACT_WIDTH, LF_FLOATER_HEIGHT);
- sLFInstance->setResizeLimits(LF_FLOATER_CONTRACT_WIDTH, LF_FLOATER_HEIGHT);
- }
-
-}
-
void FloaterLocalAssetBrowser::UpdateBitmapScrollList()
{
if ( !sLFInstance ) { return; }
@@ -937,10 +894,7 @@ void FloaterLocalAssetBrowser::UpdateBitmapScrollList()
void FloaterLocalAssetBrowser::UpdateRightSide()
{
/*
- Since i'm not keeping a bool on if the floater is expanded or not, i'll
- just check if one of the widgets that shows when the floater is expanded is visible.
-
- Also obviously before updating - checking if something IS actually selected :o
+ Before updating - checking if something IS actually selected :o
*/
if ( !sLFInstance->mTextureView->getVisible() ) { return; }
@@ -961,6 +915,7 @@ void FloaterLocalAssetBrowser::UpdateRightSide()
sLFInstance->mTypeComboBox->selectNthItem( unit->getType() );
sLFInstance->mTextureView->setEnabled(true);
+ sLFInstance->mUpdateChkBox->set(true);
sLFInstance->mUpdateChkBox->setEnabled(true);
sLFInstance->mTypeComboBox->setEnabled(true);
}
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_local_asset_browse.xml b/linden/indra/newview/skins/default/xui/en-us/floater_local_asset_browse.xml
index c63f989..f9bb3a7 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_local_asset_browse.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_local_asset_browse.xml
@@ -4,103 +4,83 @@
-
-
-
-
-
-
-
-
-
+
Local path:
@@ -110,23 +90,23 @@
border_style="line"
border_thickness="1"
mouse_opaque="true"
- follows="top"
+ follows="left|top"
height="16"
bottom_delta="20"
left_delta="0"
name="uuid_text"
select_all_on_focus_received="true"
width="305"
- visible="false"
+ visible="true"
/>
Local UUID:
@@ -143,13 +123,13 @@
left_delta="0"
mouse_opaque="true"
name="texture_view"
- visible="false"
+ visible="true"
/>
-
-
+
Texture
-
+
Sculptmap
-
+
Clothing
-
+
-
+
Time:
-
+
(date here)
@@ -213,21 +193,21 @@
Link:
-
+
(link status)
@@ -235,10 +215,10 @@
Name:
@@ -248,14 +228,14 @@
border_style="line"
border_thickness="1"
mouse_opaque="true"
- follows="top"
+ follows="left|top"
height="16"
bottom_delta="0"
left_delta="50"
name="name_text"
select_all_on_focus_received="true"
width="150"
- visible="false"
+ visible="true"
/>
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_texture_ctrl.xml b/linden/indra/newview/skins/default/xui/en-us/floater_texture_ctrl.xml
index 247e0da..f42ed9f 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_texture_ctrl.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_texture_ctrl.xml
@@ -63,7 +63,7 @@
follows="left|top|right|bottom" height="245" left="0" mouse_opaque="true"
name="inventory panel" sort_order="TexturePickerSortOrder" width="271" />
-
+
Restrained Life to Advanced > Restrained Love
---
linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml b/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
index f2f969b..1b64878 100644
--- a/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
@@ -2165,8 +2165,8 @@
-
+
--
cgit v1.1
From 0e84e867479051772366ad48bf066004fe5d8d77 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Wed, 25 Aug 2010 22:47:40 -0700
Subject: Added AAC decoding to GStreamer for Windows
---
linden/indra/cmake/CopyWinLibs.cmake | 4 ++++
1 file changed, 4 insertions(+)
(limited to 'linden/indra')
diff --git a/linden/indra/cmake/CopyWinLibs.cmake b/linden/indra/cmake/CopyWinLibs.cmake
index 511e547..13530d8 100644
--- a/linden/indra/cmake/CopyWinLibs.cmake
+++ b/linden/indra/cmake/CopyWinLibs.cmake
@@ -36,6 +36,7 @@ set(debug_files
iconv.dll
libxml2.dll
libcairo-2.dll
+ libfaad-2.dll
libgio-2.0-0.dll
libglib-2.0-0.dll
libgmodule-2.0-0.dll
@@ -48,6 +49,7 @@ set(debug_files
libgpg-error-0.dll
libgstapp.dll
libgstaudio.dll
+ libgstaudio-0.10.dll
libgstbase-0.10.dll
libgstcdda.dll
libgstcontroller-0.10.dll
@@ -119,6 +121,7 @@ set(release_files
iconv.dll
libxml2.dll
libcairo-2.dll
+ libfaad-2.dll
libgio-2.0-0.dll
libglib-2.0-0.dll
libgmodule-2.0-0.dll
@@ -131,6 +134,7 @@ set(release_files
libgpg-error-0.dll
libgstapp.dll
libgstaudio.dll
+ libgstaudio-0.10.dll
libgstbase-0.10.dll
libgstcdda.dll
libgstcontroller-0.10.dll
--
cgit v1.1
From f19cf0699012fecc98899ab016d1b732fb316e8c Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Thu, 26 Aug 2010 02:19:18 -0700
Subject: Potential fix for #447: llSetText text shows characters as invalid
---
linden/indra/llmessage/llcachename.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/llmessage/llcachename.cpp b/linden/indra/llmessage/llcachename.cpp
index 1e6584a..88a0cfe 100644
--- a/linden/indra/llmessage/llcachename.cpp
+++ b/linden/indra/llmessage/llcachename.cpp
@@ -895,7 +895,7 @@ void LLCacheName::Impl::processUUIDReply(LLMessageSystem* msg, bool isGroup)
else
{ // is group
msg->getStringFast(_PREHASH_UUIDNameBlock, _PREHASH_GroupName, entry->mGroupName, i);
- LLStringFn::replace_ascii_controlchars(entry->mGroupName, LL_UNKNOWN_CHAR);
+ //LLStringFn::replace_ascii_controlchars(entry->mGroupName, LL_UNKNOWN_CHAR); -- MC
}
if (!isGroup)
--
cgit v1.1
From 488d8d6a4027cbd8eb6112b66b22a322a45c70dd Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Thu, 26 Aug 2010 10:04:39 +0200
Subject: tx Oh: fix bug #415 lightshare update not fluently
---
linden/indra/newview/lightshare.cpp | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/lightshare.cpp b/linden/indra/newview/lightshare.cpp
index 78d27b5..4f8b1e2 100644
--- a/linden/indra/newview/lightshare.cpp
+++ b/linden/indra/newview/lightshare.cpp
@@ -78,7 +78,11 @@ WindlightMessage::WindlightMessage( LLMessageSystem* msg ) :
buf, size, 0, 249);
mWater = new LLWaterParamSet();
- mSky = new LLWLParamSet();
+// mSky = new LLWLParamSet();
+ LLWLParamManager * wl_param_mgr = LLWLParamManager::instance();
+ static LLWLParamSet & sSky = wl_param_mgr->mCurParams;
+ mSky = &sSky;
+
mWaterNormal = new LLUUID();
process_packet(&buf[0]);
@@ -93,7 +97,7 @@ WindlightMessage::WindlightMessage( LLMessageSystem* msg ) :
WindlightMessage::~WindlightMessage()
{
delete mWater;
- delete mSky;
+// delete mSky;
delete mWaterNormal;
}
--
cgit v1.1
From 8ec728332398b7c06baf93f88f43b485c5f7df53 Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Wed, 25 Aug 2010 10:36:12 +0200
Subject: fix leak if lightshare message not valid
---
linden/indra/newview/lightshare.cpp | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/lightshare.cpp b/linden/indra/newview/lightshare.cpp
index 4f8b1e2..b00df96 100644
--- a/linden/indra/newview/lightshare.cpp
+++ b/linden/indra/newview/lightshare.cpp
@@ -63,8 +63,7 @@ WindlightMessage::WindlightMessage( LLMessageSystem* msg ) :
return; // Wrong message type, somehow.
}
- S32 size = msg->getSizeFast(_PREHASH_ParamList, 0,
- _PREHASH_Parameter);
+ S32 size = msg->getSizeFast(_PREHASH_ParamList, 0, _PREHASH_Parameter);
if( size < 0 || 250 < size )
{
@@ -74,8 +73,8 @@ WindlightMessage::WindlightMessage( LLMessageSystem* msg ) :
// Unpack and process the message's binary payload.
char buf[250];
msg->getBinaryDataFast(_PREHASH_ParamList,
- _PREHASH_Parameter,
- buf, size, 0, 249);
+ _PREHASH_Parameter,
+ buf, size, 0, 249);
mWater = new LLWaterParamSet();
// mSky = new LLWLParamSet();
@@ -110,9 +109,15 @@ void WindlightMessage::processWindlight(LLMessageSystem* msg, void**)
WindlightMessage* wl = new WindlightMessage(msg);
- if( !wl->isValid() )
+ if (!wl)
return;
+ if(!wl->isValid() )
+ {
+ delete wl;
+ return;
+ }
+
std::string water = LLWaterParamManager::instance()->mCurParams.mName;
std::string sky = LLWLParamManager::instance()->mCurParams.mName;
--
cgit v1.1
From 494c00f56bd89d6d7371990bb8cc98243694b7d3 Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Wed, 25 Aug 2010 19:09:26 +0200
Subject: SG1.4: fix ressource waste in non-wl sky rendering
---
linden/indra/newview/pipeline.cpp | 23 +++++++++--------------
1 file changed, 9 insertions(+), 14 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/pipeline.cpp b/linden/indra/newview/pipeline.cpp
index 14896e1..f10aca5 100644
--- a/linden/indra/newview/pipeline.cpp
+++ b/linden/indra/newview/pipeline.cpp
@@ -1417,20 +1417,15 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
camera.disableUserClipPlane();
- if (gSky.mVOSkyp.notNull() && gSky.mVOSkyp->mDrawable.notNull())
- {
- // Hack for sky - always visible.
- if (hasRenderType(LLPipeline::RENDER_TYPE_SKY))
- {
- gSky.mVOSkyp->mDrawable->setVisible(camera);
- sCull->pushDrawable(gSky.mVOSkyp->mDrawable);
- gSky.updateCull();
- stop_glerror();
- }
- }
- else
- {
- llinfos << "No sky drawable!" << llendl;
+ // Render non-windlight sky.
+ if (hasRenderType(LLPipeline::RENDER_TYPE_SKY) &&
+ gSky.mVOSkyp.notNull() &&
+ gSky.mVOSkyp->mDrawable.notNull())
+ {
+ gSky.mVOSkyp->mDrawable->setVisible(camera);
+ sCull->pushDrawable(gSky.mVOSkyp->mDrawable);
+ gSky.updateCull();
+ stop_glerror();
}
if (hasRenderType(LLPipeline::RENDER_TYPE_GROUND) &&
--
cgit v1.1
From 7d47202bcfe42166e446a8ccc9f7410e1c27b2d7 Mon Sep 17 00:00:00 2001
From: Jacek Antonelli
Date: Thu, 26 Aug 2010 16:36:02 -0500
Subject: Added faad2 plugin for Mac.
---
linden/indra/newview/viewer_manifest.py | 2 ++
1 file changed, 2 insertions(+)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/viewer_manifest.py b/linden/indra/newview/viewer_manifest.py
index ca47995..a925be3 100755
--- a/linden/indra/newview/viewer_manifest.py
+++ b/linden/indra/newview/viewer_manifest.py
@@ -553,6 +553,7 @@ class DarwinManifest(ViewerManifest):
self.path("libgstvideo-0.10.dylib")
self.path("libxml2.2.dylib")
+ self.path("libfaad.2.dylib")
self.path("libintl.3.dylib")
self.path("libjpeg.62.dylib")
self.path("libpng12.0.dylib")
@@ -630,6 +631,7 @@ class DarwinManifest(ViewerManifest):
self.path("libgstdecodebin2.so")
self.path("libgstdeinterlace2.so")
self.path("libgstequalizer.so")
+ self.path("libgstfaad.so")
self.path("libgstffmpeg.so")
self.path("libgstffmpegcolorspace.so")
self.path("libgstffmpegscale.so")
--
cgit v1.1
From 39db370002f241ca96c7e6d76c08ae8950bab920 Mon Sep 17 00:00:00 2001
From: Jacek Antonelli
Date: Thu, 26 Aug 2010 16:40:39 -0500
Subject: Added faad2 license info.
---
linden/indra/newview/skins/default/xui/en-us/floater_about.xml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_about.xml b/linden/indra/newview/skins/default/xui/en-us/floater_about.xml
index 557c1d7..1370051 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_about.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_about.xml
@@ -50,8 +50,9 @@ Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft
xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
google-perftools Copyright (c) 2005, Google Inc.
+ Code from FAAD2 is copyright (c) Nero AG, www.nero.com
- All rights reserved. See licenses.txt for details.
+ All rights reserved. See LICENSE-libraries.txt for details.
Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
--
cgit v1.1
From 61d7db2f2d1df03dd5446f99b6944630cb1dd73e Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Fri, 27 Aug 2010 06:17:52 -0700
Subject: Removed whitespace for script dialogs since scripters rely on it not
being there
---
linden/indra/newview/skins/default/xui/en-us/notifications.xml | 2 --
1 file changed, 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/notifications.xml b/linden/indra/newview/skins/default/xui/en-us/notifications.xml
index d830e7e..807885c 100644
--- a/linden/indra/newview/skins/default/xui/en-us/notifications.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/notifications.xml
@@ -6190,7 +6190,6 @@ Grant this request?
name="ScriptDialog"
type="notify">
[FIRST] [LAST]'s '[TITLE]'
-
[MESSAGE]
+
+
+
+
+
--
cgit v1.1
From bcc3c68ae340e77d8af227cb20d4f63bcf4d9552 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sat, 28 Aug 2010 05:45:26 -0700
Subject: Updated non en-us translations for floater_tools.xml checkbox
changeswhere applicable
---
.../newview/skins/default/xui/da/floater_tools.xml | 11 +-
.../newview/skins/default/xui/de/floater_tools.xml | 7 +-
.../newview/skins/default/xui/es/floater_tools.xml | 1249 ++++++++++----------
.../newview/skins/default/xui/fr/floater_tools.xml | 1249 ++++++++++----------
.../newview/skins/default/xui/hu/floater_tools.xml | 4 +-
.../newview/skins/default/xui/it/floater_tools.xml | 7 +-
.../newview/skins/default/xui/ja/floater_tools.xml | 7 +-
.../newview/skins/default/xui/ko/floater_tools.xml | 3 +-
.../newview/skins/default/xui/pl/floater_tools.xml | 7 +-
.../newview/skins/default/xui/pt/floater_tools.xml | 1245 +++++++++----------
.../newview/skins/default/xui/ru/floater_tools.xml | 3 +-
.../newview/skins/default/xui/tr/floater_tools.xml | 3 +-
.../newview/skins/default/xui/uk/floater_tools.xml | 3 +-
.../newview/skins/default/xui/zh/floater_tools.xml | 3 +-
14 files changed, 1910 insertions(+), 1891 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/da/floater_tools.xml b/linden/indra/newview/skins/default/xui/da/floater_tools.xml
index 0cd5f68..3e47453 100644
--- a/linden/indra/newview/skins/default/xui/da/floater_tools.xml
+++ b/linden/indra/newview/skins/default/xui/da/floater_tools.xml
@@ -122,8 +122,11 @@
Deed
-
-
+
+ Enhver:
+
+
+
@@ -134,7 +137,7 @@
Original
- Kopi
+ Kopiére
Indhold
@@ -145,7 +148,7 @@
-
+
NĂ¥r der venstreklikkes:
diff --git a/linden/indra/newview/skins/default/xui/de/floater_tools.xml b/linden/indra/newview/skins/default/xui/de/floater_tools.xml
index 44ebde6..165d0a7 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_tools.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_tools.xml
@@ -122,8 +122,11 @@
Ăœbertragung
-
-
+
+ Jeder:
+
+
+
diff --git a/linden/indra/newview/skins/default/xui/es/floater_tools.xml b/linden/indra/newview/skins/default/xui/es/floater_tools.xml
index 1e60aec..f4b5787 100644
--- a/linden/indra/newview/skins/default/xui/es/floater_tools.xml
+++ b/linden/indra/newview/skins/default/xui/es/floater_tools.xml
@@ -1,623 +1,626 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Ajuste:
-
-
-
- Mundo
-
-
- Local
-
-
- Referencia
-
-
-
-
-
-
-
- Arrastrar para mover, MayĂºs.+arrastrar para copiar
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Bulldozer:
-
-
- Tamaño
-
-
- Fuerza
-
-
- Objetos seleccionados: [COUNT]
-
-
- primitivas: [COUNT]
-
-
-
-
- Nombre:
-
-
- DescripciĂ³n:
-
-
- Creador:
-
-
- Thrax Linden
-
-
-
- Propietario:
-
-
- Thrax Linden
-
-
-
- Grupo:
-
-
- Los Linden
-
-
-
- Permisos:
-
-
- Puede modificar este objeto.
-
-
-
- Transferir...
-
-
- Transferir
-
-
-
-
-
-
-
- Precio: L$
-
-
-
- Original
-
-
- Copia
-
-
- Contenidos
-
-
-
- El prĂ³ximo propietario puede:
-
-
-
-
-
- Al pulsarlo con el botĂ³n izquierdo:
-
-
-
- Tocar/Agarrar (por defecto)
-
-
- Sentarse en el objeto
-
-
- Comprar el objeto
-
-
- Pagar al objeto
-
-
- Abrirlo
-
-
- Ejecutar los media de la parcela
-
-
- Abrir los media de la parcela
-
-
-
- B:
-
-
- O:
-
-
- G:
-
-
- E:
-
-
- N:
-
-
- F:
-
-
- Puede modificar este objeto.
-
-
- Puede modificar estos objetos.
-
-
- No puede modificar este objeto.
-
-
- No puede modificar estos objetos.
-
-
- Debe seleccionar todo el objeto para definir los permisos.
-
-
- Precio: L$
-
-
- Precio total: L$
-
-
- Precio por: L$
-
-
- Precio variable
-
-
- Venta variable
-
-
-
-
- Seleccione un sĂ³lo prim para editarlo.
-
-
- Modificar los parĂ¡metros del objeto:
-
-
-
-
-
-
- PosiciĂ³n (metros)
-
-
-
-
-
- Tamaño (metros)
-
-
-
-
-
- RotaciĂ³n (grados)
-
-
-
-
-
- Material
-
-
-
- Piedra
-
-
- Metal
-
-
- Vidrio
-
-
- Madera
-
-
- Carne
-
-
- PlĂ¡stico
-
-
- Goma
-
-
-
- Tipo de objeto a construir
-
-
-
- Caja
-
-
- Cilindro
-
-
- Prisma
-
-
- Esfera
-
-
- Toroide
-
-
- Tubo
-
-
- Cono truncado
-
-
- Sculpted
-
-
-
- Corte: Inicio y Fin
-
-
-
-
- Hueco
-
-
- Sesgo
-
-
- Forma del hueco
-
-
-
- Por defecto
-
-
- CĂrculo
-
-
- Cuadrado
-
-
- TriĂ¡ngulo
-
-
-
- TorsiĂ³n: Inicio y Fin
-
-
-
-
- Biselar
-
-
- Tamaño del hueco
-
-
-
-
- InclinaciĂ³n superior
-
-
-
-
- Corte del perfil: Inicio y Fin
-
-
- Horadar: Inicio y Fin
-
-
- Cortar: Inicio y Fin
-
-
-
-
- Biselar
-
-
-
-
- Radio
-
-
- Giros
-
-
-
-
-
- Tipo de uniĂ³n
-
-
-
- (ninguna)
-
-
- Esfera
-
-
- Toroide
-
-
- Plano
-
-
- Cilindro
-
-
-
-
-
- Seleccione un sĂ³lo prim para editarlo.
-
-
- Editar las caracterĂsticas del objeto:
-
-
-
-
-
-
-
-
-
-
-
-
- Color
-
-
-
-
-
-
-
-
-
-
- Transparencia %
-
-
- Resplandor
-
-
-
- Detallado
-
-
-
- Por defecto
-
-
- Plano
-
-
-
- Brillantez
-
-
-
- Ninguna
-
-
- Baja
-
-
- Media
-
-
- Alta
-
-
-
- Relieve
-
-
-
- Ninguno
-
-
- Brillo
-
-
- Oscuro
-
-
- grano de madera
-
-
- corteza
-
-
- ladrillos
-
-
- cajero
-
-
- cemento
-
-
- azulejerĂa
-
-
- piedra cortada
-
-
- discos
-
-
- grava
-
-
- placa de Petri
-
-
- revestimiento
-
-
- baldosa de piedra
-
-
- estuco
-
-
- succiĂ³n
-
-
- tejido
-
-
-
- Repeticiones por cara
-
-
-
-
-
-
- RotaciĂ³n (grados)
-
-
- Repeticiones por m.
-
-
- Repeticiones por cara
-
-
- Repeticiones por m.
-
-
-
-
-
- Desplazar
-
-
-
-
- Centrar la textura para los media
-(primero debe subirla)
-
-
-
-
-
-
-
-
-
-
- InformaciĂ³n de la parcela
-
-
- Precio: [PRICE] L$ por [AREA] m²
-
-
- Superficie: [AREA] m²
-
-
-
-
-
- Modificar la parcela
-
-
-
-
- Transacciones de terreno
-
-
-
-
-
- Arrastre las bandas de color para girar el objeto
-
-
- Pulse y arrastre para estirar el lado seleccionado
-
-
- Arrastrar para mover, MayĂºs.+arrastrar para copiar
-
-
- Mantenga pulsado para modificar el terreno
-
-
- Pulse y arrastre para cambiar el punto de vista
-
-
- Arrastre para mover objetos: Ctrl, verticalmente; Ctrl-MayĂºs., para girarlos.
-
-
- Pulse en el mundo para construir
-
-
- Pulse y arrastre para seleccionar el terreno
-
-
- Pantalla
-
-
- Local
-
-
- Mundo
-
-
- Referencia
-
-
- Añadido
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Ajuste:
+
+
+
+ Mundo
+
+
+ Local
+
+
+ Referencia
+
+
+
+
+
+
+
+ Arrastrar para mover, MayĂºs.+arrastrar para copiar
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Bulldozer:
+
+
+ Tamaño
+
+
+ Fuerza
+
+
+ Objetos seleccionados: [COUNT]
+
+
+ primitivas: [COUNT]
+
+
+
+
+ Nombre:
+
+
+ DescripciĂ³n:
+
+
+ Creador:
+
+
+ Thrax Linden
+
+
+
+ Propietario:
+
+
+ Thrax Linden
+
+
+
+ Grupo:
+
+
+ Los Linden
+
+
+
+ Permisos:
+
+
+ Puede modificar este objeto.
+
+
+
+ Transferir...
+
+
+ Transferir
+
+
+
+ Cualquiera:
+
+
+
+
+
+
+ Precio: L$
+
+
+
+ Original
+
+
+ Copia
+
+
+ Contenidos
+
+
+
+ El prĂ³ximo propietario puede:
+
+
+
+
+
+ Al pulsarlo con el botĂ³n izquierdo:
+
+
+
+ Tocar/Agarrar (por defecto)
+
+
+ Sentarse en el objeto
+
+
+ Comprar el objeto
+
+
+ Pagar al objeto
+
+
+ Abrirlo
+
+
+ Ejecutar los media de la parcela
+
+
+ Abrir los media de la parcela
+
+
+
+ B:
+
+
+ O:
+
+
+ G:
+
+
+ E:
+
+
+ N:
+
+
+ F:
+
+
+ Puede modificar este objeto.
+
+
+ Puede modificar estos objetos.
+
+
+ No puede modificar este objeto.
+
+
+ No puede modificar estos objetos.
+
+
+ Debe seleccionar todo el objeto para definir los permisos.
+
+
+ Precio: L$
+
+
+ Precio total: L$
+
+
+ Precio por: L$
+
+
+ Precio variable
+
+
+ Venta variable
+
+
+
+
+ Seleccione un sĂ³lo prim para editarlo.
+
+
+ Modificar los parĂ¡metros del objeto:
+
+
+
+
+
+
+ PosiciĂ³n (metros)
+
+
+
+
+
+ Tamaño (metros)
+
+
+
+
+
+ RotaciĂ³n (grados)
+
+
+
+
+
+ Material
+
+
+
+ Piedra
+
+
+ Metal
+
+
+ Vidrio
+
+
+ Madera
+
+
+ Carne
+
+
+ PlĂ¡stico
+
+
+ Goma
+
+
+
+ Tipo de objeto a construir
+
+
+
+ Caja
+
+
+ Cilindro
+
+
+ Prisma
+
+
+ Esfera
+
+
+ Toroide
+
+
+ Tubo
+
+
+ Cono truncado
+
+
+ Sculpted
+
+
+
+ Corte: Inicio y Fin
+
+
+
+
+ Hueco
+
+
+ Sesgo
+
+
+ Forma del hueco
+
+
+
+ Por defecto
+
+
+ CĂrculo
+
+
+ Cuadrado
+
+
+ TriĂ¡ngulo
+
+
+
+ TorsiĂ³n: Inicio y Fin
+
+
+
+
+ Biselar
+
+
+ Tamaño del hueco
+
+
+
+
+ InclinaciĂ³n superior
+
+
+
+
+ Corte del perfil: Inicio y Fin
+
+
+ Horadar: Inicio y Fin
+
+
+ Cortar: Inicio y Fin
+
+
+
+
+ Biselar
+
+
+
+
+ Radio
+
+
+ Giros
+
+
+
+
+
+ Tipo de uniĂ³n
+
+
+
+ (ninguna)
+
+
+ Esfera
+
+
+ Toroide
+
+
+ Plano
+
+
+ Cilindro
+
+
+
+
+
+ Seleccione un sĂ³lo prim para editarlo.
+
+
+ Editar las caracterĂsticas del objeto:
+
+
+
+
+
+
+
+
+
+
+
+
+ Color
+
+
+
+
+
+
+
+
+
+
+ Transparencia %
+
+
+ Resplandor
+
+
+
+ Detallado
+
+
+
+ Por defecto
+
+
+ Plano
+
+
+
+ Brillantez
+
+
+
+ Ninguna
+
+
+ Baja
+
+
+ Media
+
+
+ Alta
+
+
+
+ Relieve
+
+
+
+ Ninguno
+
+
+ Brillo
+
+
+ Oscuro
+
+
+ grano de madera
+
+
+ corteza
+
+
+ ladrillos
+
+
+ cajero
+
+
+ cemento
+
+
+ azulejerĂa
+
+
+ piedra cortada
+
+
+ discos
+
+
+ grava
+
+
+ placa de Petri
+
+
+ revestimiento
+
+
+ baldosa de piedra
+
+
+ estuco
+
+
+ succiĂ³n
+
+
+ tejido
+
+
+
+ Repeticiones por cara
+
+
+
+
+
+
+ RotaciĂ³n (grados)
+
+
+ Repeticiones por m.
+
+
+ Repeticiones por cara
+
+
+ Repeticiones por m.
+
+
+
+
+
+ Desplazar
+
+
+
+
+ Centrar la textura para los media
+(primero debe subirla)
+
+
+
+
+
+
+
+
+
+
+ InformaciĂ³n de la parcela
+
+
+ Precio: [PRICE] L$ por [AREA] m²
+
+
+ Superficie: [AREA] m²
+
+
+
+
+
+ Modificar la parcela
+
+
+
+
+ Transacciones de terreno
+
+
+
+
+
+ Arrastre las bandas de color para girar el objeto
+
+
+ Pulse y arrastre para estirar el lado seleccionado
+
+
+ Arrastrar para mover, MayĂºs.+arrastrar para copiar
+
+
+ Mantenga pulsado para modificar el terreno
+
+
+ Pulse y arrastre para cambiar el punto de vista
+
+
+ Arrastre para mover objetos: Ctrl, verticalmente; Ctrl-MayĂºs., para girarlos.
+
+
+ Pulse en el mundo para construir
+
+
+ Pulse y arrastre para seleccionar el terreno
+
+
+ Pantalla
+
+
+ Local
+
+
+ Mundo
+
+
+ Referencia
+
+
+ Añadido
+
+
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_tools.xml b/linden/indra/newview/skins/default/xui/fr/floater_tools.xml
index 154c826..38b137c 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_tools.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_tools.xml
@@ -1,623 +1,626 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Axe :
-
-
-
- Monde
-
-
- Local
-
-
- Référence
-
-
-
-
-
-
-
- Glissez pour déplacer, Maj-glissez pour copier.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Bulldozer :
-
-
- Taille
-
-
- Force
-
-
- Objets sélectionnés : [COUNT]
-
-
- Prims : [COUNT]
-
-
-
-
- Nom :
-
-
- Description :
-
-
- Créateur :
-
-
- Thrax Linden
-
-
-
- Propriétaire :
-
-
- Thrax Linden
-
-
-
- Groupe :
-
-
- Les Lindens
-
-
-
- Droits :
-
-
- Vous pouvez modifier cet objet.
-
-
-
- Transférer...
-
-
- Transférer
-
-
-
-
-
-
-
- Prix : L$
-
-
-
- Original
-
-
- Copie
-
-
- Contenus
-
-
-
- Le prochain propriétaire pourra :
-
-
-
-
-
- Action du clic-gauche :
-
-
-
- Toucher/attraper (défaut)
-
-
- S'asseoir sur l'objet
-
-
- Acheter l'objet
-
-
- Payer l'objet
-
-
- Ouvrir
-
-
- Jouer le média de la parcelle
-
-
- Ouvrir le média de la parcelle
-
-
-
- BÂ :
-
-
- OÂ :
-
-
- G :
-
-
- EÂ :
-
-
- NÂ :
-
-
- FÂ :
-
-
- Vous pouvez modifier cet objet.
-
-
- Vous pouvez modifier ces objets.
-
-
- Vous ne pouvez pas modifier cet objet.
-
-
- Vous ne pouvez pas modifier ces objets.
-
-
- SĂ©lectionnez l'objet en entier.
-
-
- Prix : L$
-
-
- Prix total : L$
-
-
- Prix par : L$
-
-
- Prix mixte
-
-
- Vente mixte
-
-
-
-
- Sélectionnez un prim pour modifier les paramètres.
-
-
- Modifier les paramètres de l'objet :
-
-
-
-
-
-
- Position (mètres)
-
-
-
-
-
- Taille (mètres)
-
-
-
-
-
- Rotation (degrés)
-
-
-
-
-
- Matériau
-
-
-
- Pierre
-
-
- MĂ©tal
-
-
- Verre
-
-
- Bois
-
-
- Chair
-
-
- Plastique
-
-
- Caoutchouc
-
-
-
- Type de construction
-
-
-
- Boîte
-
-
- Cylindre
-
-
- Prisme
-
-
- Sphère
-
-
- Tore
-
-
- Tube
-
-
- Anneau
-
-
- Sculptie
-
-
-
- Début et fin de découpe du tracé
-
-
-
-
- Creux
-
-
- Biais
-
-
- Forme du creux
-
-
-
- DĂ©faut
-
-
- Cercle
-
-
- Carré
-
-
- Triangle
-
-
-
- DĂ©but et fin de vrille
-
-
-
-
- Biseautage
-
-
- Taille du trou
-
-
-
-
- Inclinaison
-
-
-
-
- Début et fin de découpe du profilé
-
-
- DĂ©but et fin du creux
-
-
- DĂ©but et fin de la tranche
-
-
-
-
- Biseautage
-
-
-
-
- Rayon
-
-
- RĂ©volutions
-
-
-
-
-
- Type de raccord
-
-
-
- (aucun)
-
-
- Sphère
-
-
- Tore
-
-
- Plan
-
-
- Cylindre
-
-
-
-
-
- SĂ©lectionnez un prim pour modifier les attributs.
-
-
- Modifier les attributs de l'objet :
-
-
-
-
-
-
-
-
-
-
-
-
- Couleur
-
-
-
-
-
-
-
-
-
-
- Transparence
-
-
- Rayonnement
-
-
-
- Application
-
-
-
- DĂ©faut
-
-
- Planar
-
-
-
- Brillance
-
-
-
- Aucune
-
-
- Faible
-
-
- Moyenne
-
-
- Élevée
-
-
-
- Relief
-
-
-
- Aucun
-
-
- Luminosité
-
-
- Obscurité
-
-
- Aggloméré
-
-
- Écorce
-
-
- Briques
-
-
- Damier
-
-
- BĂ©ton
-
-
- Carrelage
-
-
- Pierre de taille
-
-
- Disques
-
-
- Gravier
-
-
- Boîte de Petri
-
-
- Lattes
-
-
- Carreaux
-
-
- Stuc
-
-
- Ventouses
-
-
- Tissage
-
-
-
- Répétitions par face
-
-
-
-
-
-
- Rotation (degrés)
-
-
-
- Répétitions au mètre
-
-
- Répétitions par face
-
-
- Répétitions au mètre
-
-
-
-
- DĂ©calage
-
-
-
-
- Ajuster la texture du média
-(chargement préalable)
-
-
-
-
-
-
-
-
-
-
- Informations sur la parcelle
-
-
- Prix : [PRICE] L$ pour [AREA] m².
-
-
- Surface : [AREA] m²
-
-
-
-
-
- Modifier la parcelle
-
-
-
-
- Transactions
-
-
-
-
-
- Pour faire tourner l'objet, faîtes glisser les bandes de couleur.
-
-
- Pour étirer le côté sélectionné, cliquez et faites glisser.
-
-
- Glissez pour déplacer, Maj-glissez pour copier.
-
-
- Cliquez et maintenez pour modifier le terrain.
-
-
- Cliquez et faites glisser pour changer l'affichage.
-
-
- Glisser pour déplacer, Ctrl pour soulever, Crtl-Maj pour pivoter.
-
-
- Cliquez dans le monde pour construire.
-
-
- Cliquez et faites glisser pour sélectionner le terrain.
-
-
- Écran
-
-
- Local
-
-
- Monde
-
-
- Référence
-
-
- Pièce-jointe
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Axe :
+
+
+
+ Monde
+
+
+ Local
+
+
+ Référence
+
+
+
+
+
+
+
+ Glissez pour déplacer, Maj-glissez pour copier.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Bulldozer :
+
+
+ Taille
+
+
+ Force
+
+
+ Objets sélectionnés : [COUNT]
+
+
+ Prims : [COUNT]
+
+
+
+
+ Nom :
+
+
+ Description :
+
+
+ Créateur :
+
+
+ Thrax Linden
+
+
+
+ Propriétaire :
+
+
+ Thrax Linden
+
+
+
+ Groupe :
+
+
+ Les Lindens
+
+
+
+ Droits :
+
+
+ Vous pouvez modifier cet objet.
+
+
+
+ Transférer...
+
+
+ Transférer
+
+
+
+ N'importe qui :
+
+
+
+
+
+
+ Prix : L$
+
+
+
+ Original
+
+
+ Copie
+
+
+ Contenus
+
+
+
+ Le prochain propriétaire pourra :
+
+
+
+
+
+ Action du clic-gauche :
+
+
+
+ Toucher/attraper (défaut)
+
+
+ S'asseoir sur l'objet
+
+
+ Acheter l'objet
+
+
+ Payer l'objet
+
+
+ Ouvrir
+
+
+ Jouer le média de la parcelle
+
+
+ Ouvrir le média de la parcelle
+
+
+
+ BÂ :
+
+
+ OÂ :
+
+
+ G :
+
+
+ EÂ :
+
+
+ NÂ :
+
+
+ FÂ :
+
+
+ Vous pouvez modifier cet objet.
+
+
+ Vous pouvez modifier ces objets.
+
+
+ Vous ne pouvez pas modifier cet objet.
+
+
+ Vous ne pouvez pas modifier ces objets.
+
+
+ SĂ©lectionnez l'objet en entier.
+
+
+ Prix : L$
+
+
+ Prix total : L$
+
+
+ Prix par : L$
+
+
+ Prix mixte
+
+
+ Vente mixte
+
+
+
+
+ Sélectionnez un prim pour modifier les paramètres.
+
+
+ Modifier les paramètres de l'objet :
+
+
+
+
+
+
+ Position (mètres)
+
+
+
+
+
+ Taille (mètres)
+
+
+
+
+
+ Rotation (degrés)
+
+
+
+
+
+ Matériau
+
+
+
+ Pierre
+
+
+ MĂ©tal
+
+
+ Verre
+
+
+ Bois
+
+
+ Chair
+
+
+ Plastique
+
+
+ Caoutchouc
+
+
+
+ Type de construction
+
+
+
+ Boîte
+
+
+ Cylindre
+
+
+ Prisme
+
+
+ Sphère
+
+
+ Tore
+
+
+ Tube
+
+
+ Anneau
+
+
+ Sculptie
+
+
+
+ Début et fin de découpe du tracé
+
+
+
+
+ Creux
+
+
+ Biais
+
+
+ Forme du creux
+
+
+
+ DĂ©faut
+
+
+ Cercle
+
+
+ Carré
+
+
+ Triangle
+
+
+
+ DĂ©but et fin de vrille
+
+
+
+
+ Biseautage
+
+
+ Taille du trou
+
+
+
+
+ Inclinaison
+
+
+
+
+ Début et fin de découpe du profilé
+
+
+ DĂ©but et fin du creux
+
+
+ DĂ©but et fin de la tranche
+
+
+
+
+ Biseautage
+
+
+
+
+ Rayon
+
+
+ RĂ©volutions
+
+
+
+
+
+ Type de raccord
+
+
+
+ (aucun)
+
+
+ Sphère
+
+
+ Tore
+
+
+ Plan
+
+
+ Cylindre
+
+
+
+
+
+ SĂ©lectionnez un prim pour modifier les attributs.
+
+
+ Modifier les attributs de l'objet :
+
+
+
+
+
+
+
+
+
+
+
+
+ Couleur
+
+
+
+
+
+
+
+
+
+
+ Transparence
+
+
+ Rayonnement
+
+
+
+ Application
+
+
+
+ DĂ©faut
+
+
+ Planar
+
+
+
+ Brillance
+
+
+
+ Aucune
+
+
+ Faible
+
+
+ Moyenne
+
+
+ Élevée
+
+
+
+ Relief
+
+
+
+ Aucun
+
+
+ Luminosité
+
+
+ Obscurité
+
+
+ Aggloméré
+
+
+ Écorce
+
+
+ Briques
+
+
+ Damier
+
+
+ BĂ©ton
+
+
+ Carrelage
+
+
+ Pierre de taille
+
+
+ Disques
+
+
+ Gravier
+
+
+ Boîte de Petri
+
+
+ Lattes
+
+
+ Carreaux
+
+
+ Stuc
+
+
+ Ventouses
+
+
+ Tissage
+
+
+
+ Répétitions par face
+
+
+
+
+
+
+ Rotation (degrés)
+
+
+
+ Répétitions au mètre
+
+
+ Répétitions par face
+
+
+ Répétitions au mètre
+
+
+
+
+ DĂ©calage
+
+
+
+
+ Ajuster la texture du média
+(chargement préalable)
+
+
+
+
+
+
+
+
+
+
+ Informations sur la parcelle
+
+
+ Prix : [PRICE] L$ pour [AREA] m².
+
+
+ Surface : [AREA] m²
+
+
+
+
+
+ Modifier la parcelle
+
+
+
+
+ Transactions
+
+
+
+
+
+ Pour faire tourner l'objet, faîtes glisser les bandes de couleur.
+
+
+ Pour étirer le côté sélectionné, cliquez et faites glisser.
+
+
+ Glissez pour déplacer, Maj-glissez pour copier.
+
+
+ Cliquez et maintenez pour modifier le terrain.
+
+
+ Cliquez et faites glisser pour changer l'affichage.
+
+
+ Glisser pour déplacer, Ctrl pour soulever, Crtl-Maj pour pivoter.
+
+
+ Cliquez dans le monde pour construire.
+
+
+ Cliquez et faites glisser pour sélectionner le terrain.
+
+
+ Écran
+
+
+ Local
+
+
+ Monde
+
+
+ Référence
+
+
+ Pièce-jointe
+
+
diff --git a/linden/indra/newview/skins/default/xui/hu/floater_tools.xml b/linden/indra/newview/skins/default/xui/hu/floater_tools.xml
index 35adb06..e146248 100644
--- a/linden/indra/newview/skins/default/xui/hu/floater_tools.xml
+++ b/linden/indra/newview/skins/default/xui/hu/floater_tools.xml
@@ -122,8 +122,8 @@
ĂtruhĂ¡z
-
-
+
+
diff --git a/linden/indra/newview/skins/default/xui/it/floater_tools.xml b/linden/indra/newview/skins/default/xui/it/floater_tools.xml
index c7c5890..1a8c06d 100644
--- a/linden/indra/newview/skins/default/xui/it/floater_tools.xml
+++ b/linden/indra/newview/skins/default/xui/it/floater_tools.xml
@@ -123,8 +123,11 @@
Cedi al gruppo
-
-
+
+ Chiunque:
+
+
+
diff --git a/linden/indra/newview/skins/default/xui/ja/floater_tools.xml b/linden/indra/newview/skins/default/xui/ja/floater_tools.xml
index 81f221a..738f00b 100644
--- a/linden/indra/newview/skins/default/xui/ja/floater_tools.xml
+++ b/linden/indra/newview/skins/default/xui/ja/floater_tools.xml
@@ -122,8 +122,11 @@
è²æ¸¡
-
-
+
+ 全員ï¼
+
+
+
diff --git a/linden/indra/newview/skins/default/xui/ko/floater_tools.xml b/linden/indra/newview/skins/default/xui/ko/floater_tools.xml
index b430cd1..1161196 100644
--- a/linden/indra/newview/skins/default/xui/ko/floater_tools.xml
+++ b/linden/indra/newview/skins/default/xui/ko/floater_tools.xml
@@ -146,8 +146,7 @@
-
-
+
diff --git a/linden/indra/newview/skins/default/xui/pl/floater_tools.xml b/linden/indra/newview/skins/default/xui/pl/floater_tools.xml
index c896222..62da67d 100755
--- a/linden/indra/newview/skins/default/xui/pl/floater_tools.xml
+++ b/linden/indra/newview/skins/default/xui/pl/floater_tools.xml
@@ -126,8 +126,11 @@
Przypisz
-
-
+
+ Każdy:
+
+
+
diff --git a/linden/indra/newview/skins/default/xui/pt/floater_tools.xml b/linden/indra/newview/skins/default/xui/pt/floater_tools.xml
index 2595e94..b5e4e4a 100644
--- a/linden/indra/newview/skins/default/xui/pt/floater_tools.xml
+++ b/linden/indra/newview/skins/default/xui/pt/floater_tools.xml
@@ -1,621 +1,624 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- RĂ©gua:
-
-
-
- Mundo
-
-
- Local
-
-
- ReferĂªncia
-
-
-
-
-
-
-
- Arraste para mover, shift+Arrastar para Copiar
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Escavadeira:
-
-
- Tamanho
-
-
- Força
-
-
- Objetos selecionados: [COUNT]
-
-
- primitivas: [COUNT]
-
-
-
-
- Nome:
-
-
- DescriĂ§Ă£o:
-
-
- Criador:
-
-
- Thrax Linden
-
-
-
- ProprietĂ¡rio:
-
-
- Thrax Linden
-
-
-
- Grupo:
-
-
- The Lindens
-
-
-
- Permissões:
-
-
- VocĂª pode modificar este objeto.
-
-
-
- Doar...
-
-
- Doar
-
-
-
-
-
-
-
- Preço: L$
-
-
-
- Original
-
-
- CĂ³pia
-
-
- ConteĂºdo
-
-
-
- PrĂ³ximo ProprietĂ¡rio pode:
-
-
-
-
-
- Quando clicado com o botĂ£o esquerdo:
-
-
-
- Tocar/Pegar (padrĂ£o)
-
-
- Sentar no objeto
-
-
- Comprar objeto
-
-
- Pagar Objeto
-
-
- Abrir
-
-
- Executar a mĂdia do lote
-
-
- Abrir a mĂdia do lote
-
-
-
- B:
-
-
- O:
-
-
- G:
-
-
- E:
-
-
- N:
-
-
- F:
-
-
- VocĂª pode modificar este objeto.
-
-
- VocĂª pode modificar estes objetos.
-
-
- VocĂª nĂ£o pode modificar este objeto.
-
-
- VocĂª nĂ£o pode modificar estes objetos.
-
-
- VocĂª precisa selecionar o objeto todo para ajustar as permissões.
-
-
- Preço: L$
-
-
- Preço Total: L$
-
-
- Preço Por: L$
-
-
- Preço Misturado
-
-
- Venda Misturada
-
-
-
-
- Selecione apenas uma primitiva para editar os parĂ¢metros.
-
-
- Editar os parĂ¢metros do Objeto:
-
-
-
-
-
-
- PosiĂ§Ă£o (metros)
-
-
-
-
-
- Tamanho (metros)
-
-
-
-
-
- RotaĂ§Ă£o (graus)
-
-
-
-
-
- Material
-
-
-
- Pedra
-
-
- Metal
-
-
- Vidro
-
-
- Madeira
-
-
- Carne
-
-
- PlĂ¡stico
-
-
- Couro
-
-
-
- Forma bĂ¡sica
-
-
-
- Caixa
-
-
- Cilindro
-
-
- Prisma
-
-
- Esfera
-
-
- TorĂ³ide
-
-
- Tubo
-
-
- Anel
-
-
- Esculpida
-
-
-
- Recorte InĂcio e final
-
-
-
-
- Vazio
-
-
- Torcer
-
-
- Forma Vazia
-
-
-
- PadrĂ£o
-
-
- Circulo
-
-
- Quadrado
-
-
- TriĂ¢gulo
-
-
-
- Torcer no InĂcio e final
-
-
-
-
- Afinar
-
-
- Tamanho do Buraco
-
-
-
-
- Inclinar
-
-
-
-
- Perfil Recortado no InĂcio e fim
-
-
- Cova InĂcio e final
-
-
- Pedaço InĂcio e fim
-
-
-
-
- Afinar
-
-
-
-
- Raio
-
-
- Revoluções
-
-
-
-
-
- Tipo costura
-
-
-
- (nenhum)
-
-
- Esfera
-
-
- TorĂ³ide
-
-
- Plano
-
-
- Cilindro
-
-
-
-
-
- Selecione apenas uma primitiva para editar suas caracterĂsticas.
-
-
- Editar caracterĂsticas do Objeto:
-
-
-
-
-
-
-
-
-
-
-
-
- Cor
-
-
-
-
-
-
-
-
-
-
- TransparĂªncia %
-
-
- Brilho
-
-
-
- Mapeamento
-
-
-
- PadrĂ£o
-
-
- Planar
-
-
-
- Brilho
-
-
-
- Nenhum
-
-
- Baixo
-
-
- MĂ©dio
-
-
- Alto
-
-
-
- OndulaĂ§Ă£o
-
-
-
- Nenhum
-
-
- Claridade
-
-
- EscuridĂ£o
-
-
- GranulaĂ§Ă£o
-
-
- Casca
-
-
- Tijolos
-
-
- Caixa
-
-
- Concreto
-
-
- Encaroçado
-
-
- Pedra Cortante
-
-
- Discos
-
-
- Cascalho
-
-
- Pedrisco
-
-
- Revestimento
-
-
- Empedrado
-
-
- Grafiato
-
-
- Sulcos
-
-
- Weave
-
-
-
- Repetir por Face
-
-
-
-
-
-
- RotaĂ§Ă£o (graus)
-
-
- Repetir por Metro
-
-
- Repetir por Face
-
-
- Repetir por Metro
-
-
-
- Deslocamento
-
-
-
-
- Alinhar Texturas
-
-
-
-
-
-
-
-
-
-
-
- Informações do Lote
-
-
- Preço: L$[PRICE] por [AREA] m².
-
-
- Ărea: [AREA] m².
-
-
-
-
-
- Modificar Lote
-
-
-
-
- Transações com a Terra
-
-
-
-
-
- Arrastar as bandas coloridas para girar o objeto
-
-
- Clicar e arrastar para esticar o lado selecionado
-
-
- Arrastar para mover, Shift-arrastar para copiar
-
-
- Clicar e reter para modificar a terra
-
-
- Clicar e arrastar para mudar a vista
-
-
- Arrastar para mover, Ctrl para levantar, Ctrl-Shift para rotacionar
-
-
- Clique no mundo para construir
-
-
- Clicar e arrastar para selecionar a terra
-
-
- Tela
-
-
- Local
-
-
- Mundo
-
-
- ReferĂªncia
-
-
- Anexo
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ RĂ©gua:
+
+
+
+ Mundo
+
+
+ Local
+
+
+ ReferĂªncia
+
+
+
+
+
+
+
+ Arraste para mover, shift+Arrastar para Copiar
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Escavadeira:
+
+
+ Tamanho
+
+
+ Força
+
+
+ Objetos selecionados: [COUNT]
+
+
+ primitivas: [COUNT]
+
+
+
+
+ Nome:
+
+
+ DescriĂ§Ă£o:
+
+
+ Criador:
+
+
+ Thrax Linden
+
+
+
+ ProprietĂ¡rio:
+
+
+ Thrax Linden
+
+
+
+ Grupo:
+
+
+ The Lindens
+
+
+
+ Permissões:
+
+
+ VocĂª pode modificar este objeto.
+
+
+
+ Doar...
+
+
+ Doar
+
+
+
+ Todos:
+
+
+
+
+
+
+ Preço: L$
+
+
+
+ Original
+
+
+ CĂ³pia
+
+
+ ConteĂºdo
+
+
+
+ PrĂ³ximo ProprietĂ¡rio pode:
+
+
+
+
+
+ Quando clicado com o botĂ£o esquerdo:
+
+
+
+ Tocar/Pegar (padrĂ£o)
+
+
+ Sentar no objeto
+
+
+ Comprar objeto
+
+
+ Pagar Objeto
+
+
+ Abrir
+
+
+ Executar a mĂdia do lote
+
+
+ Abrir a mĂdia do lote
+
+
+
+ B:
+
+
+ O:
+
+
+ G:
+
+
+ E:
+
+
+ N:
+
+
+ F:
+
+
+ VocĂª pode modificar este objeto.
+
+
+ VocĂª pode modificar estes objetos.
+
+
+ VocĂª nĂ£o pode modificar este objeto.
+
+
+ VocĂª nĂ£o pode modificar estes objetos.
+
+
+ VocĂª precisa selecionar o objeto todo para ajustar as permissões.
+
+
+ Preço: L$
+
+
+ Preço Total: L$
+
+
+ Preço Por: L$
+
+
+ Preço Misturado
+
+
+ Venda Misturada
+
+
+
+
+ Selecione apenas uma primitiva para editar os parĂ¢metros.
+
+
+ Editar os parĂ¢metros do Objeto:
+
+
+
+
+
+
+ PosiĂ§Ă£o (metros)
+
+
+
+
+
+ Tamanho (metros)
+
+
+
+
+
+ RotaĂ§Ă£o (graus)
+
+
+
+
+
+ Material
+
+
+
+ Pedra
+
+
+ Metal
+
+
+ Vidro
+
+
+ Madeira
+
+
+ Carne
+
+
+ PlĂ¡stico
+
+
+ Couro
+
+
+
+ Forma bĂ¡sica
+
+
+
+ Caixa
+
+
+ Cilindro
+
+
+ Prisma
+
+
+ Esfera
+
+
+ TorĂ³ide
+
+
+ Tubo
+
+
+ Anel
+
+
+ Esculpida
+
+
+
+ Recorte InĂcio e final
+
+
+
+
+ Vazio
+
+
+ Torcer
+
+
+ Forma Vazia
+
+
+
+ PadrĂ£o
+
+
+ Circulo
+
+
+ Quadrado
+
+
+ TriĂ¢gulo
+
+
+
+ Torcer no InĂcio e final
+
+
+
+
+ Afinar
+
+
+ Tamanho do Buraco
+
+
+
+
+ Inclinar
+
+
+
+
+ Perfil Recortado no InĂcio e fim
+
+
+ Cova InĂcio e final
+
+
+ Pedaço InĂcio e fim
+
+
+
+
+ Afinar
+
+
+
+
+ Raio
+
+
+ Revoluções
+
+
+
+
+
+ Tipo costura
+
+
+
+ (nenhum)
+
+
+ Esfera
+
+
+ TorĂ³ide
+
+
+ Plano
+
+
+ Cilindro
+
+
+
+
+
+ Selecione apenas uma primitiva para editar suas caracterĂsticas.
+
+
+ Editar caracterĂsticas do Objeto:
+
+
+
+
+
+
+
+
+
+
+
+
+ Cor
+
+
+
+
+
+
+
+
+
+
+ TransparĂªncia %
+
+
+ Brilho
+
+
+
+ Mapeamento
+
+
+
+ PadrĂ£o
+
+
+ Planar
+
+
+
+ Brilho
+
+
+
+ Nenhum
+
+
+ Baixo
+
+
+ MĂ©dio
+
+
+ Alto
+
+
+
+ OndulaĂ§Ă£o
+
+
+
+ Nenhum
+
+
+ Claridade
+
+
+ EscuridĂ£o
+
+
+ GranulaĂ§Ă£o
+
+
+ Casca
+
+
+ Tijolos
+
+
+ Caixa
+
+
+ Concreto
+
+
+ Encaroçado
+
+
+ Pedra Cortante
+
+
+ Discos
+
+
+ Cascalho
+
+
+ Pedrisco
+
+
+ Revestimento
+
+
+ Empedrado
+
+
+ Grafiato
+
+
+ Sulcos
+
+
+ Weave
+
+
+
+ Repetir por Face
+
+
+
+
+
+
+ RotaĂ§Ă£o (graus)
+
+
+ Repetir por Metro
+
+
+ Repetir por Face
+
+
+ Repetir por Metro
+
+
+
+ Deslocamento
+
+
+
+
+ Alinhar Texturas
+
+
+
+
+
+
+
+
+
+
+
+ Informações do Lote
+
+
+ Preço: L$[PRICE] por [AREA] m².
+
+
+ Ărea: [AREA] m².
+
+
+
+
+
+ Modificar Lote
+
+
+
+
+ Transações com a Terra
+
+
+
+
+
+ Arrastar as bandas coloridas para girar o objeto
+
+
+ Clicar e arrastar para esticar o lado selecionado
+
+
+ Arrastar para mover, Shift-arrastar para copiar
+
+
+ Clicar e reter para modificar a terra
+
+
+ Clicar e arrastar para mudar a vista
+
+
+ Arrastar para mover, Ctrl para levantar, Ctrl-Shift para rotacionar
+
+
+ Clique no mundo para construir
+
+
+ Clicar e arrastar para selecionar a terra
+
+
+ Tela
+
+
+ Local
+
+
+ Mundo
+
+
+ ReferĂªncia
+
+
+ Anexo
+
+
diff --git a/linden/indra/newview/skins/default/xui/ru/floater_tools.xml b/linden/indra/newview/skins/default/xui/ru/floater_tools.xml
index 63697ac..8400270 100644
--- a/linden/indra/newview/skins/default/xui/ru/floater_tools.xml
+++ b/linden/indra/newview/skins/default/xui/ru/floater_tools.xml
@@ -122,8 +122,7 @@
Đ”ĐµĐ»Đ¾
-
-
+
diff --git a/linden/indra/newview/skins/default/xui/tr/floater_tools.xml b/linden/indra/newview/skins/default/xui/tr/floater_tools.xml
index 07ee005..932db0a 100644
--- a/linden/indra/newview/skins/default/xui/tr/floater_tools.xml
+++ b/linden/indra/newview/skins/default/xui/tr/floater_tools.xml
@@ -122,8 +122,7 @@
Bağışla
-
-
+
diff --git a/linden/indra/newview/skins/default/xui/uk/floater_tools.xml b/linden/indra/newview/skins/default/xui/uk/floater_tools.xml
index c9e2497..38510a4 100644
--- a/linden/indra/newview/skins/default/xui/uk/floater_tools.xml
+++ b/linden/indra/newview/skins/default/xui/uk/floater_tools.xml
@@ -122,8 +122,7 @@
Đ¡Đ¿Ñ€Đ°Đ²Đ°
-
-
+
diff --git a/linden/indra/newview/skins/default/xui/zh/floater_tools.xml b/linden/indra/newview/skins/default/xui/zh/floater_tools.xml
index a6eb482..4f7bcf1 100644
--- a/linden/indra/newview/skins/default/xui/zh/floater_tools.xml
+++ b/linden/indra/newview/skins/default/xui/zh/floater_tools.xml
@@ -122,8 +122,7 @@
转让
-
-
+
--
cgit v1.1
From 887825848066234ef7505b3a99cb28418f3777ad Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sat, 28 Aug 2010 07:08:03 -0700
Subject: Fixed width on first use grid selector being too small
---
.../newview/skins/default/xui/en-us/floater_grid_default_selector.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_grid_default_selector.xml b/linden/indra/newview/skins/default/xui/en-us/floater_grid_default_selector.xml
index 2cf9cd7..3c26d30 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_grid_default_selector.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_grid_default_selector.xml
@@ -1,7 +1,7 @@
+ title="Select a Default Grid" width="260">
Or use the Grid Manager to add a new one
@@ -9,7 +9,7 @@
+ name="grid_list" width="240">
+
+
+
--
cgit v1.1
From fc4e800ba8389c0d13caae414f9db4329022722e Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Thu, 26 Aug 2010 16:39:24 +0200
Subject: Katharine Berry: Fixed WindLight settings not loading in many (most?)
cases. Also fixed capitalisation of "WindLight".
---
linden/indra/newview/llwlparammanager.cpp | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llwlparammanager.cpp b/linden/indra/newview/llwlparammanager.cpp
index 8bbff25..74fa8f3 100644
--- a/linden/indra/newview/llwlparammanager.cpp
+++ b/linden/indra/newview/llwlparammanager.cpp
@@ -273,7 +273,17 @@ void LLWLParamManager::savePresets(const std::string & fileName)
void LLWLParamManager::loadPreset(const std::string & name,bool propagate)
{
-
+ // Check if we already have the preset before we try loading it again.
+ if(mParamList.find(name) != mParamList.end())
+ {
+ if(propagate)
+ {
+ getParamSet(name, mCurParams);
+ propagateParameters();
+ }
+ return;
+ }
+
// bugfix for SL-46920: preventing filenames that break stuff.
char * curl_str = curl_escape(name.c_str(), name.size());
std::string escaped_filename(curl_str);
@@ -662,9 +672,15 @@ void LLWLParamManager::loadWindlightNotecard(LLVFS *vfs, const LLUUID& asset_id,
notecard.importStream(str);
std::string settings = notecard.getText();
LLMemoryStream settings_str((U8*)settings.c_str(), settings.length());
+ bool is_animator_running = sInstance->mAnimator.mIsRunning;
+ bool animator_linden_time = sInstance->mAnimator.mUseLindenTime;
+ sInstance->mAnimator.mIsRunning = false;
+ sInstance->mAnimator.mUseLindenTime = false;
bool is_real_setting = sInstance->loadPresetXML(name, settings_str, true, true);
if(!is_real_setting)
{
+ sInstance->mAnimator.mIsRunning = is_animator_running;
+ sInstance->mAnimator.mUseLindenTime = animator_linden_time;
LLSD subs;
subs["NAME"] = name;
LLNotifications::getInstance()->add("KittyInvalidWindlightNotecard", subs);
--
cgit v1.1
From ce2e2dba3ddcd1185fd48bdeb76b425dfa347799 Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Thu, 26 Aug 2010 18:41:50 +0200
Subject: Katharine Berry: Added an icon for WindLight settings.
---
linden/indra/newview/llinventorybridge.cpp | 18 ++++++++++++++----
.../indra/newview/skins/default/textures/textures.xml | 4 ++++
2 files changed, 18 insertions(+), 4 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llinventorybridge.cpp b/linden/indra/newview/llinventorybridge.cpp
index 7396eac..efa0d20 100644
--- a/linden/indra/newview/llinventorybridge.cpp
+++ b/linden/indra/newview/llinventorybridge.cpp
@@ -2999,10 +2999,7 @@ BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop,
std::string LLNotecardBridge::sPrefix("Note: ");
-LLUIImagePtr LLNotecardBridge::getIcon() const
-{
- return get_item_icon(LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, 0, FALSE);
-}
+
void open_notecard(LLViewerInventoryItem* inv_item,
const std::string& title,
@@ -3129,6 +3126,19 @@ void LLNotecardBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
*/
}
+LLUIImagePtr LLNotecardBridge::getIcon() const
+{
+ bool is_windlight = (getName().length() > 2 && getName().compare(getName().length() - 3, 3, ".wl") == 0);
+ if(is_windlight)
+ {
+ return LLUI::getUIImage("Inv_WindLight");
+ }
+ else
+ {
+ return get_item_icon(LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, 0, FALSE);
+ }
+}
+
// +=================================================+
// | LLGestureBridge |
// +=================================================+
diff --git a/linden/indra/newview/skins/default/textures/textures.xml b/linden/indra/newview/skins/default/textures/textures.xml
index ad1a1b6..fef6c05 100644
--- a/linden/indra/newview/skins/default/textures/textures.xml
+++ b/linden/indra/newview/skins/default/textures/textures.xml
@@ -375,4 +375,8 @@
+
+
+
+
--
cgit v1.1
From 643ef4072a2387c8f8f5e2f3d6a801e5471bce18 Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Thu, 26 Aug 2010 18:03:11 +0200
Subject: Katharine Berry:Double-clicking a WindLight notecard immediately
applies the setting.
---
linden/indra/newview/llinventorybridge.cpp | 59 ++++++++++------------
linden/indra/newview/llinventorybridge.h | 1 +
.../skins/default/xui/en-us/menu_inventory.xml | 8 ++-
3 files changed, 34 insertions(+), 34 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llinventorybridge.cpp b/linden/indra/newview/llinventorybridge.cpp
index efa0d20..db7a955 100644
--- a/linden/indra/newview/llinventorybridge.cpp
+++ b/linden/indra/newview/llinventorybridge.cpp
@@ -813,12 +813,6 @@ void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model,
folder_view_itemp->getListener()->pasteFromClipboard();
return;
}
- else if ("load_windlight" == action)
- {
- LLInventoryItem* itemp = model->getItem(mUUID);
- if(!itemp) return;
- LLWLParamManager::instance()->loadPresetNotecard(itemp->getName(), itemp->getAssetUUID(), mUUID);
- }
}
void LLItemBridge::selectItem()
@@ -828,6 +822,16 @@ void LLItemBridge::selectItem()
{
item->fetchFromServer();
}
+
+ if (item && item->isComplete())
+ {
+ bool is_windlight = (getName().length() > 2 && getName().compare(getName().length() - 3, 3, ".wl") == 0);
+ if(is_windlight)
+ {
+ LLWLParamManager::instance()->loadPresetNotecard(item->getName(), item->getAssetUUID(), mUUID);
+ }
+ }
+
}
void LLItemBridge::restoreItem()
@@ -3060,7 +3064,9 @@ void LLNotecardBridge::openItem()
LLViewerInventoryItem* item = getItem();
if (item)
{
- open_notecard(item, getPrefix() + item->getName(), LLUUID::null, FALSE);
+ bool is_windlight = (getName().length() > 2 && getName().compare(getName().length() - 3, 3, ".wl") == 0);
+ if(!is_windlight)
+ open_notecard(item, getPrefix() + item->getName(), LLUUID::null, FALSE);
}
}
@@ -3087,43 +3093,32 @@ void LLNotecardBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
if(is_windlight)
{
- items.push_back(std::string("Use Windlight Settings"));
+ items.push_back(std::string("Use WindLight Settings"));
+ items.push_back(std::string("Edit WindLight Settings"));
}
items.push_back(std::string("Properties"));
getClipboardEntries(true, items, disabled_items, flags);
}
hideContextEntries(menu, items, disabled_items);
-/*
---
-
+}
+void LLNotecardBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+{
+ LLViewerInventoryItem* itemp = model->getItem(mUUID);
+ if(!itemp) return;
- menuentry_vec_t items;
- menuentry_vec_t disabled_items;
- if(isItemInTrash())
+ if ("load_windlight" == action)
{
- addTrashContextMenuOptions(items, disabled_items);
+ LLWLParamManager::instance()->loadPresetNotecard(itemp->getName(), itemp->getAssetUUID(), mUUID);
+ }
+ else if ("edit_windlight" == action)
+ {
+ open_notecard(itemp, getPrefix() + itemp->getName(), LLUUID::null, FALSE);
}
else
{
- bool is_windlight = (getName().length() > 2 && getName().compare(getName().length() - 3, 3, ".wl") == 0);
- items.push_back(std::string("Share"));
- if (!canShare())
- {
- disabled_items.push_back(std::string("Share"));
- }
-
- addOpenRightClickMenuOption(items);
- if(is_windlight)
- {
- items.push_back(std::string("Use Windlight Settings"));
- }
- items.push_back(std::string("Properties"));
-
- getClipboardEntries(true, items, disabled_items, flags);
+ LLItemBridge::performAction(folder, model, action);
}
- hide_context_entries(menu, items, disabled_items);
-*/
}
LLUIImagePtr LLNotecardBridge::getIcon() const
diff --git a/linden/indra/newview/llinventorybridge.h b/linden/indra/newview/llinventorybridge.h
index 2ad4b3a..b703d07 100644
--- a/linden/indra/newview/llinventorybridge.h
+++ b/linden/indra/newview/llinventorybridge.h
@@ -477,6 +477,7 @@ public:
virtual LLUIImagePtr getIcon() const;
virtual void openItem();
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
+ virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action);
protected:
LLNotecardBridge(LLInventoryPanel* inventory, const LLUUID& uuid) :
diff --git a/linden/indra/newview/skins/default/xui/en-us/menu_inventory.xml b/linden/indra/newview/skins/default/xui/en-us/menu_inventory.xml
index 8d5f1fe..2c837a2 100644
--- a/linden/indra/newview/skins/default/xui/en-us/menu_inventory.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/menu_inventory.xml
@@ -141,10 +141,14 @@
name="Open" width="128">
-
+
+
+
+
--
cgit v1.1
From e2be2beaf9a9b6bca19bdd4b36fc7adb681349e9 Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Thu, 26 Aug 2010 20:30:07 +0200
Subject: Katharine Berry: We can save inventory presets to inventory directly.
How exciting.
issues from porting: buttons need love
---
linden/indra/newview/llfloaterwindlight.cpp | 82 +++++++++++++++++++++-
linden/indra/newview/llfloaterwindlight.h | 8 ++-
linden/indra/newview/llwlparammanager.cpp | 77 +++++++++++++++++++-
linden/indra/newview/llwlparammanager.h | 5 +-
linden/indra/newview/llwlparamset.h | 3 +-
.../xui/en-us/floater_windlight_options.xml | 7 +-
6 files changed, 172 insertions(+), 10 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llfloaterwindlight.cpp b/linden/indra/newview/llfloaterwindlight.cpp
index 42adba8..8cdc634 100644
--- a/linden/indra/newview/llfloaterwindlight.cpp
+++ b/linden/indra/newview/llfloaterwindlight.cpp
@@ -50,6 +50,10 @@
#include "lltabcontainer.h"
#include "llboost.h"
+#include "llagent.h"
+#include "llinventorymodel.h"
+#include "llviewerinventory.h"
+
#include "v4math.h"
#include "llviewerdisplay.h"
#include "llviewercontrol.h"
@@ -222,6 +226,7 @@ void LLFloaterWindLight::initCallbacks(void) {
//childSetAction("WLLoadPreset", onLoadPreset, comboBox);
childSetAction("WLNewPreset", onNewPreset, comboBox);
childSetAction("WLSavePreset", onSavePreset, comboBox);
+ childSetAction("WLSaveNotecard", onSaveNotecard, comboBox);
childSetAction("WLDeletePreset", onDeletePreset, comboBox);
comboBox->setCommitCallback(onChangePresetName);
@@ -837,6 +842,76 @@ void LLFloaterWindLight::onSavePreset(void* userData)
LLNotifications::instance().add("WLSavePresetAlert", LLSD(), LLSD(), saveAlertCallback);
}
+class KVFloaterWindLightNotecardCreatedCallback : public LLInventoryCallback
+{
+public:
+ void fire(const LLUUID& inv_item);
+};
+
+void LLFloaterWindLight::onSaveNotecard(void* userData)
+{
+ // get the name
+ LLComboBox* comboBox = sWindLight->getChild(
+ "WLPresetsCombo");
+
+ // don't save the empty name
+ if(comboBox->getSelectedItemLabel() == "")
+ {
+ return;
+ }
+
+ // Check if this is already a notecard.
+ if(LLWLParamManager::instance()->mCurParams.mInventoryID.notNull())
+ {
+ LLNotifications::instance().add("KittyWLSaveNotecardAlert", LLSD(), LLSD(), saveNotecardCallback);
+ }
+ else
+ {
+ // Make sure we have a ".wl" extension.
+ std::string name = comboBox->getSelectedItemLabel();
+ if(name.length() > 2 && name.compare(name.length() - 3, 3, ".wl") != 0)
+ {
+ name += ".wl";
+ }
+ LLPointer cb = new KVFloaterWindLightNotecardCreatedCallback();
+ // Create a notecard and then save it.
+ create_inventory_item(gAgent.getID(),
+ gAgent.getSessionID(),
+ LLUUID::null,
+ LLTransactionID::tnull,
+ name,
+ "WindLight settings (Kitty Viewer compatible)",
+ LLAssetType::AT_NOTECARD,
+ LLInventoryType::IT_NOTECARD,
+ NOT_WEARABLE,
+ PERM_ITEM_UNRESTRICTED,
+ cb);
+
+ }
+}
+
+void KVFloaterWindLightNotecardCreatedCallback::fire(const LLUUID& inv_item)
+{
+ LLWLParamManager * param_mgr = LLWLParamManager::instance();
+ param_mgr->setParamSet(param_mgr->mCurParams.mName, param_mgr->mCurParams);
+ param_mgr->mParamList[param_mgr->mCurParams.mName].mInventoryID = inv_item;
+ param_mgr->mCurParams.mInventoryID = inv_item;
+ LL_INFOS("WindLight") << "Created inventory item " << inv_item << LL_ENDL;
+ param_mgr->savePresetToNotecard(param_mgr->mCurParams.mName);
+}
+
+bool LLFloaterWindLight::saveNotecardCallback(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotification::getSelectedOption(notification, response);
+ // if they choose save, do it. Otherwise, don't do anything
+ if(option == 0)
+ {
+ LLWLParamManager * param_mgr = LLWLParamManager::instance();
+ param_mgr->setParamSet(param_mgr->mCurParams.mName, param_mgr->mCurParams);
+ param_mgr->savePresetToNotecard(param_mgr->mCurParams.mName);
+ }
+ return false;
+}
bool LLFloaterWindLight::saveAlertCallback(const LLSD& notification, const LLSD& response)
{
@@ -948,9 +1023,10 @@ void LLFloaterWindLight::onChangePresetName(LLUICtrl* ctrl, void * userData)
{
return;
}
-
- LLWLParamManager::instance()->loadPreset(
- combo_box->getSelectedValue().asString());
+ //impfixme fix of an mystherious crash? : kittyviewer: if(!data.empty())
+ //
+ LLWLParamManager::instance()->loadPreset(combo_box->getSelectedValue().asString());
+ LL_INFOS("WindLight") << "Current inventory ID: " << LLWLParamManager::instance()->mCurParams.mInventoryID << LL_ENDL;
sWindLight->syncMenu();
}
diff --git a/linden/indra/newview/llfloaterwindlight.h b/linden/indra/newview/llfloaterwindlight.h
index 23e3056..9656803 100644
--- a/linden/indra/newview/llfloaterwindlight.h
+++ b/linden/indra/newview/llfloaterwindlight.h
@@ -91,9 +91,15 @@ public:
/// when user hits the load preset button
static void onNewPreset(void* userData);
- /// when user hits the save preset button
+ /// when user hits the save to file button
static void onSavePreset(void* userData);
+ /// when user hits the save to inventory button
+ static void onSaveNotecard(void* userData);
+
+ /// prompts a user when overwriting a preset notecard
+ static bool saveNotecardCallback(const LLSD& notification, const LLSD& response);
+
/// prompts a user when overwriting a preset
static bool saveAlertCallback(const LLSD& notification, const LLSD& response);
diff --git a/linden/indra/newview/llwlparammanager.cpp b/linden/indra/newview/llwlparammanager.cpp
index 74fa8f3..b3c2b0b 100644
--- a/linden/indra/newview/llwlparammanager.cpp
+++ b/linden/indra/newview/llwlparammanager.cpp
@@ -67,6 +67,10 @@
#include "llmemorystream.h"
#include "llnotify.h"
#include "llagent.h"
+#include "llinventorymodel.h"
+#include "llviewerinventory.h"
+#include "llviewerregion.h"
+#include "llassetuploadresponders.h"
#include "curl/curl.h"
@@ -243,7 +247,7 @@ void LLWLParamManager::loadPresetNotecard(const std::string& name, const LLUUID&
asset_id,
LLAssetType::AT_NOTECARD,
&loadWindlightNotecard,
- (void*)name.c_str());
+ (void*)&inv_id);
}
void LLWLParamManager::savePresets(const std::string & fileName)
@@ -269,6 +273,63 @@ void LLWLParamManager::savePresets(const std::string & fileName)
formatter->format(paramsData, presetsXML, LLSDFormatter::OPTIONS_PRETTY);
presetsXML.close();
+
+ propagateParameters();
+}
+
+bool LLWLParamManager::savePresetToNotecard(const std::string & name)
+{
+ // make an empty llsd
+ LLSD paramsData(LLSD::emptyMap());
+
+ // fill it with LLSD windlight params
+ paramsData = mParamList[name].getAll();
+
+ // get some XML
+ std::ostringstream presetsXML;
+ LLPointer formatter = new LLSDXMLFormatter();
+ formatter->format(paramsData, presetsXML, LLSDFormatter::OPTIONS_PRETTY);
+
+ // Write it to a notecard
+ LLNotecard notecard;
+ notecard.setText(presetsXML.str());
+
+ LLInventoryItem *item = gInventory.getItem(mParamList[name].mInventoryID);
+ if(!item)
+ {
+ mParamList[name].mInventoryID = LLUUID::null;
+ return false;
+ }
+ std::string agent_url = gAgent.getRegion()->getCapability("UpdateNotecardAgentInventory");
+ if(!agent_url.empty())
+ {
+ LLTransactionID tid;
+ LLAssetID asset_id;
+ tid.generate();
+ asset_id = tid.makeAssetID(gAgent.getSecureSessionID());
+
+ LLVFile file(gVFS, asset_id, LLAssetType::AT_NOTECARD, LLVFile::APPEND);
+
+ std::ostringstream stream;
+ notecard.exportStream(stream);
+ std::string buffer = stream.str();
+
+ S32 size = buffer.length() + 1;
+ file.setMaxSize(size);
+ file.write((U8*)buffer.c_str(), size);
+ LLSD body;
+ body["item_id"] = item->getUUID();
+ LL_INFOS("WindLight") << body << LL_ENDL;
+ LLHTTPClient::post(agent_url, body, new LLUpdateAgentInventoryResponder(body, asset_id, LLAssetType::AT_NOTECARD));
+ }
+ else
+ {
+ LL_WARNS("WindLight") << "Stuff the legacy system." << LL_ENDL;
+ return false;
+ }
+
+ propagateParameters();
+ return true;
}
void LLWLParamManager::loadPreset(const std::string & name,bool propagate)
@@ -659,7 +720,14 @@ LLWLParamManager * LLWLParamManager::instance()
void LLWLParamManager::loadWindlightNotecard(LLVFS *vfs, const LLUUID& asset_id, LLAssetType::EType asset_type, void *user_data, S32 status, LLExtStat ext_status)
{
- std::string name = std::string((char*)user_data);
+ LLUUID inventory_id(*((LLUUID*)user_data));
+ std::string name = "WindLight Setting.wl";
+ LLViewerInventoryItem *item = gInventory.getItem(inventory_id);
+ if(item)
+ {
+ inventory_id = item->getUUID();
+ name = item->getName();
+ }
if(LL_ERR_NOERR == status)
{
LLVFile file(vfs, asset_id, asset_type, LLVFile::READ);
@@ -685,6 +753,11 @@ void LLWLParamManager::loadWindlightNotecard(LLVFS *vfs, const LLUUID& asset_id,
subs["NAME"] = name;
LLNotifications::getInstance()->add("KittyInvalidWindlightNotecard", subs);
}
+ else
+ {
+ // We can do this because we know mCurParams
+ sInstance->mParamList[name].mInventoryID = inventory_id;
+ }
}
}
diff --git a/linden/indra/newview/llwlparammanager.h b/linden/indra/newview/llwlparammanager.h
index c506c11..612a507 100644
--- a/linden/indra/newview/llwlparammanager.h
+++ b/linden/indra/newview/llwlparammanager.h
@@ -154,9 +154,12 @@ public:
/// Load an individual preset from a notecard.
void loadPresetNotecard(const std::string& name, const LLUUID& asset_id, const LLUUID& inv_id);
-
+
/// save the parameter presets to file
void savePreset(const std::string & name);
+
+ /// save the parameter presets to file
+ bool savePresetToNotecard(const std::string & name);
/// Set shader uniforms dirty, so they'll update automatically.
void propagateParameters(void);
diff --git a/linden/indra/newview/llwlparamset.h b/linden/indra/newview/llwlparamset.h
index 21d646f..038490d 100644
--- a/linden/indra/newview/llwlparamset.h
+++ b/linden/indra/newview/llwlparamset.h
@@ -49,7 +49,8 @@ class LLWLParamSet {
friend class LLWLParamManager;
public:
- std::string mName;
+ std::string mName;
+ LLUUID mInventoryID;
private:
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_windlight_options.xml b/linden/indra/newview/skins/default/xui/en-us/floater_windlight_options.xml
index 471b3e5..529ed63 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_windlight_options.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_windlight_options.xml
@@ -24,10 +24,13 @@
label="New" label_selected="New" left_delta="40"
mouse_opaque="true" name="WLNewPreset" scale_image="true" width="70" />
+
+
+
+
--
cgit v1.1
From 7c878691db12df71b6924a8337f8e4c821189eb7 Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Fri, 27 Aug 2010 01:16:13 +0200
Subject: Katharine Berry: Added loading of water params from notecards.
---
linden/indra/newview/llinventorybridge.cpp | 11 +-
linden/indra/newview/llwaterparammanager.cpp | 147 ++++++++++++++++++++++++---
linden/indra/newview/llwaterparammanager.h | 13 +++
linden/indra/newview/llwaterparamset.h | 3 +-
linden/indra/newview/llwlparammanager.cpp | 1 +
5 files changed, 157 insertions(+), 18 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llinventorybridge.cpp b/linden/indra/newview/llinventorybridge.cpp
index a3a6e78..712d2fe 100644
--- a/linden/indra/newview/llinventorybridge.cpp
+++ b/linden/indra/newview/llinventorybridge.cpp
@@ -78,6 +78,7 @@
#include "llviewerobjectlist.h"
#include "llviewerwindow.h"
#include "llvoavatar.h"
+#include "llwaterparammanager.h"
#include "llwearable.h"
#include "llwearablelist.h"
#include "llviewermessage.h"
@@ -3068,7 +3069,11 @@ void LLNotecardBridge::openItem()
if(isSkySetting())
{
LLWLParamManager::instance()->loadPresetNotecard(item->getName(), item->getAssetUUID(), mUUID);
- }
+ }
+ else if(isWaterSetting())
+ {
+ LLWaterParamManager::instance()->loadPresetNotecard(item->getName(), item->getAssetUUID(), mUUID);
+ }
else
{
open_notecard(item, getPrefix() + item->getName(), LLUUID::null, FALSE);
@@ -3123,6 +3128,10 @@ void LLNotecardBridge::performAction(LLFolderView* folder, LLInventoryModel* mod
{
LLWLParamManager::instance()->loadPresetNotecard(itemp->getName(), itemp->getAssetUUID(), mUUID);
}
+ else if ("load_waterlight" == action)
+ {
+ LLWaterParamManager::instance()->loadPresetNotecard(itemp->getName(), itemp->getAssetUUID(), mUUID);
+ }
else if ("edit_windlight" == action)
{
open_notecard(itemp, getPrefix() + itemp->getName(), LLUUID::null, FALSE);
diff --git a/linden/indra/newview/llwaterparammanager.cpp b/linden/indra/newview/llwaterparammanager.cpp
index 4a61b78..0b08b14 100644
--- a/linden/indra/newview/llwaterparammanager.cpp
+++ b/linden/indra/newview/llwaterparammanager.cpp
@@ -48,6 +48,17 @@
#include "lllineeditor.h"
#include "llsdserialize.h"
+// For notecard loading
+#include "llvfile.h"
+#include "llnotecard.h"
+#include "llmemorystream.h"
+#include "llnotify.h"
+#include "llagent.h"
+#include "llinventorymodel.h"
+#include "llviewerinventory.h"
+#include "llviewerregion.h"
+#include "llassetuploadresponders.h"
+
#include "v4math.h"
#include "llviewerdisplay.h"
#include "llviewercontrol.h"
@@ -141,6 +152,17 @@ void LLWaterParamManager::loadAllPresets(const std::string& file_name)
void LLWaterParamManager::loadPreset(const std::string & name,bool propagate)
{
+ // Check if we already have the preset before we try loading it again.
+ if(mParamList.find(name) != mParamList.end())
+ {
+ if(propagate)
+ {
+ getParamSet(name, mCurParams);
+ propagateParameters();
+ }
+ return;
+ }
+
// bugfix for SL-46920: preventing filenames that break stuff.
char * curl_str = curl_escape(name.c_str(), name.size());
std::string escaped_filename(curl_str);
@@ -165,21 +187,7 @@ void LLWaterParamManager::loadPreset(const std::string & name,bool propagate)
if (presetsXML)
{
- LLSD paramsData(LLSD::emptyMap());
-
- LLPointer parser = new LLSDXMLParser();
-
- parser->parse(presetsXML, paramsData, LLSDSerialize::SIZE_UNLIMITED);
-
- std::map::iterator mIt = mParamList.find(name);
- if(mIt == mParamList.end())
- {
- addParamSet(name, paramsData);
- }
- else
- {
- setParamSet(name, paramsData);
- }
+ loadPresetXML(name, presetsXML);
presetsXML.close();
}
else
@@ -193,7 +201,76 @@ void LLWaterParamManager::loadPreset(const std::string & name,bool propagate)
getParamSet(name, mCurParams);
propagateParameters();
}
-}
+}
+
+bool LLWaterParamManager::loadPresetXML(const std::string& name, std::istream& preset_stream, bool propagate /* = false */, bool check_if_real /* = false */)
+{
+ LLSD paramsData(LLSD::emptyMap());
+
+ LLPointer parser = new LLSDXMLParser();
+
+ if(parser->parse(preset_stream, paramsData, LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE)
+ {
+ return false;
+ }
+
+ if(check_if_real)
+ {
+ static const char* expected_windlight_settings[] = {
+ "blurMultiplier",
+ "fresnelOffset",
+ "fresnelScale",
+ "normScale",
+ "normalMap",
+ "scaleAbove",
+ "scaleBelow",
+ "waterFogColor",
+ "waterFogDensity",
+ "wave1Dir",
+ "wave2Dir"
+ };
+ static S32 expected_count = LL_ARRAY_SIZE(expected_windlight_settings);
+ for(S32 i = 0; i < expected_count; ++i)
+ {
+ if(!paramsData.has(expected_windlight_settings[i]))
+ {
+ LL_WARNS("WindLight") << "Attempted to load WindLight water param set without " << expected_windlight_settings[i] << LL_ENDL;
+ return false;
+ }
+ }
+ }
+
+ std::map::iterator mIt = mParamList.find(name);
+ if(mIt == mParamList.end())
+ {
+ addParamSet(name, paramsData);
+ }
+ else
+ {
+ setParamSet(name, paramsData);
+ }
+
+ if(propagate)
+ {
+ getParamSet(name, mCurParams);
+ propagateParameters();
+ }
+ return true;
+}
+
+void LLWaterParamManager::loadPresetNotecard(const std::string& name, const LLUUID& asset_id, const LLUUID& inv_id)
+{
+ gAssetStorage->getInvItemAsset(LLHost::invalid,
+ gAgent.getID(),
+ gAgent.getSessionID(),
+ gAgent.getID(),
+ LLUUID::null,
+ inv_id,
+ asset_id,
+ LLAssetType::AT_NOTECARD,
+ &loadWaterNotecard,
+ (void*)&inv_id);
+}
void LLWaterParamManager::savePreset(const std::string & name)
{
@@ -457,3 +534,41 @@ LLWaterParamManager * LLWaterParamManager::instance()
return sInstance;
}
+
+// static
+void LLWaterParamManager::loadWaterNotecard(LLVFS *vfs, const LLUUID& asset_id, LLAssetType::EType asset_type, void *user_data, S32 status, LLExtStat ext_status)
+{
+ LLUUID inventory_id(*((LLUUID*)user_data));
+ std::string name = "WindLight Setting.ww";
+ LLViewerInventoryItem *item = gInventory.getItem(inventory_id);
+ if(item)
+ {
+ inventory_id = item->getUUID();
+ name = item->getName();
+ }
+ if(LL_ERR_NOERR == status)
+ {
+ LLVFile file(vfs, asset_id, asset_type, LLVFile::READ);
+ S32 file_length = file.getSize();
+ std::vector buffer(file_length + 1);
+ file.read((U8*)&buffer[0], file_length);
+ buffer[file_length] = 0;
+ LLNotecard notecard(LLNotecard::MAX_SIZE);
+ LLMemoryStream str((U8*)&buffer[0], file_length + 1);
+ notecard.importStream(str);
+ std::string settings = notecard.getText();
+ LLMemoryStream settings_str((U8*)settings.c_str(), settings.length());
+ bool is_real_setting = sInstance->loadPresetXML(name, settings_str, true, true);
+ if(!is_real_setting)
+ {
+ LLSD subs;
+ subs["NAME"] = name;
+ LLNotifications::instance().add("KittyInvalidWaterlightNotecard", subs);
+ }
+ else
+ {
+ // We can do this because we know mCurParams
+ sInstance->mParamList[name].mInventoryID = inventory_id;
+ }
+ }
+}
diff --git a/linden/indra/newview/llwaterparammanager.h b/linden/indra/newview/llwaterparammanager.h
index babaf00..baac4cf 100644
--- a/linden/indra/newview/llwaterparammanager.h
+++ b/linden/indra/newview/llwaterparammanager.h
@@ -39,6 +39,10 @@
#include "llviewercamera.h"
#include "v4color.h"
+#include "llassettype.h" // Ugh.
+
+class LLVFS;
+
const F32 WATER_FOG_LIGHT_CLAMP = 0.3f;
// color control
@@ -231,6 +235,13 @@ public:
/// load an individual preset into the sky
void loadPreset(const std::string & name,bool propagate=true);
+
+ /// load an individual preset into the sky from an LLSD stream
+ /// Returns whether the stream was actually reasonable XML to load from.
+ bool loadPresetXML(const std::string& name, std::istream& preset_stream, bool propogate=false, bool check_if_real=false);
+
+ /// Load an individual preset from a notecard.
+ void loadPresetNotecard(const std::string& name, const LLUUID& asset_id, const LLUUID& inv_id);
/// save the parameter presets to file
void savePreset(const std::string & name);
@@ -322,6 +333,8 @@ private:
// our parameter manager singleton instance
static LLWaterParamManager * sInstance;
+
+ static void loadWaterNotecard(LLVFS *vfs, const LLUUID& asset_id, LLAssetType::EType asset_type, void *user_data, S32 status, LLExtStat ext_status);
};
inline void LLWaterParamManager::setDensitySliderValue(F32 val)
diff --git a/linden/indra/newview/llwaterparamset.h b/linden/indra/newview/llwaterparamset.h
index 9087843..efbad31 100644
--- a/linden/indra/newview/llwaterparamset.h
+++ b/linden/indra/newview/llwaterparamset.h
@@ -49,7 +49,8 @@ class LLWaterParamSet
friend class LLWaterParamManager;
public:
- std::string mName;
+ std::string mName;
+ LLUUID mInventoryID;
private:
diff --git a/linden/indra/newview/llwlparammanager.cpp b/linden/indra/newview/llwlparammanager.cpp
index b3c2b0b..d7df7ae 100644
--- a/linden/indra/newview/llwlparammanager.cpp
+++ b/linden/indra/newview/llwlparammanager.cpp
@@ -718,6 +718,7 @@ LLWLParamManager * LLWLParamManager::instance()
return sInstance;
}
+// static
void LLWLParamManager::loadWindlightNotecard(LLVFS *vfs, const LLUUID& asset_id, LLAssetType::EType asset_type, void *user_data, S32 status, LLExtStat ext_status)
{
LLUUID inventory_id(*((LLUUID*)user_data));
--
cgit v1.1
From d6a5375d9e490c8b03b032bbe1fc08e30ebf1cd3 Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Fri, 27 Aug 2010 01:42:20 +0200
Subject: Katharine Berry: Save to Inventory in water floater.
---
linden/indra/newview/llfloaterwater.cpp | 75 ++++++++++++++++++++++
linden/indra/newview/llfloaterwater.h | 6 ++
linden/indra/newview/llwaterparammanager.cpp | 56 ++++++++++++++++
linden/indra/newview/llwaterparammanager.h | 3 +
linden/indra/newview/llwlparammanager.cpp | 1 -
.../skins/default/xui/en-us/floater_water.xml | 5 +-
6 files changed, 144 insertions(+), 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llfloaterwater.cpp b/linden/indra/newview/llfloaterwater.cpp
index 32c2b75..f08beea 100644
--- a/linden/indra/newview/llfloaterwater.cpp
+++ b/linden/indra/newview/llfloaterwater.cpp
@@ -50,6 +50,10 @@
#include "llboost.h"
#include "llmultisliderctrl.h"
+#include "llagent.h"
+#include "llinventorymodel.h"
+#include "llviewerinventory.h"
+
#include "v4math.h"
#include "llviewerdisplay.h"
#include "llviewercontrol.h"
@@ -157,6 +161,7 @@ void LLFloaterWater::initCallbacks(void) {
//childSetAction("WaterLoadPreset", onLoadPreset, comboBox);
childSetAction("WaterNewPreset", onNewPreset, comboBox);
childSetAction("WaterSavePreset", onSavePreset, comboBox);
+ childSetAction("WaterSaveNotecard", onSaveNotecard, comboBox);
childSetAction("WaterDeletePreset", onDeletePreset, comboBox);
// wave direction
@@ -644,6 +649,76 @@ void LLFloaterWater::onSavePreset(void* userData)
LLNotifications::instance().add("WLSavePresetAlert", LLSD(), LLSD(), saveAlertCallback);
}
+class KVFloaterWaterNotecardCreatedCallback : public LLInventoryCallback
+{
+public:
+ void fire(const LLUUID& inv_item);
+};
+
+void LLFloaterWater::onSaveNotecard(void* userData)
+{
+ // get the name
+ LLComboBox* comboBox = sWaterMenu->getChild("WaterPresetsCombo");
+
+ // don't save the empty name
+ if(comboBox->getSelectedItemLabel() == "")
+ {
+ return;
+ }
+
+ // Check if this is already a notecard.
+ if(LLWaterParamManager::instance()->mCurParams.mInventoryID.notNull())
+ {
+ LLNotifications::instance().add("KittyWLSaveNotecardAlert", LLSD(), LLSD(), saveNotecardCallback);
+ }
+ else
+ {
+ // Make sure we have a ".ww" extension.
+ std::string name = comboBox->getSelectedItemLabel();
+ if(name.length() > 2 && name.compare(name.length() - 3, 3, ".ww") != 0)
+ {
+ name += ".ww";
+ }
+ LLPointer cb = new KVFloaterWaterNotecardCreatedCallback();
+ // Create a notecard and then save it.
+ create_inventory_item(gAgent.getID(),
+ gAgent.getSessionID(),
+ LLUUID::null,
+ LLTransactionID::tnull,
+ name,
+ "Water settings (Kitty Viewer compatible)",
+ LLAssetType::AT_NOTECARD,
+ LLInventoryType::IT_NOTECARD,
+ NOT_WEARABLE,
+ PERM_ITEM_UNRESTRICTED,
+ cb);
+
+ }
+}
+
+void KVFloaterWaterNotecardCreatedCallback::fire(const LLUUID& inv_item)
+{
+ LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
+ param_mgr->setParamSet(param_mgr->mCurParams.mName, param_mgr->mCurParams);
+ param_mgr->mParamList[param_mgr->mCurParams.mName].mInventoryID = inv_item;
+ param_mgr->mCurParams.mInventoryID = inv_item;
+ LL_INFOS("WindLight") << "Created inventory item " << inv_item << LL_ENDL;
+ param_mgr->savePresetToNotecard(param_mgr->mCurParams.mName);
+}
+
+bool LLFloaterWater::saveNotecardCallback(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotification::getSelectedOption(notification, response);
+ // if they choose save, do it. Otherwise, don't do anything
+ if(option == 0)
+ {
+ LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
+ param_mgr->setParamSet(param_mgr->mCurParams.mName, param_mgr->mCurParams);
+ param_mgr->savePresetToNotecard(param_mgr->mCurParams.mName);
+ }
+ return false;
+}
+
bool LLFloaterWater::saveAlertCallback(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotification::getSelectedOption(notification, response);
diff --git a/linden/indra/newview/llfloaterwater.h b/linden/indra/newview/llfloaterwater.h
index f0944e1..0a47627 100644
--- a/linden/indra/newview/llfloaterwater.h
+++ b/linden/indra/newview/llfloaterwater.h
@@ -96,6 +96,12 @@ public:
/// when user hits the save preset button
static void onSavePreset(void* userData);
+
+ /// when user hits the save to inventory button
+ static void onSaveNotecard(void* userData);
+
+ /// prompts a user when overwriting a preset notecard
+ static bool saveNotecardCallback(const LLSD& notification, const LLSD& response);
/// prompts a user when overwriting a preset
static bool saveAlertCallback(const LLSD& notification, const LLSD& response);
diff --git a/linden/indra/newview/llwaterparammanager.cpp b/linden/indra/newview/llwaterparammanager.cpp
index 0b08b14..e01506e 100644
--- a/linden/indra/newview/llwaterparammanager.cpp
+++ b/linden/indra/newview/llwaterparammanager.cpp
@@ -298,6 +298,62 @@ void LLWaterParamManager::savePreset(const std::string & name)
propagateParameters();
}
+// Yes, this function is completely identical to LLWLParamManager::savePresetToNotecard.
+// I feel some refactoring of this whole WindLight thing would be generally beneficial.
+// Damned if I'm going to be the one to do it, though.
+bool LLWaterParamManager::savePresetToNotecard(const std::string & name)
+{
+ // make an empty llsd
+ LLSD paramsData(LLSD::emptyMap());
+
+ // fill it with LLSD windlight params
+ paramsData = mParamList[name].getAll();
+
+ // get some XML
+ std::ostringstream presetsXML;
+ LLPointer formatter = new LLSDXMLFormatter();
+ formatter->format(paramsData, presetsXML, LLSDFormatter::OPTIONS_PRETTY);
+
+ // Write it to a notecard
+ LLNotecard notecard;
+ notecard.setText(presetsXML.str());
+
+ LLInventoryItem *item = gInventory.getItem(mParamList[name].mInventoryID);
+ if(!item)
+ {
+ mParamList[name].mInventoryID = LLUUID::null;
+ return false;
+ }
+ std::string agent_url = gAgent.getRegion()->getCapability("UpdateNotecardAgentInventory");
+ if(!agent_url.empty())
+ {
+ LLTransactionID tid;
+ LLAssetID asset_id;
+ tid.generate();
+ asset_id = tid.makeAssetID(gAgent.getSecureSessionID());
+
+ LLVFile file(gVFS, asset_id, LLAssetType::AT_NOTECARD, LLVFile::APPEND);
+
+ std::ostringstream stream;
+ notecard.exportStream(stream);
+ std::string buffer = stream.str();
+
+ S32 size = buffer.length() + 1;
+ file.setMaxSize(size);
+ file.write((U8*)buffer.c_str(), size);
+ LLSD body;
+ body["item_id"] = item->getUUID();
+ LLHTTPClient::post(agent_url, body, new LLUpdateAgentInventoryResponder(body, asset_id, LLAssetType::AT_NOTECARD));
+ }
+ else
+ {
+ LL_WARNS("WindLight") << "Stuff the legacy system." << LL_ENDL;
+ return false;
+ }
+
+ propagateParameters();
+ return true;
+}
void LLWaterParamManager::propagateParameters(void)
{
diff --git a/linden/indra/newview/llwaterparammanager.h b/linden/indra/newview/llwaterparammanager.h
index baac4cf..588e436 100644
--- a/linden/indra/newview/llwaterparammanager.h
+++ b/linden/indra/newview/llwaterparammanager.h
@@ -245,6 +245,9 @@ public:
/// save the parameter presets to file
void savePreset(const std::string & name);
+
+ /// save the parameter presets to file
+ bool savePresetToNotecard(const std::string & name);
/// send the parameters to the shaders
void propagateParameters(void);
diff --git a/linden/indra/newview/llwlparammanager.cpp b/linden/indra/newview/llwlparammanager.cpp
index d7df7ae..31471d7 100644
--- a/linden/indra/newview/llwlparammanager.cpp
+++ b/linden/indra/newview/llwlparammanager.cpp
@@ -319,7 +319,6 @@ bool LLWLParamManager::savePresetToNotecard(const std::string & name)
file.write((U8*)buffer.c_str(), size);
LLSD body;
body["item_id"] = item->getUUID();
- LL_INFOS("WindLight") << body << LL_ENDL;
LLHTTPClient::post(agent_url, body, new LLUpdateAgentInventoryResponder(body, asset_id, LLAssetType::AT_NOTECARD));
}
else
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_water.xml b/linden/indra/newview/skins/default/xui/en-us/floater_water.xml
index 7038c93..c7e5d83 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_water.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_water.xml
@@ -24,9 +24,12 @@
label="New" label_selected="New" left_delta="40"
mouse_opaque="true" name="WaterNewPreset" scale_image="true" width="70" />
+
-
+
+
+[NAME] is not a valid water settings asset.
+
+
+
+[NAME] is not a valid WindLight settings asset.
+
+
+
+Do you wish to overwrite the saved preset?
+
+
+
- Your CPU speed does not meet the minimum requirements.
--
cgit v1.1
From 8da4875a718f55546942aca1f1a9a049989793f1 Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Fri, 27 Aug 2010 02:03:17 +0200
Subject: Katharine Berry: Use correct icons for WindLight in inventory
---
linden/indra/newview/llpanelinventory.cpp | 43 +++++++++++++++++++++++++++----
1 file changed, 38 insertions(+), 5 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llpanelinventory.cpp b/linden/indra/newview/llpanelinventory.cpp
index 85f6ea2..333b83f 100644
--- a/linden/indra/newview/llpanelinventory.cpp
+++ b/linden/indra/newview/llpanelinventory.cpp
@@ -1377,6 +1377,9 @@ public:
virtual LLUIImagePtr getIcon() const;
virtual void openItem();
virtual BOOL removeItem();
+ bool isSkySetting() const;
+ bool isWaterSetting() const;
+ bool isWindLight() const;
};
LLTaskNotecardBridge::LLTaskNotecardBridge(
@@ -1387,11 +1390,6 @@ LLTaskNotecardBridge::LLTaskNotecardBridge(
{
}
-LLUIImagePtr LLTaskNotecardBridge::getIcon() const
-{
- return get_item_icon(LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, 0, FALSE);
-}
-
void LLTaskNotecardBridge::openItem()
{
if(LLPreview::show(mUUID))
@@ -1410,6 +1408,10 @@ void LLTaskNotecardBridge::openItem()
return;
}
// [/RLVa:KB]
+ if(isWindLight())
+ {
+ return;
+ }
if(object->permModify() || gAgent.isGodlike())
{
S32 left, top;
@@ -1434,6 +1436,37 @@ BOOL LLTaskNotecardBridge::removeItem()
LLPreview::hide(mUUID);
return LLTaskInvFVBridge::removeItem();
}
+LLUIImagePtr LLTaskNotecardBridge::getIcon() const
+{
+ if(isSkySetting())
+ {
+ return LLUI::getUIImage("Inv_WindLight");
+ }
+ else if(isWaterSetting())
+ {
+ return LLUI::getUIImage("Inv_WaterLight");
+ }
+ else
+ {
+ return get_item_icon(LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, 0, FALSE);
+ }
+}
+
+bool LLTaskNotecardBridge::isSkySetting() const
+{
+ return (getName().length() > 2 && getName().compare(getName().length() - 3, 3, ".wl") == 0);
+}
+
+bool LLTaskNotecardBridge::isWaterSetting() const
+{
+ return (getName().length() > 2 && getName().compare(getName().length() - 3, 3, ".ww") == 0);
+}
+
+bool LLTaskNotecardBridge::isWindLight() const
+{
+ return (isSkySetting() || isWaterSetting());
+}
+
///----------------------------------------------------------------------------
/// Class LLTaskGestureBridge
--
cgit v1.1
From ce4998e0cb8f4bce1a45dff76a346de2a2c3c4a0 Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Fri, 27 Aug 2010 13:29:20 +0200
Subject: give the buttons in the windlight floaters love
---
.../skins/default/xui/en-us/floater_water.xml | 16 ++++++++--------
.../default/xui/en-us/floater_windlight_options.xml | 20 ++++++++++----------
2 files changed, 18 insertions(+), 18 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_water.xml b/linden/indra/newview/skins/default/xui/en-us/floater_water.xml
index c7e5d83..fd0c131 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_water.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_water.xml
@@ -21,17 +21,17 @@
label="" label_selected="" left_delta="180" image_overlay="arrow_right.tga"
mouse_opaque="true" name="next" scale_image="true" width="20" />
+ label="New" label_selected="New" left_delta="30"
+ mouse_opaque="true" name="WaterNewPreset" scale_image="true" width="50" />
+ label="Save to Disk" label_selected="Save to Disk" left_delta="50"
+ mouse_opaque="true" name="WaterSavePreset" scale_image="true" width="110" />
+ label="Save to Inventory" label_selected="Save" left_delta="110"
+ mouse_opaque="true" name="WaterSaveNotecard" scale_image="true" width="110" />
+ label="Delete File" label_selected="Delete File" left_delta="110"
+ mouse_opaque="true" name="WaterDeletePreset" scale_image="true" width="110" />
+ label="New" label_selected="New" left_delta="30"
+ mouse_opaque="true" name="WLNewPreset" scale_image="true" width="50" />
+ label="Save to Disk" label_selected="Save to Disk" left_delta="50"
+ mouse_opaque="true" name="WLSavePreset" scale_image="true" width="110" />
-
+ label="Save to Inventory" label_selected="Save" left_delta="110"
+ mouse_opaque="true" name="WLSaveNotecard" scale_image="true" width="110" />
+
--
cgit v1.1
From de1f64910b86bd8c690868f645053509371b89cf Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Fri, 27 Aug 2010 15:30:58 +0200
Subject: fix possible crash caused by hudmanager
thanks to nemurimasu for the catch
---
linden/indra/newview/llhudeffectlookat.cpp | 10 +++++-----
linden/indra/newview/llhudmanager.cpp | 3 ++-
2 files changed, 7 insertions(+), 6 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llhudeffectlookat.cpp b/linden/indra/newview/llhudeffectlookat.cpp
index 561fce5..58d2c6a 100644
--- a/linden/indra/newview/llhudeffectlookat.cpp
+++ b/linden/indra/newview/llhudeffectlookat.cpp
@@ -280,17 +280,17 @@ void LLHUDEffectLookAt::packData(LLMessageSystem *mesgsys)
LLViewerObject* source_object = (LLViewerObject*)mSourceObject;
LLVOAvatar* source_avatar = NULL;
- if (!source_object)
+ if (!source_object)//imprudence TODO: find out why this happens at all and fix there
{
+ LL_DEBUGS("HUDEffect")<<"NULL-Object HUDEffectLookAt message" << LL_ENDL;
markDead();
return;
}
- if (source_object->isAvatar()) //strange enough that non-objects try
- //to send a lookat message ...
+ if (source_object->isAvatar())
{
source_avatar = (LLVOAvatar*)source_object;
}
- else //... more strange if its an non-avatar object ...
+ else //imprudence TODO: find out why this happens at all and fix there
{
LL_DEBUGS("HUDEffect")<<"Non-Avatar HUDEffectLookAt message for ID: " << source_object->getID().asString()<< LL_ENDL;
markDead();
@@ -300,7 +300,7 @@ void LLHUDEffectLookAt::packData(LLMessageSystem *mesgsys)
bool is_self = source_avatar->isSelf();
bool is_private = gSavedSettings.getBOOL("PrivateLookAtTarget");
- if (!is_self) //... very strange if it is not self. But happens. Also at local opensim.
+ if (!is_self) //imprudence TODO: find out why this happens at all and fix there
{
LL_DEBUGS("HUDEffect")<< "Non-self Avatar HUDEffectLookAt message for ID: " << source_avatar->getID().asString() << LL_ENDL;
markDead();
diff --git a/linden/indra/newview/llhudmanager.cpp b/linden/indra/newview/llhudmanager.cpp
index 955d786..602ef6c 100644
--- a/linden/indra/newview/llhudmanager.cpp
+++ b/linden/indra/newview/llhudmanager.cpp
@@ -103,7 +103,8 @@ void LLHUDManager::sendEffects()
msg->nextBlockFast(_PREHASH_Effect);
hep->packData(msg);
hep->setNeedsSendToSim(FALSE);
- gAgent.sendMessage();
+ if (!hep->isDead()) //packData(msg) might have invalidated the effect
+ gAgent.sendMessage();
}
}
}
--
cgit v1.1
From 2b1749ec67a6fe9eb93664b5921f5f212d35ae6b Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sun, 29 Aug 2010 01:35:32 -0700
Subject: Added author info to local texture files
---
linden/indra/newview/floaterlocalassetbrowse.H | 2 +-
linden/indra/newview/floaterlocalassetbrowse.cpp | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/floaterlocalassetbrowse.H b/linden/indra/newview/floaterlocalassetbrowse.H
index 4827daa..e02a7d3 100644
--- a/linden/indra/newview/floaterlocalassetbrowse.H
+++ b/linden/indra/newview/floaterlocalassetbrowse.H
@@ -4,7 +4,7 @@
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
-* Copyright (c) 2010, author unknown
+* 2010, original author Vaalith Jinn
*
* Imprudence Viewer Source Code
* The source code in this file ("Source Code") is provided to you
diff --git a/linden/indra/newview/floaterlocalassetbrowse.cpp b/linden/indra/newview/floaterlocalassetbrowse.cpp
index dba4e85..337a5e6 100644
--- a/linden/indra/newview/floaterlocalassetbrowse.cpp
+++ b/linden/indra/newview/floaterlocalassetbrowse.cpp
@@ -4,7 +4,7 @@
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
-* Copyright (c) 2010, author unknown
+* 2010, original author Vaalith Jinn
*
* Imprudence Viewer Source Code
* The source code in this file ("Source Code") is provided to you
--
cgit v1.1
From 2eef1ebb15b900145cc47bc89c4c7ad95a5f6233 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sun, 29 Aug 2010 04:05:22 -0700
Subject: Compile fixes for windlight notecards on windows
---
linden/indra/newview/llinventorybridge.cpp | 11 -----------
1 file changed, 11 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llinventorybridge.cpp b/linden/indra/newview/llinventorybridge.cpp
index 712d2fe..bf2d898 100644
--- a/linden/indra/newview/llinventorybridge.cpp
+++ b/linden/indra/newview/llinventorybridge.cpp
@@ -823,16 +823,6 @@ void LLItemBridge::selectItem()
{
item->fetchFromServer();
}
-
- if (item && item->isComplete())
- {
- bool is_windlight = (getName().length() > 2 && getName().compare(getName().length() - 3, 3, ".wl") == 0);
- if(is_windlight)
- {
- LLWLParamManager::instance()->loadPresetNotecard(item->getName(), item->getAssetUUID(), mUUID);
- }
- }
-
}
void LLItemBridge::restoreItem()
@@ -3065,7 +3055,6 @@ void LLNotecardBridge::openItem()
LLViewerInventoryItem* item = getItem();
if (item)
{
- bool is_windlight = (getName().length() > 2 && getName().compare(getName().length() - 3, 3, ".wl") == 0);
if(isSkySetting())
{
LLWLParamManager::instance()->loadPresetNotecard(item->getName(), item->getAssetUUID(), mUUID);
--
cgit v1.1
From 89315b7e2649015845b7649133a5a19cbba717ac Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sun, 29 Aug 2010 10:38:03 -0700
Subject: Tidied up the sky/water editors (both use a flyout_button to save
now). Still some non-trivial bugs to fix, specifically: #474 and #475. Both
have repros
---
linden/indra/newview/app_settings/logcontrol.xml | 1 +
linden/indra/newview/llfloaterwater.cpp | 118 +++---
linden/indra/newview/llfloaterwater.h | 5 +-
linden/indra/newview/llfloaterwindlight.cpp | 116 +++--
linden/indra/newview/llfloaterwindlight.h | 5 +-
.../skins/default/xui/en-us/floater_water.xml | 24 +-
.../xui/en-us/floater_windlight_options.xml | 466 +++++++++++----------
7 files changed, 361 insertions(+), 374 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/logcontrol.xml b/linden/indra/newview/app_settings/logcontrol.xml
index 4d3288f..4e0b582 100644
--- a/linden/indra/newview/app_settings/logcontrol.xml
+++ b/linden/indra/newview/app_settings/logcontrol.xml
@@ -77,6 +77,7 @@
+
diff --git a/linden/indra/newview/llfloaterwater.cpp b/linden/indra/newview/llfloaterwater.cpp
index f08beea..05bc001 100644
--- a/linden/indra/newview/llfloaterwater.cpp
+++ b/linden/indra/newview/llfloaterwater.cpp
@@ -160,9 +160,8 @@ void LLFloaterWater::initCallbacks(void) {
//childSetAction("WaterLoadPreset", onLoadPreset, comboBox);
childSetAction("WaterNewPreset", onNewPreset, comboBox);
- childSetAction("WaterSavePreset", onSavePreset, comboBox);
- childSetAction("WaterSaveNotecard", onSaveNotecard, comboBox);
childSetAction("WaterDeletePreset", onDeletePreset, comboBox);
+ childSetCommitCallback("WaterSavePreset", onSavePreset, this);
// wave direction
childSetCommitCallback("WaterWave1DirX", onVector2ControlXMoved, ¶m_mgr->mWave1Dir);
@@ -623,39 +622,23 @@ void LLFloaterWater::onNewPreset(void* userData)
LLNotifications::instance().add("NewWaterPreset", LLSD(), LLSD(), newPromptCallback);
}
-void LLFloaterWater::onSavePreset(void* userData)
-{
- // get the name
- LLComboBox* comboBox = sWaterMenu->getChild("WaterPresetsCombo");
-
- // don't save the empty name
- if(comboBox->getSelectedItemLabel() == "")
- {
- return;
- }
-
- LLWaterParamManager::instance()->mCurParams.mName =
- comboBox->getSelectedItemLabel();
-
- // check to see if it's a default and shouldn't be overwritten
- std::set::iterator sIt = sDefaultPresets.find(
- comboBox->getSelectedItemLabel());
- if(sIt != sDefaultPresets.end() && !gSavedSettings.getBOOL("WaterEditPresets"))
- {
- LLNotifications::instance().add("WLNoEditDefault");
- return;
- }
-
- LLNotifications::instance().add("WLSavePresetAlert", LLSD(), LLSD(), saveAlertCallback);
-}
-
class KVFloaterWaterNotecardCreatedCallback : public LLInventoryCallback
{
public:
void fire(const LLUUID& inv_item);
};
-void LLFloaterWater::onSaveNotecard(void* userData)
+void KVFloaterWaterNotecardCreatedCallback::fire(const LLUUID& inv_item)
+{
+ LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
+ param_mgr->setParamSet(param_mgr->mCurParams.mName, param_mgr->mCurParams);
+ param_mgr->mParamList[param_mgr->mCurParams.mName].mInventoryID = inv_item;
+ param_mgr->mCurParams.mInventoryID = inv_item;
+ LL_INFOS("WindLight") << "Created inventory item " << inv_item << LL_ENDL;
+ param_mgr->savePresetToNotecard(param_mgr->mCurParams.mName);
+}
+
+void LLFloaterWater::onSavePreset(LLUICtrl* ctrl, void* userData)
{
// get the name
LLComboBox* comboBox = sWaterMenu->getChild("WaterPresetsCombo");
@@ -665,47 +648,56 @@ void LLFloaterWater::onSaveNotecard(void* userData)
{
return;
}
-
- // Check if this is already a notecard.
- if(LLWaterParamManager::instance()->mCurParams.mInventoryID.notNull())
+
+ if (ctrl->getValue().asString() == "save_disk_item")
{
- LLNotifications::instance().add("KittyWLSaveNotecardAlert", LLSD(), LLSD(), saveNotecardCallback);
+ LLWaterParamManager::instance()->mCurParams.mName =
+ comboBox->getSelectedItemLabel();
+
+ // check to see if it's a default and shouldn't be overwritten
+ std::set::iterator sIt = sDefaultPresets.find(
+ comboBox->getSelectedItemLabel());
+ if(sIt != sDefaultPresets.end() && !gSavedSettings.getBOOL("WaterEditPresets"))
+ {
+ LLNotifications::instance().add("WLNoEditDefault");
+ return;
+ }
+
+ LLNotifications::instance().add("WLSavePresetAlert", LLSD(), LLSD(), saveAlertCallback);
}
- else
- {
- // Make sure we have a ".ww" extension.
- std::string name = comboBox->getSelectedItemLabel();
- if(name.length() > 2 && name.compare(name.length() - 3, 3, ".ww") != 0)
+ else if (ctrl->getValue().asString() == "save_inventory_item")
+ {
+ // Check if this is already a notecard.
+ if(LLWaterParamManager::instance()->mCurParams.mInventoryID.notNull())
{
- name += ".ww";
+ LLNotifications::instance().add("KittyWLSaveNotecardAlert", LLSD(), LLSD(), saveNotecardCallback);
+ }
+ else
+ {
+ // Make sure we have a ".ww" extension.
+ std::string name = comboBox->getSelectedItemLabel();
+ if(name.length() > 2 && name.compare(name.length() - 3, 3, ".ww") != 0)
+ {
+ name += ".ww";
+ }
+ LLPointer cb = new KVFloaterWaterNotecardCreatedCallback();
+ // Create a notecard and then save it.
+ create_inventory_item(gAgent.getID(),
+ gAgent.getSessionID(),
+ LLUUID::null,
+ LLTransactionID::tnull,
+ name,
+ "Water settings (Imprudence compatible)",
+ LLAssetType::AT_NOTECARD,
+ LLInventoryType::IT_NOTECARD,
+ NOT_WEARABLE,
+ PERM_ITEM_UNRESTRICTED,
+ cb);
+
}
- LLPointer cb = new KVFloaterWaterNotecardCreatedCallback();
- // Create a notecard and then save it.
- create_inventory_item(gAgent.getID(),
- gAgent.getSessionID(),
- LLUUID::null,
- LLTransactionID::tnull,
- name,
- "Water settings (Kitty Viewer compatible)",
- LLAssetType::AT_NOTECARD,
- LLInventoryType::IT_NOTECARD,
- NOT_WEARABLE,
- PERM_ITEM_UNRESTRICTED,
- cb);
-
}
}
-void KVFloaterWaterNotecardCreatedCallback::fire(const LLUUID& inv_item)
-{
- LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
- param_mgr->setParamSet(param_mgr->mCurParams.mName, param_mgr->mCurParams);
- param_mgr->mParamList[param_mgr->mCurParams.mName].mInventoryID = inv_item;
- param_mgr->mCurParams.mInventoryID = inv_item;
- LL_INFOS("WindLight") << "Created inventory item " << inv_item << LL_ENDL;
- param_mgr->savePresetToNotecard(param_mgr->mCurParams.mName);
-}
-
bool LLFloaterWater::saveNotecardCallback(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotification::getSelectedOption(notification, response);
diff --git a/linden/indra/newview/llfloaterwater.h b/linden/indra/newview/llfloaterwater.h
index 0a47627..cd9eb13 100644
--- a/linden/indra/newview/llfloaterwater.h
+++ b/linden/indra/newview/llfloaterwater.h
@@ -95,10 +95,7 @@ public:
static void onNewPreset(void* userData);
/// when user hits the save preset button
- static void onSavePreset(void* userData);
-
- /// when user hits the save to inventory button
- static void onSaveNotecard(void* userData);
+ static void onSavePreset(LLUICtrl* ctrl, void* userData);
/// prompts a user when overwriting a preset notecard
static bool saveNotecardCallback(const LLSD& notification, const LLSD& response);
diff --git a/linden/indra/newview/llfloaterwindlight.cpp b/linden/indra/newview/llfloaterwindlight.cpp
index 8cdc634..ae94d3a 100644
--- a/linden/indra/newview/llfloaterwindlight.cpp
+++ b/linden/indra/newview/llfloaterwindlight.cpp
@@ -225,9 +225,8 @@ void LLFloaterWindLight::initCallbacks(void) {
//childSetAction("WLLoadPreset", onLoadPreset, comboBox);
childSetAction("WLNewPreset", onNewPreset, comboBox);
- childSetAction("WLSavePreset", onSavePreset, comboBox);
- childSetAction("WLSaveNotecard", onSaveNotecard, comboBox);
childSetAction("WLDeletePreset", onDeletePreset, comboBox);
+ childSetCommitCallback("WLSavePreset", onSavePreset, this);
comboBox->setCommitCallback(onChangePresetName);
@@ -816,39 +815,23 @@ void LLFloaterWindLight::onNewPreset(void* userData)
LLNotifications::instance().add("NewSkyPreset", LLSD(), LLSD(), newPromptCallback);
}
-void LLFloaterWindLight::onSavePreset(void* userData)
-{
- // get the name
- LLComboBox* comboBox = sWindLight->getChild(
- "WLPresetsCombo");
-
- // don't save the empty name
- if(comboBox->getSelectedItemLabel() == "")
- {
- return;
- }
-
- // check to see if it's a default and shouldn't be overwritten
- std::set::iterator sIt = sDefaultPresets.find(
- comboBox->getSelectedItemLabel());
- if(sIt != sDefaultPresets.end() && !gSavedSettings.getBOOL("SkyEditPresets"))
- {
- LLNotifications::instance().add("WLNoEditDefault");
- return;
- }
-
- LLWLParamManager::instance()->mCurParams.mName =
- comboBox->getSelectedItemLabel();
-
- LLNotifications::instance().add("WLSavePresetAlert", LLSD(), LLSD(), saveAlertCallback);
-}
class KVFloaterWindLightNotecardCreatedCallback : public LLInventoryCallback
{
public:
void fire(const LLUUID& inv_item);
};
-void LLFloaterWindLight::onSaveNotecard(void* userData)
+void KVFloaterWindLightNotecardCreatedCallback::fire(const LLUUID& inv_item)
+{
+ LLWLParamManager * param_mgr = LLWLParamManager::instance();
+ param_mgr->setParamSet(param_mgr->mCurParams.mName, param_mgr->mCurParams);
+ param_mgr->mParamList[param_mgr->mCurParams.mName].mInventoryID = inv_item;
+ param_mgr->mCurParams.mInventoryID = inv_item;
+ LL_INFOS("WindLight") << "Created inventory item " << inv_item << LL_ENDL;
+ param_mgr->savePresetToNotecard(param_mgr->mCurParams.mName);
+}
+
+void LLFloaterWindLight::onSavePreset(LLUICtrl* ctrl, void* userData)
{
// get the name
LLComboBox* comboBox = sWindLight->getChild(
@@ -859,47 +842,56 @@ void LLFloaterWindLight::onSaveNotecard(void* userData)
{
return;
}
-
- // Check if this is already a notecard.
- if(LLWLParamManager::instance()->mCurParams.mInventoryID.notNull())
+
+ if (ctrl->getValue().asString() == "save_disk_item")
{
- LLNotifications::instance().add("KittyWLSaveNotecardAlert", LLSD(), LLSD(), saveNotecardCallback);
+ // check to see if it's a default and shouldn't be overwritten
+ std::set::iterator sIt = sDefaultPresets.find(
+ comboBox->getSelectedItemLabel());
+ if(sIt != sDefaultPresets.end() && !gSavedSettings.getBOOL("SkyEditPresets"))
+ {
+ LLNotifications::instance().add("WLNoEditDefault");
+ return;
+ }
+
+ LLWLParamManager::instance()->mCurParams.mName =
+ comboBox->getSelectedItemLabel();
+
+ LLNotifications::instance().add("WLSavePresetAlert", LLSD(), LLSD(), saveAlertCallback);
}
- else
+ else if (ctrl->getValue().asString() == "save_inventory_item")
{
- // Make sure we have a ".wl" extension.
- std::string name = comboBox->getSelectedItemLabel();
- if(name.length() > 2 && name.compare(name.length() - 3, 3, ".wl") != 0)
+ // Check if this is already a notecard.
+ if(LLWLParamManager::instance()->mCurParams.mInventoryID.notNull())
{
- name += ".wl";
+ LLNotifications::instance().add("KittyWLSaveNotecardAlert", LLSD(), LLSD(), saveNotecardCallback);
+ }
+ else
+ {
+ // Make sure we have a ".wl" extension.
+ std::string name = comboBox->getSelectedItemLabel();
+ if(name.length() > 2 && name.compare(name.length() - 3, 3, ".wl") != 0)
+ {
+ name += ".wl";
+ }
+ LLPointer cb = new KVFloaterWindLightNotecardCreatedCallback();
+ // Create a notecard and then save it.
+ create_inventory_item(gAgent.getID(),
+ gAgent.getSessionID(),
+ LLUUID::null,
+ LLTransactionID::tnull,
+ name,
+ "WindLight settings (Imprudence compatible)",
+ LLAssetType::AT_NOTECARD,
+ LLInventoryType::IT_NOTECARD,
+ NOT_WEARABLE,
+ PERM_ITEM_UNRESTRICTED,
+ cb);
+
}
- LLPointer cb = new KVFloaterWindLightNotecardCreatedCallback();
- // Create a notecard and then save it.
- create_inventory_item(gAgent.getID(),
- gAgent.getSessionID(),
- LLUUID::null,
- LLTransactionID::tnull,
- name,
- "WindLight settings (Kitty Viewer compatible)",
- LLAssetType::AT_NOTECARD,
- LLInventoryType::IT_NOTECARD,
- NOT_WEARABLE,
- PERM_ITEM_UNRESTRICTED,
- cb);
-
}
}
-void KVFloaterWindLightNotecardCreatedCallback::fire(const LLUUID& inv_item)
-{
- LLWLParamManager * param_mgr = LLWLParamManager::instance();
- param_mgr->setParamSet(param_mgr->mCurParams.mName, param_mgr->mCurParams);
- param_mgr->mParamList[param_mgr->mCurParams.mName].mInventoryID = inv_item;
- param_mgr->mCurParams.mInventoryID = inv_item;
- LL_INFOS("WindLight") << "Created inventory item " << inv_item << LL_ENDL;
- param_mgr->savePresetToNotecard(param_mgr->mCurParams.mName);
-}
-
bool LLFloaterWindLight::saveNotecardCallback(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotification::getSelectedOption(notification, response);
diff --git a/linden/indra/newview/llfloaterwindlight.h b/linden/indra/newview/llfloaterwindlight.h
index 9656803..b9e5311 100644
--- a/linden/indra/newview/llfloaterwindlight.h
+++ b/linden/indra/newview/llfloaterwindlight.h
@@ -92,10 +92,7 @@ public:
static void onNewPreset(void* userData);
/// when user hits the save to file button
- static void onSavePreset(void* userData);
-
- /// when user hits the save to inventory button
- static void onSaveNotecard(void* userData);
+ static void onSavePreset(LLUICtrl* ctrl, void* userData);
/// prompts a user when overwriting a preset notecard
static bool saveNotecardCallback(const LLSD& notification, const LLSD& response);
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_water.xml b/linden/indra/newview/skins/default/xui/en-us/floater_water.xml
index fd0c131..441ce7b 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_water.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_water.xml
@@ -21,17 +21,21 @@
label="" label_selected="" left_delta="180" image_overlay="arrow_right.tga"
mouse_opaque="true" name="next" scale_image="true" width="20" />
+ label="New" right="-270"
+ mouse_opaque="true" name="WaterNewPreset" scale_image="true" width="100" />
+
+
+ Save to Inventory
+
+
+ Save to Disk
+
+
-
-
+ label="Delete File" label_selected="Delete File" right="-10"
+ mouse_opaque="true" name="WaterDeletePreset" scale_image="true" width="125" />
-
-
-
-
-
+
+
+ Save to Inventory
+
+
+ Save to Disk
+
+
+
+
-
-
- Blue Horizon
-
-
-
+
-
- Sun/Moon Color
-
-
+
-
- R
-
-
+
- G
-
-
+
- B
-
-
+
- I
-
-
+
-
-
-
-
- Sun/Moon Position
-
-
+
-
-
-
- Ambient
-
-
+
-
- R
-
-
+
- G
-
-
+
- B
-
-
+
- I
-
-
+
-
-
-
-
- East Angle
-
-
+
-
-
- Sun Glow
-
-
+
-
-
-
- Scene Gamma
-
-
+
-
-
- Star Brightness
-
-
+
-
-
-
+
-
- Cloud Color
-
-
+
-
- R
-
-
+
- G
-
-
+
- B
-
-
+
- I
-
-
+
-
-
-
-
- Cloud XY/Density
-
-
+
-
- X
-
-
+
- Y
-
-
+
- D
-
-
+
-
-
-
- Cloud Coverage
-
-
+
-
-
- Cloud Scale
-
-
+
-
-
- Cloud Detail (XY/Density)
-
-
+
-
- X
-
-
+
- Y
-
-
+
- D
-
-
+
-
-
-
- Cloud Scroll X
-
-
+
-
-
-
- Cloud Scroll Y
-
-
+
-
-
-
-
-
-
+
+
+
A-12AM:A-12PM:A-3AM:A-3PM:A-4.30PM:A-6AM:A-6PM:A-9AM:A-9PM:Barcelona:Blizzard:Blue Midday:Coastal Afternoon:Coastal Sunset:Default:Desert Sunset:Fine Day:Fluffy Big Clouds:Foggy:Funky Funky:Funky Funky Funky:Gelatto:Ghost:Incongruent Truths:Midday 1:Midday 2:Midday 3:Midday 4:Night:Pirate:Purple:Sailor's Delight:Sheer Sensuality
--
cgit v1.1
From 0061a5ed4e6995f8b759744369ac9719426847e5 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sun, 29 Aug 2010 11:18:59 -0700
Subject: Fixed windlight water notecards (.ww) not displaying their icon in
inventory
---
linden/indra/newview/llinventorybridge.cpp | 4 ++++
1 file changed, 4 insertions(+)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llinventorybridge.cpp b/linden/indra/newview/llinventorybridge.cpp
index bf2d898..ebbccfe 100644
--- a/linden/indra/newview/llinventorybridge.cpp
+++ b/linden/indra/newview/llinventorybridge.cpp
@@ -3137,6 +3137,10 @@ LLUIImagePtr LLNotecardBridge::getIcon() const
{
return LLUI::getUIImage("Inv_WindLight");
}
+ else if(isWaterSetting())
+ {
+ return LLUI::getUIImage("Inv_WaterLight");
+ }
else
{
return get_item_icon(LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, 0, FALSE);
--
cgit v1.1
From 4a62f50b88998756a0644842bd9c27438f3f097a Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sun, 29 Aug 2010 11:19:39 -0700
Subject: Fixed windlight water/sky notecards opening the notecard preview
window on creation
---
linden/indra/newview/llviewermessage.cpp | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llviewermessage.cpp b/linden/indra/newview/llviewermessage.cpp
index af4b8d8..45280e4 100755
--- a/linden/indra/newview/llviewermessage.cpp
+++ b/linden/indra/newview/llviewermessage.cpp
@@ -910,7 +910,14 @@ void open_offer(const std::vector& items, const std::string& from_name)
switch(asset_type)
{
case LLAssetType::AT_NOTECARD:
- open_notecard((LLViewerInventoryItem*)item, std::string("Note: ") + item->getName(), LLUUID::null, show_keep_discard, LLUUID::null, FALSE);
+ // Don't show WindLight settings as notecards.
+ // *TODO: centralise all these damned .wl/.ww checks somewhere.
+ if((item->getName().length() > 2 && item->getName().compare(item->getName().length() - 3, 3, ".wl") != 0) &&
+ (item->getName().compare(item->getName().length() - 3, 3, ".ww") != 0))
+ {
+ open_notecard((LLViewerInventoryItem*)item, std::string("Note: ") + item->getName(),
+ LLUUID::null, show_keep_discard, LLUUID::null, FALSE);
+ }
break;
case LLAssetType::AT_LANDMARK:
open_landmark((LLViewerInventoryItem*)item, std::string("Landmark: ") + item->getName(), show_keep_discard, LLUUID::null, FALSE);
--
cgit v1.1
From 1865d88536eb459a11bba3c2f544cb2863a59fbf Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sun, 29 Aug 2010 14:50:20 -0700
Subject: Potential fix for a crash in llfontgl
---
linden/indra/llrender/llfontgl.cpp | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/llrender/llfontgl.cpp b/linden/indra/llrender/llfontgl.cpp
index beecb6b..5d3d6a7 100644
--- a/linden/indra/llrender/llfontgl.cpp
+++ b/linden/indra/llrender/llfontgl.cpp
@@ -725,17 +725,18 @@ F32 LLFontGL::getWidthF32(const std::string& utf8text, const S32 begin_offset, c
F32 LLFontGL::getWidthF32(const llwchar* wchars, const S32 begin_offset, const S32 max_chars, BOOL use_embedded) const
{
+ if (!wchars || !wchars[0] || max_chars == 0)
+ {
+ return 0;
+ }
+
const S32 LAST_CHARACTER = LLFont::LAST_CHAR_FULL;
F32 cur_x = 0;
const S32 max_index = begin_offset + max_chars;
- for (S32 i = begin_offset; i < max_index; i++)
+ for (S32 i = begin_offset; i < max_index && wchars[i] != 0; i++)
{
- const llwchar wch = wchars[i];
- if (wch == 0)
- {
- break; // done
- }
+ llwchar wch = wchars[i];
const embedded_data_t* ext_data = use_embedded ? getEmbeddedCharData(wch) : NULL;
if (ext_data)
{
@@ -764,6 +765,11 @@ F32 LLFontGL::getWidthF32(const llwchar* wchars, const S32 begin_offset, const S
cur_x = (F32)llfloor(cur_x + 0.5f);
}
+ if (cur_x == 0)
+ {
+ return cur_x;
+ }
+
return cur_x / sScaleX;
}
--
cgit v1.1
From 252d0124288c71d8c0a9cf2ee8cf69eb895e769a Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sun, 29 Aug 2010 17:37:15 -0700
Subject: Added 'Inventory' log control stuff from Snowglobe
---
linden/indra/newview/app_settings/logcontrol.xml | 1 +
linden/indra/newview/llinventorybridge.cpp | 2 +-
linden/indra/newview/llinventorymodel.cpp | 63 +++++++++++++++---------
3 files changed, 41 insertions(+), 25 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/logcontrol.xml b/linden/indra/newview/app_settings/logcontrol.xml
index 4e0b582..d59f07d 100644
--- a/linden/indra/newview/app_settings/logcontrol.xml
+++ b/linden/indra/newview/app_settings/logcontrol.xml
@@ -54,6 +54,7 @@
+
diff --git a/linden/indra/newview/llinventorybridge.cpp b/linden/indra/newview/llinventorybridge.cpp
index ebbccfe..4a5ad67 100644
--- a/linden/indra/newview/llinventorybridge.cpp
+++ b/linden/indra/newview/llinventorybridge.cpp
@@ -3945,7 +3945,7 @@ protected:
}
else
{
- llwarns << "Dropping unhandled LLWearAttachments" << llendl;
+ llwarns << "Dropping unhandled LLWearAttachmentsCallback" << llendl;
}
}
private:
diff --git a/linden/indra/newview/llinventorymodel.cpp b/linden/indra/newview/llinventorymodel.cpp
index 5a6a26b..aaaa1dd 100644
--- a/linden/indra/newview/llinventorymodel.cpp
+++ b/linden/indra/newview/llinventorymodel.cpp
@@ -1050,8 +1050,12 @@ void LLInventoryModel::mock(const LLUUID& root_id)
*/
//If we get back a normal response, handle it here
+// Note: this is the responder used in "fetchInventory" cap,
+// this is not responder for "WebFetchInventoryDescendents" or "agent/inventory" cap
+
void LLInventoryModel::fetchInventoryResponder::result(const LLSD& content)
{
+ LL_DEBUGS("Inventory") << " fetch http got " << ll_pretty_print_sd(content) << LL_ENDL; // OGPX
start_new_inventory_observer();
/*LLUUID agent_id;
@@ -1117,8 +1121,8 @@ void LLInventoryModel::fetchInventoryResponder::result(const LLSD& content)
//If we get back an error (not found, etc...), handle it here
void LLInventoryModel::fetchInventoryResponder::error(U32 status, const std::string& reason)
{
- llinfos << "fetchInventory::error "
- << status << ": " << reason << llendl;
+ LL_INFOS("Inventory") << "fetchInventory::error "
+ << status << ": " << reason << LL_ENDL;
gInventory.notifyObservers("fetchinventory");
}
@@ -1169,8 +1173,10 @@ class fetchDescendentsResponder: public LLHTTPClient::Responder
};
//If we get back a normal response, handle it here
+// Note: this is the handler for WebFetchInventoryDescendents and agent/inventory caps
void fetchDescendentsResponder::result(const LLSD& content)
{
+ LL_DEBUGS("Inventory") << " fetch descendents got " << ll_pretty_print_sd(content) << LL_ENDL; // OGPX
if (content.has("folders"))
{
@@ -1277,8 +1283,8 @@ void fetchDescendentsResponder::result(const LLSD& content)
LLSD folder_sd = *folder_it;
//These folders failed on the dataserver. We probably don't want to retry them.
- llinfos << "Folder " << folder_sd["folder_id"].asString()
- << "Error: " << folder_sd["error"].asString() << llendl;
+ LL_INFOS("Inventory") << "Folder " << folder_sd["folder_id"].asString()
+ << "Error: " << folder_sd["error"].asString() << LL_ENDL;
}
}
@@ -1286,7 +1292,7 @@ void fetchDescendentsResponder::result(const LLSD& content)
if (LLInventoryModel::isBulkFetchProcessingComplete())
{
- llinfos << "Inventory fetch completed" << llendl;
+ LL_INFOS("Inventory") << "Inventory fetch completed" << LL_ENDL;
if (LLInventoryModel::sFullFetchStarted)
{
LLInventoryModel::sAllFoldersFetched = TRUE;
@@ -1300,8 +1306,8 @@ void fetchDescendentsResponder::result(const LLSD& content)
//If we get back an error (not found, etc...), handle it here
void fetchDescendentsResponder::error(U32 status, const std::string& reason)
{
- llinfos << "fetchDescendentsResponder::error "
- << status << ": " << reason << llendl;
+ LL_INFOS("Inventory") << "fetchDescendentsResponder::error "
+ << status << ": " << reason << LL_ENDL;
LLInventoryModel::incrBulkFetch(-1);
@@ -1386,7 +1392,12 @@ void LLInventoryModel::bulkFetch(std::string url)
folder_sd["fetch_folders"] = TRUE; //(LLSD::Boolean)sFullFetchStarted;
folder_sd["fetch_items"] = (LLSD::Boolean)TRUE;
- if (ALEXANDRIA_LINDEN_ID == cat->getOwnerID())
+ LL_DEBUGS("Inventory") << " fetching "<getUUID()<<" with cat owner "<getOwnerID()<<" and agent" << gAgent.getID() << LL_ENDL;
+ //OGPX if (ALEXANDRIA_LINDEN_ID == cat->getOwnerID())
+ // for OGP it really doesnt make sense to have the decision about whether to fetch
+ // from the library or user cap be determined by a hard coded UUID.
+ // if it isnt an item that belongs to the agent, then fetch from the library
+ if (gAgent.getID() != cat->getOwnerID()) //if i am not the owner, it must be in the library
body_lib["folders"].append(folder_sd);
else
body["folders"].append(folder_sd);
@@ -1417,11 +1428,13 @@ void LLInventoryModel::bulkFetch(std::string url)
sBulkFetchCount++;
if (body["folders"].size())
{
+ LL_DEBUGS("Inventory") << " fetch descendents post to " << url << ": " << ll_pretty_print_sd(body) << LL_ENDL; // OGPX
LLHTTPClient::post(url, body, new fetchDescendentsResponder(body),300.0);
}
if (body_lib["folders"].size())
{
std::string url_lib = gAgent.getRegion()->getCapability("FetchLibDescendents");
+ LL_DEBUGS("Inventory") << " fetch descendents lib post: " << ll_pretty_print_sd(body_lib) << LL_ENDL; // OGPX
LLHTTPClient::post(url_lib, body_lib, new fetchDescendentsResponder(body_lib),300.0);
}
sFetchTimer.reset();
@@ -1516,7 +1529,7 @@ void LLInventoryModel::backgroundFetch(void*)
// no more categories to fetch, stop fetch process
if (sFetchQueue.empty())
{
- llinfos << "Inventory fetch completed" << llendl;
+ LL_INFOS("Inventory") << "Inventory fetch completed" << LL_ENDL;
if (sFullFetchStarted)
{
sAllFoldersFetched = TRUE;
@@ -1532,7 +1545,7 @@ void LLInventoryModel::backgroundFetch(void*)
// double timeouts on failure
sMinTimeBetweenFetches = llmin(sMinTimeBetweenFetches * 2.f, 10.f);
sMaxTimeBetweenFetches = llmin(sMaxTimeBetweenFetches * 2.f, 120.f);
- llinfos << "Inventory fetch times grown to (" << sMinTimeBetweenFetches << ", " << sMaxTimeBetweenFetches << ")" << llendl;
+ LL_INFOS("Inventory") << "Inventory fetch times grown to (" << sMinTimeBetweenFetches << ", " << sMaxTimeBetweenFetches << ")" << LL_ENDL;
// fetch is no longer considered "timely" although we will wait for full time-out
sTimelyFetchPending = FALSE;
}
@@ -2078,9 +2091,9 @@ bool LLInventoryModel::loadSkeleton(
categories.clear(); // will unref and delete entries
}
- llinfos << "Successfully loaded " << cached_category_count
+ LL_DEBUGS("Inventory") << "Successfully loaded " << cached_category_count
<< " categories and " << cached_item_count << " items from cache."
- << llendl;
+ << LL_ENDL;
return rv;
}
@@ -2238,7 +2251,7 @@ void LLInventoryModel::buildParentChildMap()
// which would be (folder_id, new_parent_id) to be sent up
// to the server.
llinfos << "Lost categroy: " << cat->getUUID() << " - "
- << cat->getName() << llendl;
+ << cat->getName() << " with parent:" << cat->getParentUUID() << llendl;
++lost;
// plop it into the lost & found.
LLAssetType::EType pref = cat->getPreferredType();
@@ -2366,6 +2379,8 @@ void LLInventoryModel::buildParentChildMap()
mIsAgentInvUsable = true;
}
}
+ llinfos << " finished buildParentChildMap " << llendl;
+ // dumpInventory(); // enable this if debugging inventory or appearance issues OGPX
}
struct LLUUIDAndName
@@ -3188,37 +3203,37 @@ void LLInventoryModel::processMoveInventoryItem(LLMessageSystem* msg, void**)
// *NOTE: DEBUG functionality
void LLInventoryModel::dumpInventory()
{
- llinfos << "\nBegin Inventory Dump\n**********************:" << llendl;
- llinfos << "mCategroy[] contains " << mCategoryMap.size() << " items." << llendl;
+ LL_DEBUGS("Inventory") << "\nBegin Inventory Dump\n**********************:" << LL_ENDL;
+ LL_DEBUGS("Inventory") << "mCategroy[] contains " << mCategoryMap.size() << " items." << LL_ENDL;
for(cat_map_t::iterator cit = mCategoryMap.begin(); cit != mCategoryMap.end(); ++cit)
{
LLViewerInventoryCategory* cat = cit->second;
if(cat)
{
- llinfos << " " << cat->getUUID() << " '" << cat->getName() << "' "
- << cat->getVersion() << " " << cat->getDescendentCount()
- << llendl;
+ LL_DEBUGS("Inventory") << " " << cat->getUUID() << " '" << cat->getName() << "' "
+ << cat->getVersion() << " " << cat->getDescendentCount() << " parent: " << cat->getParentUUID()
+ << LL_ENDL;
}
else
{
- llinfos << " NULL!" << llendl;
+ LL_DEBUGS("Inventory") << " NULL!" << LL_ENDL;
}
}
- llinfos << "mItemMap[] contains " << mItemMap.size() << " items." << llendl;
+ LL_DEBUGS("Inventory") << "mItemMap[] contains " << mItemMap.size() << " items." << LL_ENDL;
for(item_map_t::iterator iit = mItemMap.begin(); iit != mItemMap.end(); ++iit)
{
LLViewerInventoryItem* item = iit->second;
if(item)
{
- llinfos << " " << item->getUUID() << " "
- << item->getName() << llendl;
+ LL_DEBUGS("Inventory") << " " << item->getUUID() << " "
+ << item->getName() << LL_ENDL;
}
else
{
- llinfos << " NULL!" << llendl;
+ LL_DEBUGS("Inventory") << " NULL!" << LL_ENDL;
}
}
- llinfos << "\n**********************\nEnd Inventory Dump" << llendl;
+ LL_DEBUGS("Inventory") << "\n**********************\nEnd Inventory Dump" << LL_ENDL;
}
///----------------------------------------------------------------------------
--
cgit v1.1
From 2f33f6edda2267fa521408854753781d40c05744 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Mon, 30 Aug 2010 05:05:43 -0700
Subject: Fixed #455: inventory found items vanish after a certain amount of
time. Also fixed several inventory search bugs by updating desc. etc.
searches to the latest Emerald version
---
linden/indra/newview/app_settings/settings.xml | 22 +-
linden/indra/newview/llfolderview.cpp | 304 +++++++++++++--------
linden/indra/newview/llfolderview.h | 75 +++--
linden/indra/newview/llinventoryactions.cpp | 18 +-
linden/indra/newview/llinventoryview.cpp | 40 ++-
linden/indra/newview/llinventoryview.h | 5 +
.../skins/default/xui/en-us/floater_inventory.xml | 2 +-
7 files changed, 300 insertions(+), 166 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index d35aa1e..29d2f07 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -293,17 +293,6 @@
Value
http://support.secondlife.com
- InventorySearchType
-
- Comment
- Controls what type of inventory search we perform.
- Persist
- 0
- Type
- U32
- Value
- 0
-
IgnoreSimulatorCameraConstraints
Comment
@@ -970,6 +959,17 @@
Value
1
+ WornItemsSortOrder
+
+ Comment
+ Specifies sort key for worn inventory items (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top)
+ Persist
+ 1
+ Type
+ U32
+ Value
+ 7
+
DefaultGrid
Comment
diff --git a/linden/indra/newview/llfolderview.cpp b/linden/indra/newview/llfolderview.cpp
index e87ac0c..16c0aa9 100644
--- a/linden/indra/newview/llfolderview.cpp
+++ b/linden/indra/newview/llfolderview.cpp
@@ -162,7 +162,6 @@ LLFolderViewItem::LLFolderViewItem( const std::string& name, LLUIImagePtr icon,
mIcon(icon),
mHasVisibleChildren(FALSE),
mIndentation(0),
- mNumDescendantsSelected(0),
mFiltered(FALSE),
mLastFilterGeneration(-1),
mStringMatchOffset(std::string::npos),
@@ -350,7 +349,8 @@ void LLFolderViewItem::refresh()
if (mSearchableLabel.compare(searchable_label) ||
mSearchableLabelCreator.compare(searchable_label_creator) ||
- mSearchableLabelDesc.compare(searchable_label_creator))
+ mSearchableLabelDesc.compare(searchable_label_desc) ||
+ mSearchableLabelAll.compare(searchable_label_all))
{
mSearchableLabel.assign(searchable_label);
mSearchableLabelCreator.assign(searchable_label_creator);
@@ -358,28 +358,10 @@ void LLFolderViewItem::refresh()
mSearchableLabelAll.assign(searchable_label_all);
dirtyFilter();
- //some part of label has changed, so overall width has potentially changed
+ // some part of label has changed, so overall width has potentially changed
if (mParentFolder)
mParentFolder->requestArrange();
}
-
- /*if(mSearchableLabelCreator.compare(searchable_label_creator))
- {
- mSearchableLabelCreator.assign(searchable_label_creator);
-
- dirtyFilter();
- if(mParentFolder)
- mParentFolder->requestArrange();
- }
-
- if(mSearchableLabelDesc.compare(searchable_label_desc))
- {
- mSearchableLabelDesc.assign(searchable_label_desc);
-
- dirtyFilter();
- if(mParentFolder)
- mParentFolder->requestArrange();
- }*/
S32 label_width = sFont->getWidth(mLabel);
if( mLabelSuffix.size() )
@@ -517,26 +499,33 @@ void LLFolderViewItem::dirtyFilter()
// together.
BOOL LLFolderViewItem::setSelection(LLFolderViewItem* selection, BOOL openitem, BOOL take_keyboard_focus)
{
- if( selection == this )
+ if (selection == this && !mIsSelected)
{
- mIsSelected = TRUE;
+ selectItem();
if(mListener)
{
mListener->selectItem();
}
}
- else
+ else if (mIsSelected) // Deselect everything else.
{
- mIsSelected = FALSE;
+ deselectItem();
}
return mIsSelected;
}
BOOL LLFolderViewItem::changeSelection(LLFolderViewItem* selection, BOOL selected)
{
- if(selection == this && mIsSelected != selected)
+ if (selection == this && mIsSelected != selected)
{
- mIsSelected = selected;
+ if (mIsSelected)
+ {
+ deselectItem();
+ }
+ else
+ {
+ selectItem();
+ }
if(mListener)
{
mListener->selectItem();
@@ -546,22 +535,33 @@ BOOL LLFolderViewItem::changeSelection(LLFolderViewItem* selection, BOOL selecte
return FALSE;
}
-void LLFolderViewItem::recursiveDeselect(BOOL deselect_self)
+void LLFolderViewItem::deselectItem(void)
{
- if (mIsSelected && deselect_self)
- {
- mIsSelected = FALSE;
+ llassert(mIsSelected);
- // update ancestors' count of selected descendents
- LLFolderViewFolder* parent_folder = getParentFolder();
- while(parent_folder)
- {
- parent_folder->mNumDescendantsSelected--;
- parent_folder = parent_folder->getParentFolder();
- }
+ mIsSelected = FALSE;
+
+ // Update ancestors' count of selected descendents.
+ LLFolderViewFolder* parent_folder = getParentFolder();
+ if (parent_folder)
+ {
+ parent_folder->recursiveIncrementNumDescendantsSelected(-1);
}
}
+void LLFolderViewItem::selectItem(void)
+{
+ llassert(!mIsSelected);
+
+ mIsSelected = TRUE;
+
+ // Update ancestors' count of selected descendents.
+ LLFolderViewFolder* parent_folder = getParentFolder();
+ if (parent_folder)
+ {
+ parent_folder->recursiveIncrementNumDescendantsSelected(1);
+ }
+}
BOOL LLFolderViewItem::isMovable()
{
@@ -654,16 +654,20 @@ void LLFolderViewItem::rename(const std::string& new_name)
}
}
-const std::string& LLFolderViewItem::getSearchableLabel(U32 search_type = 0) const
+const std::string& LLFolderViewItem::getSearchableLabel() const
{
- if(search_type == 3)
- return mSearchableLabelAll;
- else if(search_type == 2)
- return mSearchableLabelDesc;
- else if(search_type == 1)
+ U32 type = mRoot->getFilter()->getSearchType();
+ switch(type)
+ {
+ case 1:
return mSearchableLabelCreator;
- else
+ case 2:
+ return mSearchableLabelDesc;
+ case 3:
+ return mSearchableLabelAll;
+ default:
return mSearchableLabel;
+ }
}
const std::string& LLFolderViewItem::getName( void ) const
@@ -1022,9 +1026,16 @@ void LLFolderViewItem::draw()
{
// don't draw backgrounds for zero-length strings
S32 filter_string_length = mRoot->getFilterSubString().size();
- if (filter_string_length > 0)
+
+ std::string combined_string = mLabel + mLabelSuffix;
+
+ //fix so that highlighting works properly again - rkeast
+ std::string check = combined_string;
+ LLStringUtil::toUpper(check);
+
+ if ((filter_string_length > 0) && (check.find(mRoot->getFilterSubString()) != -1))
{
- std::string combined_string = mLabel + mLabelSuffix;
+// llinfos << "mLabel " << mLabel<< " mLabelSuffix " << mLabelSuffix << " mLabel " << mLabel << " mLabel " << mLabel << llendl;
S32 left = llround(text_left) + sFont->getWidth(combined_string, 0, mStringMatchOffset) - 1;
S32 right = left + sFont->getWidth(combined_string, mStringMatchOffset, filter_string_length) + 2;
S32 bottom = llfloor(getRect().getHeight() - sFont->getLineHeight() - 3);
@@ -1057,6 +1068,7 @@ LLFolderViewFolder::LLFolderViewFolder( const std::string& name, LLUIImagePtr ic
LLFolderView* root,
LLFolderViewEventListener* listener ):
LLFolderViewItem( name, icon, 0, root, listener ), // 0 = no create time
+ mNumDescendantsSelected(0),
mIsOpen(FALSE),
mExpanderHighlighted(FALSE),
mCurHeight(0.f),
@@ -1423,6 +1435,21 @@ BOOL LLFolderViewFolder::hasFilteredDescendants()
return mMostFilteredDescendantGeneration >= mRoot->getFilter()->getCurrentGeneration();
}
+void LLFolderViewFolder::recursiveIncrementNumDescendantsSelected(S32 increment)
+{
+ LLFolderViewFolder* parent_folder = this;
+ do
+ {
+ parent_folder->mNumDescendantsSelected += increment;
+
+ // Make sure we don't have negative values.
+ llassert(parent_folder->mNumDescendantsSelected >= 0);
+
+ parent_folder = parent_folder->getParentFolder();
+ }
+ while(parent_folder);
+}
+
// Passes selection information on to children and record selection
// information if necessary.
BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL openitem,
@@ -1431,7 +1458,10 @@ BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL openitem
BOOL rv = FALSE;
if( selection == this )
{
- mIsSelected = TRUE;
+ if (!isSelected())
+ {
+ selectItem();
+ }
if(mListener)
{
mListener->selectItem();
@@ -1440,7 +1470,10 @@ BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL openitem
}
else
{
- mIsSelected = FALSE;
+ if (isSelected())
+ {
+ deselectItem();
+ }
rv = FALSE;
}
BOOL child_selected = FALSE;
@@ -1453,7 +1486,6 @@ BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL openitem
{
rv = TRUE;
child_selected = TRUE;
- mNumDescendantsSelected++;
}
}
for (items_t::iterator iter = mItems.begin();
@@ -1464,7 +1496,6 @@ BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL openitem
{
rv = TRUE;
child_selected = TRUE;
- mNumDescendantsSelected++;
}
}
if(openitem && child_selected)
@@ -1474,37 +1505,39 @@ BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL openitem
return rv;
}
-// This method is used to change the selection of an item. If
-// selection is 'this', then note selection as true. Returns TRUE
-// if this or a child is now selected.
-BOOL LLFolderViewFolder::changeSelection(LLFolderViewItem* selection,
- BOOL selected)
+// This method is used to change the selection of an item.
+// Recursively traverse all children; if 'selection' is 'this' then change
+// the select status if necessary.
+// Returns TRUE if the selection state of this folder, or of a child, was changed.
+BOOL LLFolderViewFolder::changeSelection(LLFolderViewItem* selection, BOOL selected)
{
BOOL rv = FALSE;
if(selection == this)
{
- mIsSelected = selected;
+ if (isSelected() != selected)
+ {
+ rv = TRUE;
+ if (selected)
+ {
+ selectItem();
+ }
+ else
+ {
+ deselectItem();
+ }
+ }
if(mListener && selected)
{
mListener->selectItem();
}
- rv = TRUE;
}
for (folders_t::iterator iter = mFolders.begin();
iter != mFolders.end();)
{
folders_t::iterator fit = iter++;
- if((*fit)->changeSelection(selection, selected))
+ if ((*fit)->changeSelection(selection, selected))
{
- if (selected)
- {
- mNumDescendantsSelected++;
- }
- else
- {
- mNumDescendantsSelected--;
- }
rv = TRUE;
}
}
@@ -1512,33 +1545,22 @@ BOOL LLFolderViewFolder::changeSelection(LLFolderViewItem* selection,
iter != mItems.end();)
{
items_t::iterator iit = iter++;
- if((*iit)->changeSelection(selection, selected))
+ if ((*iit)->changeSelection(selection, selected))
{
- if (selected)
- {
- mNumDescendantsSelected++;
- }
- else
- {
- mNumDescendantsSelected--;
- }
rv = TRUE;
}
}
return rv;
}
-S32 LLFolderViewFolder::extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray& selected_items)
+void LLFolderViewFolder::extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray& selected_items)
{
- S32 num_selected = 0;
-
// pass on to child folders first
for (folders_t::iterator iter = mFolders.begin();
iter != mFolders.end();)
{
folders_t::iterator fit = iter++;
- num_selected += (*fit)->extendSelection(selection, last_selected, selected_items);
- mNumDescendantsSelected += num_selected;
+ (*fit)->extendSelection(selection, last_selected, selected_items);
}
// handle selection of our immediate children...
@@ -1631,8 +1653,6 @@ S32 LLFolderViewFolder::extendSelection(LLFolderViewItem* selection, LLFolderVie
if (item->changeSelection(item, TRUE))
{
selected_items.put(item);
- mNumDescendantsSelected++;
- num_selected++;
}
}
}
@@ -1642,30 +1662,15 @@ S32 LLFolderViewFolder::extendSelection(LLFolderViewItem* selection, LLFolderVie
if (selection->changeSelection(selection, TRUE))
{
selected_items.put(selection);
- mNumDescendantsSelected++;
- num_selected++;
}
}
-
- return num_selected;
}
void LLFolderViewFolder::recursiveDeselect(BOOL deselect_self)
{
- // make sure we don't have negative values
- llassert(mNumDescendantsSelected >= 0);
-
- if (mIsSelected && deselect_self)
+ if (isSelected() && deselect_self)
{
- mIsSelected = FALSE;
-
- // update ancestors' count of selected descendents
- LLFolderViewFolder* parent_folder = getParentFolder();
- while(parent_folder)
- {
- parent_folder->mNumDescendantsSelected--;
- parent_folder = parent_folder->getParentFolder();
- }
+ deselectItem();
}
if (0 == mNumDescendantsSelected)
@@ -1673,14 +1678,19 @@ void LLFolderViewFolder::recursiveDeselect(BOOL deselect_self)
return;
}
+ // Deselect all items in this folder.
for (items_t::iterator iter = mItems.begin();
iter != mItems.end();)
{
items_t::iterator iit = iter++;
LLFolderViewItem* item = (*iit);
- item->recursiveDeselect(TRUE);
+ if (item->isSelected())
+ {
+ item->deselectItem();
+ }
}
+ // Recursively deselect all folders in this folder.
for (folders_t::iterator iter = mFolders.begin();
iter != mFolders.end();)
{
@@ -1740,7 +1750,10 @@ void LLFolderViewFolder::removeView(LLFolderViewItem* item)
return;
}
// deselect without traversing hierarchy
- item->recursiveDeselect(TRUE);
+ if (item->isSelected())
+ {
+ item->deselectItem();
+ }
getRoot()->removeFromSelectionList(item);
extractItem(item);
delete item;
@@ -1756,16 +1769,24 @@ void LLFolderViewFolder::extractItem( LLFolderViewItem* item )
// This is an evil downcast. However, it's only doing
// pointer comparison to find if (which it should be ) the
// item is in the container, so it's pretty safe.
- LLFolderViewFolder* f = reinterpret_cast(item);
+ LLFolderViewFolder* f = static_cast(item);
folders_t::iterator ft;
ft = std::find(mFolders.begin(), mFolders.end(), f);
if(ft != mFolders.end())
{
+ if ((*ft)->numSelected())
+ {
+ recursiveIncrementNumDescendantsSelected(-(*ft)->numSelected());
+ }
mFolders.erase(ft);
}
}
else
{
+ if ((*it)->isSelected())
+ {
+ recursiveIncrementNumDescendantsSelected(-1);
+ }
mItems.erase(it);
}
//item has been removed, need to update filter
@@ -1944,6 +1965,10 @@ BOOL LLFolderViewFolder::addItem(LLFolderViewItem* item)
item,
mSortFunction);
mItems.insert(it,item);
+ if (item->isSelected())
+ {
+ recursiveIncrementNumDescendantsSelected(1);
+ }
item->setRect(LLRect(0, 0, getRect().getWidth(), 0));
item->setVisible(FALSE);
addChild( item );
@@ -1961,6 +1986,10 @@ BOOL LLFolderViewFolder::addFolder(LLFolderViewFolder* folder)
folder,
mSortFunction);
mFolders.insert(it,folder);
+ if (folder->numSelected())
+ {
+ recursiveIncrementNumDescendantsSelected(folder->numSelected());
+ }
folder->setOrigin(0, 0);
folder->reshape(getRect().getWidth(), 0);
folder->setVisible(FALSE);
@@ -2731,6 +2760,10 @@ BOOL LLFolderView::addFolder( LLFolderViewFolder* folder)
{
mFolders.insert(mFolders.begin(), folder);
}
+ if (folder->numSelected())
+ {
+ recursiveIncrementNumDescendantsSelected(folder->numSelected());
+ }
folder->setOrigin(0, 0);
folder->reshape(getRect().getWidth(), 0);
folder->setVisible(FALSE);
@@ -3012,29 +3045,24 @@ BOOL LLFolderView::changeSelection(LLFolderViewItem* selection, BOOL selected)
return rv;
}
-S32 LLFolderView::extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray& items)
+void LLFolderView::extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray& items)
{
- S32 rv = 0;
-
// now store resulting selection
if (mAllowMultiSelect)
{
LLFolderViewItem *cur_selection = getCurSelectedItem();
- rv = LLFolderViewFolder::extendSelection(selection, cur_selection, items);
+ LLFolderViewFolder::extendSelection(selection, cur_selection, items);
for (S32 i = 0; i < items.count(); i++)
{
addToSelectionList(items[i]);
- rv++;
}
}
else
{
setSelection(selection, FALSE, FALSE);
- rv++;
}
mSignalSelectCallback = SIGNAL_KEYBOARD_FOCUS;
- return rv;
}
void LLFolderView::sanitizeSelection()
@@ -4554,6 +4582,8 @@ LLInventoryFilter::LLInventoryFilter(const std::string& name) :
mModified(FALSE),
mNeedTextRebuild(TRUE)
{
+ //fix to get rid of gSavedSettings use - rkeast
+ mSearchType = 0;
mFilterOps.mFilterTypes = LLInventoryType::NIT_ALL;
mFilterOps.mMinDate = time_min();
mFilterOps.mMaxDate = time_max();
@@ -4599,14 +4629,49 @@ BOOL LLInventoryFilter::check(LLFolderViewItem* item)
LLFolderViewEventListener* listener = item->getListener();
const LLUUID& item_id = listener->getUUID();
- U32 search_type = gSavedSettings.getU32("InventorySearchType");
- mSubStringMatchOffset = mFilterSubString.size() ? item->getSearchableLabel(search_type).find(mFilterSubString) : std::string::npos;
- BOOL passed = (listener->getNInventoryType() & mFilterOps.mFilterTypes || listener->getNInventoryType() == LLInventoryType::NIT_NONE)
+ //When searching for all labels, we need to explode the filter string
+ //Into an array, and then compare each string to the label seperately
+ //Otherwise the filter substring needs to be
+ //formatted in the same order as the label - rkeast
+
+ BOOL passed;
+ //Added ability to toggle this type of searching for all labels cause it's convienient - RKeast
+ if(mSearchType == 3)
+ {
+ std::istringstream i(mFilterSubString);
+ std::string blah;
+
+ LLDynamicArray search_array;
+
+ while(i >> blah)
+ {
+ search_array.put(blah);
+ }
+
+ BOOL subStringMatch = true;
+ for(int i = 0; i < search_array.getLength(); i++)
+ {
+ mSubStringMatchOffset = (search_array.get(i)).size() ? item->getSearchableLabel().find(search_array.get(i)) : std::string::npos;
+ subStringMatch = subStringMatch && ((search_array.get(i)).size() == 0 || mSubStringMatchOffset != std::string::npos);
+ }
+
+ passed = (listener->getNInventoryType() & mFilterOps.mFilterTypes || listener->getNInventoryType() == LLInventoryType::NIT_NONE)
+ && (subStringMatch)
+ && (mFilterWorn == false || gAgent.isWearingItem(item_id) ||
+ (gAgent.getAvatarObject() && gAgent.getAvatarObject()->isWearingAttachment(item_id)))
+ && ((listener->getPermissionMask() & mFilterOps.mPermissions) == mFilterOps.mPermissions)
+ && (listener->getCreationDate() >= earliest && listener->getCreationDate() <= mFilterOps.mMaxDate);
+ }
+ else
+ {
+ mSubStringMatchOffset = mFilterSubString.size() ? item->getSearchableLabel().find(mFilterSubString) : std::string::npos;
+ passed = (listener->getNInventoryType() & mFilterOps.mFilterTypes || listener->getNInventoryType() == LLInventoryType::NIT_NONE)
&& (mFilterSubString.size() == 0 || mSubStringMatchOffset != std::string::npos)
&& (mFilterWorn == false || gAgent.isWearingItem(item_id) ||
(gAgent.getAvatarObject() && gAgent.getAvatarObject()->isWearingAttachment(item_id)))
&& ((listener->getPermissionMask() & mFilterOps.mPermissions) == mFilterOps.mPermissions)
&& (listener->getCreationDate() >= earliest && listener->getCreationDate() <= mFilterOps.mMaxDate);
+ }
return passed;
}
@@ -4655,6 +4720,19 @@ BOOL LLInventoryFilter::isModifiedAndClear()
return ret;
}
+
+//fix to get rid of gSavedSettings use - rkeast
+void LLInventoryFilter::setSearchType(U32 type)
+{
+ mSearchType = type;
+}
+
+//fix to get rid of gSavedSettings use - rkeast
+U32 LLInventoryFilter::getSearchType()
+{
+ return mSearchType;
+}
+
void LLInventoryFilter::setFilterTypes(U32 types)
{
if (mFilterOps.mFilterTypes != types)
diff --git a/linden/indra/newview/llfolderview.h b/linden/indra/newview/llfolderview.h
index 5e6902d..9fad72e 100644
--- a/linden/indra/newview/llfolderview.h
+++ b/linden/indra/newview/llfolderview.h
@@ -168,6 +168,10 @@ public:
class LLInventoryFilter
{
public:
+ //fix to get rid of gSavedSettings use - rkeast
+ void setSearchType(U32 type);
+ U32 getSearchType();
+
typedef enum e_folder_show
{
SHOW_ALL_FOLDERS,
@@ -248,6 +252,9 @@ public:
void fromLLSD(LLSD& data);
protected:
+ //fix to get rid of gSavedSettings use - rkeast
+ U32 mSearchType;
+
struct filter_ops
{
U32 mFilterTypes;
@@ -322,9 +329,12 @@ class LLFolderView;
class LLFolderViewItem : public LLUICtrl
{
-protected:
friend class LLFolderViewEventListener;
+private:
+ BOOL mIsSelected;
+
+protected:
static const LLFontGL* sFont;
static const LLFontGL* sSmallFont;
static LLColor4 sFgColor;
@@ -354,7 +364,6 @@ protected:
U32 mCreationDate;
LLFolderViewFolder* mParentFolder;
LLFolderViewEventListener* mListener;
- BOOL mIsSelected;
BOOL mIsCurSelection;
BOOL mSelectPending;
LLFontGL::StyleFlags mLabelStyle;
@@ -363,7 +372,6 @@ protected:
std::string mStatusText;
BOOL mHasVisibleChildren;
S32 mIndentation;
- S32 mNumDescendantsSelected;
BOOL mFiltered;
S32 mLastFilterGeneration;
std::string::size_type mStringMatchOffset;
@@ -424,22 +432,23 @@ public:
virtual void dirtyFilter();
- // If the selection is 'this' then note that otherwise
- // ignore. Returns TRUE if this object was affected. If open is
- // TRUE, then folders are opened up along the way to the
- // selection.
- virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem,
- BOOL take_keyboard_focus);
+ // If 'selection' is 'this' then note that otherwise ignore.
+ // Returns TRUE if this item ends up being selected.
+ virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem, BOOL take_keyboard_focus);
- // This method is used to toggle the selection of an item. If
- // selection is 'this', then note selection, and return TRUE.
+ // This method is used to set the selection state of an item.
+ // If 'selection' is 'this' then note selection.
+ // Returns TRUE if the selection state of this item was changed.
virtual BOOL changeSelection(LLFolderViewItem* selection, BOOL selected);
// this method is used to group select items
- virtual S32 extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray& items){ return FALSE; }
+ virtual void extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray& items) { }
- // this method is used to group select items
- virtual void recursiveDeselect(BOOL deselect_self);
+ // this method is used to deselect this element
+ void deselectItem();
+
+ // this method is used to select this element
+ void selectItem();
// gets multiple-element selection
virtual BOOL getSelectionList(std::set &selection){return TRUE;}
@@ -453,9 +462,7 @@ public:
// destroys this item recursively
virtual void destroyView();
- S32 getNumSelectedDescendants() { return mNumDescendantsSelected; }
-
- BOOL isSelected() { return mIsSelected; }
+ BOOL isSelected() const { return mIsSelected; }
void setIsCurSelection(BOOL select) { mIsCurSelection = select; }
@@ -475,7 +482,7 @@ public:
// viewed. This method will ask the viewed object itself.
const std::string& getName( void ) const;
- const std::string& getSearchableLabel( U32 search_type ) const;
+ const std::string& getSearchableLabel() const;
// This method returns the label displayed on the view. This
// method was primarily added to allow sorting on the folder
@@ -563,6 +570,13 @@ public:
UNKNOWN, TRASH, NOT_TRASH
} ETrash;
+private:
+ S32 mNumDescendantsSelected;
+
+public: // Accessed needed by LLFolderViewItem
+ void recursiveIncrementNumDescendantsSelected(S32 increment);
+ S32 numSelected(void) const { return mNumDescendantsSelected + (isSelected() ? 1 : 0); }
+
protected:
typedef std::list items_t;
typedef std::list folders_t;
@@ -624,20 +638,22 @@ public:
virtual void dirtyFilter();
// Passes selection information on to children and record
- // selection information if necessary. Returns TRUE if this object
- // (or a child) was affected.
- virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem,
- BOOL take_keyboard_focus);
-
- // This method is used to change the selection of an item. If
- // selection is 'this', then note selection as true. Returns TRUE
- // if this or a child is now selected.
+ // selection information if necessary.
+ // Returns TRUE if this object (or a child) ends up being selected.
+ // If 'openitem' is TRUE then folders are opened up along the way to the selection.
+ virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem, BOOL take_keyboard_focus);
+
+ // This method is used to change the selection of an item.
+ // Recursively traverse all children; if 'selection' is 'this' then change
+ // the select status if necessary.
+ // Returns TRUE if the selection state of this folder, or of a child, was changed.
virtual BOOL changeSelection(LLFolderViewItem* selection, BOOL selected);
// this method is used to group select items
- virtual S32 extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray& items);
+ virtual void extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray& items);
- virtual void recursiveDeselect(BOOL deselect_self);
+ // Deselect this folder and all folder/items it contains recursively.
+ void recursiveDeselect(BOOL deselect_self);
// Returns true is this object and all of its children can be removed.
virtual BOOL isRemovable();
@@ -724,6 +740,7 @@ public:
time_t getCreationDate() const;
bool isTrash() const;
+ S32 getNumSelectedDescendants(void) const { return mNumDescendantsSelected; }
};
@@ -797,7 +814,7 @@ public:
// children, and keeps track of selected objects.
virtual BOOL changeSelection(LLFolderViewItem* selection, BOOL selected);
- virtual S32 extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray& items);
+ virtual void extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray& items);
virtual BOOL getSelectionList(std::set &selection);
diff --git a/linden/indra/newview/llinventoryactions.cpp b/linden/indra/newview/llinventoryactions.cpp
index 319b5b2..f3277ad 100644
--- a/linden/indra/newview/llinventoryactions.cpp
+++ b/linden/indra/newview/llinventoryactions.cpp
@@ -486,7 +486,7 @@ class LLDoCreateFloater : public inventory_listener_t
}
};
-//Handles the search type buttons
+//Handles the search type buttons - RKeast
class SetSearchType : public inventory_listener_t
{
bool handleEvent(LLPointer event, const LLSD& userdata)
@@ -494,8 +494,10 @@ class SetSearchType : public inventory_listener_t
std::string search_type = userdata.asString();
if(search_type == "name")
{
- gSavedSettings.setU32("InventorySearchType", 0);
+ mPtr->getActivePanel()->setSearchType(0);
+ gSavedPerAccountSettings.setU32("InventorySearchType",0);
+
mPtr->getControl("Inventory.SearchByName")->setValue(TRUE);
mPtr->getControl("Inventory.SearchByCreator")->setValue(FALSE);
mPtr->getControl("Inventory.SearchByDesc")->setValue(FALSE);
@@ -503,7 +505,9 @@ class SetSearchType : public inventory_listener_t
}
else if(search_type == "creator")
{
- gSavedSettings.setU32("InventorySearchType", 1);
+ mPtr->getActivePanel()->setSearchType(1);
+
+ gSavedPerAccountSettings.setU32("InventorySearchType",1);
mPtr->getControl("Inventory.SearchByName")->setValue(FALSE);
mPtr->getControl("Inventory.SearchByCreator")->setValue(TRUE);
@@ -512,7 +516,9 @@ class SetSearchType : public inventory_listener_t
}
else if(search_type == "desc")
{
- gSavedSettings.setU32("InventorySearchType", 2);
+ mPtr->getActivePanel()->setSearchType(2);
+
+ gSavedPerAccountSettings.setU32("InventorySearchType",2);
mPtr->getControl("Inventory.SearchByName")->setValue(FALSE);
mPtr->getControl("Inventory.SearchByCreator")->setValue(FALSE);
@@ -521,7 +527,9 @@ class SetSearchType : public inventory_listener_t
}
else if(search_type == "all")
{
- gSavedSettings.setU32("InventorySearchType", 3);
+ mPtr->getActivePanel()->setSearchType(3);
+
+ gSavedPerAccountSettings.setU32("InventorySearchType",3);
mPtr->getControl("Inventory.SearchByName")->setValue(FALSE);
mPtr->getControl("Inventory.SearchByCreator")->setValue(FALSE);
diff --git a/linden/indra/newview/llinventoryview.cpp b/linden/indra/newview/llinventoryview.cpp
index a001d65..71d8194 100644
--- a/linden/indra/newview/llinventoryview.cpp
+++ b/linden/indra/newview/llinventoryview.cpp
@@ -486,7 +486,8 @@ LLInventoryView::LLInventoryView(const std::string& name,
LLInventoryModel* inventory) :
LLFloater(name, rect, std::string("Inventory"), RESIZE_YES,
INV_MIN_WIDTH, INV_MIN_HEIGHT, DRAG_ON_TOP,
- MINIMIZE_NO, CLOSE_YES)
+ MINIMIZE_NO, CLOSE_YES),
+ mActivePanel(NULL)
//LLHandle mFinderHandle takes care of its own initialization
{
init(inventory);
@@ -497,7 +498,8 @@ LLInventoryView::LLInventoryView(const std::string& name,
LLInventoryModel* inventory) :
LLFloater(name, rect, std::string("Inventory"), RESIZE_YES,
INV_MIN_WIDTH, INV_MIN_HEIGHT, DRAG_ON_TOP,
- MINIMIZE_NO, CLOSE_YES)
+ MINIMIZE_NO, CLOSE_YES),
+ mActivePanel(NULL)
//LLHandle mFinderHandle takes care of its own initialization
{
init(inventory);
@@ -522,8 +524,8 @@ void LLInventoryView::init(LLInventoryModel* inventory)
addBoolControl("Inventory.FoldersAlwaysByName", sort_folders_by_name );
addBoolControl("Inventory.SystemFoldersToTop", sort_system_folders_to_top );
- //Search Controls
- U32 search_type = gSavedSettings.getU32("InventorySearchType");
+ //Search Controls - RKeast
+ U32 search_type = gSavedPerAccountSettings.getU32("InventorySearchType");
BOOL search_by_name = (search_type == 0);
addBoolControl("Inventory.SearchByName", search_by_name);
@@ -544,6 +546,10 @@ void LLInventoryView::init(LLInventoryModel* inventory)
if (mActivePanel)
{
// "All Items" is the previous only view, so it gets the InventorySortOrder
+
+ //Fix for gSavedSettings use - rkeast
+ mActivePanel->getFilter()->setSearchType(search_type);
+
mActivePanel->setSortOrder(gSavedSettings.getU32("InventorySortOrder"));
mActivePanel->getFilter()->markDefault();
mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
@@ -580,7 +586,7 @@ void LLInventoryView::init(LLInventoryModel* inventory)
file.close();
// Load the persistent "Recent Items" settings.
- // Note that the "All Items" settings do not persist.
+ // Note that the "All Items" and "Worn Items" settings do not persist per-account.
if(recent_items_panel)
{
if(savedFilterState.has(recent_items_panel->getFilter()->getName()))
@@ -590,8 +596,7 @@ void LLInventoryView::init(LLInventoryModel* inventory)
recent_items_panel->getFilter()->fromLLSD(recent_items);
}
}
-
- }
+ }
//Initialize item count - rkeast
mItemCount = gSavedPerAccountSettings.getS32("InventoryPreviousCount");
@@ -1044,9 +1049,16 @@ void LLInventoryView::onClearSearch(void* user_data)
LLInventoryView* self = (LLInventoryView*)user_data;
if(!self) return;
+ LLFloater *finder = self->getFinder();
if (self->mActivePanel)
{
self->mActivePanel->setFilterSubString(LLStringUtil::null);
+ self->mActivePanel->setFilterTypes(LLInventoryType::NIT_ALL);
+ }
+
+ if (finder)
+ {
+ LLInventoryViewFinder::selectAllTypes(finder);
}
// re-open folders that were initially open
@@ -1737,6 +1749,7 @@ LLUIImagePtr get_item_icon(LLAssetType::EType asset_type,
const std::string LLInventoryPanel::DEFAULT_SORT_ORDER = std::string("InventorySortOrder");
const std::string LLInventoryPanel::RECENTITEMS_SORT_ORDER = std::string("RecentItemsSortOrder");
+const std::string LLInventoryPanel::WORNITEMS_SORT_ORDER = std::string("WornItemsSortOrder");
const std::string LLInventoryPanel::INHERIT_SORT_ORDER = std::string("");
LLInventoryPanel::LLInventoryPanel(const std::string& name,
@@ -1867,6 +1880,19 @@ void LLInventoryPanel::draw()
LLPanel::draw();
}
+
+//fix to get rid of gSavedSettings use - rkeast
+void LLInventoryPanel::setSearchType(U32 type)
+{
+ mFolders->getFilter()->setSearchType(type);
+}
+
+//fix to get rid of gSavedSettings use - rkeast
+U32 LLInventoryPanel::getSearchType()
+{
+ return mFolders->getFilter()->getSearchType();
+}
+
void LLInventoryPanel::setFilterTypes(U32 filter_types)
{
mFolders->getFilter()->setFilterTypes(filter_types);
diff --git a/linden/indra/newview/llinventoryview.h b/linden/indra/newview/llinventoryview.h
index e098ac7..3ec1e73 100644
--- a/linden/indra/newview/llinventoryview.h
+++ b/linden/indra/newview/llinventoryview.h
@@ -70,6 +70,7 @@ class LLInventoryPanel : public LLPanel
public:
static const std::string DEFAULT_SORT_ORDER;
static const std::string RECENTITEMS_SORT_ORDER;
+ static const std::string WORNITEMS_SORT_ORDER;
static const std::string INHERIT_SORT_ORDER;
LLInventoryPanel(const std::string& name,
@@ -96,6 +97,10 @@ public:
EAcceptance* accept,
std::string& tooltip_msg);
+ //fix to get rid of gSavedSettings use - rkeast
+ void setSearchType(U32 type);
+ U32 getSearchType();
+
// Call this method to set the selection.
void openAllFolders();
void closeAllFolders();
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_inventory.xml b/linden/indra/newview/skins/default/xui/en-us/floater_inventory.xml
index f1a6626..3ab7c7b 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_inventory.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_inventory.xml
@@ -64,7 +64,7 @@
+ sort_order="WornItemsSortOrder" width="461" />
lock();
+ for (delete_list_t::iterator iter = mDeleteList.begin(); iter != mDeleteList.end(); ++iter)
+ {
+ (*iter)->mRequestHandle = LLWorkerThread::nullHandle();
+ (*iter)->clearFlags(LLWorkerClass::WCF_HAVE_WORK);
+ delete *iter ;
+ }
+ mDeleteList.clear() ;
+ mDeleteMutex->unlock() ;
+ }
+}
+
// virtual
S32 LLWorkerThread::update(U32 max_time_ms)
{
@@ -183,6 +204,7 @@ LLWorkerClass::LLWorkerClass(LLWorkerThread* workerthread, const std::string& na
: mWorkerThread(workerthread),
mWorkerClassName(name),
mRequestHandle(LLWorkerThread::nullHandle()),
+ mRequestPriority(LLWorkerThread::PRIORITY_NORMAL),
mMutex(NULL),
mWorkFlags(0)
{
@@ -314,7 +336,20 @@ bool LLWorkerClass::checkWork(bool aborting)
if (mRequestHandle != LLWorkerThread::nullHandle())
{
LLWorkerThread::WorkRequest* workreq = (LLWorkerThread::WorkRequest*)mWorkerThread->getRequest(mRequestHandle);
- llassert_always(workreq);
+ if(!workreq)
+ {
+ if(mWorkerThread->isQuitting() || mWorkerThread->isStopped()) //the mWorkerThread is not running
+ {
+ mRequestHandle = LLWorkerThread::nullHandle();
+ clearFlags(WCF_HAVE_WORK);
+ }
+ else
+ {
+ llassert_always(workreq);
+ }
+ return true ;
+ }
+
LLQueuedThread::status_t status = workreq->getStatus();
if (status == LLWorkerThread::STATUS_ABORTED)
{
@@ -364,7 +399,7 @@ void LLWorkerClass::scheduleDelete()
void LLWorkerClass::setPriority(U32 priority)
{
mMutex.lock();
- if (mRequestHandle != LLWorkerThread::nullHandle())
+ if (mRequestHandle != LLWorkerThread::nullHandle() && mRequestPriority != priority)
{
mRequestPriority = priority;
mWorkerThread->setPriority(mRequestHandle, priority);
diff --git a/linden/indra/llcommon/llworkerthread.h b/linden/indra/llcommon/llworkerthread.h
index 708d812..d1868bc 100644
--- a/linden/indra/llcommon/llworkerthread.h
+++ b/linden/indra/llcommon/llworkerthread.h
@@ -80,6 +80,9 @@ public:
S32 mParam;
};
+protected:
+ void clearDeleteList() ;
+
private:
typedef std::list delete_list_t;
delete_list_t mDeleteList;
@@ -93,8 +96,11 @@ public:
handle_t addWorkRequest(LLWorkerClass* workerclass, S32 param, U32 priority = PRIORITY_NORMAL);
- void deleteWorker(LLWorkerClass* workerclass); // schedule for deletion
S32 getNumDeletes() { return (S32)mDeleteList.size(); } // debug
+
+private:
+ void deleteWorker(LLWorkerClass* workerclass); // schedule for deletion
+
};
//============================================================================
diff --git a/linden/indra/newview/lltexturecache.cpp b/linden/indra/newview/lltexturecache.cpp
index 46c125f..0a76742 100644
--- a/linden/indra/newview/lltexturecache.cpp
+++ b/linden/indra/newview/lltexturecache.cpp
@@ -48,11 +48,11 @@
// Unordered array of Entry structs
// cache/texture.cache
// First TEXTURE_CACHE_ENTRY_SIZE bytes of each texture in texture.entries in same order
-// Entry size same as header packet, so we're not 0-padding unless whole image is contained in header.
// cache/textures/[0-F]/UUID.texture
// Actual texture body files
-const S32 TEXTURE_CACHE_ENTRY_SIZE = FIRST_PACKET_SIZE;
+//note: there is no good to define 1024 for TEXTURE_CACHE_ENTRY_SIZE while FIRST_PACKET_SIZE is 600 on sim side.
+const S32 TEXTURE_CACHE_ENTRY_SIZE = FIRST_PACKET_SIZE;//1024;
const F32 TEXTURE_CACHE_PURGE_AMOUNT = .20f; // % amount to reduce the cache by when it exceeds its limit
const F32 TEXTURE_CACHE_LRU_SIZE = .10f; // % amount for LRU list (low overhead to regenerate)
@@ -390,6 +390,7 @@ bool LLTextureCacheRemoteWorker::doRead()
}
else
{
+ //llinfos << "texture " << mID.asString() << " found in local_assets" << llendl;
mImageSize = local_size;
mImageLocal = TRUE;
}
@@ -400,7 +401,8 @@ bool LLTextureCacheRemoteWorker::doRead()
// Second state / stage : identify the cache or not...
if (!done && (mState == CACHE))
{
- idx = mCache->getHeaderCacheEntry(mID, mImageSize);
+ LLTextureCache::Entry entry ;
+ idx = mCache->getHeaderCacheEntry(mID, entry);
if (idx < 0)
{
// The texture is *not* cached. We're done here...
@@ -409,6 +411,7 @@ bool LLTextureCacheRemoteWorker::doRead()
}
else
{
+ mImageSize = entry.mImageSize ;
// If the read offset is bigger than the header cache, we read directly from the body
// Note that currently, we *never* read with offset from the cache, so the result is *always* HEADER
mState = mOffset < TEXTURE_CACHE_ENTRY_SIZE ? HEADER : BODY;
@@ -536,6 +539,7 @@ bool LLTextureCacheRemoteWorker::doWrite()
{
llassert_always(mOffset == 0); // We currently do not support write offsets
llassert_always(mDataSize > 0); // Things will go badly wrong if mDataSize is nul or negative...
+ llassert_always(mImageSize >= mDataSize);
mState = CACHE;
}
@@ -545,14 +549,19 @@ bool LLTextureCacheRemoteWorker::doWrite()
if (!done && (mState == CACHE))
{
bool alreadyCached = false;
- S32 cur_imagesize = 0;
+ LLTextureCache::Entry entry ;
+
// Checks if this image is already in the entry list
- idx = mCache->getHeaderCacheEntry(mID, cur_imagesize);
- if (idx >= 0 && (cur_imagesize >= 0))
+ idx = mCache->getHeaderCacheEntry(mID, entry);
+ if(idx < 0)
+ {
+ idx = mCache->setHeaderCacheEntry(mID, entry, mImageSize, mDataSize); // create the new entry.
+ }
+ else
{
- alreadyCached = true; // already there and non empty
+ alreadyCached = mCache->updateEntry(idx, entry, mImageSize, mDataSize); // update the existing entry.
}
- idx = mCache->setHeaderCacheEntry(mID, mImageSize); // create or touch the entry
+
if (idx < 0)
{
llwarns << "LLTextureCacheWorker: " << mID
@@ -562,10 +571,6 @@ bool LLTextureCacheRemoteWorker::doWrite()
}
else
{
- if (cur_imagesize > 0 && (mImageSize != cur_imagesize))
- {
- alreadyCached = false; // re-write the header if the size changed in all cases
- }
if (alreadyCached && (mDataSize <= TEXTURE_CACHE_ENTRY_SIZE))
{
// Small texture already cached case: we're done with writing
@@ -628,7 +633,7 @@ bool LLTextureCacheRemoteWorker::doWrite()
{
llassert(mDataSize > TEXTURE_CACHE_ENTRY_SIZE); // wouldn't make sense to be here otherwise...
S32 file_size = mDataSize - TEXTURE_CACHE_ENTRY_SIZE;
- if ((file_size > 0) && mCache->updateTextureEntryList(mID, file_size))
+
{
// build the cache file name from the UUID
std::string filename = mCache->getTextureFileName(mID);
@@ -645,10 +650,7 @@ bool LLTextureCacheRemoteWorker::doWrite()
done = true;
}
}
- else
- {
- mDataSize = 0; // no data written
- }
+
// Nothing else to do at that point...
done = true;
}
@@ -739,7 +741,7 @@ LLTextureCache::LLTextureCache(bool threaded)
mHeaderMutex(NULL),
mListMutex(NULL),
mHeaderAPRFile(NULL),
- mReadOnly(FALSE),
+ mReadOnly(TRUE), //do not allow to change the texture cache until setReadOnly() is called.
mTexturesSizeTotal(0),
mDoPurge(FALSE)
{
@@ -747,6 +749,8 @@ LLTextureCache::LLTextureCache(bool threaded)
LLTextureCache::~LLTextureCache()
{
+ clearDeleteList() ;
+ writeUpdatedEntries() ;
}
//////////////////////////////////////////////////////////////////////////////
@@ -754,6 +758,9 @@ LLTextureCache::~LLTextureCache()
//virtual
S32 LLTextureCache::update(U32 max_time_ms)
{
+ static LLFrameTimer timer ;
+ static const F32 MAX_TIME_INTERVAL = 300.f ; //seconds.
+
S32 res;
res = LLWorkerThread::update(max_time_ms);
@@ -789,6 +796,12 @@ S32 LLTextureCache::update(U32 max_time_ms)
responder->completed(success);
}
+ if(!res && timer.getElapsedTimeF32() > MAX_TIME_INTERVAL)
+ {
+ timer.reset() ;
+ writeUpdatedEntries() ;
+ }
+
return res;
}
@@ -811,58 +824,54 @@ std::string LLTextureCache::getTextureFileName(const LLUUID& id)
return filename;
}
-bool LLTextureCache::updateTextureEntryList(const LLUUID& id, S32 bodysize)
+//debug
+BOOL LLTextureCache::isInCache(const LLUUID& id)
{
- bool res = false;
- bool purge = false;
+ LLMutexLock lock(&mHeaderMutex);
+ id_map_t::const_iterator iter = mHeaderIDMap.find(id);
+
+ return (iter != mHeaderIDMap.end()) ;
+}
+
+//debug
+BOOL LLTextureCache::isInLocal(const LLUUID& id)
+{
+ S32 local_size = 0;
+ std::string local_filename;
+
+ std::string filename = getLocalFileName(id);
+ // Is it a JPEG2000 file?
{
- mHeaderMutex.lock();
- size_map_t::iterator iter1 = mTexturesSizeMap.find(id);
- if (iter1 == mTexturesSizeMap.end() || iter1->second < bodysize)
+ local_filename = filename + ".j2c";
+ local_size = LLAPRFile::size(local_filename);
+ if (local_size > 0)
{
- llassert_always(bodysize > 0);
-
- S32 oldbodysize = 0;
- if (iter1 != mTexturesSizeMap.end())
- {
- oldbodysize = iter1->second;
- }
-
- Entry entry;
- S32 idx = openAndReadEntry(id, entry, false);
- if (idx < 0)
- {
- llwarns << "Failed to open entry: " << id << llendl;
- mHeaderMutex.unlock();
- removeFromCache(id);
- return false;
- }
- else if (oldbodysize != entry.mBodySize)
- {
- llwarns << "Entry mismatch in mTextureSizeMap / mHeaderIDMap"
- << " idx=" << idx << " oldsize=" << oldbodysize << " entrysize=" << entry.mBodySize << llendl;
- }
- entry.mBodySize = bodysize;
- writeEntryAndClose(idx, entry);
-
- mTexturesSizeTotal -= oldbodysize;
- mTexturesSizeTotal += bodysize;
-
- if (mTexturesSizeTotal > sCacheMaxTexturesSize)
- {
- purge = true;
- }
- res = true;
+ return TRUE ;
}
}
- if (purge)
+
+ // If not, is it a jpeg file?
{
- mDoPurge = TRUE;
+ local_filename = filename + ".jpg";
+ local_size = LLAPRFile::size(local_filename);
+ if (local_size > 0)
+ {
+ return TRUE ;
+ }
}
- mHeaderMutex.unlock();
- return res;
+
+ // Hmm... What about a targa file? (used for UI texture mostly)
+ {
+ local_filename = filename + ".tga";
+ local_size = LLAPRFile::size(local_filename);
+ if (local_size > 0)
+ {
+ return TRUE ;
+ }
+ }
+
+ return FALSE ;
}
-
//////////////////////////////////////////////////////////////////////////////
//static
@@ -893,13 +902,21 @@ void LLTextureCache::purgeCache(ELLPath location)
LLAPRFile::remove(mHeaderEntriesFileName);
LLAPRFile::remove(mHeaderDataFileName);
}
+ //remove the current texture cache.
purgeAllTextures(true);
}
-S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL read_only)
+//is called in the main thread before initCache(...) is called.
+void LLTextureCache::setReadOnly(BOOL read_only)
{
mReadOnly = read_only;
-
+}
+
+//called in the main thread.
+S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL disable_texture_cache)
+{
+ llassert_always(getPending() == 0) ; //should not start accessing the texture cache before initialized.
+
S64 header_size = (max_size * 2) / 10;
S64 max_entries = header_size / TEXTURE_CACHE_ENTRY_SIZE;
sCacheMaxEntries = (S32)(llmin((S64)sCacheMaxEntries, max_entries));
@@ -911,6 +928,15 @@ S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL read_only)
sCacheMaxTexturesSize = max_size;
max_size -= sCacheMaxTexturesSize;
+ if(disable_texture_cache) //the texture cache is disabled
+ {
+ llinfos << "The texture cache is disabled!" << llendl ;
+ setReadOnly(TRUE) ;
+ purgeAllTextures(true);
+
+ return max_size ;
+ }
+
LL_INFOS("TextureCache") << "Headers: " << sCacheMaxEntries
<< " Textures size: " << sCacheMaxTexturesSize/(1024*1024) << " MB" << LL_ENDL;
@@ -919,6 +945,7 @@ S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL read_only)
if (!mReadOnly)
{
LLFile::mkdir(mTexturesDirName);
+
const char* subdirs = "0123456789abcdef";
for (S32 i=0; i<16; i++)
{
@@ -929,6 +956,8 @@ S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL read_only)
readHeaderCache();
purgeTextures(true); // calc mTexturesSize and make some room in the texture cache if we need it
+ llassert_always(getPending() == 0) ; //should not start accessing the texture cache before initialized.
+
return max_size; // unused cache space
}
@@ -940,13 +969,20 @@ LLAPRFile* LLTextureCache::openHeaderEntriesFile(bool readonly, S32 offset)
llassert_always(mHeaderAPRFile == NULL);
apr_int32_t flags = readonly ? APR_READ|APR_BINARY : APR_READ|APR_WRITE|APR_BINARY;
mHeaderAPRFile = new LLAPRFile(mHeaderEntriesFileName, flags, LLAPRFile::local);
- mHeaderAPRFile->seek(APR_SET, offset);
+ if(offset > 0)
+ {
+ mHeaderAPRFile->seek(APR_SET, offset);
+ }
return mHeaderAPRFile;
}
void LLTextureCache::closeHeaderEntriesFile()
{
- llassert_always(mHeaderAPRFile != NULL);
+ if(!mHeaderAPRFile)
+ {
+ return ;
+ }
+
delete mHeaderAPRFile;
mHeaderAPRFile = NULL;
}
@@ -959,6 +995,12 @@ void LLTextureCache::readEntriesHeader()
{
LLAPRFile::readEx(mHeaderEntriesFileName, (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo));
}
+ else //create an empty entries header.
+ {
+ mHeaderEntriesInfo.mVersion = sHeaderCacheVersion ;
+ mHeaderEntriesInfo.mEntries = 0 ;
+ writeEntriesHeader() ;
+ }
}
void LLTextureCache::writeEntriesHeader()
@@ -970,8 +1012,7 @@ void LLTextureCache::writeEntriesHeader()
}
}
-static S32 mHeaderEntriesMaxWriteIdx = 0;
-
+//mHeaderMutex is locked before calling this.
S32 LLTextureCache::openAndReadEntry(const LLUUID& id, Entry& entry, bool create)
{
S32 idx = -1;
@@ -1011,8 +1052,7 @@ S32 LLTextureCache::openAndReadEntry(const LLUUID& id, Entry& entry, bool create
if (iter3 != mHeaderIDMap.end() && iter3->second >= 0)
{
idx = iter3->second;
- mHeaderIDMap.erase(oldid);
- mTexturesSizeMap.erase(oldid);
+ removeCachedTexture(oldid) ;//remove the existing cached texture to release the entry index.
break;
}
}
@@ -1022,20 +1062,9 @@ S32 LLTextureCache::openAndReadEntry(const LLUUID& id, Entry& entry, bool create
}
if (idx >= 0)
{
- // Set the header index
- mHeaderIDMap[id] = idx;
- llassert_always(mTexturesSizeMap.erase(id) == 0);
- // Initialize the entry (will get written later)
- entry.init(id, time(NULL));
- // Update Header
- writeEntriesHeader();
- // Write Entry
- S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry);
- LLAPRFile* aprfile = openHeaderEntriesFile(false, offset);
- S32 bytes_written = aprfile->write((void*)&entry, (S32)sizeof(Entry));
- llassert_always(bytes_written == sizeof(Entry));
- mHeaderEntriesMaxWriteIdx = llmax(mHeaderEntriesMaxWriteIdx, idx);
- closeHeaderEntriesFile();
+ entry.mID = id ;
+ entry.mImageSize = -1 ; //mark it is a brand-new entry.
+ entry.mBodySize = 0 ;
}
}
}
@@ -1044,44 +1073,153 @@ S32 LLTextureCache::openAndReadEntry(const LLUUID& id, Entry& entry, bool create
// Remove this entry from the LRU if it exists
mLRU.erase(id);
// Read the entry
- S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry);
- LLAPRFile* aprfile = openHeaderEntriesFile(true, offset);
- S32 bytes_read = aprfile->read((void*)&entry, (S32)sizeof(Entry));
- llassert_always(bytes_read == sizeof(Entry));
- llassert_always(entry.mImageSize == 0 || entry.mImageSize == -1 || entry.mImageSize > entry.mBodySize);
- closeHeaderEntriesFile();
+ idx_entry_map_t::iterator iter = mUpdatedEntryMap.find(idx) ;
+ if(iter != mUpdatedEntryMap.end())
+ {
+ entry = iter->second ;
+ }
+ else
+ {
+ readEntryFromHeaderImmediately(idx, entry) ;
+ }
+ if(entry.mImageSize <= entry.mBodySize)//it happens on 64-bit systems, do not know why
+ {
+ llwarns << "corrupted entry: " << id << " entry image size: " << entry.mImageSize << " entry body size: " << entry.mBodySize << llendl ;
+
+ //erase this entry and the cached texture from the cache.
+ std::string tex_filename = getTextureFileName(id);
+ removeEntry(idx, entry, tex_filename) ;
+ mUpdatedEntryMap.erase(idx) ;
+ idx = -1 ;
+ }
}
return idx;
}
-void LLTextureCache::writeEntryAndClose(S32 idx, Entry& entry)
+//mHeaderMutex is locked before calling this.
+void LLTextureCache::writeEntryToHeaderImmediately(S32& idx, Entry& entry, bool write_header)
+{
+ LLAPRFile* aprfile ;
+ S32 bytes_written ;
+ S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry);
+ if(write_header)
+ {
+ aprfile = openHeaderEntriesFile(false, 0);
+ bytes_written = aprfile->write((U8*)&mHeaderEntriesInfo, sizeof(EntriesInfo)) ;
+ if(bytes_written != sizeof(EntriesInfo))
+ {
+ clearCorruptedCache() ; //clear the cache.
+ idx = -1 ;//mark the idx invalid.
+ return ;
+ }
+
+ mHeaderAPRFile->seek(APR_SET, offset);
+ }
+ else
+ {
+ aprfile = openHeaderEntriesFile(false, offset);
+ }
+ bytes_written = aprfile->write((void*)&entry, (S32)sizeof(Entry));
+ if(bytes_written != sizeof(Entry))
+ {
+ clearCorruptedCache() ; //clear the cache.
+ idx = -1 ;//mark the idx invalid.
+
+ return ;
+ }
+
+ closeHeaderEntriesFile();
+ mUpdatedEntryMap.erase(idx) ;
+}
+
+//mHeaderMutex is locked before calling this.
+void LLTextureCache::readEntryFromHeaderImmediately(S32& idx, Entry& entry)
+{
+ S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry);
+ LLAPRFile* aprfile = openHeaderEntriesFile(true, offset);
+ S32 bytes_read = aprfile->read((void*)&entry, (S32)sizeof(Entry));
+ closeHeaderEntriesFile();
+
+ if(bytes_read != sizeof(Entry))
+ {
+ clearCorruptedCache() ; //clear the cache.
+ idx = -1 ;//mark the idx invalid.
+ }
+}
+
+//mHeaderMutex is locked before calling this.
+//update an existing entry time stamp, delay writing.
+void LLTextureCache::updateEntryTimeStamp(S32 idx, Entry& entry)
{
+ static const U32 MAX_ENTRIES_WITHOUT_TIME_STAMP = (U32)(LLTextureCache::sCacheMaxEntries * 0.75f) ;
+
+ if(mHeaderEntriesInfo.mEntries < MAX_ENTRIES_WITHOUT_TIME_STAMP)
+ {
+ return ; //there are enough empty entry index space, no need to stamp time.
+ }
+
if (idx >= 0)
{
if (!mReadOnly)
{
- entry.mTime = time(NULL);
- if(entry.mImageSize < entry.mBodySize)
- {
- // Just say no, due to my messing around to cache discards other than 0 we can end up here
- // after recalling an image from cache at a lower discard than cached. RC
- return;
- }
+ entry.mTime = time(NULL);
+ mUpdatedEntryMap[idx] = entry ;
+ }
+ }
+}
- llassert_always(entry.mImageSize == 0 || entry.mImageSize == -1 || entry.mImageSize > entry.mBodySize);
- if (entry.mBodySize > 0)
- {
- mTexturesSizeMap[entry.mID] = entry.mBodySize;
- }
-// llinfos << "Updating TE: " << idx << ": " << id << " Size: " << entry.mBodySize << " Time: " << entry.mTime << llendl;
- S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry);
- LLAPRFile* aprfile = openHeaderEntriesFile(false, offset);
- S32 bytes_written = aprfile->write((void*)&entry, (S32)sizeof(Entry));
- llassert_always(bytes_written == sizeof(Entry));
- mHeaderEntriesMaxWriteIdx = llmax(mHeaderEntriesMaxWriteIdx, idx);
- closeHeaderEntriesFile();
+//update an existing entry, write to header file immediately.
+bool LLTextureCache::updateEntry(S32& idx, Entry& entry, S32 new_image_size, S32 new_data_size)
+{
+ S32 new_body_size = llmax(0, new_data_size - TEXTURE_CACHE_ENTRY_SIZE) ;
+
+ if(new_image_size == entry.mImageSize && new_body_size == entry.mBodySize)
+ {
+ return true ; //nothing changed.
+ }
+ else
+ {
+ bool purge = false ;
+
+ lockHeaders() ;
+
+ bool update_header = false ;
+ if(entry.mImageSize < 0) //is a brand-new entry
+ {
+ mHeaderIDMap[entry.mID] = idx;
+ mTexturesSizeMap[entry.mID] = new_body_size ;
+ mTexturesSizeTotal += new_body_size ;
+
+ // Update Header
+ update_header = true ;
+ }
+ else if (entry.mBodySize != new_body_size)
+ {
+ //already in mHeaderIDMap.
+ mTexturesSizeMap[entry.mID] = new_body_size ;
+ mTexturesSizeTotal -= entry.mBodySize ;
+ mTexturesSizeTotal += new_body_size ;
+ }
+ entry.mTime = time(NULL);
+ entry.mImageSize = new_image_size ;
+ entry.mBodySize = new_body_size ;
+
+ writeEntryToHeaderImmediately(idx, entry, update_header) ;
+
+ if (mTexturesSizeTotal > sCacheMaxTexturesSize)
+ {
+ purge = true;
+ }
+
+ unlockHeaders() ;
+
+ if (purge)
+ {
+ mDoPurge = TRUE;
}
}
+
+ return false ;
}
U32 LLTextureCache::openAndReadEntries(std::vector& entries)
@@ -1093,7 +1231,21 @@ U32 LLTextureCache::openAndReadEntries(std::vector& entries)
mFreeList.clear();
mTexturesSizeTotal = 0;
- LLAPRFile* aprfile = openHeaderEntriesFile(false, (S32)sizeof(EntriesInfo));
+ LLAPRFile* aprfile = NULL;
+ if(mUpdatedEntryMap.empty())
+ {
+ aprfile = openHeaderEntriesFile(true, (S32)sizeof(EntriesInfo));
+ }
+ else //update the header file first.
+ {
+ aprfile = openHeaderEntriesFile(false, 0);
+ updatedHeaderEntriesFile() ;
+ if(!aprfile)
+ {
+ return 0;
+ }
+ aprfile->seek(APR_SET, (S32)sizeof(EntriesInfo));
+ }
for (U32 idx=0; idx& entries)
}
entries.push_back(entry);
// llinfos << "ENTRY: " << entry.mTime << " TEX: " << entry.mID << " IDX: " << idx << " Size: " << entry.mImageSize << llendl;
- if (entry.mImageSize < 0)
+ if(entry.mImageSize > entry.mBodySize)
{
- mFreeList.insert(idx);
+ mHeaderIDMap[entry.mID] = idx;
+ mTexturesSizeMap[entry.mID] = entry.mBodySize;
+ mTexturesSizeTotal += entry.mBodySize;
}
else
{
- mHeaderIDMap[entry.mID] = idx;
- if (entry.mBodySize > 0)
- {
- mTexturesSizeMap[entry.mID] = entry.mBodySize;
- mTexturesSizeTotal += entry.mBodySize;
- }
- llassert_always(entry.mImageSize == 0 || entry.mImageSize > entry.mBodySize);
+ mFreeList.insert(idx);
}
}
closeHeaderEntriesFile();
@@ -1137,13 +1285,65 @@ void LLTextureCache::writeEntriesAndClose(const std::vector& entries)
for (S32 idx=0; idxwrite((void*)(&entries[idx]), (S32)sizeof(Entry));
- llassert_always(bytes_written == sizeof(Entry));
+ if(bytes_written != sizeof(Entry))
+ {
+ clearCorruptedCache() ; //clear the cache.
+ return ;
+ }
}
- mHeaderEntriesMaxWriteIdx = llmax(mHeaderEntriesMaxWriteIdx, num_entries-1);
closeHeaderEntriesFile();
}
}
+void LLTextureCache::writeUpdatedEntries()
+{
+ lockHeaders() ;
+ if (!mReadOnly && !mUpdatedEntryMap.empty())
+ {
+ openHeaderEntriesFile(false, 0);
+ updatedHeaderEntriesFile() ;
+ closeHeaderEntriesFile();
+ }
+ unlockHeaders() ;
+}
+
+//mHeaderMutex is locked and mHeaderAPRFile is created before calling this.
+void LLTextureCache::updatedHeaderEntriesFile()
+{
+ if (!mReadOnly && !mUpdatedEntryMap.empty() && mHeaderAPRFile)
+ {
+ //entriesInfo
+ mHeaderAPRFile->seek(APR_SET, 0);
+ S32 bytes_written = mHeaderAPRFile->write((U8*)&mHeaderEntriesInfo, sizeof(EntriesInfo)) ;
+ if(bytes_written != sizeof(EntriesInfo))
+ {
+ clearCorruptedCache() ; //clear the cache.
+ return ;
+ }
+
+ //write each updated entry
+ S32 entry_size = (S32)sizeof(Entry) ;
+ S32 prev_idx = -1 ;
+ S32 delta_idx ;
+ for (idx_entry_map_t::iterator iter = mUpdatedEntryMap.begin(); iter != mUpdatedEntryMap.end(); ++iter)
+ {
+ delta_idx = iter->first - prev_idx - 1;
+ prev_idx = iter->first ;
+ if(delta_idx)
+ {
+ mHeaderAPRFile->seek(APR_CUR, delta_idx * entry_size);
+ }
+
+ bytes_written = mHeaderAPRFile->write((void*)(&iter->second), entry_size);
+ if(bytes_written != entry_size)
+ {
+ clearCorruptedCache() ; //clear the cache.
+ return ;
+ }
+ }
+ mUpdatedEntryMap.clear() ;
+ }
+}
//----------------------------------------------------------------------------
// Called from either the main thread or the worker thread
@@ -1169,28 +1369,27 @@ void LLTextureCache::readHeaderCache()
if (num_entries)
{
U32 empty_entries = 0;
- typedef std::pair lru_data_t;
+ typedef std::pair lru_data_t;
std::set lru;
- std::vector purge_list;
+ std::set purge_list;
for (U32 i=0; i 0)
{
if (entry.mBodySize > entry.mImageSize)
{
// Shouldn't happen, failsafe only
- llwarns << "Bad entry: " << i << ": " << id << ": BodySize: " << entry.mBodySize << llendl;
- purge_list.push_back(id);
+ llwarns << "Bad entry: " << i << ": " << entry.mID << ": BodySize: " << entry.mBodySize << llendl;
+ purge_list.insert(i);
}
}
}
@@ -1200,22 +1399,24 @@ void LLTextureCache::readHeaderCache()
// Special case: cache size was reduced, need to remove entries
// Note: After we prune entries, we will call this again and create the LRU
U32 entries_to_purge = (num_entries-empty_entries) - sCacheMaxEntries;
+ llinfos << "Texture Cache Entries: " << num_entries << " Max: " << sCacheMaxEntries << " Empty: " << empty_entries << " Purging: " << entries_to_purge << llendl;
if (entries_to_purge > 0)
{
for (std::set::iterator iter = lru.begin(); iter != lru.end(); ++iter)
{
- purge_list.push_back(iter->second);
- if (--entries_to_purge <= 0)
+ purge_list.insert(iter->second);
+ if (purge_list.size() >= entries_to_purge)
break;
}
}
+ llassert_always(purge_list.size() >= entries_to_purge);
}
else
{
S32 lru_entries = (S32)((F32)sCacheMaxEntries * TEXTURE_CACHE_LRU_SIZE);
for (std::set::iterator iter = lru.begin(); iter != lru.end(); ++iter)
{
- mLRU.insert(iter->second);
+ mLRU.insert(entries[iter->second].mID);
// llinfos << "LRU: " << iter->first << " : " << iter->second << llendl;
if (--lru_entries <= 0)
break;
@@ -1224,11 +1425,10 @@ void LLTextureCache::readHeaderCache()
if (purge_list.size() > 0)
{
- for (std::vector::iterator iter = purge_list.begin(); iter != purge_list.end(); ++iter)
+ for (std::set::iterator iter = purge_list.begin(); iter != purge_list.end(); ++iter)
{
- mHeaderMutex.unlock();
- removeFromCache(*iter);
- mHeaderMutex.lock();
+ std::string tex_filename = getTextureFileName(entries[*iter].mID);
+ removeEntry((S32)*iter, entries[*iter], tex_filename);
}
// If we removed any entries, we need to rebuild the entries list,
// write the header, and call this again
@@ -1236,13 +1436,14 @@ void LLTextureCache::readHeaderCache()
for (U32 i=0; i=0)
+ if (entry.mImageSize > 0)
{
new_entries.push_back(entry);
}
}
llassert_always(new_entries.size() <= sCacheMaxEntries);
mHeaderEntriesInfo.mEntries = new_entries.size();
+ writeEntriesHeader();
writeEntriesAndClose(new_entries);
mHeaderMutex.unlock(); // unlock the mutex before calling again
readHeaderCache(); // repeat with new entries file
@@ -1250,7 +1451,7 @@ void LLTextureCache::readHeaderCache()
}
else
{
- writeEntriesAndClose(entries);
+ //entries are not changed, nothing here.
}
}
}
@@ -1259,6 +1460,29 @@ void LLTextureCache::readHeaderCache()
//////////////////////////////////////////////////////////////////////////////
+//the header mutex is locked before calling this.
+void LLTextureCache::clearCorruptedCache()
+{
+ llwarns << "the texture cache is corrupted, need to be cleared." << llendl ;
+
+ closeHeaderEntriesFile();//close possible file handler
+ purgeAllTextures(false) ; //clear the cache.
+
+ if (!mReadOnly) //regenerate the directory tree if not exists.
+ {
+ LLFile::mkdir(mTexturesDirName);
+
+ const char* subdirs = "0123456789abcdef";
+ for (S32 i=0; i<16; i++)
+ {
+ std::string dirname = mTexturesDirName + gDirUtilp->getDirDelimiter() + subdirs[i];
+ LLFile::mkdir(dirname);
+ }
+ }
+
+ return ;
+}
+
void LLTextureCache::purgeAllTextures(bool purge_directories)
{
if (!mReadOnly)
@@ -1269,6 +1493,7 @@ void LLTextureCache::purgeAllTextures(bool purge_directories)
for (S32 i=0; i<16; i++)
{
std::string dirname = mTexturesDirName + delem + subdirs[i];
+ llinfos << "Deleting files in directory: " << dirname << llendl;
gDirUtilp->deleteFilesInDir(dirname,mask);
if (purge_directories)
{
@@ -1277,19 +1502,23 @@ void LLTextureCache::purgeAllTextures(bool purge_directories)
}
if (purge_directories)
{
+ gDirUtilp->deleteFilesInDir(mTexturesDirName, mask);
LLFile::rmdir(mTexturesDirName);
- }
+ }
}
mHeaderIDMap.clear();
mTexturesSizeMap.clear();
mTexturesSizeTotal = 0;
mFreeList.clear();
mTexturesSizeTotal = 0;
+ mUpdatedEntryMap.clear();
// Info with 0 entries
mHeaderEntriesInfo.mVersion = sHeaderCacheVersion;
mHeaderEntriesInfo.mEntries = 0;
writeEntriesHeader();
+
+ llinfos << "The entire texture cache is cleared." << llendl ;
}
void LLTextureCache::purgeTextures(bool validate)
@@ -1314,7 +1543,6 @@ void LLTextureCache::purgeTextures(bool validate)
U32 num_entries = openAndReadEntries(entries);
if (!num_entries)
{
- writeEntriesAndClose(entries);
return; // nothing to purge
}
@@ -1333,6 +1561,10 @@ void LLTextureCache::purgeTextures(bool validate)
time_idx_set.insert(std::make_pair(entries[idx].mTime, idx));
// llinfos << "TIME: " << entries[idx].mTime << " TEX: " << entries[idx].mID << " IDX: " << idx << " Size: " << entries[idx].mImageSize << llendl;
}
+ else
+ {
+ llerrs << "mTexturesSizeMap / mHeaderIDMap corrupted." << llendl ;
+ }
}
}
@@ -1384,11 +1616,8 @@ void LLTextureCache::purgeTextures(bool validate)
{
purge_count++;
LL_DEBUGS("TextureCache") << "PURGING: " << filename << LL_ENDL;
- LLAPRFile::remove(filename);
+ removeEntry(idx, entries[idx], filename) ;
cache_size -= entries[idx].mBodySize;
- mTexturesSizeTotal -= entries[idx].mBodySize;
- entries[idx].mBodySize = 0;
- mTexturesSizeMap.erase(entries[idx].mID);
}
}
@@ -1396,11 +1625,8 @@ void LLTextureCache::purgeTextures(bool validate)
writeEntriesAndClose(entries);
- if (!mThreaded)
- {
- // *FIX:Mani - watchdog back on.
- LLAppViewer::instance()->resumeMainloopTimeout();
- }
+ // *FIX:Mani - watchdog back on.
+ LLAppViewer::instance()->resumeMainloopTimeout();
LL_INFOS("TextureCache") << "TEXTURE CACHE:"
<< " PURGED: " << purge_count
@@ -1438,40 +1664,38 @@ LLTextureCacheWorker* LLTextureCache::getWriter(handle_t handle)
// Called from work thread
// Reads imagesize from the header, updates timestamp
-S32 LLTextureCache::getHeaderCacheEntry(const LLUUID& id, S32& imagesize)
+S32 LLTextureCache::getHeaderCacheEntry(const LLUUID& id, Entry& entry)
{
- LLMutexLock lock(&mHeaderMutex);
- Entry entry;
+ LLMutexLock lock(&mHeaderMutex);
S32 idx = openAndReadEntry(id, entry, false);
if (idx >= 0)
- {
- imagesize = entry.mImageSize;
- writeEntryAndClose(idx, entry); // updates time
+ {
+ updateEntryTimeStamp(idx, entry); // updates time
}
return idx;
}
// Writes imagesize to the header, updates timestamp
-S32 LLTextureCache::setHeaderCacheEntry(const LLUUID& id, S32 imagesize)
+S32 LLTextureCache::setHeaderCacheEntry(const LLUUID& id, Entry& entry, S32 imagesize, S32 datasize)
{
mHeaderMutex.lock();
- llassert_always(imagesize >= 0);
- Entry entry;
S32 idx = openAndReadEntry(id, entry, true);
+ mHeaderMutex.unlock();
+
if (idx >= 0)
{
- entry.mImageSize = imagesize;
- writeEntryAndClose(idx, entry);
- mHeaderMutex.unlock();
+ updateEntry(idx, entry, imagesize, datasize);
}
- else // retry
+
+ if(idx < 0) // retry
{
- mHeaderMutex.unlock();
readHeaderCache(); // We couldn't write an entry, so refresh the LRU
+
mHeaderMutex.lock();
llassert_always(!mLRU.empty() || mHeaderEntriesInfo.mEntries < sCacheMaxEntries);
mHeaderMutex.unlock();
- idx = setHeaderCacheEntry(id, imagesize); // assert above ensures no inf. recursion
+
+ idx = setHeaderCacheEntry(id, entry, imagesize, datasize); // assert above ensures no inf. recursion
}
return idx;
}
@@ -1508,39 +1732,34 @@ LLTextureCache::handle_t LLTextureCache::readFromCache(const LLUUID& id, U32 pri
return handle;
}
-// Return true if the handle is not valid, which is the case
-// when the worker was already deleted or is scheduled for deletion.
-//
-// If the handle exists and a call to worker->complete() returns
-// true or abort is true, then the handle is removed and the worker
-// scheduled for deletion.
+
bool LLTextureCache::readComplete(handle_t handle, bool abort)
{
- lockWorkers(); // Needed for access to mReaders.
-
+ lockWorkers();
handle_map_t::iterator iter = mReaders.find(handle);
- bool handle_is_valid = iter != mReaders.end();
- llassert_always(handle_is_valid || abort);
LLTextureCacheWorker* worker = NULL;
- bool delete_worker = false;
-
- if (handle_is_valid)
+ bool complete = false;
+ if (iter != mReaders.end())
{
worker = iter->second;
- delete_worker = worker->complete() || abort;
- if (delete_worker)
+ complete = worker->complete();
+
+ if(!complete && abort)
{
- mReaders.erase(handle);
- handle_is_valid = false;
+ abortRequest(handle, true) ;
}
}
-
- unlockWorkers();
-
- if (delete_worker) worker->scheduleDelete();
-
- // Return false if the handle is (still) valid.
- return !handle_is_valid;
+ if (worker && (complete || abort))
+ {
+ mReaders.erase(iter);
+ unlockWorkers();
+ worker->scheduleDelete();
+ }
+ else
+ {
+ unlockWorkers();
+ }
+ return (complete || abort);
}
LLTextureCache::handle_t LLTextureCache::writeToCache(const LLUUID& id, U32 priority,
@@ -1573,20 +1792,20 @@ bool LLTextureCache::writeComplete(handle_t handle, bool abort)
{
lockWorkers();
handle_map_t::iterator iter = mWriters.find(handle);
- llassert_always(iter != mWriters.end());
- LLTextureCacheWorker* worker = iter->second;
- if (worker->complete() || abort)
- {
- mWriters.erase(handle);
- unlockWorkers();
- worker->scheduleDelete();
- return true;
- }
- else
+ llassert(iter != mWriters.end());
+ if (iter != mWriters.end())
{
- unlockWorkers();
- return false;
+ LLTextureCacheWorker* worker = iter->second;
+ if (worker->complete() || abort)
+ {
+ mWriters.erase(handle);
+ unlockWorkers();
+ worker->scheduleDelete();
+ return true;
+ }
}
+ unlockWorkers();
+ return false;
}
void LLTextureCache::prioritizeWrite(handle_t handle)
@@ -1605,38 +1824,56 @@ void LLTextureCache::addCompleted(Responder* responder, bool success)
//////////////////////////////////////////////////////////////////////////////
-// Called from MAIN thread (endWork())
+//called after mHeaderMutex is locked.
+void LLTextureCache::removeCachedTexture(const LLUUID& id)
+{
+ if(mTexturesSizeMap.find(id) != mTexturesSizeMap.end())
+ {
+ mTexturesSizeTotal -= mTexturesSizeMap[id] ;
+ mTexturesSizeMap.erase(id);
+ }
+ mHeaderIDMap.erase(id);
+ LLAPRFile::remove(getTextureFileName(id));
+}
-bool LLTextureCache::removeHeaderCacheEntry(const LLUUID& id)
+//called after mHeaderMutex is locked.
+void LLTextureCache::removeEntry(S32 idx, Entry& entry, std::string& filename)
{
- if (!mReadOnly)
+ if(idx >= 0) //valid entry
{
- LLMutexLock lock(&mHeaderMutex);
- Entry entry;
- S32 idx = openAndReadEntry(id, entry, false);
- if (idx >= 0)
- {
- entry.mImageSize = -1;
- entry.mBodySize = 0;
- writeEntryAndClose(idx, entry);
- mFreeList.insert(idx);
- mHeaderIDMap.erase(id);
- mTexturesSizeMap.erase(id);
- return true;
- }
+ entry.mImageSize = -1;
+ entry.mBodySize = 0;
+ mHeaderIDMap.erase(entry.mID);
+ mTexturesSizeMap.erase(entry.mID);
+
+ mTexturesSizeTotal -= entry.mBodySize;
+ mFreeList.insert(idx);
}
- return false;
+
+ LLAPRFile::remove(filename);
}
-void LLTextureCache::removeFromCache(const LLUUID& id)
+bool LLTextureCache::removeFromCache(const LLUUID& id)
{
//llwarns << "Removing texture from cache: " << id << llendl;
+ bool ret = false ;
if (!mReadOnly)
{
- removeHeaderCacheEntry(id);
- LLMutexLock lock(&mHeaderMutex);
- LLAPRFile::remove(getTextureFileName(id));
+ lockHeaders() ;
+
+ Entry entry;
+ S32 idx = openAndReadEntry(id, entry, false);
+ std::string tex_filename = getTextureFileName(id);
+ removeEntry(idx, entry, tex_filename) ;
+ if (idx >= 0)
+ {
+ writeEntryToHeaderImmediately(idx, entry);
+ ret = true;
+ }
+
+ unlockHeaders() ;
}
+ return ret ;
}
//////////////////////////////////////////////////////////////////////////////
diff --git a/linden/indra/newview/lltexturecache.h b/linden/indra/newview/lltexturecache.h
index 45804c2..f80be00 100644
--- a/linden/indra/newview/lltexturecache.h
+++ b/linden/indra/newview/lltexturecache.h
@@ -40,6 +40,7 @@
#include "llworkerthread.h"
+class LLImageFormatted;
class LLTextureCacheWorker;
class LLTextureCache : public LLWorkerThread
@@ -58,10 +59,16 @@ private:
};
struct Entry
{
- Entry() {}
+ Entry() :
+ mBodySize(0),
+ mImageSize(0),
+ mTime(0)
+ {
+ }
Entry(const LLUUID& id, S32 imagesize, S32 bodysize, U32 time) :
mID(id), mImageSize(imagesize), mBodySize(bodysize), mTime(time) {}
void init(const LLUUID& id, U32 time) { mID = id, mImageSize = 0; mBodySize = 0; mTime = time; }
+ Entry& operator=(const Entry& entry) {mID = entry.mID, mImageSize = entry.mImageSize; mBodySize = entry.mBodySize; mTime = entry.mTime; return *this;}
LLUUID mID; // 16 bytes
S32 mImageSize; // total size of image if known
S32 mBodySize; // size of body file in body cache
@@ -103,7 +110,8 @@ public:
/*virtual*/ S32 update(U32 max_time_ms);
void purgeCache(ELLPath location);
- S64 initCache(ELLPath location, S64 maxsize, BOOL read_only);
+ void setReadOnly(BOOL read_only) ;
+ S64 initCache(ELLPath location, S64 maxsize, BOOL disable_texture_cache);
handle_t readFromCache(const std::string& local_filename, const LLUUID& id, U32 priority, S32 offset, S32 size,
ReadResponder* responder);
@@ -116,7 +124,7 @@ public:
bool writeComplete(handle_t handle, bool abort = false);
void prioritizeWrite(handle_t handle);
- void removeFromCache(const LLUUID& id);
+ bool removeFromCache(const LLUUID& id);
// For LLTextureCacheWorker::Responder
LLTextureCacheWorker* getReader(handle_t handle);
@@ -131,10 +139,11 @@ public:
S64 getMaxUsage() { return sCacheMaxTexturesSize; }
U32 getEntries() { return mHeaderEntriesInfo.mEntries; }
U32 getMaxEntries() { return sCacheMaxEntries; };
+ BOOL isInCache(const LLUUID& id) ;
+ BOOL isInLocal(const LLUUID& id) ;
protected:
// Accessed by LLTextureCacheWorker
- bool updateTextureEntryList(const LLUUID& id, S32 size);
std::string getLocalFileName(const LLUUID& id);
std::string getTextureFileName(const LLUUID& id);
void addCompleted(Responder* responder, bool success);
@@ -145,6 +154,7 @@ protected:
private:
void setDirNames(ELLPath location);
void readHeaderCache();
+ void clearCorruptedCache();
void purgeAllTextures(bool purge_directories);
void purgeTextures(bool validate);
LLAPRFile* openHeaderEntriesFile(bool readonly, S32 offset);
@@ -152,12 +162,20 @@ private:
void readEntriesHeader();
void writeEntriesHeader();
S32 openAndReadEntry(const LLUUID& id, Entry& entry, bool create);
- void writeEntryAndClose(S32 idx, Entry& entry);
+ bool updateEntry(S32& idx, Entry& entry, S32 new_image_size, S32 new_body_size);
+ void updateEntryTimeStamp(S32 idx, Entry& entry) ;
U32 openAndReadEntries(std::vector& entries);
void writeEntriesAndClose(const std::vector& entries);
- S32 getHeaderCacheEntry(const LLUUID& id, S32& imagesize);
- S32 setHeaderCacheEntry(const LLUUID& id, S32 imagesize);
- bool removeHeaderCacheEntry(const LLUUID& id);
+ void readEntryFromHeaderImmediately(S32& idx, Entry& entry) ;
+ void writeEntryToHeaderImmediately(S32& idx, Entry& entry, bool write_header = false) ;
+ void removeEntry(S32 idx, Entry& entry, std::string& filename);
+ void removeCachedTexture(const LLUUID& id) ;
+ S32 getHeaderCacheEntry(const LLUUID& id, Entry& entry);
+ S32 setHeaderCacheEntry(const LLUUID& id, Entry& entry, S32 imagesize, S32 datasize);
+ void writeUpdatedEntries() ;
+ void updatedHeaderEntriesFile() ;
+ void lockHeaders() { mHeaderMutex.lock(); }
+ void unlockHeaders() { mHeaderMutex.unlock(); }
private:
// Internal
@@ -194,6 +212,9 @@ private:
S64 mTexturesSizeTotal;
LLAtomic32 mDoPurge;
+ typedef std::map idx_entry_map_t;
+ idx_entry_map_t mUpdatedEntryMap;
+
// Statics
static F32 sHeaderCacheVersion;
static U32 sCacheMaxEntries;
diff --git a/linden/indra/newview/lltexturefetch.cpp b/linden/indra/newview/lltexturefetch.cpp
index 2184478..427e55a 100644
--- a/linden/indra/newview/lltexturefetch.cpp
+++ b/linden/indra/newview/lltexturefetch.cpp
@@ -1500,6 +1500,8 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image
LLTextureFetch::~LLTextureFetch()
{
+ clearDeleteList() ;
+
// ~LLQueuedThread() called here
}
--
cgit v1.1
From 2c099d201370fb7c54f71533b9d6cf93a2944587 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Mon, 30 Aug 2010 13:31:47 -0700
Subject: Added missing 'TextureCache' entry to logcontrol.xml
---
linden/indra/newview/app_settings/logcontrol.xml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/logcontrol.xml b/linden/indra/newview/app_settings/logcontrol.xml
index d59f07d..682bf64 100644
--- a/linden/indra/newview/app_settings/logcontrol.xml
+++ b/linden/indra/newview/app_settings/logcontrol.xml
@@ -74,7 +74,8 @@
-
+
+
--
cgit v1.1
From 2cd7f57d143042e45871e43331fd459fa8160ff3 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Mon, 30 Aug 2010 13:49:25 -0700
Subject: Moved LLInventoryPanel::buildNewViews called with objectp->mType
behind LL_DEBUGS(Inventory)
---
linden/indra/newview/llinventoryview.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llinventoryview.cpp b/linden/indra/newview/llinventoryview.cpp
index 71d8194..952121f 100644
--- a/linden/indra/newview/llinventoryview.cpp
+++ b/linden/indra/newview/llinventoryview.cpp
@@ -2081,9 +2081,9 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
if (objectp->getType() <= LLAssetType::AT_NONE ||
objectp->getType() >= LLAssetType::AT_COUNT)
{
- llwarns << "LLInventoryPanel::buildNewViews called with objectp->mType == "
+ LL_DEBUGS("Inventory") << "LLInventoryPanel::buildNewViews called with objectp->mType == "
<< ((S32) objectp->getType())
- << " (shouldn't happen)" << llendl;
+ << " (shouldn't happen)" << LL_ENDL;
}
else if (objectp->getType() == LLAssetType::AT_CATEGORY) // build new view for category
{
--
cgit v1.1
From cc4e1096e8b264c962be3e0be0bdeb8bd61d660f Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Mon, 30 Aug 2010 15:58:47 -0700
Subject: Added debug setting UseLegacyChatLogsFolder for saving chat.txt and
IM logs in non-grid-specific folders
---
linden/indra/newview/app_settings/settings.xml | 11 +++++++++++
linden/indra/newview/llprefsim.cpp | 12 ++++++++++--
linden/indra/newview/llstartup.cpp | 9 ++++++++-
3 files changed, 29 insertions(+), 3 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index 29d2f07..b042fb2 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -882,6 +882,17 @@
Value
1
+ UseLegacyChatLogsFolder
+
+ Comment
+ Enable legacy chat log format (firstname_lastname instead of firstname_lastname@grid). Requires restart
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 0
+
UseUTCTime
Comment
diff --git a/linden/indra/newview/llprefsim.cpp b/linden/indra/newview/llprefsim.cpp
index 045139c..e7c39e2 100644
--- a/linden/indra/newview/llprefsim.cpp
+++ b/linden/indra/newview/llprefsim.cpp
@@ -190,8 +190,16 @@ void LLPrefsIMImpl::apply()
gDirUtilp->setChatLogsDir(gSavedPerAccountSettings.getString("InstantMessageLogPath"));
- gDirUtilp->setPerAccountChatLogsDir(gHippoGridManager->getCurrentGridNick(), gSavedSettings.getString("FirstName"),
- gSavedSettings.getString("LastName") );
+ if (gSavedSettings.getBOOL("UseLegacyChatLogsFolder"))
+ {
+ gDirUtilp->setPerAccountChatLogsDir(LLStringUtil::null,
+ gSavedSettings.getString("FirstName"), gSavedSettings.getString("LastName") );
+ }
+ else
+ {
+ gDirUtilp->setPerAccountChatLogsDir(gHippoGridManager->getCurrentGridNick(),
+ gSavedSettings.getString("FirstName"), gSavedSettings.getString("LastName") );
+ }
LLFile::mkdir(gDirUtilp->getPerAccountChatLogsDir());
bool new_im_via_email = childGetValue("send_im_to_email").asBoolean();
diff --git a/linden/indra/newview/llstartup.cpp b/linden/indra/newview/llstartup.cpp
index 0464e99..301e67c 100644
--- a/linden/indra/newview/llstartup.cpp
+++ b/linden/indra/newview/llstartup.cpp
@@ -936,7 +936,14 @@ bool idle_startup()
gDirUtilp->setChatLogsDir(gSavedPerAccountSettings.getString("InstantMessageLogPath"));
}
- gDirUtilp->setPerAccountChatLogsDir(gHippoGridManager->getCurrentGridNick(), firstname, lastname);
+ if (gSavedSettings.getBOOL("UseLegacyChatLogsFolder"))
+ {
+ gDirUtilp->setPerAccountChatLogsDir(LLStringUtil::null, firstname, lastname);
+ }
+ else
+ {
+ gDirUtilp->setPerAccountChatLogsDir(gHippoGridManager->getCurrentGridNick(), firstname, lastname);
+ }
LLFile::mkdir(gDirUtilp->getChatLogsDir());
LLFile::mkdir(gDirUtilp->getPerAccountChatLogsDir());
--
cgit v1.1
From ded1245db74ae4c97d174c5779f8572ee2f032fa Mon Sep 17 00:00:00 2001
From: Patrick Sapinski
Date: Tue, 24 Aug 2010 03:04:20 -0400
Subject: added spellcheck + translation from Emerald Viewer. references to
modularsystems.sl should be changed!
---
linden/indra/cmake/CopyWinLibs.cmake | 2 +
linden/indra/cmake/FindHunSpell.cmake | 34 +
linden/indra/cmake/FindJsonCpp.cmake | 60 +
linden/indra/cmake/HUNSPELL.cmake | 16 +
linden/indra/cmake/JsonCpp.cmake | 28 +
linden/indra/llui/lllineeditor.cpp | 521 +-
linden/indra/llui/lllineeditor.h | 47 +-
linden/indra/llui/llmenugl.cpp | 25 +
linden/indra/llui/llmenugl.h | 3 +
linden/indra/llui/lltexteditor.cpp | 639 +-
linden/indra/llui/lltexteditor.h | 74 +-
linden/indra/llxml/llcontrol.cpp | 6 +
linden/indra/llxml/llcontrol.h | 80 +
linden/indra/newview/CMakeLists.txt | 14 +
.../newview/app_settings/dictionaries/en_sl.dic | 10895 ++++
.../newview/app_settings/dictionaries/en_us.aff | 201 +
.../newview/app_settings/dictionaries/en_us.dic | 62120 +++++++++++++++++++
linden/indra/newview/app_settings/settings.xml | 60 +
linden/indra/newview/lggautocorrect.cpp | 400 +
linden/indra/newview/lggautocorrect.h | 59 +
linden/indra/newview/lggdicdownload.cpp | 183 +
linden/indra/newview/lggdicdownload.h | 37 +
linden/indra/newview/lgghunspell_wrapper.cpp | 885 +
linden/indra/newview/lgghunspell_wrapper.h | 74 +
linden/indra/newview/llprefsadvanced.cpp | 106 +
linden/indra/newview/llprefsadvanced.h | 12 +
linden/indra/newview/llstartup.cpp | 8 +-
linden/indra/newview/lltranslate.cpp | 136 +
linden/indra/newview/lltranslate.h | 125 +
linden/indra/newview/llviewermessage.cpp | 82 +-
linden/indra/newview/llviewermessage.h | 4 +
linden/indra/newview/llviewertexteditor.cpp | 1 +
.../default/xui/en-us/floater_dictionaries.xml | 15 +
.../skins/default/xui/en-us/notifications.xml | 11 +-
.../xui/en-us/panel_preferences_advanced.xml | 173 +-
35 files changed, 76949 insertions(+), 187 deletions(-)
create mode 100644 linden/indra/cmake/FindHunSpell.cmake
create mode 100644 linden/indra/cmake/FindJsonCpp.cmake
create mode 100644 linden/indra/cmake/HUNSPELL.cmake
create mode 100644 linden/indra/cmake/JsonCpp.cmake
create mode 100644 linden/indra/newview/app_settings/dictionaries/en_sl.dic
create mode 100644 linden/indra/newview/app_settings/dictionaries/en_us.aff
create mode 100644 linden/indra/newview/app_settings/dictionaries/en_us.dic
create mode 100644 linden/indra/newview/lggautocorrect.cpp
create mode 100644 linden/indra/newview/lggautocorrect.h
create mode 100644 linden/indra/newview/lggdicdownload.cpp
create mode 100644 linden/indra/newview/lggdicdownload.h
create mode 100644 linden/indra/newview/lgghunspell_wrapper.cpp
create mode 100644 linden/indra/newview/lgghunspell_wrapper.h
create mode 100644 linden/indra/newview/lltranslate.cpp
create mode 100644 linden/indra/newview/lltranslate.h
create mode 100644 linden/indra/newview/skins/default/xui/en-us/floater_dictionaries.xml
(limited to 'linden/indra')
diff --git a/linden/indra/cmake/CopyWinLibs.cmake b/linden/indra/cmake/CopyWinLibs.cmake
index 13530d8..b544c15 100644
--- a/linden/indra/cmake/CopyWinLibs.cmake
+++ b/linden/indra/cmake/CopyWinLibs.cmake
@@ -25,6 +25,7 @@ set(debug_files
nssckbi.dll
openal32.dll
openjpegd.dll
+ libhunspell.dll
plc4.dll
plds4.dll
smime3.dll
@@ -111,6 +112,7 @@ set(release_files
nssckbi.dll
openal32.dll
openjpeg.dll
+ libhunspell.dll
plc4.dll
plds4.dll
smime3.dll
diff --git a/linden/indra/cmake/FindHunSpell.cmake b/linden/indra/cmake/FindHunSpell.cmake
new file mode 100644
index 0000000..d41f9cf
--- /dev/null
+++ b/linden/indra/cmake/FindHunSpell.cmake
@@ -0,0 +1,34 @@
+FIND_PATH(HUNSPELL_INCLUDE_DIR hunspell.hxx
+ /usr/local/include/hunspell
+ /usr/local/include
+ /usr/include/hunspell
+ /usr/include
+ )
+
+SET(HUNSPELL_NAMES ${HUNSPELL_NAMES} hunspell hunspell-1.2)
+FIND_LIBRARY(HUNSPELL_LIBRARY
+ NAMES ${HUNSPELL_NAMES}
+ PATHS /usr/lib /usr/local/lib
+ )
+
+IF(HUNSPELL_LIBRARY AND HUNSPELL_INCLUDE_DIR)
+ SET(HUNSPELL_LIBRARIES ${HUNSPELL_LIBRARY})
+ SET(HUNSPELL_FOUND "YES")
+ELSE(HUNSPELL_LIBRARY AND HUNSPELL_INCLUDE_DIR)
+ SET(HUNSPELL_FOUND "NO")
+ENDIF(HUNSPELL_LIBRARY AND HUNSPELL_INCLUDE_DIR)
+
+IF(HUNSPELL_FOUND)
+ IF(NOT HUNSPELL_FIND_QUIETLY)
+ MESSAGE(STATUS "Found Hunspell: ${HUNSPELL_LIBRARIES}")
+ ENDIF(NOT HUNSPELL_FIND_QUIETLY)
+ELSE(HUNSPELL_FOUND)
+ IF(HUNSPELL_FIND_REQUIRED)
+ MESSAGE(FATAL_ERROR "Could not find HunSpell library")
+ ENDIF(HUNSPELL_FIND_REQUIRED)
+ENDIF(HUNSPELL_FOUND)
+
+MARK_AS_ADVANCED(
+ HUNSPELL_LIBRARY
+ HUNSPELL_INCLUDE_DIR
+ )
diff --git a/linden/indra/cmake/FindJsonCpp.cmake b/linden/indra/cmake/FindJsonCpp.cmake
new file mode 100644
index 0000000..cf84b30
--- /dev/null
+++ b/linden/indra/cmake/FindJsonCpp.cmake
@@ -0,0 +1,60 @@
+# -*- cmake -*-
+
+# - Find JSONCpp
+# Find the JSONCpp includes and library
+# This module defines
+# JSONCPP_INCLUDE_DIR, where to find json.h, etc.
+# JSONCPP_LIBRARIES, the libraries needed to use jsoncpp.
+# JSONCPP_FOUND, If false, do not try to use jsoncpp.
+# also defined, but not for general use are
+# JSONCPP_LIBRARY, where to find the jsoncpp library.
+
+FIND_PATH(JSONCPP_INCLUDE_DIR jsoncpp/json.h
+/usr/local/include
+/usr/include
+)
+
+# Get the GCC compiler version
+EXEC_PROGRAM(${CMAKE_CXX_COMPILER}
+ ARGS ${CMAKE_CXX_COMPILER_ARG1} -dumpversion
+ OUTPUT_VARIABLE _gcc_COMPILER_VERSION
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+
+# Try to find a library that was compiled with the same compiler version as we currently use.
+SET(JSONCPP_NAMES ${JSONCPP_NAMES} libjson_linux-gcc-${_gcc_COMPILER_VERSION}_libmt.so)
+IF (STANDALONE)
+ # On standalone, assume that the system installed library was compiled with the used compiler.
+ SET(JSONCPP_NAMES ${JSONCPP_NAMES} libjson.so)
+ENDIF (STANDALONE)
+FIND_LIBRARY(JSONCPP_LIBRARY
+ NAMES ${JSONCPP_NAMES}
+ PATHS /usr/lib /usr/local/lib
+ )
+
+IF (JSONCPP_LIBRARY AND JSONCPP_INCLUDE_DIR)
+ SET(JSONCPP_LIBRARIES ${JSONCPP_LIBRARY})
+ SET(JSONCPP_FOUND "YES")
+ELSE (JSONCPP_LIBRARY AND JSONCPP_INCLUDE_DIR)
+ SET(JSONCPP_FOUND "NO")
+ENDIF (JSONCPP_LIBRARY AND JSONCPP_INCLUDE_DIR)
+
+
+IF (JSONCPP_FOUND)
+ IF (NOT JSONCPP_FIND_QUIETLY)
+ MESSAGE(STATUS "Found JSONCpp: ${JSONCPP_LIBRARIES}")
+ ENDIF (NOT JSONCPP_FIND_QUIETLY)
+ELSE (JSONCPP_FOUND)
+ IF (JSONCPP_FIND_REQUIRED)
+ MESSAGE(FATAL_ERROR "Could not find JSONCpp library")
+ ENDIF (JSONCPP_FIND_REQUIRED)
+ENDIF (JSONCPP_FOUND)
+
+# Deprecated declarations.
+SET (NATIVE_JSONCPP_INCLUDE_PATH ${JSONCPP_INCLUDE_DIR} )
+GET_FILENAME_COMPONENT (NATIVE_JSONCPP_LIB_PATH ${JSONCPP_LIBRARY} PATH)
+
+MARK_AS_ADVANCED(
+ JSONCPP_LIBRARY
+ JSONCPP_INCLUDE_DIR
+ )
diff --git a/linden/indra/cmake/HUNSPELL.cmake b/linden/indra/cmake/HUNSPELL.cmake
new file mode 100644
index 0000000..cd5d7e0
--- /dev/null
+++ b/linden/indra/cmake/HUNSPELL.cmake
@@ -0,0 +1,16 @@
+# -*- cmake -*-
+include(Prebuilt)
+
+if (STANDALONE)
+ include(FindHunSpell)
+else (STANDALONE)
+ use_prebuilt_binary(hunspell)
+
+ set(HUNSPELL_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/hunspell)
+
+ if (LINUX OR DARWIN)
+ set(HUNSPELL_LIBRARY hunspell-1.2)
+ else (LINUX OR DARWIN)
+ set(HUNSPELL_LIBRARY libhunspell)
+ endif (LINUX OR DARWIN)
+endif (STANDALONE)
diff --git a/linden/indra/cmake/JsonCpp.cmake b/linden/indra/cmake/JsonCpp.cmake
new file mode 100644
index 0000000..fe6369d
--- /dev/null
+++ b/linden/indra/cmake/JsonCpp.cmake
@@ -0,0 +1,28 @@
+# -*- cmake -*-
+
+include(Prebuilt)
+
+set(JSONCPP_FIND_QUIETLY ON)
+set(JSONCPP_FIND_REQUIRED ON)
+
+if (STANDALONE)
+ include(FindJsonCpp)
+else (STANDALONE)
+ use_prebuilt_binary(jsoncpp)
+ if (WINDOWS)
+ if (MSVC80)
+ set(JSONCPP_LIBRARIES
+ debug json_vc80d
+ optimized json_vc80)
+ elseif (MSVC90)
+ set(JSONCPP_LIBRARIES
+ debug json_vc90d
+ optimized json_vc90)
+ endif(MSVC80)
+ elseif (DARWIN)
+ set(JSONCPP_LIBRARIES json_mac-universal-gcc_libmt)
+ elseif (LINUX)
+ set(JSONCPP_LIBRARIES jsoncpp)
+ endif (WINDOWS)
+ set(JSONCPP_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/jsoncpp)
+endif (STANDALONE)
diff --git a/linden/indra/llui/lllineeditor.cpp b/linden/indra/llui/lllineeditor.cpp
index 21f0800..5441d0a 100644
--- a/linden/indra/llui/lllineeditor.cpp
+++ b/linden/indra/llui/lllineeditor.cpp
@@ -37,7 +37,6 @@
#include "lllineeditor.h"
#include "lltexteditor.h"
-#include "audioengine.h"
#include "llmath.h"
#include "llfontgl.h"
#include "llgl.h"
@@ -57,6 +56,11 @@
#include "lluictrlfactory.h"
#include "llclipboard.h"
+#include "../newview/lgghunspell_wrapper.h"
+#include "../newview/lltranslate.h"
+#include "../newview/llviewercontrol.h"
+#include "../newview/lggautocorrect.h"
+
//
// Imported globals
//
@@ -89,6 +93,34 @@ static LLRegisterWidget r1("line_editor");
//
// Member functions
//
+class LineChatTranslationReceiver : public LLTranslate::TranslationReceiver
+{
+public :
+ LineChatTranslationReceiver(const std::string &toLang, LLLineEditor* line): LLTranslate::TranslationReceiver("", toLang),
+ m_line(line)
+ {
+ }
+
+ static boost::intrusive_ptr build(const std::string &toLang,LLLineEditor* line)
+ {
+ return boost::intrusive_ptr(new LineChatTranslationReceiver(toLang,line));
+ }
+
+protected:
+ void handleResponse(const std::string &translation, const std::string &detectedLanguage)
+ {
+ static BOOL* rep = rebind_llcontrol("EmeraldTranslateReplace", &gSavedSettings, true);
+ if(*rep)
+ m_line->deleteSelection();
+ m_line->insert(((*rep)?"":" (") + translation + ((*rep)?"":")"),m_line->getCursor());
+ }
+ void handleFailure()
+ {
+ LLTranslate::TranslationReceiver::handleFailure();
+ }
+private:
+ LLLineEditor* m_line;
+};
LLLineEditor::LLLineEditor(const std::string& name, const LLRect& rect,
const std::string& default_text, const LLFontGL* font,
@@ -104,6 +136,7 @@ LLLineEditor::LLLineEditor(const std::string& name, const LLRect& rect,
:
LLUICtrl( name, rect, TRUE, commit_callback, userdata, FOLLOWS_TOP | FOLLOWS_LEFT ),
mMaxLengthBytes(max_length_bytes),
+ mPopupMenuHandle(),
mCursorPos( 0 ),
mScrollHPos( 0 ),
mTextPadLeft(0),
@@ -137,7 +170,8 @@ LLLineEditor::LLLineEditor(const std::string& name, const LLRect& rect,
mReadOnly(FALSE),
mHaveHistory(FALSE),
mImage( sImage ),
- mReplaceNewlinesWithSpaces( TRUE )
+ mReplaceNewlinesWithSpaces( TRUE ),
+ mOverRideAndShowMisspellings( FALSE )
{
llassert( max_length_bytes > 0 );
@@ -175,6 +209,59 @@ LLLineEditor::LLLineEditor(const std::string& name, const LLRect& rect,
sImage = LLUI::getUIImage("sm_rounded_corners_simple.tga");
}
mImage = sImage;
+ // make the popup menu available
+ //LLMenuGL* menu = LLUICtrlFactory::getInstance()->buildMenu("menu_texteditor.xml", parent_view);
+ LLMenuGL* menu = new LLMenuGL("wot");
+ /*if (!menu)
+ {
+ menu = new LLMenuGL(LLStringUtil::null);
+ }*/
+ menu->append(new LLMenuItemCallGL("Cut", context_cut, NULL, this));
+ menu->append(new LLMenuItemCallGL("Copy", context_copy, NULL, this));
+ menu->append(new LLMenuItemCallGL("Paste", context_paste, NULL, this));
+ menu->append(new LLMenuItemCallGL("Delete", context_delete, NULL, this));
+ menu->append(new LLMenuItemCallGL("Select All", context_selectall, NULL, this));
+ menu->appendSeparator("Transep");
+ LLMenuGL* translatemenu = new LLMenuGL("Translate To");
+ translatemenu->setCanTearOff(FALSE);
+ SpellMenuBind* t=new SpellMenuBind;t->origin=this;t->word="en";
+ translatemenu->append(new LLMenuItemCallGL("English",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="da";
+ translatemenu->append(new LLMenuItemCallGL("Danish",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="de";
+ translatemenu->append(new LLMenuItemCallGL("Deutsch(German)",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="es";
+ translatemenu->append(new LLMenuItemCallGL("Spanish",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="fr";
+ translatemenu->append(new LLMenuItemCallGL("French",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="it";
+ translatemenu->append(new LLMenuItemCallGL("Italian",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="hu";
+ translatemenu->append(new LLMenuItemCallGL("Hungarian",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="nl";
+ translatemenu->append(new LLMenuItemCallGL("Dutch",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="pl";
+ translatemenu->append(new LLMenuItemCallGL("Polish",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="pt";
+ translatemenu->append(new LLMenuItemCallGL("Portugese",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="ru";
+ translatemenu->append(new LLMenuItemCallGL("Russian",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="tr";
+ translatemenu->append(new LLMenuItemCallGL("Turkish",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="uk";
+ translatemenu->append(new LLMenuItemCallGL("Ukrainian",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="zh";
+ translatemenu->append(new LLMenuItemCallGL("Chinese",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="ja";
+ translatemenu->append(new LLMenuItemCallGL("Japanese",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="ko";
+ translatemenu->append(new LLMenuItemCallGL("Korean",translateText, NULL, t));
+ menu->appendMenu(translatemenu);
+ menu->appendSeparator("Spelsep");
+ //menu->setBackgroundColor(gColors.getColor("MenuPopupBgColor"));
+ menu->setCanTearOff(FALSE);
+ menu->setVisible(FALSE);
+ mPopupMenuHandle = menu->getHandle();
}
@@ -188,6 +275,7 @@ LLLineEditor::~LLLineEditor()
{
gEditMenuHandler = NULL;
}
+ LLView::deleteViewByHandle(mPopupMenuHandle);
}
@@ -343,7 +431,7 @@ void LLLineEditor::setText(const LLStringExplicit &new_text)
// Picks a new cursor position based on the actual screen size of text being drawn.
-void LLLineEditor::setCursorAtLocalPos( S32 local_mouse_x )
+S32 LLLineEditor::calculateCursorFromMouse( S32 local_mouse_x )
{
const llwchar* wtext = mText.getWString().c_str();
LLWString asterix_text;
@@ -351,18 +439,22 @@ void LLLineEditor::setCursorAtLocalPos( S32 local_mouse_x )
{
for (S32 i = 0; i < mText.length(); i++)
{
- asterix_text += (llwchar) 0x2022L;
+ asterix_text += '*';
}
wtext = asterix_text.c_str();
}
- S32 cursor_pos =
- mScrollHPos +
+ return mScrollHPos +
mGLFont->charFromPixelOffset(
wtext, mScrollHPos,
(F32)(local_mouse_x - mMinHPixels),
(F32)(mMaxHPixels - mMinHPixels + 1)); // min-max range is inclusive
- setCursor(cursor_pos);
+
+}
+// Picks a new cursor position based on the actual screen size of text being drawn.
+void LLLineEditor::setCursorAtLocalPos( S32 local_mouse_x )
+{
+ setCursor(calculateCursorFromMouse(local_mouse_x));
}
void LLLineEditor::setCursor( S32 pos )
@@ -418,6 +510,125 @@ void LLLineEditor::deselect()
}
+void LLLineEditor::context_cut(void* data)
+{
+ LLLineEditor* line = (LLLineEditor*)data;
+ if(line)line->cut();
+}
+void LLLineEditor::context_copy(void* data)
+{
+ LLLineEditor* line = (LLLineEditor*)data;
+ if(line)line->copy();
+}
+void LLLineEditor::spell_correct(void* data)
+{
+ SpellMenuBind* tempBind = (SpellMenuBind*)data;
+ LLLineEditor* line = tempBind->origin;
+ if(tempBind && line)
+ {
+ llinfos << ((LLMenuItemCallGL *)(tempBind->menuItem))->getName() << " : " << tempBind->origin->getName() << " : " << tempBind->word << llendl;
+ if(line)line->spellReplace(tempBind);
+
+ }
+}
+void LLLineEditor::translateText(void * data)
+{
+ SpellMenuBind* t = (SpellMenuBind*)data;
+ LLLineEditor* line = t->origin;
+ const std::string &toLang = t->word;//LLTranslate::getTranslateLanguage();
+ LLHTTPClient::ResponderPtr result = LineChatTranslationReceiver::build(toLang,line);
+ S32 left_pos = llmin( line->mSelectionStart, line->mSelectionEnd );
+ S32 length = abs( line->mSelectionStart - line->mSelectionEnd );
+ LLTranslate::translateMessage(result,"", toLang, line->mText.getString().substr(left_pos, length));
+}
+void LLLineEditor::spell_show(void * data)
+{
+ SpellMenuBind* tempBind = (SpellMenuBind*)data;
+ LLLineEditor* line = tempBind->origin;
+
+ if(tempBind && line)
+ {
+ if(tempBind->word=="Show Misspellings")
+ {
+ line->setOverRideAndShowMisspellings(TRUE);
+ }else
+ {
+ line->setOverRideAndShowMisspellings(FALSE);
+ }
+ }
+
+
+}
+std::vector LLLineEditor::getMisspelledWordsPositions()
+{
+ std::vector thePosesOfBadWords;
+ const LLWString& text = mText.getWString();
+
+ //llinfos << "end of box is at " << cursorloc << " and end of text is at " << text.length() << llendl;
+ S32 wordStart=0;
+ S32 wordEnd=mStartSpellHere;
+ while(wordEnd < mEndSpellHere)
+ {
+ //go through all the chars... XD
+ if( LLTextEditor::isPartOfWord( text[wordEnd] ) )
+
+ {
+ // Select word the cursor is over
+ while ((wordEnd > 0) && LLTextEditor::isPartOfWord(text[wordEnd-1]))
+ {
+ wordEnd--;
+ }
+ wordStart=wordEnd;
+ while ((wordEnd < (S32)text.length()) && LLTextEditor::isPartOfWord( text[wordEnd] ) )
+ {
+ wordEnd++;
+ }
+ //got a word :D
+ std::string selectedWord(std::string(text.begin(),
+ text.end()).substr(wordStart,wordEnd-wordStart));
+
+ if(!glggHunSpell->isSpelledRight(selectedWord))
+ {
+ //misspelled word here, and you have just right clicked on it!
+ //get the center of this word..
+ //S32 center = llround( (wordEnd-wordStart)/2 ) + wordStart;
+ //turn this cursor position into a pixel pos
+ //center = findPixelNearestPos(center-getCursor());
+
+ thePosesOfBadWords.push_back(
+ wordStart);
+ thePosesOfBadWords.push_back(wordEnd);
+ }
+ }
+ wordEnd++;
+ }
+ return thePosesOfBadWords;
+}
+void LLLineEditor::spell_add(void* data)
+{
+ SpellMenuBind* tempBind = (SpellMenuBind*)data;
+ if(tempBind)
+ {
+ glggHunSpell->addWordToCustomDictionary(tempBind->word);
+ tempBind->origin->mPrevSpelledText="";//make it update
+ }
+}
+void LLLineEditor::context_paste(void* data)
+{
+ LLLineEditor* line = (LLLineEditor*)data;
+ if(line)line->paste();
+}
+void LLLineEditor::context_delete(void* data)
+{
+ LLLineEditor* line = (LLLineEditor*)data;
+ if(line)line->doDelete();
+}
+void LLLineEditor::context_selectall(void* data)
+{
+ LLLineEditor* line = (LLLineEditor*)data;
+ if(line)line->selectAll();
+}
+
void LLLineEditor::startSelection()
{
mIsSelecting = TRUE;
@@ -508,6 +719,112 @@ BOOL LLLineEditor::handleDoubleClick(S32 x, S32 y, MASK mask)
return TRUE;
}
+
+BOOL LLLineEditor::handleRightMouseDown( S32 x, S32 y, MASK mask )
+{
+ setFocus(TRUE);
+
+ //setCursorAtLocalPos( x);
+ S32 wordStart = 0;
+ S32 wordEnd = calculateCursorFromMouse(x);
+
+
+ LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get();
+ if (menu)
+ {
+ if(menu->isOpen())
+ menu->setVisible(FALSE);
+ for(int i = 0;i<(int)suggestionMenuItems.size();i++)
+ {
+ SpellMenuBind * tempBind = suggestionMenuItems[i];
+ if(tempBind)
+ {
+ menu->remove((LLMenuItemCallGL *)tempBind->menuItem);
+ ((LLMenuItemCallGL *)tempBind->menuItem)->die();
+ //delete tempBind->menuItem;
+ //tempBind->menuItem = NULL;
+ delete tempBind;
+ }
+ }
+ suggestionMenuItems.clear();
+
+ menu->setItemVisible("Translate To",!mReadOnly);
+ menu->setItemVisible("Transep",!mReadOnly);
+
+ const LLWString& text = mText.getWString();
+ if(( LLTextEditor::isPartOfWord( text[wordEnd] ) )
+ &&(!mReadOnly))
+ {
+ // Select word the cursor is over
+ while ((wordEnd > 0) && LLTextEditor::isPartOfWord(text[wordEnd-1]))
+ {
+ wordEnd--;
+ }
+ wordStart=wordEnd;
+ //startSelection();
+
+ while ((wordEnd < (S32)text.length()) && LLTextEditor::isPartOfWord( text[wordEnd] ) )
+ {
+ wordEnd++;
+ }
+ std::string selectedWord(std::string(text.begin(),
+ text.end()).substr(wordStart,wordEnd-wordStart));
+ if(!glggHunSpell->isSpelledRight(selectedWord))
+ {
+ //misspelled word here, and you have just right clicked on it!
+ std::vector suggs = glggHunSpell->getSuggestionList(selectedWord);
+ //menu->setItemVisible("Transep",(suggs.size()>0));
+
+ for(int i = 0;i<(int)suggs.size();i++)
+ {
+ SpellMenuBind * tempStruct = new SpellMenuBind;
+ tempStruct->origin = this;
+ tempStruct->word = suggs[i];
+ tempStruct->wordPositionEnd = wordEnd;
+ tempStruct->wordPositionStart=wordStart;
+ LLMenuItemCallGL * suggMenuItem = new LLMenuItemCallGL(
+ tempStruct->word, spell_correct, NULL, tempStruct);
+ //new LLMenuItemCallGL("Select All", context_selectall, NULL, this));
+ tempStruct->menuItem = suggMenuItem;
+ suggestionMenuItems.push_back(tempStruct);
+ menu->append(suggMenuItem);
+ }
+ SpellMenuBind * tempStruct = new SpellMenuBind;
+ tempStruct->origin = this;
+ tempStruct->word = selectedWord;
+ tempStruct->wordPositionEnd = wordEnd;
+ tempStruct->wordPositionStart=wordStart;
+ LLMenuItemCallGL * suggMenuItem = new LLMenuItemCallGL(
+ "Add Word", spell_add, NULL, tempStruct);
+ tempStruct->menuItem = suggMenuItem;
+ suggestionMenuItems.push_back(tempStruct);
+ menu->append(suggMenuItem);
+ }
+
+ }
+ if((!mReadOnly)&&((!glggHunSpell->highlightInRed)
+ ||(mOverRideAndShowMisspellings)))
+ {
+ SpellMenuBind * tempStruct = new SpellMenuBind;
+ tempStruct->origin = this;
+ if(mOverRideAndShowMisspellings)
+ tempStruct->word = "Hide Misspellings";
+ else
+ tempStruct->word = "Show Misspellings";
+ LLMenuItemCallGL * suggMenuItem = new LLMenuItemCallGL(
+ tempStruct->word, spell_show, NULL, tempStruct);
+ tempStruct->menuItem = suggMenuItem;
+ suggestionMenuItems.push_back(tempStruct);
+ menu->append(suggMenuItem);
+ }
+
+ menu->buildDrawLabels();
+ menu->updateParent(LLMenuGL::sMenuContainer);
+ LLMenuGL::showPopup(this, menu, x, y);
+ }
+ return TRUE;
+}
+
BOOL LLLineEditor::handleMouseDown(S32 x, S32 y, MASK mask)
{
// Check first whether the "clear search" button wants to deal with this.
@@ -912,7 +1229,7 @@ void LLLineEditor::deleteSelection()
if( !mReadOnly && hasSelection() )
{
S32 left_pos = llmin( mSelectionStart, mSelectionEnd );
- S32 selection_length = abs( mSelectionStart - mSelectionEnd );
+ S32 selection_length = llabs( mSelectionStart - mSelectionEnd );
mText.erase(left_pos, selection_length);
deselect();
@@ -935,7 +1252,7 @@ void LLLineEditor::cut()
S32 left_pos = llmin( mSelectionStart, mSelectionEnd );
- S32 length = abs( mSelectionStart - mSelectionEnd );
+ S32 length = llabs( mSelectionStart - mSelectionEnd );
gClipboard.copyFromSubstring( mText.getWString(), left_pos, length );
deleteSelection();
@@ -966,11 +1283,38 @@ void LLLineEditor::copy()
if( canCopy() )
{
S32 left_pos = llmin( mSelectionStart, mSelectionEnd );
- S32 length = abs( mSelectionStart - mSelectionEnd );
+ S32 length = llabs( mSelectionStart - mSelectionEnd );
gClipboard.copyFromSubstring( mText.getWString(), left_pos, length );
}
}
+void LLLineEditor::spellReplace(SpellMenuBind* spellData)
+{
+ mText.erase(spellData->wordPositionStart,
+ spellData->wordPositionEnd - spellData->wordPositionStart);
+ insert(spellData->word,spellData->wordPositionStart);
+ mCursorPos+=spellData->word.length() - (spellData->wordPositionEnd-spellData->wordPositionStart);
+
+
+}
+void LLLineEditor::insert(std::string what, S32 wher)
+{
+ LLLineEditorRollback rollback(this);
+ LLWString clean_string(utf8str_to_wstring(what));
+ LLWStringUtil::replaceTabsWithSpaces(clean_string, 4);
+ mText.insert(wher, clean_string);
+ //see if we should move over the cursor acordingly
+ // Validate new string and rollback the if needed.
+ BOOL need_to_rollback = ( mPrevalidateFunc && !mPrevalidateFunc( mText.getWString() ) );
+ if( need_to_rollback )
+ {
+ rollback.doRollback( this );
+ reportBadKeystroke();
+ }
+ else if( mKeystrokeCallback )
+ mKeystrokeCallback( this, mCallbackUserData );
+}
+
BOOL LLLineEditor::canPaste() const
{
return !mReadOnly && gClipboard.canPasteString();
@@ -993,17 +1337,25 @@ void LLLineEditor::pasteHelper(bool is_primary)
{
bool can_paste_it;
if (is_primary)
+ {
can_paste_it = canPastePrimary();
+ }
else
+ {
can_paste_it = canPaste();
+ }
if (can_paste_it)
{
LLWString paste;
if (is_primary)
+ {
paste = gClipboard.getPastePrimaryWString();
+ }
else
+ {
paste = gClipboard.getPasteWString();
+ }
if (!paste.empty())
{
@@ -1018,7 +1370,7 @@ void LLLineEditor::pasteHelper(bool is_primary)
// Clean up string (replace tabs and returns and remove characters that our fonts don't support.)
LLWString clean_string(paste);
- LLWStringUtil::replaceTabsWithSpaces(clean_string, 1);
+ LLWStringUtil::replaceTabsWithSpaces(clean_string, 4);
//clean_string = wstring_detabify(paste, 1);
LLWStringUtil::replaceChar(clean_string, '\n', mReplaceNewlinesWithSpaces ? ' ' : 182); // 182 == paragraph character
@@ -1074,7 +1426,7 @@ void LLLineEditor::copyPrimary()
if( canCopy() )
{
S32 left_pos = llmin( mSelectionStart, mSelectionEnd );
- S32 length = abs( mSelectionStart - mSelectionEnd );
+ S32 length = llabs( mSelectionStart - mSelectionEnd );
gClipboard.copyFromPrimarySubstring( mText.getWString(), left_pos, length );
}
}
@@ -1322,6 +1674,14 @@ BOOL LLLineEditor::handleKeyHere(KEY key, MASK mask )
BOOL handled = FALSE;
BOOL selection_modified = FALSE;
+ // SL-51858: Key presses are not being passed to the Popup menu.
+ // A proper fix is non-trivial so instead just close the menu.
+ LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get();
+ if (menu && menu->isOpen())
+ {
+ LLMenuGL::sMenuContainer->hideMenus();
+ }
+
if ( gFocusMgr.getKeyboardFocus() == this )
{
LLLineEditorRollback rollback( this );
@@ -1396,6 +1756,13 @@ BOOL LLLineEditor::handleUnicodeCharHere(llwchar uni_char)
if ( (gFocusMgr.getKeyboardFocus() == this) && getVisible() && !mReadOnly)
{
+ // SL-51858: Key presses are not being passed to the Popup menu.
+ // A proper fix is non-trivial so instead just close the menu.
+ LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get();
+ if (menu && menu->isOpen())
+ {
+ LLMenuGL::sMenuContainer->hideMenus();
+ }
handled = TRUE;
LLLineEditorRollback rollback( this );
@@ -1471,10 +1838,97 @@ void LLLineEditor::doDelete()
}
}
}
+void LLLineEditor::autoCorrectText()
+{
+ static BOOL *doAnything = rebind_llcontrol("EmeraldEnableAutoCorrect", &gSavedSettings, true);
+ if( (!mReadOnly) && (*doAnything) && (isSpellDirty()))
+ {
+ S32 wordStart = 0;
+ S32 wordEnd = mCursorPos-1;
+ //llinfos <<"Checking Word, Cursor is at "< 0) && (' '!=text[wordEnd-1]))
+ {
+ wordEnd--;
+ }
+ wordStart=wordEnd;
+ while ((wordEnd < (S32)text.length()) && (' '!=text[wordEnd] ) )
+ {
+ wordEnd++;
+ }
+ std::string lastTypedWord(std::string(text.begin(),
+ text.end()).substr(wordStart,wordEnd-wordStart));
+ //llinfos << " The last typed word has been chosen, it is "<replaceWord(lastTypedWord));
+ if(correctedWord!=lastTypedWord)
+ {
+ int dif = correctedWord.length()-lastTypedWord.length();
+ std::string regText(mText);
+ //int wordStart = regText.find(lastTypedWord);
+ regText.replace(wordStart,lastTypedWord.length(),correctedWord);
+ mText=regText;
+ mCursorPos+=dif;
+ }
+ }
+ }
+}
+void LLLineEditor::drawMisspelled(LLRect background)
+{
+ if((glggHunSpell->highlightInRed || mOverRideAndShowMisspellings)
+ &&(!mReadOnly))
+ {
+ S32 newStartSpellHere =mScrollHPos;
+ S32 cursorloc =calculateCursorFromMouse(mMaxHPixels);
+ S32 newStopSpellHere = ( ((S32)mText.length())>cursorloc)?cursorloc:(S32)mText.length();
+
+ F32 elapsed = mSpellTimer.getElapsedTimeF32();
+ if(S32(elapsed / 1) & 1)
+ {
+ if(isSpellDirty()||(newStartSpellHere!=mStartSpellHere)||(newStopSpellHere!=mEndSpellHere))
+ {
+ mStartSpellHere=newStartSpellHere;
+ mEndSpellHere= newStopSpellHere;
+ resetSpellDirty();
+ misspellLocations=getMisspelledWordsPositions();
+ }
+ }
+ for(int i =0;i<(int)misspellLocations.size();i++)
+ {
+ S32 wstart =findPixelNearestPos( misspellLocations[i]-getCursor());
+ S32 wend = findPixelNearestPos(misspellLocations[++i]-getCursor());
+ S32 maxw = getRect().getWidth();
+
+ if(wend > maxw)
+ {
+ wend=maxw;
+ }
+ if(wstart > maxw)
+ {
+ wstart=maxw;
+ }
+ gGL.color4ub(255,0,0,200);
+ //3 line zig zags..
+ while(wstartsetVisible(FALSE); // no more programmatic art.
#endif
+ drawMisspelled(background);
+ resetSpellDirty();
+
// If we're editing...
if( gFocusMgr.getKeyboardFocus() == this)
{
@@ -2164,36 +2621,28 @@ BOOL LLLineEditor::prevalidateASCII(const LLWString &str)
BOOL LLLineEditor::evaluateFloat()
{
- bool success = false;
+ bool success;
+ F32 result = 0.f;
std::string expr = getText();
+ LLStringUtil::toUpper(expr);
- // user deleted the contents, nothing to evaluate -- MC
- if (expr.empty())
+ success = LLCalc::getInstance()->evalString(expr, result);
+
+ if (!success)
{
- return success;
+ // Move the cursor to near the error on failure
+ setCursor(LLCalc::getInstance()->getLastErrorPos());
+ // *TODO: Translated error message indicating the type of error? Select error text?
}
else
{
- F32 result = 0.f;
- success = LLCalc::getInstance()->evalString(expr, result);
-
- if (!success)
- {
- // Move the cursor to near the error on failure
- setCursor(LLCalc::getInstance()->getLastErrorPos());
- // *TODO: Translated error message indicating the type of error? Select error text?
- }
- else
- {
- // Replace the expression with the result
- std::ostringstream result_str;
- result_str << result;
- setText(result_str.str());
- selectAll();
- }
-
- return success;
+ // Replace the expression with the result
+ std::string result_str = llformat("%f",result);
+ setText(result_str);
+ selectAll();
}
+
+ return success;
}
void LLLineEditor::onMouseCaptureLost()
diff --git a/linden/indra/llui/lllineeditor.h b/linden/indra/llui/lllineeditor.h
index fc1b75f..6de57ec 100644
--- a/linden/indra/llui/lllineeditor.h
+++ b/linden/indra/llui/lllineeditor.h
@@ -78,6 +78,7 @@ public:
LLViewBorder::EStyle border_style = LLViewBorder::STYLE_LINE,
S32 border_thickness = 1);
+
virtual ~LLLineEditor();
virtual LLXMLNodePtr getXML(bool save_children = true) const;
@@ -91,15 +92,30 @@ public:
/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleDoubleClick(S32 x,S32 y,MASK mask);
/*virtual*/ BOOL handleMiddleMouseDown(S32 x,S32 y,MASK mask);
+ /*virtual*/ BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
/*virtual*/ BOOL handleKeyHere(KEY key, MASK mask );
/*virtual*/ BOOL handleUnicodeCharHere(llwchar uni_char);
/*virtual*/ void onMouseCaptureLost();
+ struct SpellMenuBind
+ {
+ LLLineEditor* origin;
+ void * menuItem;
+ std::string word;
+ S32 wordPositionStart;
+ S32 wordPositionEnd;
+ };
+
+ virtual void spellReplace(SpellMenuBind* spellData);
+ virtual void insert(std::string what,S32 wher);
+
// LLEditMenuHandler overrides
virtual void cut();
virtual BOOL canCut() const;
+
virtual void copy();
virtual BOOL canCopy() const;
+
virtual void paste();
virtual BOOL canPaste() const;
@@ -117,8 +133,20 @@ public:
virtual void deselect();
virtual BOOL canDeselect() const;
+ static void context_cut(void* data);
+ static void context_copy(void* data);
+ static void spell_correct(void* data);
+ static void spell_show(void* data);
+ static void translateText(void * data);
+ static void spell_add(void* data);
+ static void context_paste(void* data);
+ static void context_delete(void* data);
+ static void context_selectall(void* data);
+ std::vector getMisspelledWordsPositions();
// view overrides
virtual void draw();
+ void autoCorrectText();
+ void drawMisspelled(LLRect background);
virtual void reshape(S32 width,S32 height,BOOL called_from_parent=TRUE);
virtual void onFocusReceived();
virtual void onFocusLost();
@@ -133,6 +161,8 @@ public:
virtual void onCommit();
virtual BOOL isDirty() const { return mText.getString() != mPrevText; } // Returns TRUE if user changed value at all
virtual void resetDirty() { mPrevText = mText.getString(); } // Clear dirty state
+ virtual BOOL isSpellDirty() const { return mText.getString() != mPrevSpelledText; } // Returns TRUE if user changed value at all
+ virtual void resetSpellDirty() { mPrevSpelledText = mText.getString(); } // Clear dirty state
// assumes UTF8 text
virtual void setValue(const LLSD& value ) { setText(value.asString()); }
@@ -168,6 +198,7 @@ public:
void setWriteableBgColor( const LLColor4& c ) { mWriteableBgColor = c; }
void setReadOnlyBgColor( const LLColor4& c ) { mReadOnlyBgColor = c; }
void setFocusBgColor(const LLColor4& c) { mFocusBgColor = c; }
+ void setOverRideAndShowMisspellings(BOOL b) { mOverRideAndShowMisspellings =b;}
const LLColor4& getFgColor() const { return mFgColor; }
const LLColor4& getReadOnlyFgColor() const { return mReadOnlyFgColor; }
@@ -213,7 +244,7 @@ public:
static BOOL prevalidateASCII(const LLWString &str);
static BOOL postvalidateFloat(const std::string &str);
-
+
BOOL evaluateFloat();
// line history support:
@@ -225,11 +256,12 @@ public:
private:
// private helper methods
- void pasteHelper(bool is_primary);
+ void pasteHelper(bool is_primary);
void removeChar();
void addChar(const llwchar c);
void setCursorAtLocalPos(S32 local_mouse_x);
+ S32 calculateCursorFromMouse(S32 local_mouse_x);
S32 findPixelNearestPos(S32 cursor_offset = 0) const;
void reportBadKeystroke();
BOOL handleSpecialKey(KEY key, MASK mask);
@@ -253,9 +285,18 @@ private:
virtual S32 getPreeditFontSize() const;
protected:
+ LLHandle mPopupMenuHandle;
LLUIString mText; // The string being edited.
std::string mPrevText; // Saved string for 'ESC' revert
LLUIString mLabel; // text label that is visible when no user text provided
+ std::string mPrevSpelledText; // saved string so we know whether to respell or not
+ std::vector misspellLocations; // where all the mispelled words are
+ S32 mStartSpellHere; // the position of the first char on the screen, stored so we know when to update
+ S32 mEndSpellHere; // the location of the last char on the screen
+ BOOL mOverRideAndShowMisspellings;
+ LLFrameTimer mSpellTimer;
+ //to keep track of what we have to remove before showing menu
+ std::vector suggestionMenuItems;
// line history support:
BOOL mHaveHistory; // flag for enabled line history
@@ -364,6 +405,8 @@ private:
BOOL mIsSelecting;
S32 mSelectionStart;
S32 mSelectionEnd;
+
+
}; // end class LLLineEditorRollback
}; // end class LLLineEditor
diff --git a/linden/indra/llui/llmenugl.cpp b/linden/indra/llui/llmenugl.cpp
index b70f98b..e00700a 100644
--- a/linden/indra/llui/llmenugl.cpp
+++ b/linden/indra/llui/llmenugl.cpp
@@ -2582,6 +2582,31 @@ BOOL LLMenuGL::appendMenu( LLMenuGL* menu )
return success;
}
+// Remove a menu item from this menu.
+BOOL LLMenuGL::remove( LLMenuItemGL* item )
+{
+ if (mSpilloverMenu)
+ {
+ cleanupSpilloverBranch();
+ }
+
+ item_list_t::iterator found_iter = std::find(mItems.begin(), mItems.end(), item);
+ if (found_iter != mItems.end())
+ {
+ mItems.erase(found_iter);
+ }
+
+ removeChild( item );
+
+ // We keep it around in case someone is pointing at it.
+ // The caller can delete it if it's safe.
+ // Note that getMenu() will still not work since its parent isn't a menu.
+ sMenuContainer->addChild( item );
+
+ arrange();
+ return TRUE;
+}
+
void LLMenuGL::setEnabledSubMenus(BOOL enable)
{
setEnabled(enable);
diff --git a/linden/indra/llui/llmenugl.h b/linden/indra/llui/llmenugl.h
index 26fc294..63f9d55 100644
--- a/linden/indra/llui/llmenugl.h
+++ b/linden/indra/llui/llmenugl.h
@@ -442,6 +442,9 @@ public:
// Add the menu item to this menu.
virtual BOOL append( LLMenuItemGL* item );
+ // Remove a menu item from this menu.
+ virtual BOOL remove( LLMenuItemGL* item );
+
// *NOTE:Mani - appendNoArrange() should be removed when merging to skinning/viewer2.0
// Its added as a fix to a viewer 1.23 bug that has already been address by skinning work.
virtual BOOL appendNoArrange( LLMenuItemGL* item );
diff --git a/linden/indra/llui/lltexteditor.cpp b/linden/indra/llui/lltexteditor.cpp
index 2d46943..be6d3ef 100644
--- a/linden/indra/llui/lltexteditor.cpp
+++ b/linden/indra/llui/lltexteditor.cpp
@@ -36,7 +36,6 @@
#include "lltexteditor.h"
-#include "llerror.h"
#include "llfontgl.h"
#include "llrender.h"
#include "llui.h"
@@ -46,7 +45,6 @@
#include "lltimer.h"
#include "llmath.h"
-#include "audioengine.h"
#include "llclipboard.h"
#include "llscrollbar.h"
#include "llstl.h"
@@ -60,7 +58,13 @@
#include "llwindow.h"
#include "lltextparser.h"
#include
-#include
+
+#include "llmenugl.h"
+#include
+#include "../newview/lgghunspell_wrapper.h"
+#include "../newview/lltranslate.h"
+#include "../newview/llviewercontrol.h"
+#include "../newview/lggautocorrect.h"
//
// Globals
@@ -96,7 +100,34 @@ LLColor4 LLTextEditor::mLinkColor = LLColor4::blue;
void (* LLTextEditor::mURLcallback)(const std::string&) = NULL;
bool (* LLTextEditor::mSecondlifeURLcallback)(const std::string&) = NULL;
bool (* LLTextEditor::mSecondlifeURLcallbackRightClick)(const std::string&) = NULL;
+///////////////////////////////////////////////////////////////////
+
+class TextChatTranslationReceiver : public LLTranslate::TranslationReceiver
+{
+public :
+ TextChatTranslationReceiver(const std::string &toLang, LLTextEditor* line): LLTranslate::TranslationReceiver("", toLang),
+ m_line(line)
+ {
+ }
+
+ static boost::intrusive_ptr build(const std::string &toLang,LLTextEditor* line)
+ {
+ return boost::intrusive_ptr(new TextChatTranslationReceiver(toLang,line));
+ }
+protected:
+ void handleResponse(const std::string &translation, const std::string &detectedLanguage)
+ {
+ BOOL rep = gSavedSettings.getBOOL("EmeraldTranslateReplace");
+ m_line->insertText((rep?"":" (") + translation +(rep?"":")"),rep);
+ }
+ void handleFailure()
+ {
+ LLTranslate::TranslationReceiver::handleFailure();
+ }
+private:
+ LLTextEditor* m_line;
+};
///////////////////////////////////////////////////////////////////
@@ -257,6 +288,7 @@ LLTextEditor::LLTextEditor(
LLUICtrl( name, rect, TRUE, NULL, NULL, FOLLOWS_TOP | FOLLOWS_LEFT ),
mTextIsUpToDate(TRUE),
mMaxTextByteLength( max_length ),
+ mPopupMenuHandle(),
mBaseDocIsPristine(TRUE),
mPristineCmd( NULL ),
mLastCmd( NULL ),
@@ -290,7 +322,8 @@ LLTextEditor::LLTextEditor(
mLastSelectionX(-1),
mLastSelectionY(-1),
mReflowNeeded(FALSE),
- mScrollNeeded(FALSE)
+ mScrollNeeded(FALSE),
+ mOverRideAndShowMisspellings(FALSE)
{
mSourceID.generate();
@@ -342,6 +375,60 @@ LLTextEditor::LLTextEditor(
mParseHTML=FALSE;
mHTML.clear();
+ // make the popup menu available
+ //LLMenuGL* menu = LLUICtrlFactory::getInstance()->buildMenu("menu_texteditor.xml", parent_view);
+ LLMenuGL* menu = new LLMenuGL("wot");
+ /*if (!menu)
+ {
+ menu = new LLMenuGL(LLStringUtil::null);
+ }*/
+ menu->append(new LLMenuItemCallGL("Cut", context_cut, NULL, this));
+ menu->append(new LLMenuItemCallGL("Copy", context_copy, NULL, this));
+ menu->append(new LLMenuItemCallGL("Paste", context_paste, NULL, this));
+ menu->append(new LLMenuItemCallGL("Delete", context_delete, NULL, this));
+ menu->append(new LLMenuItemCallGL("Select All", context_selectall, NULL, this));
+ menu->appendSeparator("transep");
+ LLMenuGL* translatemenu = new LLMenuGL("Translate To");
+ translatemenu->setCanTearOff(FALSE);
+ SpellMenuBind* t=new SpellMenuBind;t->origin=this;t->word="en";
+ translatemenu->append(new LLMenuItemCallGL("English",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="da";
+ translatemenu->append(new LLMenuItemCallGL("Danish",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="de";
+ translatemenu->append(new LLMenuItemCallGL("Deutsch(German)",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="es";
+ translatemenu->append(new LLMenuItemCallGL("Spanish",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="fr";
+ translatemenu->append(new LLMenuItemCallGL("French",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="it";
+ translatemenu->append(new LLMenuItemCallGL("Italian",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="hu";
+ translatemenu->append(new LLMenuItemCallGL("Hungarian",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="nl";
+ translatemenu->append(new LLMenuItemCallGL("Dutch",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="pl";
+ translatemenu->append(new LLMenuItemCallGL("Polish",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="pt";
+ translatemenu->append(new LLMenuItemCallGL("Portugese",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="ru";
+ translatemenu->append(new LLMenuItemCallGL("Russian",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="tr";
+ translatemenu->append(new LLMenuItemCallGL("Turkish",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="uk";
+ translatemenu->append(new LLMenuItemCallGL("Ukrainian",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="zh";
+ translatemenu->append(new LLMenuItemCallGL("Chinese",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="ja";
+ translatemenu->append(new LLMenuItemCallGL("Japanese",translateText, NULL, t));
+ t=new SpellMenuBind;t->origin=this;t->word="ko";
+ translatemenu->append(new LLMenuItemCallGL("Korean",translateText, NULL, t));
+
+ menu->appendMenu(translatemenu);
+ menu->appendSeparator("Spelsep");
+ //menu->setBackgroundColor(gColors.getColor("MenuPopupBgColor"));
+ menu->setCanTearOff(FALSE);
+ menu->setVisible(FALSE);
+ mPopupMenuHandle = menu->getHandle();
}
@@ -360,6 +447,119 @@ LLTextEditor::~LLTextEditor()
std::for_each(mSegments.begin(), mSegments.end(), DeletePointer());
std::for_each(mUndoStack.begin(), mUndoStack.end(), DeletePointer());
+ LLView::deleteViewByHandle(mPopupMenuHandle);
+}
+void LLTextEditor::context_cut(void* data)
+{
+ LLTextEditor* line = (LLTextEditor*)data;
+ if(line)line->cut();
+}
+void LLTextEditor::context_copy(void* data)
+{
+ LLTextEditor* line = (LLTextEditor*)data;
+ if(line)line->copy();
+}
+void LLTextEditor::translateText(void * data)
+{
+ SpellMenuBind* t = (SpellMenuBind*)data;
+ LLTextEditor* line = t->origin;
+ const std::string &toLang = t->word;//LLTranslate::getTranslateLanguage();
+ LLHTTPClient::ResponderPtr result = TextChatTranslationReceiver::build(toLang,line);
+
+ S32 left_pos = llmin( line->mSelectionStart, line->mSelectionEnd );
+ S32 length = abs( line->mSelectionStart - line->mSelectionEnd );
+ LLTranslate::translateMessage(result,"", toLang, line->getText().substr(left_pos, length));
+}
+void LLTextEditor::spell_correct(void* data)
+{
+ SpellMenuBind* tempBind = (SpellMenuBind*)data;
+ LLTextEditor* line = tempBind->origin;
+ if(tempBind && line)
+ {
+ llinfos << tempBind->menuItem->getName() << " : " << tempBind->origin->getName() << " : " << tempBind->word << llendl;
+ if(line)line->spellReplace(tempBind);
+
+ }
+}
+void LLTextEditor::spell_show(void * data)
+{
+ SpellMenuBind* tempBind = (SpellMenuBind*)data;
+ LLTextEditor* line = tempBind->origin;
+
+ if(tempBind && line)
+ {
+ if(tempBind->word=="Show Misspellings")
+ {
+ line->setOverRideAndShowMisspellings(TRUE);
+ }else
+ {
+ line->setOverRideAndShowMisspellings(FALSE);
+ }
+ }
+}
+
+std::vector LLTextEditor::getMisspelledWordsPositions()
+{
+ resetSpellDirty();
+ std::vector thePosesOfBadWords;
+ LLWString& text = mWText;
+ S32 wordStart=0;
+ S32 wordEnd=spellStart;//start at the scroll start
+ while(wordEnd < spellEnd)
+ {
+ //go through all the chars... XD
+ if( LLTextEditor::isPartOfWord( text[wordEnd] ) )
+ {
+ // Select word the cursor is over
+ while ((wordEnd > 0) && LLTextEditor::isPartOfWord(text[wordEnd-1]))
+ {
+ wordEnd--;
+ }
+ wordStart=wordEnd;
+ while ((wordEnd < (S32)text.length()) && LLTextEditor::isPartOfWord( text[wordEnd] ) )
+ {
+ wordEnd++;
+ }
+ //got a word :D
+
+ std::string regText(text.begin(),text.end());
+ std::string selectedWord(regText.substr(wordStart,wordEnd-wordStart));
+
+ if(!glggHunSpell->isSpelledRight(selectedWord))
+ {
+ //misspelled word here, and you have just right clicked on it
+
+ thePosesOfBadWords.push_back(wordStart);
+ thePosesOfBadWords.push_back(wordEnd);
+ }
+ }
+ wordEnd++;
+ }
+ return thePosesOfBadWords;
+}
+void LLTextEditor::spell_add(void* data)
+{
+ SpellMenuBind* tempBind = (SpellMenuBind*)data;
+ if(tempBind)
+ {
+ glggHunSpell->addWordToCustomDictionary(tempBind->word);
+ tempBind->origin->mPrevSpelledText.erase();//make it update
+ }
+}
+void LLTextEditor::context_paste(void* data)
+{
+ LLTextEditor* line = (LLTextEditor*)data;
+ if(line)line->paste();
+}
+void LLTextEditor::context_delete(void* data)
+{
+ LLTextEditor* line = (LLTextEditor*)data;
+ if(line)line->doDelete();
+}
+void LLTextEditor::context_selectall(void* data)
+{
+ LLTextEditor* line = (LLTextEditor*)data;
+ if(line)line->selectAll();
}
void LLTextEditor::setTrackColor( const LLColor4& color )
@@ -751,14 +951,7 @@ S32 LLTextEditor::getLineStart( S32 line ) const
S32 segoffset = mLineStartList[line].mOffset;
LLTextSegment* seg = mSegments[segidx];
S32 res = seg->getStart() + segoffset;
- if (res > seg->getEnd())
- {
- //llerrs << "wtf" << llendl;
- // This happens when creating a new notecard using the AO on certain opensims.
- // Play it safe instead of bringing down the viewer - MC
- llwarns << "BAD JOOJOO! Text length (" << res << ") greater than text end (" << seg->getEnd() << "). Setting line start to " << seg->getEnd() << llendl;
- res = seg->getEnd();
- }
+ if (res > seg->getEnd()) llerrs << "wtf" << llendl;
return res;
}
@@ -886,11 +1079,6 @@ S32 LLTextEditor::getCursorPosFromLocalCoord( S32 local_x, S32 local_y, BOOL rou
void LLTextEditor::setCursor(S32 row, S32 column)
{
- // Make sure we're not trying to set the cursor anywhere
- // it can't go by always setting the min to 0 -- MC
- row = (row < 0) ? 0 : row;
- column = (column < 0) ? 0 : column;
-
const llwchar* doc = mWText.c_str();
const char CR = 10;
while(row--)
@@ -1142,6 +1330,14 @@ BOOL LLTextEditor::handleMouseDown(S32 x, S32 y, MASK mask)
{
BOOL handled = FALSE;
+ // SL-51858: Key presses are not being passed to the Popup menu.
+ // A proper fix is non-trivial so instead just close the menu.
+ LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get();
+ if (menu && menu->isOpen())
+ {
+ LLMenuGL::sMenuContainer->hideMenus();
+ }
+
// Let scrollbar have first dibs
handled = LLView::childrenHandleMouseDown(x, y, mask) != NULL;
@@ -1216,6 +1412,107 @@ BOOL LLTextEditor::handleMouseDown(S32 x, S32 y, MASK mask)
return handled;
}
+BOOL LLTextEditor::handleRightMouseDown( S32 x, S32 y, MASK mask )
+{
+
+ setFocus(TRUE);
+
+ //setCursorAtLocalPos( x, y, TRUE );
+ S32 wordStart = 0;
+ S32 wordEnd = getCursorPosFromLocalCoord(x,y,TRUE);
+
+ LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get();
+ if (menu)
+ {
+ for(int i = 0;i<(int)suggestionMenuItems.size();i++)
+ {
+ SpellMenuBind * tempBind = suggestionMenuItems[i];
+ if(tempBind)
+ {
+ menu->remove(tempBind->menuItem);
+ tempBind->menuItem->die();
+ //delete tempBind->menuItem;
+ //tempBind->menuItem = NULL;
+ delete tempBind;
+ }
+ }
+ suggestionMenuItems.clear();
+
+ menu->setItemVisible("Translate To",!mReadOnly);
+ menu->setItemVisible("Transep",!mReadOnly);
+
+ const LLWString &text = mWText;
+
+ if(( isPartOfWord( text[wordEnd] ) )&&(!mReadOnly))
+ {
+ // Select word the cursor is over
+ while ((wordEnd > 0) && isPartOfWord(text[wordEnd-1]))
+ {
+ wordEnd--;
+ }
+ wordStart=wordEnd;
+ //startSelection();
+
+ while ((wordEnd < (S32)text.length()) && isPartOfWord( text[wordEnd] ) )
+ {
+ wordEnd++;
+ }
+ std::string selectedWord(std::string(text.begin(), text.end()).substr(wordStart,wordEnd-wordStart));
+ if(!glggHunSpell->isSpelledRight(selectedWord))
+ {
+ //misspelled word here, and you have just right clicked on it!
+ std::vector suggs = glggHunSpell->getSuggestionList(selectedWord);
+
+ //menu->setItemVisible("Transep",(suggs.size()>0));
+ for(int i = 0;i<(int)suggs.size();i++)
+ {
+ SpellMenuBind * tempStruct = new SpellMenuBind;
+ tempStruct->origin = this;
+ tempStruct->word = suggs[i];
+ tempStruct->wordPositionEnd = wordEnd;
+ tempStruct->wordPositionStart=wordStart;
+ tempStruct->wordY=y;
+ LLMenuItemCallGL * suggMenuItem = new LLMenuItemCallGL(
+ tempStruct->word, spell_correct, NULL, tempStruct);
+ tempStruct->menuItem = suggMenuItem;
+ suggestionMenuItems.push_back(tempStruct);
+ menu->append(suggMenuItem);
+ }
+ SpellMenuBind * tempStruct = new SpellMenuBind;
+ tempStruct->origin = this;
+ tempStruct->word = selectedWord;
+ tempStruct->wordPositionEnd = wordEnd;
+ tempStruct->wordPositionStart=wordStart;
+ tempStruct->wordY=y;
+ LLMenuItemCallGL * suggMenuItem = new LLMenuItemCallGL(
+ "Add Word", spell_add, NULL, tempStruct);
+ tempStruct->menuItem = suggMenuItem;
+ suggestionMenuItems.push_back(tempStruct);
+ menu->append(suggMenuItem);
+ }
+
+ }
+ if((!mReadOnly)&&((!glggHunSpell->highlightInRed)
+ ||(mOverRideAndShowMisspellings)||(mShowLineNumbers)))
+ {
+ SpellMenuBind * tempStruct = new SpellMenuBind;
+ tempStruct->origin = this;
+ if(mOverRideAndShowMisspellings)
+ tempStruct->word = "Hide Misspellings";
+ else
+ tempStruct->word = "Show Misspellings";
+ LLMenuItemCallGL * suggMenuItem = new LLMenuItemCallGL(
+ tempStruct->word, spell_show, NULL, tempStruct);
+ tempStruct->menuItem = suggMenuItem;
+ suggestionMenuItems.push_back(tempStruct);
+ menu->append(suggMenuItem);
+ }
+ menu->buildDrawLabels();
+ menu->updateParent(LLMenuGL::sMenuContainer);
+ LLMenuGL::showPopup(this, menu, x, y);
+ }
+ return TRUE;
+}
BOOL LLTextEditor::handleMiddleMouseDown(S32 x, S32 y, MASK mask)
@@ -1350,11 +1647,6 @@ BOOL LLTextEditor::handleMouseUp(S32 x, S32 y, MASK mask)
setCursorAtLocalPos( x, y, TRUE );
endSelection();
-
- updateScrollFromCursor();
-
- // take selection to primary clipboard
- updatePrimary();
}
if( !hasSelection() )
@@ -1432,7 +1724,6 @@ BOOL LLTextEditor::handleDoubleClick(S32 x, S32 y, MASK mask)
handled = TRUE;
}
-
return handled;
}
@@ -1913,6 +2204,16 @@ BOOL LLTextEditor::canPaste() const
return !mReadOnly && gClipboard.canPasteString();
}
+void LLTextEditor::spellReplace(SpellMenuBind* spellData)
+{
+ remove( spellData->wordPositionStart,
+ spellData->wordPositionEnd - spellData->wordPositionStart, TRUE );
+ LLWString clean_string = utf8str_to_wstring(spellData->word);
+ insert(spellData->wordPositionStart, clean_string, FALSE);
+ mCursorPos+=clean_string.length() - (spellData->wordPositionEnd-spellData->wordPositionStart);
+ needsReflow();
+}
+
// paste from clipboard
void LLTextEditor::paste()
{
@@ -1932,25 +2233,35 @@ void LLTextEditor::pasteHelper(bool is_primary)
{
bool can_paste_it;
if (is_primary)
+ {
can_paste_it = canPastePrimary();
+ }
else
+ {
can_paste_it = canPaste();
+ }
if (!can_paste_it)
{
return;
}
+
LLUUID source_id;
LLWString paste;
if (is_primary)
+ {
paste = gClipboard.getPastePrimaryWString(&source_id);
+ }
else
+ {
paste = gClipboard.getPasteWString(&source_id);
+ }
if (paste.empty())
{
return;
}
+
// Delete any selected characters (the paste replaces them)
if( (!is_primary) && hasSelection() )
{
@@ -1995,7 +2306,7 @@ void LLTextEditor::copyPrimary()
return;
}
S32 left_pos = llmin( mSelectionStart, mSelectionEnd );
- S32 length = abs( mSelectionStart - mSelectionEnd );
+ S32 length = llabs( mSelectionStart - mSelectionEnd );
gClipboard.copyFromPrimarySubstring(mWText, left_pos, length, mSourceID);
}
@@ -2262,6 +2573,13 @@ BOOL LLTextEditor::handleKeyHere(KEY key, MASK mask )
BOOL selection_modified = FALSE;
BOOL return_key_hit = FALSE;
BOOL text_may_have_changed = TRUE;
+ // SL-51858: Key presses are not being passed to the Popup menu.
+ // A proper fix is non-trivial so instead just close the menu.
+ LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get();
+ if (menu && menu->isOpen())
+ {
+ LLMenuGL::sMenuContainer->hideMenus();
+ }
if ( gFocusMgr.getKeyboardFocus() == this )
{
@@ -2306,6 +2624,14 @@ BOOL LLTextEditor::handleKeyHere(KEY key, MASK mask )
}
}
+ // SL-51858: Key presses are not being passed to the Popup menu.
+ // A proper fix is non-trivial so instead just close the menu.
+ LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get();
+ if (menu && menu->isOpen())
+ {
+ LLMenuGL::sMenuContainer->hideMenus();
+ }
+
// Handle most keys only if the text editor is writeable.
if( !mReadOnly )
{
@@ -2739,6 +3065,140 @@ void LLTextEditor::drawSelectionBackground()
}
}
}
+void LLTextEditor::autoCorrectText()
+{
+
+ static BOOL *doAnything = rebind_llcontrol("EmeraldEnableAutoCorrect", &gSavedSettings, true);
+ if( (!mReadOnly) && (*doAnything) && (isSpellDirty()) )
+ {
+ S32 wordStart = 0;
+ S32 wordEnd = mCursorPos-1;
+ if(wordEnd<1)return;
+ LLWString& text = mWText;
+ if(text.size()<1)return;
+ if( LLTextEditor::isPartOfWord( text[wordEnd] )) return;//we only check on word breaks
+ wordEnd--;
+ if( LLTextEditor::isPartOfWord( text[wordEnd] ) )
+ {
+ while ((wordEnd > 0) && (text[wordEnd-1]!=' '))
+ {
+ wordEnd--;
+ }
+ wordStart=wordEnd;
+ while ((wordEnd < (S32)text.length()) && (' '!= text[wordEnd] ) )
+ {
+ wordEnd++;
+ }
+ std::string lastTypedWord(std::string(text.begin(),
+ text.end()).substr(wordStart,wordEnd-wordStart));
+
+ std::string regText(text.begin(),text.end());
+
+ std::string correctedWord(LGGAutoCorrect::getInstance()->replaceWord(lastTypedWord));
+ if(correctedWord!=lastTypedWord)
+ {
+ int dif = correctedWord.length()-lastTypedWord.length();
+ regText.replace(wordStart,lastTypedWord.length(),correctedWord);
+ mWText=utf8str_to_wstring(regText);
+ mCursorPos+=dif;
+ needsReflow();
+ }
+ }
+ }
+}
+void LLTextEditor::drawMisspelled()
+{
+ if(mReadOnly)return;
+ if(glggHunSpell->highlightInRed || mOverRideAndShowMisspellings)
+ {
+ if(
+ ( ((getLength()<400)||(false)) &&( (S32(mSpellTimer.getElapsedTimeF32() / 1) & 1) ))
+ ||
+ (S32(mKeystrokeTimer.getElapsedTimeF32() / 1) & 1)
+ )
+ {
+ S32 newSpellStart = getLineStart(mScrollbar->getDocPos());//start at the scroll start
+ S32 newSpellEnd = getLineStart(mScrollbar->getDocPos() + 1 + mScrollbar->getDocSize()-mScrollbar->getDocPosMax());//end at the end o.o
+
+ if(mScrollbar->getDocPos() == mScrollbar->getDocPosMax())
+ {
+ newSpellEnd=(S32)mWText.length();
+ }
+ if((isSpellDirty())||(newSpellEnd!=spellEnd || newSpellStart!=spellStart))
+ {
+ spellEnd = newSpellEnd;
+ spellStart = newSpellStart;
+ misspellLocations=getMisspelledWordsPositions();
+ }
+ }
+ //draw
+ for(int i =0;i<(int)misspellLocations.size();i++)
+ {
+ S32 wstart = misspellLocations[i];
+ S32 wend = misspellLocations[++i];
+ //start curor code mod
+ const LLWString &text = mWText;
+ const S32 text_len = getLength();
+ // Skip through the lines we aren't drawing.
+ S32 search_pos = mScrollbar->getDocPos();
+ S32 num_lines = getLineCount();
+ if (search_pos >= num_lines)return;
+ S32 line_start = getLineStart(search_pos);
+ F32 line_height = mGLFont->getLineHeight();
+ F32 text_y = (F32)(mTextRect.mTop) - line_height;
+
+ F32 word_left = 0.f;
+ F32 word_right = 0.f;
+ F32 word_bottom = 0.f;
+ BOOL word_visible = FALSE;
+
+ S32 line_end = 0;
+ // Determine if the cursor is visible and if so what its coordinates are.
+ while( (mTextRect.mBottom <= llround(text_y)) && (search_pos < num_lines))
+ {
+ line_end = text_len + 1;
+ S32 next_line = -1;
+
+ if ((search_pos + 1) < num_lines)
+ {
+ next_line = getLineStart(search_pos + 1);
+ line_end = next_line - 1;
+ }
+ const llwchar* line = text.c_str() + line_start;
+ // Find the cursor and selection bounds
+ if( line_start <= wstart && wend <= line_end )
+ {
+ word_visible = TRUE;
+ word_left = (F32)mTextRect.mLeft + mGLFont->getWidthF32(line, 0, wstart - line_start, mAllowEmbeddedItems )-1.f;
+ word_right = (F32)mTextRect.mLeft + mGLFont->getWidthF32(line, 0, wend - line_start, mAllowEmbeddedItems )+1.f;
+ word_bottom = text_y;
+ break;
+ }
+ // move down one line
+ text_y -= line_height;
+ line_start = next_line;
+ search_pos++;
+ }
+ if(mShowLineNumbers)
+ {
+ word_left += UI_TEXTEDITOR_LINE_NUMBER_MARGIN;
+ word_right += UI_TEXTEDITOR_LINE_NUMBER_MARGIN;
+ }
+ // Draw the cursor
+ if( word_visible )
+ {
+ //end cursos code mod
+ gGL.color4ub(255,0,0,200);
+ while(word_leftsetVisible(true);
html->setColor(mLinkColor);
@@ -3675,9 +4143,9 @@ void LLTextEditor::appendStyledText(const std::string &new_text,
appendHighlightedText(subtext,allow_undo, prepend_newline, part, stylep);
}
- html->setLinkHREF(text.substr(start,end-start));
+ html->setLinkHREF(url);
appendText(text.substr(start, end-start),allow_undo, prepend_newline, html);
- if (end < (S32)text.length())
+ if (end < (S32)text.length())
{
text = text.substr(end,text.length() - end);
end=0;
@@ -3688,6 +4156,7 @@ void LLTextEditor::appendStyledText(const std::string &new_text,
break;
}
}
+
if (part != (S32)LLTextParser::WHOLE) part=(S32)LLTextParser::END;
if (end < (S32)text.length()) appendHighlightedText(text,allow_undo, prepend_newline, part, stylep);
}
@@ -3784,6 +4253,10 @@ void LLTextEditor::appendText(const std::string &new_text, bool allow_undo, bool
{
mSelectionStart = selection_start;
mSelectionEnd = selection_end;
+
+
+
+
mIsSelecting = was_selecting;
setCursorPos(cursor_pos);
}
@@ -3952,6 +4425,15 @@ void LLTextEditor::loadKeywords(const std::string& filename,
}
}
+void LLTextEditor::addToken(LLKeywordToken::TOKEN_TYPE type,
+ const std::string& key,
+ const LLColor3& color,
+ const std::string& tool_tip,
+ const std::string& delimiter)
+{
+ mKeywords.addToken(type,key,color,tool_tip);
+}
+
void LLTextEditor::updateSegments()
{
if (mKeywords.isLoaded())
@@ -4417,11 +4899,9 @@ S32 LLTextEditor::findHTMLToken(const std::string &line, S32 pos, BOOL reverse)
std::string openers=" \t\n('\"[{<>";
std::string closers=" \t\n)'\"]}><;";
- S32 index = 0;
-
if (reverse)
{
- for (index=pos; index >= 0; index--)
+ for (int index=pos; index >= 0; index--)
{
char c = line[index];
S32 m2 = openers.find(c);
@@ -4430,13 +4910,13 @@ S32 LLTextEditor::findHTMLToken(const std::string &line, S32 pos, BOOL reverse)
return index+1;
}
}
- index = 0; // Can't be before first charater
+ return 0; // index is -1, don't want to return that.
}
else
{
// adjust the search slightly, to allow matching parenthesis inside the URL
S32 paren_count = 0;
- for (index=pos; index<(S32)line.length(); index++)
+ for (int index=pos; index<(S32)line.length(); index++)
{
char c = line[index];
@@ -4464,12 +4944,11 @@ S32 LLTextEditor::findHTMLToken(const std::string &line, S32 pos, BOOL reverse)
}
}
}
+ return line.length();
}
-
- return index;
}
-BOOL LLTextEditor::findHTML(const std::string &line, S32 *begin, S32 *end) const
+BOOL LLTextEditor::findHTML(const std::string &line, S32 *begin, S32 *end, std::string& url) const
{
S32 m1,m2,m3;
@@ -4481,34 +4960,21 @@ BOOL LLTextEditor::findHTML(const std::string &line, S32 *begin, S32 *end) const
{
*begin = findHTMLToken(line, m1, TRUE);
*end = findHTMLToken(line, m1, FALSE);
-
- // Can't start before the first char
- if(*begin < 0)
- {
- //*begin = 0;
- }
//Load_url only handles http and https so don't hilite ftp, smb, etc.
- try
+ m2 = line.substr(*begin,(m1 - *begin)).find("http");
+ m3 = line.substr(*begin,(m1 - *begin)).find("secondlife");
+
+ std::string badneighbors=".,<>?';\"][}{=-+_)(*&^%$#@!~`\t\r\n\\";
+
+ if (m2 >= 0 || m3>=0)
{
- m2 = line.substr(*begin,(m1 - *begin)).find("http");
- m3 = line.substr(*begin,(m1 - *begin)).find("secondlife");
-
- std::string badneighbors=".,<>?';\"][}{=-+_)(*&^%$#@!~`\t\r\n\\";
-
- if (m2 >= 0 || m3>=0)
- {
- S32 bn = badneighbors.find(line.substr(m1+3,1));
-
- if (bn < 0)
- {
- matched = TRUE;
- }
+ S32 bn = badneighbors.find(line.substr(m1+3,1));
+
+ if (bn < 0)
+ {
+ matched = TRUE;
}
- }
- catch ( std::out_of_range outOfRange )
- {
- LL_WARNS("TextEditor") << "got std::out_of_range exception \"" << line << "\"" << LL_ENDL;
}
}
/* matches things like secondlife.com (no http://) needs a whitelist to really be effective.
@@ -4541,11 +5007,46 @@ BOOL LLTextEditor::findHTML(const std::string &line, S32 *begin, S32 *end) const
{
S32 strpos, strpos2;
- try
+ url = line.substr(*begin,*end - *begin);
+ std::string slurlID = "slurl.com/secondlife/";
+ strpos = url.find(slurlID);
+
+ if (strpos < 0)
{
- std::string url = line.substr(*begin,*end - *begin);
- std::string slurlID = "slurl.com/secondlife/";
- strpos = url.find(slurlID);
+ slurlID="maps.secondlife.com/secondlife/";
+ strpos = url.find(slurlID);
+ }
+
+ if (strpos < 0)
+ {
+ slurlID="secondlife://";
+ strpos = url.find(slurlID);
+ }
+
+ if (strpos < 0)
+ {
+ slurlID="sl://";
+ strpos = url.find(slurlID);
+ }
+
+ if (strpos >= 0)
+ {
+ strpos+=slurlID.length();
+
+ while ( ( strpos2=url.find("/",strpos) ) == -1 )
+ {
+ if ((*end+2) >= (S32)line.length() || line.substr(*end,1) != " " )
+ {
+ matched=FALSE;
+ break;
+ }
+
+ strpos = (*end + 1) - *begin;
+
+ *end = findHTMLToken(line,(*begin + strpos),FALSE);
+ url = line.substr(*begin,*end - *begin);
+ }
+ }
if (strpos < 0)
{
diff --git a/linden/indra/llui/lltexteditor.h b/linden/indra/llui/lltexteditor.h
index f26bf3b..6b372d7 100644
--- a/linden/indra/llui/lltexteditor.h
+++ b/linden/indra/llui/lltexteditor.h
@@ -45,6 +45,7 @@
#include "lldarray.h"
#include "llpreeditor.h"
+#include "llmenugl.h"
class LLFontGL;
class LLScrollbar;
@@ -84,6 +85,7 @@ public:
virtual BOOL handleHover(S32 x, S32 y, MASK mask);
virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask );
+ virtual BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
virtual BOOL handleMiddleMouseDown(S32 x,S32 y,MASK mask);
virtual BOOL handleKeyHere(KEY key, MASK mask );
@@ -108,29 +110,55 @@ public:
virtual void setFocus( BOOL b );
virtual BOOL acceptsTextInput() const;
virtual BOOL isDirty() const { return( mLastCmd != NULL || (mPristineCmd && (mPristineCmd != mLastCmd)) ); }
+ BOOL isSpellDirty() const { return mWText != mPrevSpelledText; } // Returns TRUE if user changed value at all
+ void resetSpellDirty() { mPrevSpelledText = mWText; } // Clear dirty state
+ struct SpellMenuBind
+ {
+ LLTextEditor* origin;
+ LLMenuItemCallGL * menuItem;
+ std::string word;
+ S32 wordPositionStart;
+ S32 wordPositionEnd;
+ S32 wordY;
+ };
+
// LLEditMenuHandler interface
virtual void undo();
virtual BOOL canUndo() const;
virtual void redo();
virtual BOOL canRedo() const;
-
virtual void cut();
virtual BOOL canCut() const;
virtual void copy();
virtual BOOL canCopy() const;
virtual void paste();
virtual BOOL canPaste() const;
+
+ virtual void spellReplace(SpellMenuBind* spellData);
+
virtual void updatePrimary();
virtual void copyPrimary();
virtual void pastePrimary();
virtual BOOL canPastePrimary() const;
+
virtual void doDelete();
virtual BOOL canDoDelete() const;
virtual void selectAll();
virtual BOOL canSelectAll() const;
virtual void deselect();
virtual BOOL canDeselect() const;
+ static void context_cut(void* data);
+
+ static void context_copy(void* data);
+ static void context_paste(void* data);
+ static void context_delete(void* data);
+ static void context_selectall(void* data);
+ static void translateText(void * data);
+ static void spell_correct(void* data);
+ static void spell_add(void* data);
+ static void spell_show(void* data);
+ std::vector getMisspelledWordsPositions();
void selectNext(const std::string& search_text_in, BOOL case_insensitive, BOOL wrap = TRUE);
BOOL replaceText(const std::string& search_text, const std::string& replace_text, BOOL case_insensitive, BOOL wrap = TRUE);
@@ -145,17 +173,17 @@ public:
BOOL allowsEmbeddedItems() const { return mAllowEmbeddedItems; }
// inserts text at cursor
- void insertText(const std::string &text);
+ void insertText(const std::string &text, BOOL deleteSelection = TRUE);
// appends text at end
void appendText(const std::string &wtext, bool allow_undo, bool prepend_newline,
const LLStyleSP stylep = NULL);
- void appendColoredText(const std::string &wtext, bool allow_undo,
+ void appendColoredText(const std::string &wtext, bool allow_undo,
bool prepend_newline,
const LLColor4 &color,
const std::string& font_name = LLStringUtil::null);
// if styled text starts a line, you need to prepend a newline.
- void appendStyledText(const std::string &new_text, bool allow_undo,
+ void appendStyledText(const std::string &new_text, bool allow_undo,
bool prepend_newline,
LLStyleSP stylep = NULL);
void appendHighlightedText(const std::string &new_text, bool allow_undo,
@@ -182,6 +210,11 @@ public:
const std::vector& funcs,
const std::vector& tooltips,
const LLColor3& func_color);
+ void addToken(LLKeywordToken::TOKEN_TYPE type,
+ const std::string& key,
+ const LLColor3& color,
+ const std::string& tool_tip = LLStringUtil::null,
+ const std::string& delimiter = LLStringUtil::null);
LLKeywords::keyword_iterator_t keywordsBegin() { return mKeywords.begin(); }
LLKeywords::keyword_iterator_t keywordsEnd() { return mKeywords.end(); }
@@ -196,6 +229,7 @@ public:
void setThumbColor( const LLColor4& color );
void setHighlightColor( const LLColor4& color );
void setShadowColor( const LLColor4& color );
+ void setOverRideAndShowMisspellings(BOOL b){ mOverRideAndShowMisspellings =b;}
// Hacky methods to make it into a word-wrapping, potentially scrolling,
// read-only text box.
@@ -262,7 +296,7 @@ public:
const LLTextSegment* getPreviousSegment() const;
void getSelectedSegments(std::vector& segments) const;
- static bool isPartOfWord(llwchar c) { return (c == '_') || LLStringOps::isAlnum((char)c); }
+ static bool isPartOfWord(llwchar c) { return ( (c == '_') || (c == '\'') || LLStringOps::isAlnum((char)c)); }
BOOL isReadOnly() { return mReadOnly; }
protected:
@@ -270,11 +304,14 @@ protected:
// Methods
//
+ LLHandle mPopupMenuHandle;
+
S32 getLength() const { return mWText.length(); }
void getSegmentAndOffset( S32 startpos, S32* segidxp, S32* offsetp ) const;
void drawPreeditMarker();
-
+public:
void updateLineStartList(S32 startpos = 0);
+protected:
void updateScrollFromCursor();
void updateTextRect();
const LLRect& getTextRect() const { return mTextRect; }
@@ -301,8 +338,13 @@ protected:
BOOL handleSelectionKey(const KEY key, const MASK mask);
BOOL handleControlKey(const KEY key, const MASK mask);
BOOL handleEditKey(const KEY key, const MASK mask);
-
+ //
+public:
+ //
BOOL hasSelection() const { return (mSelectionStart !=mSelectionEnd); }
+ //
+ protected:
+ //
BOOL selectionContainsLineBreaks();
void startSelection();
void endSelection();
@@ -330,7 +372,7 @@ protected:
virtual void unbindEmbeddedChars(const LLFontGL* font) const {}
S32 findHTMLToken(const std::string &line, S32 pos, BOOL reverse) const;
- BOOL findHTML(const std::string &line, S32 *begin, S32 *end) const;
+ BOOL findHTML(const std::string &line, S32 *begin, S32 *end, std::string& url) const;
// Abstract inner base class representing an undoable editor command.
// Concrete sub-classes can be defined for operations such as insert, remove, etc.
@@ -400,8 +442,9 @@ protected:
//
// I-beam is just after the mCursorPos-th character.
+public:
S32 mCursorPos;
-
+protected:
// Use these to determine if a click on an embedded item is a drag or not.
S32 mMouseDownX;
S32 mMouseDownY;
@@ -447,6 +490,8 @@ private:
void drawBackground();
void drawSelectionBackground();
void drawCursor();
+ void autoCorrectText();
+ void drawMisspelled();
void drawText();
void drawClippedSegment(const LLWString &wtext, S32 seg_start, S32 seg_end, F32 x, F32 y, S32 selection_left, S32 selection_right, const LLStyleSP& color, F32* right_x);
@@ -477,6 +522,12 @@ private:
mutable std::string mUTF8Text;
mutable BOOL mTextIsUpToDate;
+ LLWString mPrevSpelledText; // saved string so we know whether to respell or not
+ S32 spellStart;
+ S32 spellEnd;
+ std::vector misspellLocations; // where all the mispelled words are
+ BOOL mOverRideAndShowMisspellings;
+
S32 mMaxTextByteLength; // Maximum length mText is allowed to be in bytes
const LLFontGL* mGLFont;
@@ -513,11 +564,16 @@ private:
}
};
typedef std::vector line_list_t;
+
+ //to keep track of what we have to remove before showing menu
+ std::vector suggestionMenuItems;
+
line_list_t mLineStartList;
BOOL mReflowNeeded;
BOOL mScrollNeeded;
LLFrameTimer mKeystrokeTimer;
+ LLFrameTimer mSpellTimer;
LLColor4 mCursorColor;
diff --git a/linden/indra/llxml/llcontrol.cpp b/linden/indra/llxml/llcontrol.cpp
index 88eb2c3..1d1f024 100644
--- a/linden/indra/llxml/llcontrol.cpp
+++ b/linden/indra/llxml/llcontrol.cpp
@@ -1217,6 +1217,12 @@ void LLControlGroup::resetWarnings()
}
}
+template <> void jc_rebind::rebind_callback(const LLSD &data, S32 *reciever){ *reciever = data.asInteger(); }
+template <> void jc_rebind::rebind_callback(const LLSD &data, F32 *reciever){ *reciever = data.asReal(); }
+template <> void jc_rebind::rebind_callback(const LLSD &data, U32 *reciever){ *reciever = data.asInteger(); }
+template <> void jc_rebind::rebind_callback(const LLSD &data, std::string *reciever){ *reciever = data.asString(); }
+template <> void jc_rebind::rebind_callback(const LLSD &data, LLColor4 *reciever){ *reciever = LLColor4(LLColor4U(data)); }
+
//============================================================================
#ifdef TEST_HARNESS
diff --git a/linden/indra/llxml/llcontrol.h b/linden/indra/llxml/llcontrol.h
index ba0a1c7..316de5c 100644
--- a/linden/indra/llxml/llcontrol.h
+++ b/linden/indra/llxml/llcontrol.h
@@ -242,4 +242,84 @@ public:
void resetWarnings();
};
+///////////////////////
+namespace jc_you_suck
+{
+class jc_rebind
+{
+ template static void rebind_callback(const LLSD &data, REC *reciever){ *reciever = data; }
+
+ typedef boost::signal signal_t;
+
+public:
+
+//#define binder_debug
+
+ template static RBTYPE* rebind_llcontrol(std::string name, LLControlGroup* controlgroup, bool init)
+ {
+ static std::map > references;
+
+#ifdef binder_debug
+ llinfos << "rebind_llcontrol" << llendl;
+#endif
+
+ RBTYPE* type = NULL;
+ if(controlgroup)
+ {
+ if(references.find(controlgroup) == references.end())
+ {
+#ifdef binder_debug
+ llinfos << "was no map for a group, adding" << llendl;
+#endif
+ references[controlgroup] = std::map();
+ }
+
+ if(references[controlgroup].find(name) != references[controlgroup].end())
+ {
+#ifdef binder_debug
+ llinfos << "pulling type from map for " << name << llendl;
+#endif
+ type = (RBTYPE*)(references[controlgroup][name]);
+ if(type == NULL)llerrs << "bad type stored" << llendl;
+ }else
+ {
+#ifdef binder_debug
+ llinfos << "creating type in map for " << name << llendl;
+#endif
+ type = new RBTYPE();
+ references[controlgroup][name] = (void*)type;
+ LLControlVariable* control = controlgroup->getControl(name);
+ if(control)
+ {
+#ifdef binder_debug
+ llinfos << "control there " << name << llendl;
+#endif
+ signal_t* signal = control->getSignal();
+ if(signal)
+ {
+#ifdef binder_debug
+ llinfos << "signal there" << name << llendl;
+#endif
+ signal->connect(boost::bind(&jc_rebind::rebind_callback, _1, type));
+ if(init)jc_rebind::rebind_callback(control->getValue(),type);
+ }else llerrs << "no signal!" << llendl;
+ }else llerrs << "no control for " << name << "!" << llendl;
+ }
+ }
+ return type;
+ }
+};
+
+template <> void jc_rebind::rebind_callback(const LLSD &data, S32 *reciever);
+template <> void jc_rebind::rebind_callback(const LLSD &data, F32 *reciever);
+template <> void jc_rebind::rebind_callback(const LLSD &data, U32 *reciever);
+template <> void jc_rebind::rebind_callback(const LLSD &data, std::string *reciever);
+template <> void jc_rebind::rebind_callback(const LLSD &data, LLColor4 *reciever);
+
+}
+using namespace jc_you_suck;
+#define rebind_llcontrol jc_rebind::rebind_llcontrol
+
+///////////////////////
+
#endif
diff --git a/linden/indra/newview/CMakeLists.txt b/linden/indra/newview/CMakeLists.txt
index 13c972a..e50318e 100644
--- a/linden/indra/newview/CMakeLists.txt
+++ b/linden/indra/newview/CMakeLists.txt
@@ -10,7 +10,9 @@ include(DirectX)
include(ELFIO)
include(FMOD)
include(OPENAL)
+include(HUNSPELL)
include(FindOpenGL)
+include(JsonCpp)
include(LLAddBuildTest)
include(LLAudio)
include(LLCharacter)
@@ -44,7 +46,9 @@ endif (WINDOWS)
include_directories(
${DBUSGLIB_INCLUDE_DIRS}
+ ${HUNSPELL_INCLUDE_DIR}
${ELFIO_INCLUDE_DIR}
+ ${JSONCPP_INCLUDE_DIRS}
${LLAUDIO_INCLUDE_DIRS}
${LLCHARACTER_INCLUDE_DIRS}
${LLCOMMON_INCLUDE_DIRS}
@@ -65,6 +69,9 @@ include_directories(
)
set(viewer_SOURCE_FILES
+ lggautocorrect.cpp
+ lgghunspell_wrapper.cpp
+ lggdicdownload.cpp
aoremotectrl.cpp
emeraldboobutils.cpp
floaterao.cpp
@@ -378,6 +385,7 @@ set(viewer_SOURCE_FILES
lltoolview.cpp
lltracker.cpp
lltrans.cpp
+ lltranslate.cpp
lluploaddialog.cpp
llurl.cpp
llurldispatcher.cpp
@@ -514,6 +522,9 @@ set(viewer_HEADER_FILES
jcfloater_animation_list.h
jcfloaterareasearch.h
lightshare.h
+ lggautocorrect.h
+ lggdicdownload.h
+ lgghunspell_wrapper.h
llagent.h
llagentaccess.h
llagentdata.h
@@ -816,6 +827,7 @@ set(viewer_HEADER_FILES
lltoolview.h
lltracker.h
lltrans.h
+ lltranslate.h
lluiconstants.h
lluploaddialog.h
llurl.h
@@ -1336,12 +1348,14 @@ target_link_libraries(${VIEWER_BINARY_NAME}
${FMODWRAPPER_LIBRARY}
${OPENGL_LIBRARIES}
${MOZLIB_LIBRARIES}
+ ${JSONCPP_LIBRARIES}
${SDL_LIBRARY}
${SMARTHEAP_LIBRARY}
${UI_LIBRARIES}
${WINDOWS_LIBRARIES}
${XMLRPCEPI_LIBRARIES}
${ELFIO_LIBRARIES}
+ ${HUNSPELL_LIBRARY}
)
build_version(viewer)
diff --git a/linden/indra/newview/app_settings/dictionaries/en_sl.dic b/linden/indra/newview/app_settings/dictionaries/en_sl.dic
new file mode 100644
index 0000000..c9048ee
--- /dev/null
+++ b/linden/indra/newview/app_settings/dictionaries/en_sl.dic
@@ -0,0 +1,10895 @@
+10894
+rez
+slex
+slutorial
+ruth
+ruthing
+rezzing
+lag
+prim
+anim
+anims
+noob
+noobie
+slurl
+flexi
+sculptmap
+sim
+opensim
+greenlife
+openmetaverse
+onrez
+wiki
+aditi
+agni
+alt
+freebie
+tech
+mod
+bling
+banline
+banlines
+blog
+blogger
+gteam
+goo
+griefer
+griefing
+havok
+havok4
+homestead
+campie
+chim
+lag
+coalesced
+indra
+invisiprim
+infohub
+jpeg2000
+kdu
+kakadu
+landmark
+liason
+lindex
+estate
+fmod
+facelight
+megaprim
+mono
+mouseview
+mouselook
+neko
+occlusion
+ogg
+vorbis
+firefox
+online
+offline
+openspace
+orbiter
+parcel
+primitar
+quaternion
+resi
+showcase
+skybox
+slebrity
+sliders
+snowglobe
+spacenavigator
+spam
+stipend
+teleport
+tos
+tier
+uuid
+unlink
+uberexplorer
+vollee
+windlight
+yiff
+X-Axis
+Y-Axis
+Z-Axis
+Aabye
+Allen
+Amat
+Anatine
+Asbrink
+Auer
+Babenco
+Babii
+Bade
+Bailey
+Balczo
+Ballinger
+Balogh
+Balut
+Bamaisin
+Barbosa
+Barthelmess
+Barzane
+Basevi
+Beattie
+Beaumont
+Bechir
+Beck
+Beerbaum
+Bekkers
+Benelli
+Beresford
+Biedermann
+Bikcin
+Binder
+Bing
+Bingyi
+Blachere
+Bleac
+Boa
+Bonetto
+Boucher
+Bracken
+Broek
+Broome
+Burt
+Bury
+Canning
+Capalini
+Carfagno
+Carlberg
+Carnell
+Carter
+Catteneo
+Cazalet
+Ceawlin
+Chaffe
+Choche
+Cioc
+Clary
+Coage
+Coakes
+Collas
+Congrejo
+Cortes
+Dagger
+Dagostino
+Daviau
+Debevec
+Decosta
+DeCuir
+Demina
+Dench
+Despres
+Dinzeo
+Docherty
+Dollinger
+Dovgal
+Dryke
+Ducatillon
+Dyrssen
+Ebbage
+Edman
+Eilde
+Emmons
+Enoch
+Etchegaray
+Etzel
+Ewing
+Falta
+Fargis
+Faulds
+Fegte
+Ferraris
+Fimicoloud
+Flanagan
+Foden
+Forcella
+Forder
+Forwzy
+Fredriksson
+Fride
+Furse
+Garrigus
+Gausman
+Gazov
+Giha
+Graves
+Greggan
+Grut
+Gufler
+Gustafson
+Guyot
+Gynoid
+Habercom
+Halasy
+Halderman
+Hammerer
+Handrick
+Hapmouche
+Harrop
+Hax
+Heberle
+Heckroth
+Helgerud
+Heron
+Hienrichs
+Hifeng
+Hird
+Hirons
+Hirvi
+Holmer
+Homewood
+Hoorenbeek
+Hotaling
+Huet
+Huldschinsky
+Hultcrantz
+Humby
+Humphreys
+Hykova
+Hynes
+Hyun
+Igaly
+Ihnen
+Ireton
+Iuga
+Jacobus
+Jansma
+Janus
+Jewell
+Jie
+Johin
+Jun
+Juran
+Kamachi
+Kappler
+Karas
+Katscher
+Kidd
+Klaar
+Klees
+Koba
+Koenkamp
+Kohime
+Kohnke
+Korhonen
+Korobase
+Kuhn
+Kungler
+Kurka
+Lane
+Larsson
+Laryukov
+Laval
+Lednev
+Lilliehook
+Ling
+Lisle
+Loon
+Lowey
+Lubitsch
+Lundquist
+Lusch
+Lykin
+Lytton
+Maertens
+Maktoum
+Mannonen
+Martinek
+Martynov
+Masala
+Mathy
+Matova
+Mayo
+McMahon
+McMillan
+Meili
+Melnik
+Menges
+Meriman
+Merlin
+Mertel
+Messmer
+Mielziner
+Miles
+Milev
+Mills
+Mizser
+Mokeev
+Morigi
+Munro
+Nagy
+Negulesco
+Nemeth
+Nikolaidis
+Nishi
+Noel
+Oh
+Oppewall
+Oyen
+Paine
+Palen
+Panacek
+Papp
+Peccable
+Pennell
+Pera
+Perfferle
+Pessoa
+Petrov
+Pfeffer
+Philbin
+Piek
+Pinion
+Pintens
+Planer
+Platthy
+Qinan
+Qunhua
+Rang
+Rasmuson
+Rau
+Raymaker
+Recreant
+Rehula
+Reifsnider
+Repine
+Rhode
+Riederer
+Robbiani
+Rodenberger
+Roelofs
+Roffo
+Ronmark
+Rosca
+Rossini
+Rotaru
+Runo
+Saenz
+Sands
+Sautereau
+Schnyder
+Schridde
+Schumann
+Seiling
+Sewell
+Shan
+Shepherd
+Shilova
+Sicling
+Singh
+Sirbu
+Slade
+Snook
+Soderstrom
+Sperber
+Spitteler
+Staheli
+Starostin
+Stenvaag
+Straaf
+Streeter
+Swindlehurst
+Szondi
+Takacs
+Tammas
+Tatham
+Taurog
+Tenk
+Theas
+Tomsen
+Torok
+Tripsa
+Uggla
+Ultsch
+Umarov
+Upshaw
+Uriza
+Vella
+Villota
+Vollmar
+Voom
+Vuckovic
+Watanabe
+Waydelich
+Whitfield
+Wiefel
+Winkler
+Woodget
+Writer
+Wuyts
+Yalin
+Yifu
+Yiyuan
+Yoshikawa
+Zabelin
+Zapedzki
+Zehetbauer
+Zenovka
+Chung
+Spade
+Jones
+Taylor
+Cardway
+Liebknecht
+Leinhardt
+Semyorka
+Oxide
+Vanbeeck
+Draken
+Ra
+Kato
+Voss
+Federal
+Lassally
+Schlesinger
+Reisler
+Friedkin
+Paderborn
+Brennon
+Cummings
+Quaranta
+Hrachov
+Lindman
+Carripook
+Foss
+Kepler
+Meerson
+Usher
+Alcott
+Soderberg
+Henley
+Garden
+Leonard
+Mosuke
+Qi
+Tyson
+Ogee
+Laramide
+Subagja
+Ogg
+Wijaya
+Priestman
+Hiten
+Sabre
+Ginsberg
+Renegade
+Rolls
+Foulon
+Laborde
+Hienke
+Rosetta
+Reinert
+Glasgow
+Beleza
+Medusa
+Grebe
+Gaspara
+Harrison
+Mascot
+Muni
+Sodwind
+Grigges
+Independent
+Renoir
+Penokea
+Kazan
+Wildcat
+Felix
+Houston
+Biziou
+Swot
+Tizona
+Petronius
+Moriarty
+Antler
+Surtees
+Sternberg
+Mouroutsos
+Magellan
+Munich
+Montpark
+Mulligan
+Vanguard
+Greenberg
+Rahja
+Professor
+Cao
+Paisley
+Goldblatt
+Souter
+Ayakashi
+Yareach
+Sungsoo
+Medby
+Birmingham
+Maddaloni
+Pyle
+Brooks
+Oregon
+Geiger
+Palliard
+Paul
+Perenti
+Taira
+Lamatia
+Gundersen
+Ersetu
+Figgis
+Richez
+Gray
+Piccard
+Figaro
+Fitzgerald
+Michinaga
+Manga
+Swenholt
+Hallard
+Fonda
+Stardust
+Knibber
+Zhaoying
+Brody
+Polano
+Tibbett
+Mincemeat
+Columbino
+Marsi
+Gunawan
+Brenner
+Branagh
+Klata
+McElroy
+Vernon
+Pixel
+Tracy
+Zemlja
+Nakamura
+Ferrer
+Spark
+Meijer
+Sinatra
+Bergson
+Wertmuller
+Moyer
+Longstaff
+Malick
+Ritt
+Fadoodle
+Mathieson
+Sandial
+Bode
+Stockton
+Bagration
+Lutetia
+Beaton
+Colonel
+Shamroy
+Sonic
+Marama
+Schaffner
+Heideman
+Tendaze
+Lesnie
+Altamura
+Frangilli
+Saintlouis
+Regent
+Kerensky
+Moana
+Schroeder
+Oliva
+Boyd
+Yip
+Lasek
+Beauchamp
+Xi
+Andree
+Gallacher
+Burks
+Primbee
+Frantisek
+Westinghouse
+Cormer
+Rockin
+Onmura
+Bumstead
+Jorda
+Plubeau
+Goldenberg
+Chestnut
+Senyurt
+Meiklejohn
+Siodmak
+Josten
+Cooke
+Crabgrass
+Weizhen
+Rousselot
+Frederix
+Yohogania
+Sellers
+Bartz
+Pakula
+Voyager
+Vidor
+Rehnquist
+Ouachita
+Islander
+Bouras
+Harvey
+Werribee
+Mehring
+Alexandre
+Goalpost
+Zhang
+Kurosawa
+Lerwick
+Becloud
+Lean
+Greatrex
+Poplin
+Bates
+Laxness
+Calliope
+Preminger
+Thielt
+Pidgeon
+Ackland
+Ahn
+Zanetti
+Lancaster
+Soothsayer
+Halleck
+Ofarrel
+Steuart
+Stovall
+Tower
+Fiddlesticks
+Lambeau
+Vandyke
+Benigni
+Sleaford
+McCudden
+Rotunno
+Quentin
+McLaglen
+Gulick
+Greene
+Gulaev
+Bright
+Haigh
+Cremorne
+Box
+Serrurier
+Kearny
+Sheridan
+Lowell
+Mathilde
+Bosch
+Scamper
+Koltai
+Alito
+Lachman
+Fraisse
+Leigh
+Hafner
+Clave
+Halberd
+Kaminski
+Storaro
+Colman
+Urbanowicz
+Feingold
+Portola
+Ulich
+Sampaio
+Schnabel
+Minnelli
+Berblinger
+Surya
+Vandeperck
+Metty
+Lopez
+Woodward
+Brendel
+Shuftan
+Rossen
+Nichols
+Vieria
+Marvin
+Swain
+Zhukovsky
+Wexler
+Beltran
+Barnes
+Hennah
+Hern
+Rovio
+Ondricek
+Solomon
+Ayres
+Novikov
+Cannned
+Legend
+Ikarus
+Clatworthy
+Fapp
+Creber
+Fraina
+Milland
+Amsterdam
+Nordwind
+Seungmo
+Hiller
+Humphrey
+Pau
+Okey
+Hennesy
+Posthorn
+Ricardo
+Fussbudget
+Neher
+Valeeva
+Kish
+Northmead
+Moo
+Buckler
+Francis
+Carr
+McCarey
+Horwitz
+Nyle
+Gabreski
+Truffaut
+Remblai
+Drayman
+Pedro
+Bogdanovich
+Crispien
+Phlox
+Vilas
+Palmer
+Stallion
+Whitman
+Flintoff
+Sempati
+Ah
+Lukas
+Clift
+Malle
+Rydell
+Stonewall
+Gleeson
+Clutterbuck
+Stradling
+Hian
+Celt
+Hogfather
+Hawkeye
+Lemmon
+Kasei
+Bisiani
+Burgess
+Vansant
+McLeod
+Koken
+Carnot
+Moller
+Columbo
+Schnook
+Kubrick
+Flintlock
+Yates
+Lamont
+Shinja
+Shenlin
+Ichigo
+Fontaine
+Heston
+Bourgoin
+Scheflo
+Horsefly
+Lehtovaara
+Skjellerup
+Mantis
+Belford
+Krasker
+Wind
+Seymour
+Vanvleck
+Tungl
+Minghuang
+Tureaud
+Lanate
+Esposito
+Germi
+Elderslie
+Voight
+Gardiner
+Antonelli
+Bucyk
+Glineux
+Batz
+Vellhi
+Food
+Smadga
+Carthage
+Fukai
+Talaj
+Jarvis
+Hanni
+Frankton
+Molinaro
+Spire
+Ellsworth
+Poitier
+Hessely
+Haworth
+Woolley
+Olivier
+Emoto
+Quellmalz
+Jung
+Roizman
+Whitcroft
+Taov
+Reiner
+Tuncsik
+Perinal
+Mersereau
+Lacey
+Misfit
+Bulan
+Vielle
+Flossberg
+Lyon
+Giotto
+Market
+Parker
+Vanalten
+Rennahan
+Haifisch
+Aster
+Friis
+Foil
+Bombast
+Parisi
+Wheeler
+Pace
+Lustre
+Salomon
+Soon
+Connell
+Newall
+Ibbetson
+Albert
+Claymore
+Bluecoat
+Legion
+Coen
+Curtiz
+Susanti
+Connolly
+Ames
+Robledo
+Morgridge
+Theriac
+Ozsvar
+Birke
+Sohmers
+Boronski
+Vallejo
+Tizzy
+Holder
+Glenville
+Wilson
+Replacement
+Stotz
+Silverstar
+Bishop
+Aldrich
+Hullabaloo
+Howard
+Balhaus
+Novi
+Redgrave
+Trollop
+Tulip
+Paravane
+Zhao
+Fairymeadow
+Zeta
+Freund
+Boardwalk
+Hanson
+Rozier
+Connoisseur
+Hansup
+Cochrane
+Hitchcock
+Peterman
+Quine
+Helios
+Foton
+Ulysses
+Gollob
+Student
+Esparza
+Zinner
+Antfarm
+Lumet
+Haas
+Otaared
+Santos
+Bourne
+Trautman
+Agnomen
+Cagney
+Pugilist
+Noarlunga
+Hollwood
+Finney
+Folsom
+Chaplin
+Bertrand
+Quijote
+Rimbaud
+Ambrose
+Travanti
+Brouwer
+Fossett
+Welles
+Cork
+Prieto
+Halley
+Mollor
+Borgnine
+Malibu
+Seaton
+Ellison
+Abruzzo
+Lederberg
+Camilo
+Hera
+Triskaidekaphobia
+Sabena
+Odell
+Bartlett
+Antonioni
+Seelowe
+Ranger
+Smagulov
+Ginsburg
+Chang
+Emert
+Tae
+Yue
+Cleanslate
+Frascati
+Nereus
+Guffey
+Couffer
+Thirroul
+Loyton
+Cordeaux
+Gapchenko
+Andric
+Fujita
+Antwerp
+Kline
+Ascot
+Ruttenberg
+Ochs
+Innis
+Garfield
+Paike
+Corleone
+Stine
+Impfondo
+Matterhorn
+Ivory
+Mankiewicz
+Bulubate
+Noonan
+Leavitt
+Pontecorvo
+Sao
+Almendros
+Sumbula
+Cheney
+Lomba
+Bournemouth
+Wise
+Furst
+Hedrick
+Nomura
+Weir
+Lynch
+Chevalier
+Edelman
+Tuttle
+Meng
+Millionsofus
+Marseille
+Krugman
+Virtanen
+Fangio
+Potato
+Franchini
+Garmes
+Li
+Lehman
+Robson
+Cukor
+Wiles
+Burroughs
+Toll
+Courier
+Yao
+Falcon
+Lorenz
+Hansen
+Kotobide
+Bergbahn
+Waverley
+Link
+Finucane
+Laughton
+Ferlinghetti
+Visconti
+Sturges
+Tidewater
+Payne
+Chezquiz
+Laszlo
+Lovell
+Moody
+Cosmos
+Haller
+Milestone
+Niven
+Holgado
+March
+Widget
+Grizot
+Gerhadsen
+Skall
+Drumheller
+Forager
+Arnot
+Fluno
+Auk
+Hallstrom
+Arkin
+Maculate
+Muse
+Albion
+Ramos
+Conover
+Burleigh
+Mommsen
+Chengpang
+Glimmer
+Redhill
+Luthardt
+Erskine
+Fulham
+Hofmann
+Spearmann
+Cronon
+Buchanan
+Massey
+Borrelly
+Haskell
+Flyer
+Commander
+Cicerone
+Dale
+Leroux
+Frye
+Tani
+Jya
+Something
+Stoklitsky
+Ellis
+Krogstad
+Snookums
+Gasser
+Fisseux
+Snye
+DuPont
+Burns
+Lilienthal
+Smirnov
+Moorhen
+Dye
+Pikajuna
+Paperclip
+Hutton
+Looby
+Bu
+Messlee
+Nordlicht
+LeSuere
+Sobocinski
+Hock
+Gladstone
+Mariani
+Guerrero
+Huffhines
+Tzara
+Gagliano
+Triangle
+Menjou
+Braendle
+Latynina
+Ur
+Vandeverre
+Turas
+Yesheyev
+Steins
+Argus
+Jaehun
+Eddy
+Queso
+Oktomica
+Chambers
+Shabazz
+Cassavetes
+Colasanti
+Jamberoo
+Margetts
+Fabre
+Hajtos
+Muggleston
+Gagarin
+Numbers
+Yosuke
+Braver
+Skosh
+Handayani
+Willsmere
+Yugen
+Marellan
+Pulford
+Petrel
+Fosse
+Hildyard
+Hartunian
+Yellowjacket
+Griswold
+Pey
+Deharo
+Sanchez
+Sterling
+Giugiaro
+Delec
+Brannan
+Biniak
+Tuck
+Rope
+Gao
+Goddard
+Utarid
+Spork
+Biddle
+Arliss
+Cassini
+Apocalypse
+Zeffirelli
+Hawthorne
+Hazlehurst
+Snyder
+Cheeky
+Wyler
+Georgette
+Simons
+Bogan
+Corkscrew
+Sonoda
+Steiner
+Kesey
+Quaggy
+Sciurus
+Elwro
+Keen
+Howell
+Zeme
+Attenborough
+Butuzova
+Wigner
+Warrior
+Evans
+Kwon
+Ondeko
+Finsbury
+Geewhiz
+Brando
+Bobak
+Mercier
+Schuck
+Kagekiyo
+Ay
+Abramovich
+Darkes
+Ross
+Crawford
+Thibaud
+Maloney
+Frampton
+Nohkan
+Braathens
+Lazarno
+Talon
+Butoh
+Raabe
+Fuosing
+Allard
+Rigaud
+Mandelbrot
+Brennen
+Amadeus
+Zetkin
+Otterson
+Malthus
+Pilipenko
+Guynemer
+Scarfiotti
+Traveler
+Sikorsky
+LeShelle
+Pfohl
+Peterson
+London
+Godwin
+Ingmann
+Eliot
+Otoole
+Rident
+Clancy
+Farrell
+Cannonball
+Descenna
+Boyington
+Tamale
+Paragon
+Chernov
+Peckham
+Bouchard
+Bristol
+Schulze
+Gilks
+Cramer
+Cronenwerth
+Irvine
+Lupino
+Benedek
+Baverel
+Serdyuk
+Kubarev
+Milano
+Kammerer
+Reisman
+Voltaire
+Hoyer
+Toluboff
+Rothlisberger
+Jeffries
+Sylbert
+Tadanori
+Machin
+Csak
+Surveryor
+Goosson
+Niangao
+Kenzo
+Cathcart
+Crossair
+Maroon
+Tzedek
+Walker
+Iddinja
+Jonze
+Dal
+Torres
+Styrian
+Quonset
+Pokryshkin
+Fats
+Crosby
+DeVinna
+Gaudio
+Siegel
+Delpaso
+Commons
+Foxchase
+Diage
+Spear
+Comet
+Damask
+Uralia
+Yuequi
+Piedpiper
+Partch
+Drum
+Asp
+Sturm
+Minton
+Fitzroy
+Rhino
+Shu
+Watkin
+Paster
+Biondetti
+Moraff
+Orca
+Ehrler
+Day
+Jookerie
+Pippen
+Audina
+Puhakka
+Pogelmann
+Simonds
+Oranos
+Gaea
+Meness
+Lauridsen
+Barley
+Fellini
+Swayne
+Krasopani
+Atkey
+Foxley
+Grant
+Platypus
+Curtiss
+Losaberidze
+Lok
+Zolnir
+Scanlan
+Larkin
+Cusack
+Welch
+Manbi
+Tinlegs
+Gerard
+Bumi
+Bohm
+Veranes
+Zaoh
+Castro
+Shenley
+Hawes
+Roar
+Switchblade
+Terry
+Coffey
+Sunnyside
+Whitehead
+Beeks
+Selfridge
+Zhichao
+Zheng
+Copeland
+Clifton
+Lelouch
+Nilsson
+Zebaki
+Paterson
+Kiernan
+Pan
+Donat
+Semple
+Lombardi
+Zeevi
+Bamboo
+Reynolds
+Mimistrobell
+Calhern
+Crimson
+Dodonpa
+Hermano
+Keats
+Woebegone
+Toland
+Sellery
+Levi
+Ringo
+Nebestanka
+Maxsted
+Lingiuan
+May
+Mensing
+Roughneck
+Shams
+Boehm
+Grimes
+Aska
+Bearcat
+Sadovnycha
+Cardiff
+Hasp
+Allandale
+Shingleton
+Asano
+Jericho
+Xinpeng
+Gibb
+Bender
+Potkova
+Kit
+Hodgson
+Zwerling
+Kraft
+Bumbo
+Bakhtar
+Moonsoo
+Granville
+Gassner
+Punchinello
+Morang
+Roeth
+Trilling
+Ashby
+Abismo
+Beebe
+Morahan
+Moose
+Bigdipper
+Lehmann
+Idziak
+Burnham
+Daehlie
+Tadashiro
+Dieffenbach
+Tavoularis
+Yakan
+Ryder
+Kivert
+Ishii
+Bremser
+Coswell
+Larg
+Helvetic
+Stindberg
+Daldry
+Harlow
+Goldflake
+Wellman
+Goode
+Maximov
+McConachie
+Hye
+Golitzen
+Caliber
+Yaseotoko
+Saltwater
+Hoggard
+Avalanche
+Malaprop
+Suen
+Welty
+Woodbury
+Moskvitch
+Dobropan
+Darrest
+Story
+McFly
+Bayoumi
+Express
+Peck
+Junge
+Artizar
+Pontchartrain
+Zinnemann
+Dod
+Korda
+Phillip
+Pollock
+Gervasi
+Merilouto
+Waldman
+Stringer
+Klubov
+Loudon
+Sol
+Juutilainen
+Vacirca
+Sunbelter
+Kiwi
+Jenns
+Polgase
+Schlag
+Goombah
+Petty
+Curry
+Cordoso
+Melendez
+Flamand
+Wunderlich
+Leavenworth
+Temin
+Picket
+Komparu
+Gherardi
+Boyle
+Olbers
+Bolero
+McAllister
+Geest
+Schildhauer
+Tuppakaka
+Carmona
+Gritzi
+Sternad
+Mesyats
+Laasonen
+Kuramoto
+Pippita
+Dahlstrom
+Blackthorne
+Ribble
+Heita
+Eriksen
+Gymnast
+Boyau
+Dumont
+Gylling
+Swamphen
+Ares
+McKinney
+Galiazzo
+Kyger
+Leven
+Nurmi
+Bombacci
+Karami
+James
+Whorfin
+Saarinen
+Trimble
+Wilder
+Rockett
+Lagan
+Grigg
+Spinotti
+Zond
+Wheeling
+Grumiaux
+Balatron
+Zucker
+Vostok
+Wunderland
+Perreault
+Lamourfou
+Paslong
+Herouin
+Pieck
+Blazer
+Flannery
+Tantalus
+Luo
+Shermer
+Breaker
+McNally
+Fate
+Quinn
+Silvera
+Alphabeta
+Arcadia
+Pattle
+Mabellon
+Sputnik
+Nowicka
+Mendes
+Onomatopoeia
+Kittel
+Jibilla
+Digital
+Lyndhurst
+Thewphaingarm
+Creeley
+Tamura
+Delcon
+Beisswenger
+Theeuwes
+Reddevil
+Lucerne
+Yeuxdoux
+Revolution
+Ransford
+Glume
+Canto
+Douglas
+Brewer
+Idler
+Dengaku
+Longcloth
+Laws
+DeSantis
+Viking
+Barbour
+Lubezki
+Actil
+Lonergan
+Maslow
+Rosse
+Laa
+Wake
+Hayabusa
+Scaggs
+Eguzkia
+Guffroy
+Helsinki
+Backer
+Alder
+Chadbourne
+Swanson
+Sixpack
+Abel
+Maddux
+Boorman
+Elcar
+Bourjade
+Pak
+Slippery
+Rezillo
+Pro
+Knight
+Cranes
+Culdesac
+Eagleburger
+Kelley
+Delgado
+McGuire
+Merricks
+Eckersley
+Pomegranate
+Cornwall
+Heavy
+Montale
+Beery
+Paean
+Krasner
+Sevier
+Fleury
+Robbins
+Forman
+Desoto
+Crabe
+Stella
+Pole
+Reve
+Mohr
+Packbiers
+McAlpine
+Loll
+Delbonnel
+Winnfield
+Bellambi
+Bonne
+Spotter
+Priestly
+Dowd
+Nixdorf
+Jervil
+Racer
+Heart
+Gantenbein
+Otafuku
+Boram
+Potvin
+Stuart
+Labrada
+Wombarra
+Welders
+Spicer
+Giovinazzo
+Melnitz
+Kleene
+Rail
+Roskopp
+Ferguson
+Kwak
+Salubrius
+Malone
+Gunes
+Fushikizoh
+Ronzoni
+Gilmour
+Hefferman
+Petion
+Palowakski
+Mariner
+Newbold
+Phobos
+Cimino
+Whittaker
+Hesse
+Pitney
+Wilber
+Jedburgh
+Hooper
+Wardhani
+Weyland
+Breck
+Yetto
+Rosher
+Pahute
+Dowren
+Ariel
+Slazar
+Galsworthy
+Kaufman
+Kondo
+Kozhedub
+Kobolowski
+Elswit
+Eponym
+Melville
+Rearwin
+Muldoon
+Lunt
+Rootes
+Gastel
+Pinkenba
+Senior
+Marbles
+Pike
+Hendrawan
+Penguin
+Aero
+Alucinakis
+Rickenbacker
+Daniels
+Todriya
+Harley
+Cloetens
+Lunardi
+Howe
+Prinz
+Sihtu
+Irwin
+Gough
+Podolsky
+Riptide
+Spijkers
+Herzbrun
+Pilote
+Peralta
+Pegoud
+Losangeles
+Schertzinger
+Dowler
+Dancer
+Morenz
+Doboy
+Bunour
+Rothschild
+Schwartzman
+Mastroianni
+Vale
+Newcomb
+Skookum
+Gill
+Cascabel
+Patpa
+Ashton
+Demontrond
+Khorana
+Zemach
+Venkman
+Pawlowski
+Mulberry
+Mansbridge
+Kumsung
+Okina
+Grockle
+Pekli
+Atlantis
+Yongho
+Kayamanu
+Jang
+Heike
+Tinsley
+Morgenrote
+Kabuki
+Battery
+Dilweg
+Jester
+Soleil
+Pencer
+Maersk
+Parrott
+Damdin
+Althouse
+Tackleberry
+Beckham
+Boogiewoogie
+Nungesser
+Yaud
+Valentine
+Bert
+Kyogen
+Dibou
+Krams
+Edgeworth
+Hickman
+Allstar
+Tripp
+Osumi
+Margulis
+Monstre
+Kyomoon
+Kaiousei
+Foyston
+Sutherland
+Picnic
+Steenbock
+Petshop
+Devoix
+Fassnacht
+Grommet
+Gibbons
+Dolgov
+Longduk
+Dreier
+Eun
+Ratelle
+Ebi
+Delebat
+Dorn
+Berger
+Yongbo
+Pooraka
+Sandell
+Kiebach
+Pertelson
+Delphin
+Sucettes
+Pascale
+Dukes
+Ironclad
+Kuttelwascher
+Wakaonna
+Carbenell
+Wei
+Wikinger
+Fierrens
+Vesta
+Plymouth
+Gamba
+Poutine
+Langwarrin
+Thunders
+Graf
+Stoneage
+Bertolucci
+Wanweird
+Panhandle
+Bissell
+Geary
+Gontyuk
+Bedlam
+Showboat
+Superior
+Breyer
+Cleaver
+Moy
+Suising
+Vanmoer
+Stroganoff
+Ariantho
+Nagorski
+Richter
+Dynamo
+Slocombe
+Zymurgy
+Kurrajong
+Zadeh
+Scaife
+Wopat
+Leisen
+Gregory
+Egoyan
+Jannings
+Mapp
+Hannya
+Zarf
+Sawley
+Kuncoro
+Rechkalov
+Doigts
+Charlan
+Philgarlic
+Beaver
+Nelson
+Foo
+Husky
+Polanski
+Spitz
+Lawl
+Borchovski
+Jacks
+Defiant
+Baldwin
+Plunkett
+Hush
+Trenton
+Garros
+Soyuz
+Carpenter
+Nowotny
+Dixon
+Padgett
+Carroll
+Lyne
+Jurgis
+Ewry
+Bandit
+Ning
+Supply
+Tir
+Oto
+Perhaps
+Yohkoh
+Aliev
+Tomcat
+Jua
+Schack
+Zamin
+Durant
+Nykvist
+Slunce
+Bossy
+Quisling
+Wachmann
+Hathaway
+Quimby
+Dingson
+Dunn
+Meehan
+Valiant
+Vacano
+Piranha
+Pharaoh
+Seitan
+Giove
+Howey
+Claxton
+Springvale
+Mu
+Interflug
+Obscure
+Niles
+Kincess
+Pye
+Korro
+Serapis
+Druart
+Cerveau
+Poikolainen
+Rustamova
+Dae
+Lagerkvist
+Brewster
+Clyburn
+Shikami
+Calvert
+Slok
+Hartono
+Shui
+Kuri
+Source
+Mission
+Carbetta
+Hightower
+Emms
+Rhea
+Ratite
+Pierterson
+Alviso
+Cuddihy
+Wunderle
+Blackhawk
+Finn
+Beatty
+Maverick
+Milo
+Budich
+Bellah
+Oldbull
+Ferris
+Magneto
+Ramaty
+Olbracht
+Yost
+Plante
+Perkins
+Oumionna
+Bulldog
+Arnold
+Desideri
+Pitts
+Dean
+Juno
+Liddie
+Dobbs
+Olmstead
+Relph
+McKinley
+Proctor
+Mangaroon
+Perway
+Ludwig
+Hartmann
+Boelcke
+Vig
+Rolland
+Kawaguichi
+Biondi
+Kimban
+Falken
+Raveup
+Volare
+Horner
+Deadlight
+Coronet
+Newchurch
+Zwiers
+Wottitz
+Vestel
+Decatur
+Lawson
+Barrs
+Colossus
+Vox
+Stilman
+Milner
+Moxing
+Litvak
+Hinkle
+Hyland
+Glenbrook
+Prospero
+Kirshner
+Mainaky
+Zauberflote
+Starbrook
+Tornado
+Meek
+Soler
+Nastula
+Borel
+Koala
+Hermans
+Lacava
+Hoch
+Tao
+Duncan
+Joffe
+Slapstick
+Poindexter
+Pussycat
+Dielli
+Chippewa
+Few
+Musashi
+Zaius
+Omega
+Nerd
+Neva
+Anvil
+Whalen
+Balnarring
+Goodnight
+Goodfellow
+Cattaneo
+Trottier
+Lindsay
+Jetaime
+Frangible
+Warwick
+Barkkorn
+Driggs
+Ademeit
+Moraga
+Flute
+Ruggles
+Brennan
+Mannock
+Brissot
+Hegel
+Bunyip
+Sin
+Cournoyer
+Radius
+Thiebaud
+Loschmidt
+McKay
+Udet
+Hearn
+Zuhrah
+Rumey
+Lowe
+Joans
+Haul
+Stringfellow
+Mirrikh
+Jae
+Rall
+Frazer
+Moran
+Hawerchuk
+Utorid
+Lime
+Engebretsen
+Szuyuan
+Antelope
+Michalske
+Glenelg
+Darracq
+Woori
+Pony
+Whinstanes
+Yapungku
+Namanari
+Rakels
+Zeluco
+Taringa
+Field
+Wendell
+Raffke
+Pannotia
+Zsigmond
+Vasiliev
+Lipponen
+Dodge
+Reino
+Diplomat
+Armistice
+Phillips
+Aurinko
+Address
+Fenua
+Lahtinen
+Nimbus
+Brule
+Narrambi
+Lumpen
+Anzac
+Signals
+Submariner
+Lumley
+Bowman
+Octagon
+Noe
+Derby
+Immelmann
+Zambia
+Tsure
+Gainsbourg
+Merkur
+Dutton
+Standish
+Bian
+Bascom
+Stepanov
+Hua
+Eisbar
+Rojyo
+Munson
+Sparrow
+Dailey
+Tester
+Quality
+Pegler
+Beurling
+Makira
+Stubbs
+Goff
+Hayashida
+Tyron
+Scintilla
+Ely
+Niu
+Chowderhead
+Gisaku
+Ni
+Checker
+Jiang
+Cartwheel
+MacAlpine
+Winthorpe
+Alas
+Milton
+Damone
+Honua
+Wolfstein
+Bosshart
+Giles
+Jatho
+Bergman
+Clinquant
+Walcher
+Hienzman
+Shabtay
+Preddy
+Hilra
+Orr
+Dunia
+Kakapo
+Stockholm
+Fanwood
+Arten
+Tuni
+Bourgue
+Idigo
+Sydney
+Obzina
+Magnolia
+Rush
+Jogiches
+Clanger
+Troughton
+Tilling
+Hillquit
+Limpele
+Deepdene
+Dojoji
+Yanyean
+Expedition
+Angkarn
+Shablin
+Cromulent
+Schlegal
+Nowhere
+Onlyone
+Nesterov
+Cydrome
+McDunnough
+Paverini
+Artaud
+Wilcke
+Mahina
+Skirr
+Strong
+Latrell
+Steadham
+Lufbery
+Canadeo
+Sloat
+Lurra
+Umpqua
+Beika
+Reymont
+Yallock
+Banshee
+Pow
+Patrono
+Greenfield
+Tombola
+Nasworthy
+Cavan
+Deluca
+Alturas
+Plessis
+Engawa
+Pisarek
+Makarov
+Pearse
+Nieder
+Iwashi
+Buridan
+Rubio
+Fawcett
+Gilruth
+Lemuria
+Schneider
+Golding
+Nordberg
+Vodopan
+Bonito
+Pronovost
+Lagerlof
+Parmelee
+Huygens
+Kalok
+Nori
+Ash
+Vindaloo
+Kipling
+Luke
+Gremminger
+Fiske
+Variscan
+Sanford
+Ruxton
+Pierce
+Uramen
+Drakes
+Brautigan
+Glitter
+Figtree
+Bussy
+Kosrae
+Liveoak
+Frossard
+Luxor
+Citylights
+Rachmil
+Sismondi
+Pestana
+Murasaki
+Jordan
+Blobel
+Russell
+Drumbeat
+Olaria
+Coiffard
+Blanchard
+Anza
+Nogah
+Webb
+Davison
+Zeeman
+Racecourse
+Newell
+Blackmountain
+Hargrave
+Glinka
+Koi
+Ingrassia
+Bundy
+Cole
+Kirkorian
+Enzyme
+Kemsley
+Morellet
+Chandrayaan
+Nighbor
+Jurack
+Gildea
+Unknown
+McKenna
+Coledale
+Diglot
+Otawara
+Gumsing
+Skillman
+Bentham
+Ostrich
+Schmo
+Barbecue
+Excelsior
+Mackie
+Giant
+Berry
+Wesburn
+Steuben
+Fillion
+Primeau
+Nolder
+Fell
+Dooley
+Millgrove
+Lock
+Vavoom
+Coldstream
+Worsley
+Doowangle
+Vernet
+Tatsu
+Dabu
+Epin
+Tal
+Stiglitz
+Taiyou
+Taifun
+Rosebud
+Donnelly
+Lefebvre
+Hashi
+Carlton
+Saito
+Go
+Ophelia
+Tran
+Woollahra
+Giulia
+Donburi
+Rasoir
+Shalala
+Unsustainable
+Rodinia
+Fielding
+Shinobu
+Dorado
+Eretz
+Mitra
+Kapuskas
+Amiga
+Dumart
+Wilberg
+Darragh
+Levertov
+Kienzle
+Heidenstam
+Bryant
+Montague
+Grenville
+Mystakidou
+Xie
+Flaman
+Rofflecopter
+Serrati
+McClure
+Mulgrave
+Fieschi
+Sienkiewicz
+Alonzo
+Ghia
+Howitt
+Lipo
+Tanner
+Fremont
+Senn
+Nakanihon
+Lian
+Shenzhou
+Moreau
+Hurnung
+Katsu
+Merrienboer
+Leopold
+Barnett
+Cassell
+Gemini
+Noh
+Grabke
+Gallindo
+Tucker
+Boisblanc
+Dittmann
+Gobo
+Detritus
+Baxter
+Maladay
+Deemster
+Southard
+Heying
+Kondrad
+Trihey
+Carmichael
+Shemesh
+Montgolfier
+Skronski
+Martinkovic
+Gloucester
+Aferdita
+Birdbrain
+Behemoth
+Santana
+Anadyr
+Clapper
+Hyacinth
+Nieminen
+Uram
+Coppens
+Oliver
+Luna
+Willis
+Pikkara
+Hana
+Chapman
+Yossarian
+Burbclave
+Tayot
+Bennett
+Ladybird
+Oates
+Sukra
+Abdallah
+Polydactyle
+Bligh
+Fraker
+Harpoon
+Patrick
+Toman
+Birks
+Seale
+Nevzerov
+Braess
+Moa
+Guru
+Forte
+Casanova
+Burum
+Serge
+Mauvaise
+Leonov
+Kyong
+Todd
+Burch
+Kovpan
+Whippet
+Click
+Eldrich
+Enigma
+Roundfield
+Dzieciol
+Marchlewski
+Matsukaze
+Colville
+Cheetah
+Grier
+Dagmar
+Rodriquez
+Nitschke
+Ryan
+Jessop
+Demar
+Dimsum
+Myriam
+Gentil
+Olson
+Hayashi
+Prudhomme
+Sharpard
+Hall
+Petrichor
+Wheels
+Ge
+Rockwell
+Barbarossa
+Ringgold
+Svendsen
+Axon
+Oconner
+Bringholf
+Hay
+Daffodil
+Ivanova
+Sivocci
+Sleestak
+McGann
+Hoark
+Aleixandre
+Mikadze
+Yerd
+Budan
+Syakumi
+Jezebel
+Yoshiyuki
+Wright
+Mahoney
+Myhre
+Paris
+Capra
+Nedkov
+Acronym
+Yuya
+Emu
+Flare
+Gran
+Holden
+Hilite
+Taliaferro
+Tatum
+Watts
+Concertina
+Sonnerstein
+Schoonmaker
+Marathon
+Gregg
+Costagravas
+Iceberg
+McGimsie
+Richthofen
+Laperriere
+Fairweather
+Warren
+Jinxing
+Philo
+Devonshire
+Essex
+Isabella
+Clellon
+Sakai
+Gruntled
+Ragowski
+Nakamichi
+Orbit
+Whittlesea
+Dorance
+Sommambulist
+Fairlane
+Susanto
+Yamauba
+Dejavu
+Zenith
+Savon
+Cahill
+Berlin
+Sequent
+Hilbert
+Noltenius
+Drebin
+Sharpless
+Smalls
+Delaid
+Beese
+Exodus
+Richardson
+Cookie
+Stein
+Ripley
+Noble
+Orochi
+Joliat
+Berjis
+Christensen
+Pualhan
+Drinkwater
+Skolnick
+Daumig
+Malinow
+Maa
+Charles
+Savard
+Apogee
+Troell
+Rookwood
+Clipper
+Hausdorff
+Chase
+Fish
+Jano
+Burrel
+Talamasca
+Demain
+Baumer
+Aarde
+Mekong
+Brown
+Greer
+Plympton
+Post
+Sooper
+Willunga
+Wormser
+Blouin
+Narayan
+Eureka
+Everidge
+Geesink
+Aldwych
+Tiki
+Chaparral
+Holiday
+Tuxing
+Broderick
+Delling
+Flinker
+Matahari
+Barth
+Junot
+Strabel
+Encke
+Hudson
+Constantineau
+Hutson
+Dazy
+Gordimer
+Tretiak
+Granada
+Burma
+Manen
+Shiras
+Meyer
+Raymond
+Barbarino
+Barcelona
+Maracas
+Aravalli
+Cabaret
+Nacon
+Musgrave
+Seville
+Huskerdu
+Stravinsky
+Centaur
+Escape
+Ohtobide
+Schufang
+Gonzales
+Gwynneville
+Schreiner
+Havercamp
+Freelunch
+Bellman
+Norsk
+Cyr
+Gaibov
+Scalia
+Luxemburg
+Mulford
+Cachin
+Warburton
+Sneerwell
+Fizir
+Jael
+Gisel
+Undertone
+Roop
+Cline
+Koenig
+Autopoiesis
+Lassard
+Juneau
+Kramer
+Pitre
+Encinal
+Fredrickson
+Lathrop
+Shen
+Langset
+Coanda
+Lei
+Abilene
+Mip
+Boshops
+Stonehill
+Magojiro
+Brynner
+Rankin
+Dryburgh
+Zelmanov
+Attila
+Palisades
+Saule
+Cassowary
+Widdershins
+Eastkew
+Blabbermouth
+Apollo
+Alba
+Graysmark
+Zugzwang
+Yorimasa
+Delacroix
+Groshomme
+Hosho
+MacDiarmid
+Sarugaku
+Davids
+Malan
+Berthold
+Chariot
+Farina
+Gegaku
+Corrimal
+Hand
+Trebuchet
+Dionne
+Berzin
+Bullard
+Babcock
+Krog
+Holsworthy
+Acorn
+Nielson
+Westmoreland
+Lucero
+Baobob
+Leroy
+Holyoke
+Dabney
+Ruska
+Klinger
+Lowenhardt
+Mycron
+Dieterle
+Bader
+Rexroth
+Neely
+Colo
+Nozaki
+Tokyo
+Okame
+Corrigible
+Arna
+Radford
+Iredell
+Moisant
+Augustus
+Mitchell
+Speedwell
+Tosung
+Mercy
+Zon
+Alacrity
+Hackl
+Salming
+Takao
+Seferis
+Lightfoot
+Basalt
+Sawchuk
+Gorky
+Dix
+Taggart
+Coorara
+Dowding
+Geoffrion
+Berkson
+Bertone
+Habsburg
+Schultz
+Arrow
+Kingsford
+Resistance
+Sugita
+Koga
+Sidran
+Forester
+Anabuki
+Steamroller
+Hextall
+Hainsworth
+Mushtarie
+Eclipse
+Unsworth
+Brink
+Momiji
+Duke
+Baral
+Jantzen
+Laurasia
+Bentley
+Skalski
+Matthews
+Clapsaddle
+Snoring
+Galland
+Teatime
+Eerie
+Sage
+Mahovlich
+Khalamov
+Austin
+Begonia
+Luan
+Bosen
+Venera
+Borst
+Park
+Ree
+Ponzu
+Leidesdorff
+Prathivi
+Etoile
+Lipfert
+Tuominen
+Tagore
+Reardon
+Stohr
+Griffith
+Dhara
+Edelweiss
+Douhet
+Benton
+Arad
+Riel
+Byrne
+Brandeis
+Hull
+Almodovar
+Hula
+Rodgers
+Reinsch
+Inglis
+Goulet
+Chandra
+Beam
+Discovolante
+Mantha
+Spittka
+Vazquez
+Turk
+Borzage
+Karski
+Ludd
+Hanner
+Hugo
+Mineff
+Deschanel
+Meltzer
+Sixgallery
+Galvin
+Dawn
+Saramago
+Barmy
+Bismark
+Wirtanen
+Surface
+Oluja
+Darling
+Mondegreen
+Whizenhunt
+Charlotte
+Winx
+Moxie
+Encore
+Llanfair
+Devanter
+Chalet
+Fouquet
+Portsmouth
+Cruddas
+Rejected
+Dwi
+Demme
+Strauss
+Peel
+Sassoon
+Ousley
+Cassady
+Desmoulins
+Deere
+Majestic
+Corinthian
+Khalifa
+Clark
+Shino
+Briers
+Lalonde
+Deigan
+Continental
+Inada
+Manray
+Trilam
+Somme
+Rosenthal
+Reiter
+Soosung
+Kovacs
+Pluto
+Kenorland
+Alemany
+Xeno
+Mikazuki
+Maradona
+Ofeq
+Sarlo
+Hughes
+Barker
+Briggs
+Zuhal
+Erlanger
+Knafelc
+Trenchard
+Samas
+Rees
+Rikichi
+Ard
+Yorkshire
+Stuchka
+Mahana
+Curtis
+Norse
+Lake
+Mishin
+Otsuzum
+Green
+Hamsun
+Ramona
+Ida
+Welinder
+Somerton
+Nesiote
+Proudfoot
+Martov
+Utu
+Croquet
+Seversky
+Weeks
+Mesic
+Dada
+Oherlihy
+Riiser
+Naheed
+Kilara
+Gondwana
+David
+Rogan
+Klamath
+Cullen
+Chantilly
+Luukkanen
+Marikh
+Roundel
+Alvarado
+Valencia
+Dogpatch
+CiscoSystems
+Shipman
+Radio
+Kyuzo
+Sugarbeet
+Wiranata
+Fuller
+Toshihiko
+Itamae
+Tristan
+Bleriot
+Fritch
+Smashcan
+Delorean
+Freeloader
+Haight
+Eucken
+Bowie
+Lafleur
+Josephus
+Winkoop
+Dinosaur
+Earp
+Grian
+Leckrone
+Lesse
+Stork
+Botanical
+Fetisov
+Supplee
+Zhongyuan
+Zephaniah
+Cameron
+Seoul
+Herbst
+Goodman
+Beckersted
+Zagato
+Petrova
+Champollion
+Collishaw
+Gardenvale
+Wade
+Selene
+Fieseler
+Kaiser
+Riverview
+Adzebills
+Pangaea
+Weiland
+Kurri
+Jacobs
+Jubilee
+Coppola
+Appalachia
+Yering
+Jeegoo
+Pirandello
+Hubble
+Kuiper
+Brentano
+Norfolk
+Mainline
+Mangala
+Rosenberg
+Goldberg
+Levitsky
+Reatequi
+Yutani
+Yer
+Broadway
+Roberts
+Wandin
+Herber
+Peart
+Moksung
+Spaatz
+Milling
+Prather
+Okonomi
+Matzerath
+Sansome
+Peng
+Aquacade
+McConnell
+Mountain
+Caldwell
+Stevenson
+Nevadan
+Shirk
+Griffis
+Harbinger
+Schuyler
+Cerminara
+Eros
+Hotger
+Maine
+Amdahl
+Obviate
+Clostermann
+Wayne
+Kaupas
+Ruban
+Berchot
+Camden
+Termagant
+Darrow
+Yap
+Sapwood
+Commodore
+Tardis
+Montferrand
+Coulter
+Mullen
+Gupte
+Schell
+Morico
+Hawks
+Shinji
+DuCasse
+Thalheimer
+Quelch
+Shojo
+Nasu
+Shilton
+Mostel
+Martini
+Steinbeck
+Clementine
+Kerouac
+Shinohara
+Powell
+Thatcher
+Frobozz
+Richmond
+Jansen
+Hill
+Romeo
+Ray
+Electricteeth
+Steeplechase
+Tennant
+Tangerine
+Lineker
+Lycia
+Beat
+Mistral
+Walsh
+Zona
+Potluck
+Tiger
+Beckett
+Cyclone
+Feng
+Barrymore
+Thurston
+Clinton
+Duesenburg
+Stuer
+Tracer
+Vaughan
+Simoni
+Adelaide
+Vixen
+Princess
+Woyseck
+Crossing
+Engel
+Burrito
+Silversten
+Shark
+McGill
+Obstreperous
+Ruml
+Steiger
+Palace
+Young
+Larsen
+Hayes
+Twilight
+Insoo
+Biberman
+Hwasung
+Townsend
+Kostolany
+Balder
+Kubo
+Zobel
+Karura
+Coats
+Pimpernel
+Tone
+Fardel
+Lotus
+Stonecutter
+Pankhurst
+Sholokhov
+Nakatani
+Childs
+Nosferatu
+Bellow
+Calderwood
+Truss
+Carson
+Wrangler
+Burton
+Gealach
+Shirabyoshi
+Toonie
+Kitchensink
+Merit
+Ornitz
+Bugaboo
+Snowdrop
+North
+Hidayat
+Linden
+Rainbow
+Undercity
+Newman
+Helle
+Balboa
+Hope
+Kayvon
+Kokorin
+Grot
+Salsman
+Ziemia
+Huszar
+Russ
+Grainger
+Gandini
+Lupis
+Reuven
+Quartermass
+Gasparini
+Soy
+Bahram
+Skolem
+Nihilist
+Seattle
+Asylum
+Dapto
+Fold
+Popinjay
+Hathor
+Delphis
+Buaku
+Blumenthal
+Genji
+Epsilon
+Voskhod
+Projects
+Stepford
+Boyoma
+Maxwell
+Hao
+Acropolis
+Cunningham
+Grimm
+Minogue
+Kanno
+Madsen
+Octavia
+Khondji
+Kavka
+Kendall
+Languish
+Yang
+Goheen
+Caballero
+Duell
+Bueller
+Fastback
+Fredericks
+Flax
+Feldman
+Regenbogen
+Atlanta
+Kronos
+Flint
+Ruttan
+Franciosa
+Cundey
+Duvall
+Worters
+Baker
+Kyrgyz
+Marx
+Fasching
+Seisenbacher
+Kralomoc
+Tempel
+Braun
+Columbia
+Takashi
+Kivioq
+Narcissus
+Morgan
+Kabumpo
+Sura
+Kohl
+Szydlowska
+Goldkey
+Cord
+Kanze
+LaFontaine
+Keynes
+Zeddmore
+Gerstort
+Herzog
+Bukowski
+Isachenko
+Ormsby
+Jaxa
+Sachertorte
+Atansoff
+Elkhart
+Drake
+Kyaw
+Randwick
+Launay
+Schmidt
+Bricklin
+Flan
+Nap
+Gregoire
+Divisadero
+Apparatchik
+Kasshiki
+Plasma
+Lindbergh
+Scognamillo
+Canaille
+Television
+Bethune
+Weissenberger
+Scholten
+Kinsei
+Ratner
+Fugu
+Schlegel
+Karlfeldt
+Steinhoff
+Gainey
+Kittinger
+Drillon
+Klopek
+Alexandria
+Normandy
+Scapin
+Benford
+Squeegee
+Doctorow
+Blankes
+Losee
+Kidomen
+Dahlgren
+Palou
+Sidek
+Duettmann
+Knopfli
+Mesmer
+Volitant
+Walcott
+Kleiber
+Horbaczewski
+Eberlain
+Collingwood
+Fratica
+Brock
+Enzian
+Calhoun
+Bordiga
+Ikura
+Neumann
+Quackenbush
+Krastins
+Carpathea
+Asturias
+Foley
+Allmenroder
+Swenson
+Lange
+Talbot
+Harker
+Ophuls
+Saiz
+Fischer
+Daikon
+Logan
+Monnett
+Deakins
+Tanabe
+Varun
+Calayan
+Sinclair
+Mower
+Scofield
+Barracuda
+Sprocket
+Austinmer
+Poppy
+Ceres
+Belvedere
+Kilda
+Athens
+Blum
+VanDornan
+Frankfurter
+Frederick
+Frontenac
+Gainsaid
+Kryakutnoy
+Glass
+Dilley
+Levy
+Overlord
+Longwell
+Kazakov
+Oxberger
+Greenstein
+Stromer
+Kupferberg
+Achterbahn
+Fortitude
+Whetmore
+Maidstone
+Noland
+Trotter
+Slate
+Faulkner
+Booran
+Longully
+Worthington
+Spinnaker
+Marlowe
+Cianci
+Echegaray
+Kita
+Tweak
+Northport
+Beachey
+Palmerstone
+Pawpaw
+Millhouse
+Dunderdale
+Tiros
+Kukulcan
+Ajax
+Ansett
+Cleghorn
+Manilow
+Abernathy
+Chihuly
+Ball
+Fox
+Dickins
+Mayfair
+Kew
+Flagstaff
+Kappa
+Ziskey
+Pickles
+Condor
+Randall
+Oddfellow
+Forti
+Krupinski
+Chandler
+Hemingway
+Midnight
+Silverman
+Azure
+Shriner
+Jackalope
+Conacher
+Wharton
+Ock
+Cyclops
+Hartnell
+Semaphore
+Christiansen
+Witherspoon
+Tapioca
+Spicoli
+Giffen
+Kaczmarek
+Coleman
+Sloane
+Rucker
+Shaftoe
+Lardner
+Rosselsprung
+Fonck
+Czervik
+Biggles
+Goodliffe
+Kobeshimi
+Lameth
+Mougin
+Izumi
+McArdle
+Gully
+Berland
+Kellner
+Hagoromo
+Lewis
+Ehrlich
+Elvehjem
+Bute
+Hercules
+Yeats
+Greenacre
+Menoptra
+Hoodoo
+Husar
+Birge
+Barnstormer
+Howl
+Dharma
+Banting
+Yan
+Rawley
+Barry
+Holt
+Buck
+Fallon
+Bigwig
+McGee
+Ingersoll
+Hubbard
+Brickworks
+Morris
+Primrose
+Saiman
+Neruda
+Quadrifoglio
+Book
+Dumouriez
+Kochav
+Lightworker
+Hutchence
+Sachs
+Undset
+Broda
+Morrison
+Amos
+Dusk
+Goodspeed
+Macdonald
+Creeggan
+Grelling
+Middle
+Montreal
+Doji
+Menatep
+Mukerji
+Nosov
+Metropolitan
+Zuhra
+Susa
+LeSabre
+Portello
+Hogarth
+Harmison
+Quamar
+Cataract
+Nakizo
+Tymets
+Demo
+Vollmer
+Itokawa
+Lemaire
+Oe
+Canter
+Noodle
+Broadbent
+Jowisz
+Strangelove
+Chenille
+Dechou
+Valois
+Newt
+Fuhr
+Sutter
+Chama
+Hunchke
+McDonnagh
+Spackler
+Bao
+Byrd
+Salyut
+Durnan
+Bourdeille
+Soyer
+Fan
+Zeami
+Liwei
+Szymborska
+Moanalo
+Torricelli
+Lahtoh
+Vanbrugh
+Graziadei
+Tsiolkovsky
+Bradley
+Mifflin
+Rohini
+Tempura
+Ruff
+Crowley
+Suntzu
+Schilling
+Okawa
+Sopor
+Shutt
+Warilla
+Kuu
+Thorn
+Catron
+Kilby
+Masukami
+Matador
+Giacobini
+Coffee
+Titan
+Korolev
+Juniper
+Kentoku
+Metalhead
+Varga
+Oxbar
+Laprade
+Mill
+Olejniczak
+Locataire
+Callisto
+Barsov
+Shimada
+Sanders
+Reuters
+Buwan
+Lapointe
+Getting
+Idora
+Donaldo
+Mosienko
+Carillon
+Miasma
+Perry
+Mysterio
+Aoi
+Musytari
+Morphett
+Kikuchiyo
+Mayne
+Alva
+Varmint
+Craig
+Stern
+Glushenko
+Gjellerup
+Nyanda
+Berwick
+Bachman
+Wollongong
+Bunavad
+Giacomin
+Yamdev
+Rakosi
+DeVaux
+Seuss
+Tenjin
+Weinstein
+Oskan
+Veloce
+Legien
+Eggplant
+Frost
+Oki
+Michelson
+Sun
+Ebisu
+Fortas
+Jorgensen
+Shakkyo
+Spoonhammer
+Abrahamson
+Stawberry
+Manuel
+Lamar
+Dinkin
+Regina
+Kyung
+McCallister
+Otoro
+Maryfield
+Pratt
+Lightstone
+Andalso
+Chickenwing
+Shore
+Demozay
+Coalcliff
+Ramsay
+Vezina
+Vaalbara
+Madurta
+Yun
+Micheline
+Kararan
+Hyde
+Rebus
+Fossil
+Cheevers
+Laysan
+Williams
+Nuvolari
+Eagle
+Bohemia
+Sakigake
+Franklin
+Boethin
+Qian
+Tandino
+Hosoi
+Warner
+Hashimoto
+Brodie
+Barrett
+Takakura
+Kanami
+Busch
+Zagoskin
+Alabaster
+Nouvelle
+Stanley
+Taka
+Kearby
+Harlan
+Yin
+Lagodadaly
+Skomoroklov
+Schuman
+Graff
+Merosi
+Rote
+Kuroe
+Oberth
+Agnon
+Tang
+Astonia
+Wallace
+Mahfouz
+Beeper
+Barkley
+Desade
+Taft
+Memotech
+Rochefort
+Ferranti
+Ingraham
+Renneville
+Stapovic
+Warrigal
+Hin
+Quasimodo
+Blackmun
+Partridge
+Ohara
+Cone
+Kurelek
+Hatfield
+Chabrow
+Constellation
+Roystead
+Shatzkin
+Roy
+Gwasi
+Marquette
+Zohari
+Alfa
+Bower
+Miquel
+Baron
+Simca
+Langway
+Lusso
+MacKay
+Mah
+Cela
+Drago
+Nervous
+Woodhen
+Kitsune
+Hauptmann
+Auxarmes
+Bobbysocks
+Eccleston
+Janitor
+Isan
+Manzo
+Araw
+Fassbinder
+Pixie
+Taiyang
+Veil
+Reitveld
+Action
+Hassanov
+Baysklef
+Assia
+Dalgleish
+Canetti
+Musketeer
+Pointe
+Jonas
+Vertes
+Harlequin
+Fraenkel
+Till
+Grosso
+Tengu
+Isbell
+Sapunov
+Rosmer
+Underall
+Control
+Zou
+Irvin
+Sola
+Milosz
+Brevity
+Usobuki
+Supercharge
+Nephilim
+Scissor
+Evelyn
+Arguello
+Flimflam
+Formosa
+Brimsek
+Davidson
+Galbraith
+Shatner
+Seibert
+Fackler
+Crosley
+Fisher
+Dweebie
+Sims
+Petit
+Pink
+Dodo
+Harford
+Marchionne
+Leafblower
+Mochi
+Ristow
+Dripp
+Patel
+Javelin
+Burnett
+Lurton
+Laffer
+Sparkle
+Rennebohm
+Katayama
+Federko
+Mirabeau
+Street
+Colonial
+Chikuwa
+Kelly
+Westwick
+Brenham
+Hold
+Sprawl
+Gadsby
+Seurat
+Kagu
+Anaconda
+Rosencrans
+Sadoul
+Liberty
+Duncker
+Kindley
+Stastny
+Denneny
+Gontermann
+Nishizawa
+DeGroot
+Domhan
+Heaney
+Su
+Hocken
+Pavlova
+Rinkitink
+Vinson
+Simpson
+Appin
+Claar
+Wildung
+Slichter
+Patton
+Beltway
+Rayner
+Robinson
+Ortega
+Templin
+McNamara
+Sliter
+Sandgrain
+Kardex
+Xu
+Nefarious
+Levitt
+Codesmith
+Yowahoshi
+Kendal
+Aji
+Dosei
+Nozomi
+Kiesler
+Chastity
+Proost
+Liadis
+Adria
+Susenko
+Kanahoe
+Bock
+Gyoza
+Erde
+Mathys
+Khorshid
+Mann
+Waisman
+Fizz
+Oz
+Zeno
+Underthorn
+Falck
+Steinhardt
+Opus
+Keon
+Hailey
+Varayez
+Wakawaka
+Menendez
+Campbell
+Deledda
+Pertwee
+Kamenev
+Zidane
+Genosse
+Quintus
+Poole
+Doesburg
+Suisei
+Avis
+Zorger
+Dangle
+Weka
+Barber
+Uba
+Mokusei
+Melbourne
+Mendicant
+Winger
+LaSalle
+Okumura
+Lulibub
+Dmytryk
+Proudhon
+Woodin
+Marker
+Anna
+Svarog
+Reed
+DaSilva
+Brokken
+Doyle
+Pontoppidan
+Wakmann
+Wolfe
+Cowen
+Bruder
+Blair
+Fizgig
+Blatchford
+Jiutai
+Lageos
+Barnard
+Tully
+Curie
+Bayliss
+Burdeyna
+DiPrima
+Twin
+Cannoli
+Nabob
+Lang
+Frua
+Bengal
+Usitnov
+Daidig
+Ng
+Lach
+Diqui
+Soyinka
+Maitland
+Droz
+Clayton
+Arizona
+Rutledge
+Howton
+Bernal
+Bardeen
+Sonnenblume
+Laguna
+Cassidy
+Ventura
+Valkyrie
+Marat
+Chu
+Andrews
+Zhou
+Meadowbrook
+Poulot
+Cupola
+Summers
+Manhattan
+Cohen
+Vallely
+Bardot
+Babeli
+Gelfand
+Calamari
+Cooper
+Davis
+Roviana
+Grayson
+Montana
+Clifford
+Bloxome
+Quatro
+Vodafone
+Tsuki
+Edison
+Kamaboko
+Saltair
+Arbusto
+Akebono
+Rasikas
+Stapleton
+Gall
+Stantz
+MC
+Gable
+Flotta
+Serf
+Xiao
+Michabo
+Marquez
+Bamatter
+Garsztka
+Langdon
+Sani
+Greyskin
+Duck
+Black
+Ketsugo
+Dyden
+King
+Bai
+Elliott
+Thyben
+Parks
+Vantongerloo
+Vanek
+Snickerdoodle
+Zapotocky
+DeVille
+Shichiroji
+Stradale
+Benedict
+Burnfield
+Lightcloud
+Paperdoll
+Aderdeen
+Hulka
+Fujin
+Cardozo
+Adamley
+Pinkerton
+Grumby
+Poultry
+Florio
+Culcomp
+Madison
+Basiat
+Waves
+Greenspan
+Tarski
+Geer
+Darlandes
+Komachi
+Mortal
+Mounier
+Shackle
+Firefly
+Jevon
+Nolan
+Brockholst
+Raine
+Milkic
+Dannunzio
+Kojishi
+Hollywood
+Bilan
+Division
+Skye
+Syaka
+Alena
+Zephyr
+Glitterbuck
+Daniel
+Hokkigai
+Vivian
+Cushing
+Kuhr
+Mars
+Beliveau
+Mirihi
+Caledonia
+Tesio
+Gruppman
+Hamilton
+Sontse
+Rutabaga
+Average
+Yohei
+Fleming
+Watson
+Lu
+McCellan
+Takahe
+Towradgi
+Solvang
+Beach
+Apps
+Boon
+Speculaas
+Miranda
+Omegamu
+Baraka
+Tokhes
+Milk
+Opel
+Laviolette
+Ping
+Zhu
+Chaika
+Whittenton
+Diller
+Prevost
+Spectre
+Wendt
+Bach
+Bjornson
+Washington
+Akami
+Kraken
+Taney
+Strutt
+Bainbridge
+Faulkland
+Smallville
+Westerburg
+Cinquetti
+Flanders
+Pascal
+Hornpipe
+Jay
+Becquerel
+Breed
+Dallin
+Bogomil
+Heyse
+Berkman
+Robertson
+Beale
+Murakami
+Starseeker
+Eber
+Chamerberlin
+Moore
+Hunt
+Dayton
+Kamloops
+Flora
+Fermi
+Thatch
+Aridian
+Debs
+Sojourner
+Mnemonic
+Woonona
+Doolittle
+Divine
+Pennyfeather
+Seraph
+Huber
+Kolache
+Serra
+Okamoto
+Barbee
+Ren
+Vogel
+Richard
+Fugazi
+Montagne
+Marten
+Wiggins
+Raven
+Mousehold
+Solzhenitsyn
+Lobo
+Bathgate
+Splash
+Letlow
+Marlin
+Prunes
+Herrey
+Virgo
+Snoats
+Candour
+Allaert
+Dana
+Doughboy
+Perun
+Tyne
+Welesa
+Cellardoor
+Bailly
+Gretzky
+PMS
+Weaver
+Kronsage
+Teazle
+Dot
+Concord
+Shaw
+Panther
+Jack
+Therian
+Rooney
+Fluffy
+Loveless
+Waki
+Daguerre
+Nadir
+Archer
+Templar
+Trescothick
+Keegan
+Nielsen
+Kitty
+McLuhan
+Bessie
+Sunchaser
+Starr
+Padar
+Molinari
+Valentino
+Charming
+Sunset
+Sondergaard
+FairChang
+Jade
+Money
+Maltese
+Valen
+Epoch
+Zabibha
+Nash
+Orman
+Danton
+Aquitaine
+Perth
+Suicide
+Massiel
+Fairchild
+Mikita
+Sunshine
+Powers
+Stone
+Cartier
+Wishbringer
+Sapeur
+Roark
+Cosmo
+Klein
+Udal
+Joffre
+Elytis
+An
+Aubriot
+Wu
+Neutra
+Bain
+Gallant
+Benavente
+Miller
+Shi
+Lorentz
+Dassin
+Lindley
+Horus
+Plato
+Odets
+Dou
+Harris
+Montgomery
+DiorJoaillerie
+Kuroda
+Warf
+Mauriac
+Stanwell
+Pinkdot
+Singer
+Fahid
+Banach
+Rand
+Guilbeaux
+Vesperia
+Izutsu
+Mackenzie
+McTeague
+Charlton
+Hoisin
+Freeman
+Fresse
+VonLenard
+Jimenez
+Scarborough
+Nyak
+Darkholme
+Barragar
+Kong
+Witte
+Maelstrom
+Hicks
+Carducci
+Vargas
+Sillanpaa
+Lemieux
+Medici
+Pasternak
+Nightshade
+Bean
+Korvin
+York
+Simon
+Gould
+Rich
+Bomazi
+Rosewood
+Wombat
+Muir
+Aida
+Flytrap
+Night
+Taiko
+Fauna
+Commerce
+Memorial
+Electric
+Hoffman
+Blackflag
+Case
+Fitzcarraldo
+Babka
+Fudo
+Dion
+Kembla
+Gavaskar
+Naumova
+Seifert
+Bliss
+Turner
+Zebrastripe
+Grasshopper
+Polonsky
+Lollipop
+Tones
+Lehane
+Maeterlinck
+Ennui
+Page
+Lament
+Moonflower
+Bell
+Twang
+Stormwind
+Luchador
+Rocco
+Saru
+Dulce
+Skidoo
+Brightwillow
+Vasilopita
+Johnson
+Nicholas
+Llewelyn
+Tokugawa
+Spencer
+Spaight
+Mason
+Ellsberg
+Soke
+Stryker
+Perse
+Draper
+Churchill
+Aubret
+Einarmige
+Harrington
+Moonlight
+Pendragon
+Rogers
+Arbuckle
+Kothari
+Galileo
+McCoy
+Cult
+Stooge
+Faust
+Fortune
+Samiam
+Rust
+Zamboni
+Wood
+Gide
+Absolute
+Unsung
+Hayek
+Nomad
+Yamamoto
+Teevee
+Argonaut
+Protagonist
+Lippmann
+Thompson
+Steed
+Enfield
+Galatea
+LeMay
+Timtam
+Camus
+Pollack
+Butler
+Barbara
+Faddoul
+Keiko
+Spengler
+Burali
+Fetid
+Dunheved
+Brearly
+Madonna
+Scott
+Tuque
+Ogre
+DeFarge
+Gateaux
+Torrone
+OFlynn
+Tank
+Lumiere
+Duport
+Burke
+Windang
+Fei
+Ganache
+Bancroft
+Rambler
+Dougall
+Heiden
+Under
+Spice
+Vanness
+Vega
+Xevious
+Sleeper
+EarlyCreator
+Murphy
+Appleby
+Roentgen
+Kongo
+GKid
+Chen
+Suavage
+Severine
+Whiplash
+Abattoir
+Clarke
+Hornet
+Moe
+Cain
+Teacher
+Honey
+Hazlitt
+Yaffle
+Kiama
+Martin
+Bogart
+Sartre
+Paklena
+Neurocam
+Otis
+Weary
+Bijoux
+Fraser
+Neville
+Gorilla
+Daligdig
+Shang
+RiversRunRed
+GeekSquad
+Extraordinaire
+Democracy
+Diamond
+Zadoq
+Paz
+Chatnoir
+Pomeray
+Lewellen
+Feaver
+Williamson
+Bakalava
+Arnaz
+Bienenstich
+Carlos
+Trenchmouth
+Bunin
+Olsen
+Sullivan
+Xia
+Weber
+Noir
+Blanc
+Spatula
+Mandala
+Learner
+Akula
+Onizuka
+Anubis
+Adamant
+Buttercup
+Boivin
+Jimador
+Sheep
+Hocho
+Psaltery
+Baskerville
+Yoshiro
+Thereian
+Omlet
+Magpie
+Monde
+Peregrine
+Deckard
+Dawson
+Kilian
+Revere
+Sieyes
+Stirling
+Phoenix
+Jewel
+Cure
+Leviathan
+Seigo
+Quirk
+Beckenbauer
+Hedges
+Careless
+LaFollette
+Terra
+Bombay
+Smails
+Gabriel
+Clio
+Maltz
+Kawabata
+Golem
+Pinkney
+Guillaume
+Diggy
+Jackson
+Steptoe
+Baphomet
+ACS
+Karuna
+Gremlin
+Lioncourt
+McCann
+Parson
+Snakeankle
+Batra
+Buckenburger
+Donovan
+Jensen
+Han
+Kinsella
+Playahead
+Lamington
+Delvecchio
+Falcone
+Koolhaas
+Fool
+Cave
+Flasheart
+Costello
+Yellowknife
+Benmergui
+Trumbo
+Xavier
+Marshall
+Rebel
+Mondrian
+Gorham
+Eusebio
+Roo
+Angel
+Ogopogo
+Sugar
+Bunnyhug
+Bling
+Nino
+Playfair
+Withnail
+Murdock
+Zander
+Boyer
+Brocco
+MacFound
+Turnbull
+KaizenGames
+Shirakawa
+RossiResidencial
+Stewart
+Xingjian
+Rutherford
+Zapata
+Zaftig
+Callahan
+Ahmed
+Bard
+Bravo
+Wallaby
+Brotherhood
+Puff
+Ixchel
+Czukor
+Prior
+Hannibal
+Pasteur
+TUi
+Hermes
+Hawkins
+Steele
+Shortbread
+Femto
+Adroit
+Weinberger
+Pacer
+Ideator
+Skallagrimson
+Olafson
+Cook
+Amarula
+Rampal
+JCKL
+Dingo
+Bauhaus
+Small
+Overdrive
+Baggio
+Dragonfly
+Mfume
+Thomson
+Hadlee
+Satyr
+Lindgren
+Fitzsimmons
+Linderot
+Lily
+Caligari
+Bernstein
+Greenleaf
+Kavanagh
+Ludovico
+Richelieu
+Au
+Cruyff
+Domela
+Balderdash
+Trudeau
+Stygian
+Fallingbridge
+Lomax
+Muromachi
+Horton
+OsMoz
+Barnave
+Coral
+Livingston
+Anansi
+Yamabushi
+Herde
+Bauer
+McGettigan
+Edo
+Tesla
+Tomba
+Maginot
+Martinez
+Moseley
+Khan
+Boxer
+Tonic
+DeAnda
+Aprendiz
+Jacques
+Marcone
+Fluffball
+Nico
+Grace
+Astro
+Ambassador
+White
+McLean
+Bacon
+Hebert
+Boomslang
+Hare
+Altman
+Boffin
+Grindstaff
+Platini
+Salome
+Ritter
+Armitage
+Highlander
+Fonzarelli
+Jarrico
+Ferdinand
+Juergens
+Petunia
+Fairplay
+Millions
+Brodsky
+Boccara
+Tiramisu
+Kennedy
+Kent
+Gumshoe
+Manimal
+TeeCee
+LeFay
+Eisenberg
+Farber
+Walkabout
+Uritsky
+Anderson
+Hanks
+Angelus
+Flower
+Fatale
+Edge
+Ixtab
+Clymer
+Portocarrero
+Thetan
+Claveau
+Everett
+Edelbrock
+Craven
+Kojima
+Dalek
+Gullwing
+Acres
+Loonie
+Mechanique
+Lulu
+Banjo
+Qin
+Escher
+Itoku
+LaGrassa
+Wilde
+MovieTickets
+Gomez
+Kapor
+Sion
+Volos
+Guildenstern
+McHenry
+Cotton
+Gascoigne
+Gillespie
+Prefect
+Ming
+DeLane
+Leader
+Orlowski
+Broom
+Gilman
+Torgeson
+Rollins
+Took
+Basset
+Eldritch
+Fairlight
+Ayoob
+Om
+Aloft
+Dibbell
+Zircon
+Alexander
+IWOOT
+Tigereye
+Murray
+Bronfman
+Grandi
+Bunderfeld
+Riva
+Zuma
+Pfetzing
+Thirty
+Bixby
+Digeridoo
+Kaos
+Best
+Godel
+Parvenu
+Chaos
+Annenberg
+Bommerang
+Gkguest
+Carola
+OurVirtualHolland
+Paxman
+Serpentine
+Tabla
+Roemer
+Prototype
+Plisskin
+Neptune
+Shelley
+Phaeton
+Faraday
+Havok
+ATI
+Dell
+Bay
+Romulus
+Lambert
+Gasseros
+Caldera
+Kimmel
+Leandros
+INGRenaultF1Team
+Oud
+Maestro
+Bradesco
+Erato
+Rowland
+Meltingdots
+Backbite
+Ukrop
+Svensen
+Williston
+Dinova
+Gardner
+Invincible
+Statosky
+Lear
+Cafine
+Rhodes
+Filth
+BnT
+Stephanopolis
+Stonebender
+Triebel
+Liu
+Ware
+Diaz
+Snow
+Pitt
+Bartle
+Posner
+Knox
+Rheingold
+PSlunce
+Way
+Dyson
+Gabaldon
+Akina
+Albanese
+Andrew
+Arai
+Arashi
+Arbizu
+Aya
+Back
+Baroque
+Bebb
+Benazzi
+Bergamasco
+Betsen
+Blackadder
+Blanco
+Botha
+Brezoianu
+Bulloch
+Burger
+Cale
+Campese
+Carling
+Castaignede
+Charron
+Checchinato
+Chemistry
+Collins
+Contepomi
+Cooljoke
+Cuttita
+Dallagio
+Darcy
+Davies
+Dawes
+Dayafter
+Dominquez
+Dragonash
+Eales
+Eel
+Ella
+Ellils
+Farrjones
+Fayray
+Fitzpatrick
+Flatley
+Flow
+Fouroux
+Freenote
+Gabe
+Gackt
+Galthie
+Gibbs
+Gontineac
+Gopheller
+Greenwood
+Gregan
+Habana
+Halcali
+Hamaski
+Hastings
+Heartsdale
+Heslop
+Hirano
+Horan
+Howlett
+Howley
+Hutchinson
+Ibanez
+Indigo
+Infinity
+Iwish
+Jenkins
+Jetcity
+Jinn
+John
+Joubert
+Kattun
+Kawashima
+Kayo
+Kronfeld
+Kumaki
+Kungfu
+Larkham
+Lewsey
+Little
+Littlething
+Llewellyn
+Lomu
+Lunasea
+Lungu
+Lyle
+Lynagh
+Maggs
+Magne
+Matfield
+McBride
+McCaw
+McDowwll
+Meads
+Mehrtens
+Meredith
+Michalak
+Mighty
+Mortlock
+Muliaina
+Nakamori
+Nicholls
+Niekerk
+Noriega
+Obolensky
+Oceanlane
+Oconnell
+Odriscoll
+Offcourse
+Okelly
+Otsuka
+Paulse
+Pelous
+Pichot
+Pienaar
+Pinklady
+Pizzicato
+Porta
+Preez
+Price
+Quinnell
+Rabeni
+Randt
+Rives
+Roff
+Rokocoko
+Roux
+Rowlands
+Sawson
+Seesaw
+Sella
+Serevi
+Shelford
+Skinstad
+Smit
+Sporleder
+Stransky
+Teichmann
+Thorne
+Tobias
+Tokyoska
+Tomorrow
+Troncon
+Tuqiri
+Umaga
+Underwood
+Villiers
+Watkins
+Whiteberry
+Wilkinson
+Woller
+Yachvili
+Ontyne
+Mendez
+DiPietro
+Messenger
+Meiji
+Gabel
+Secondfest
+Rose
+SunMicrosystems
+Gabetti
+Kobayashi
+Onassis
+Smith
+Farrow
+Babson
+Eno
+Autodesk
+Gibson
+CredicardCiti
+Lumin
+Bond
+Song
+Meailverstar
+Pride
+Santoro
+Schwab
+Angelo
+Domino
+Barsema
+Enberg
+Intel
+Sklar
+Zulauf
+Tscher
+McCabe
+Ponticelli
+Werbach
+Wisconsin
+See
+Philpoco
+Pausch
+Abramovic
+Afarensis
+Akroyd
+Alderson
+Aluveaux
+Alvord
+Amoufhaz
+Anderton
+Apfelbaum
+Applemoor
+Arctor
+Arida
+Auebauch
+Bagley
+Balbozar
+Barbasz
+Bedrosian
+Berboral
+Bimbogami
+Blessed
+Blister
+Boozehound
+Bosatsu
+Carpool
+Chesnokov
+Coeyman
+Corvale
+Darkstone
+Dawg
+Donardson
+Dreadlow
+Drechsler
+Drevnerussky
+Eichel
+Elephas
+Eracktor
+Farella
+Felisimo
+Ferrentino
+Fizzle
+Flores
+Foggarty
+Forzane
+Fotherington
+Freck
+Freschi
+Fullstop
+Gaffer
+Ganesvoort
+Godenot
+Gustav
+Habilis
+Hartshon
+Horczys
+Imako
+Janick
+Jarman
+Jiagu
+Jonesford
+Kangjon
+Kharg
+Kiergarten
+Klaxon
+Klossovsky
+Kowalski
+Leakey
+Lefavre
+Liotta
+Lockjaw
+Lovenkraft
+Lutrova
+Manamiko
+Manatiso
+Mapholisto
+Marjeta
+Markova
+Markstein
+Masatada
+Maurer
+Maximus
+Mayako
+McGinnis
+Merryman
+Miklos
+Milena
+Milos
+Mizin
+Monentes
+Mopp
+Morales
+Mornington
+Moulliez
+Msarko
+Mumfuzz
+Myoo
+Nadezda
+Ninetails
+Noyes
+Olchowy
+Oldrich
+Outlander
+Owatatsumi
+Pastorelli
+Pinazzo
+Proto
+Puchkina
+Questi
+Radek
+Rayna
+Razor
+Reina
+Reinard
+Revnik
+Reyes
+Rickena
+Rieko
+Rivera
+Ryba
+Sadofsky
+Samtanko
+Scarpulla
+Schmooz
+Schoonhoven
+Sciarri
+Seomun
+Setsuko
+Shostakovich
+Sideways
+Silverspar
+Sinister
+Sosa
+Strom
+Takaaki
+Tedeschi
+Tendandes
+Thibedeau
+Thursday
+Timeless
+Toshi
+Troglodite
+Trommler
+Vantelli
+Varriale
+Veliz
+Vendetta
+Vhargon
+Vita
+Waechter
+Walpole
+Weatherwax
+Weston
+Wingtips
+Wisent
+Wobbit
+Wycliffe
+Yumako
+Zabaleta
+Zamani
+Zerbino
+Zhangsun
+Zhong
+Zhora
+Zimminy
+Adamczyk
+Aeghin
+Aeon
+Agrawal
+Aichi
+Albatros
+Alekseev
+Alsop
+Alter
+Amiot
+Anatra
+Ansaldo
+Ansome
+Anthony
+Arado
+Arnahan
+Ashbourne
+Aurbierre
+Aviatik
+Avro
+Bachem
+Ballyhoo
+Bashly
+Beardmore
+Bellios
+Beningbrough
+Benoir
+Bereznyak
+Berkmans
+Bernard
+Bisnovat
+Blackburn
+Blinker
+Bloch
+Boccaccio
+Boomhauer
+Brandenburg
+Breda
+Breguet
+Buscaylet
+Camel
+Caproni
+Carver
+Caudron
+Cazenove
+Chakrabarti
+Charleville
+Clavenham
+Clawtooth
+Clip
+Colclough
+Compton
+Convair
+Courtois
+Criss
+Cryotank
+Dalglish
+Darwin
+Dastardly
+Debruyere
+Deerhunter
+Delpiaz
+Demonge
+Demonia
+Denja
+Densmith
+Destiny
+Devin
+Dewoitine
+Dharnen
+Doflug
+Doobie
+Dreamscape
+Ducrot
+Dudek
+Dufaux
+Dumpling
+Duranjaya
+Eames
+Earnshaw
+Easterman
+Eberhart
+Ecksol
+Eebus
+Effingham
+Ember
+Enzo
+Euler
+Ewinaga
+Ezvalt
+Fairey
+Fall
+Falworth
+Fanshaw
+Farman
+Faulkes
+Fearne
+Felwitch
+Folland
+Foulsbane
+Frog
+Gabardini
+Galli
+Garside
+Gartle
+Garzo
+Gears
+Georgia
+Giano
+Gigamon
+Gloster
+Gorbunov
+Gourdou
+Grigorovich
+Gudkov
+Gumbo
+Haedong
+Haefeli
+Haggwood
+Halberstadt
+Halfpint
+Hanfoi
+Hanriot
+Harbour
+Harsley
+Hawker
+Heinkel
+Henhouse
+Hereter
+Himmel
+Hissop
+Hitendra
+Hobble
+Hoisan
+Honi
+Hoobinoo
+Horsforth
+Horten
+Hotshot
+Hunghi
+Illios
+Illyar
+Imtiaz
+Inshan
+Insippo
+Intikhab
+Irata
+Itano
+Jaerls
+Jameson
+Jashan
+Jaxxon
+Jefferson
+Jehangir
+Jiminy
+Jishnu
+Jonson
+Jungsten
+Junkers
+Kanto
+Karlsbar
+Kawanishi
+Kazyanenko
+Kesslinger
+Kirax
+Kjeller
+Knelstrom
+Knoller
+Kocherigin
+Kondor
+Koolhoven
+Kutanaga
+Laminsk
+Lanzius
+Latte
+Laville
+Lavochkin
+Lebed
+Leominster
+Letord
+Letov
+Levasseur
+Loening
+Lohner
+Loire
+Looming
+Loring
+Macchi
+Marksman
+Martinsyde
+Maruti
+Maynard
+McCallen
+McCullough
+McDonnell
+Melson
+Memel
+Messerchmitt
+Mikoyan
+Moomintoog
+Morane
+Morgath
+Morgwain
+Morrisey
+Moskalev
+Mrigesh
+Munster
+Mureaux
+Naglo
+Nakajima
+Neddings
+Nestler
+Nieuport
+Nightfire
+Nikitin
+Nirpaw
+Nitely
+Nostram
+Numanox
+Olkhovsky
+Parnall
+Pashinin
+Petlyakov
+Pfalz
+Piaggio
+Polikarpov
+Pomilio
+Ponnier
+Potez
+Praga
+Rammidge
+Ravikumar
+Reggiane
+Renard
+Republic
+Rhiano
+Riggles
+Rikugun
+Rishmal
+Rogozarski
+Romano
+Roogus
+Roussel
+Rubble
+Rumpler
+Runningbear
+Rutkowski
+Sablatnig
+Sadayappan
+Saeed
+Salmson
+Saunders
+Schintauer
+Schism
+Schmertzin
+Schoomantal
+Schuttelanz
+Schwade
+Scorbal
+Selentiak
+Short
+Siddeley
+Siemens
+Silvansky
+Sirkelianov
+Sittingbull
+Slyusarenko
+Smythe
+Sobczak
+Sodertelge
+Sopwith
+Spad
+Spyker
+Stoop
+Sturtevant
+Supermarine
+Svenska
+Szaberwick
+Tachikawa
+Tairov
+Tebaldi
+Teebrook
+Telling
+Tereshchenko
+Teskat
+Thor
+Tigerpaw
+Tolsen
+Trafalgar
+Trefoil
+Trefusis
+Trenchcoat
+Trenkins
+Trevellion
+Tsarchon
+Uborstein
+Ulderport
+Undercroft
+Urqhart
+Urriah
+Usbourne
+Vought
+Vultee
+Waco
+Wakowski
+Walworth
+Washborne
+Weames
+Westland
+Weymann
+Wezzog
+Wibault
+Wierwight
+Willenov
+Worbridge
+Wozniak
+Wrigglesworth
+Wuramunga
+Wylie
+Yatsenko
+Yokosuka
+GossipGirl
+WorldUE
+Burnholme
+Ehrlike
+Horn
+Hatley
+Teryaki
+Firlan
+Vasser
+Zebberman
+Pappilomo
+Zuiker
+Delight
+Mayflower
+Ireland
+Connaught
+Google
+Henly
+Eleventhauer
+Weidman
+Perrin
+Trappen
+Northolt
+Vlitzen
+Jennings
+Bashir
+Raffles
+Christen
+Eldridge
+Kingstop
+Yeshto
+Belfire
+Ostaschon
+Bazno
+Redstar
+Elfan
+Giadelli
+Moonbeam
+Jodra
+Chenaux
+Ashley
+Cliffhanger
+Robenet
+Wallifers
+Kirktown
+Oppental
+Shawbridge
+Harchester
+Ishnoo
+Gordonstone
+Trialle
+Reinoir
+Nessen
+Schama
+Leeming
+Loam
+Emsbury
+Liertow
+Irling
+Umbram
+Eppeston
+Whittenstall
+Urnst
+Lunark
+Weder
+Vonbaum
+Dagenhall
+Boothroyd
+Adlerstein
+Askham
+Oughden
+Quinsette
+ConnectedWomen
+Karphar
+Bernst
+Newbauld
+Kleb
+Senne
+Ramir
+Qualcar
+Philter
+Aubos
+Fanton
+Rasteridge
+Tischler
+Defroig
+Thorsveld
+Garmouth
+Mosten
+Qaven
+Jolafson
+Yengawa
+Maudower
+Kenthauer
+Dhanhu
+Orfein
+Periapse
+Szpieler
+Njaim
+Frabersham
+Thomas
+MadeVirtual
+Dementulo
+Lowden
+Sensei
+Straylight
+Trott
+Szabo
+Garrett
+Dub
+Holloman
+Gavankar
+Lessig
+Matlin
+Pulver
+Betteridge
+IBM
+Glin
+Karpo
+Allanson
+Mojo
+Valerio
+Herz
+Alicious
+Millionaire
+Hades
+Mueller
+Motion
+Jamaluz
+Trablesi
+FiatBrasil
+AOL
+Gessner
+Gigi
+DutchX
+Design
+HzO
+Andolini
+Hunter
+Replay
+Ireport
+Pond
+Hawley
+SeraKorea
+WeAreHere
+Reeves
+Si
+HermanMiller
+Crash
+Harmsworth
+Zakaria
+SkyNews
+Perdiguero
+Adams
+Krotoski
+Martino
+Morta
+Empero
+Esiason
+Rapisardi
+Zero7
+Briegel
+Isa
+Lupus
+Holmes
+Ito
+Telstra
+Voyunicef
+UTexas
+Folds
+Malko
+Stengel
+Abair
+Romero
+Boas
+Hammer
+OrangeTeam
+Eye4You
+FIGMENTsl
+Onrez
+Xerox
+Showtime
+PhilipsDesign
+Techsan
+Avila
+Baca
+Bateman
+Benavides
+Bowling
+Bruner
+Capps
+Carrier
+Chamberlain
+Champion
+Choi
+Conn
+Darnell
+Dominguez
+Elkins
+Fitch
+Fowler
+Guzman
+Hankins
+Huerta
+Key
+Kirkpatrick
+Langford
+Le
+Lund
+Manley
+Mansfield
+McWilliams
+Moss
+Palacios
+Pina
+Roman
+Root
+Sandoval
+Seals
+Sheppard
+Solis
+Swift
+Temple
+Thomason
+Valdez
+Varner
+Vick
+Westbrook
+Wiley
+Allison
+Bermudez
+Broussard
+Bullock
+Dickens
+Dillard
+Dotson
+Elliot
+Ervin
+Flowers
+Fountain
+Gaston
+Hays
+House
+Lawrence
+Lindsey
+Lockwood
+Lujan
+Mack
+Mata
+Mathis
+Mayes
+McNair
+Metcalf
+Michel
+Negron
+Owens
+Petersen
+Reese
+Rudd
+Sierra
+Thurman
+Toney
+Valle
+Waddell
+Walden
+Whitaker
+Willard
+William
+Zimmerman
+Adkins
+Bowen
+Bridges
+Carlisle
+Castle
+Champagne
+Collier
+Conner
+Cornett
+Dempsey
+Engle
+Foreman
+Foster
+Fournier
+Garrison
+Golden
+Groves
+Hamlin
+Holcomb
+Holloway
+Hoyt
+Hutchison
+Leary
+Ledbetter
+Mackey
+Marrero
+Masters
+McClellan
+McFadden
+Mendoza
+Meyers
+Painter
+Potter
+Reece
+Riggs
+Roper
+Sams
+Shook
+Sloan
+Sneed
+Spivey
+Steward
+Tipton
+Webster
+Barrow
+Blevins
+Blue
+Boggs
+Bunch
+Clay
+Correa
+Crump
+Dyer
+Feliciano
+Fernandez
+Givens
+Haywood
+Henson
+Hernandez
+Holman
+Leal
+Lilly
+Mathews
+McGrath
+McLain
+Miner
+Mock
+Montoya
+Napier
+Ouellette
+Pacheco
+Pickens
+Quintero
+Rodrigues
+Roe
+Roland
+Rubin
+Salas
+Salazar
+Shapiro
+Snider
+Spangler
+Spence
+Stout
+Sykes
+Thayer
+Villarreal
+Whitley
+Whitt
+Xiong
+Acosta
+Benjamin
+Benson
+Bruno
+Bryan
+Campos
+Cochran
+Decker
+Early
+Farris
+Felton
+Good
+Judd
+Light
+McCauley
+McMullen
+Murillo
+Nix
+Pierson
+Sawyer
+Stratton
+Sutton
+Tilley
+Waldron
+Walter
+Wesley
+Zuniga
+Baez
+Bergeron
+Betts
+Boswell
+Butts
+Cabrera
+Colon
+Connelly
+Dubois
+Epps
+Foote
+Galindo
+Hobbs
+Holley
+Hoover
+Huynh
+Kirby
+Krause
+Lay
+Lord
+Maddox
+Meade
+Owen
+Ponce
+Potts
+Riddle
+Rivas
+Robison
+Rosas
+Schaefer
+Schwartz
+Shafer
+Villalobos
+West
+Abbott
+Acevedo
+Andersen
+Bellamy
+Blackman
+Bourgeois
+Camp
+Carlson
+Duffy
+Elmore
+Farley
+Figueroa
+Gonzalez
+Goodrich
+Griffin
+Hargrove
+Huddleston
+Ibarra
+Jamison
+Kay
+Kemp
+Lundy
+Maldonado
+Muniz
+Nadeau
+Prescott
+Raines
+Rocha
+Rosado
+Rosales
+Rowell
+Scruggs
+Shipley
+Stacy
+Staton
+Avery
+Beard
+Bonner
+Booker
+Burrell
+Call
+Deal
+Dugan
+Echols
+Erwin
+Fontenot
+Hamm
+Hart
+Hensley
+Hickey
+Jaramillo
+Keys
+Ladd
+Land
+Longoria
+McDonough
+McPherson
+Morse
+Nunez
+Ramey
+Snell
+Springer
+Trent
+Winn
+Zamora
+Bass
+Bowden
+Cash
+Castaneda
+Cornelius
+Covington
+Darden
+Denton
+Finley
+Flynn
+Gee
+Goodson
+Helms
+Inman
+Ivey
+Kyle
+Laird
+Ledford
+McNeill
+Merrill
+Norton
+Ramsey
+Rhoades
+Rojas
+Rouse
+Salinas
+Shannon
+Silva
+Sumner
+Vance
+Ybarra
+Abraham
+Baird
+Battle
+Blackmon
+Bledsoe
+Bloom
+Conrad
+Eubanks
+Goldman
+Guthrie
+Hagan
+Hale
+Kaplan
+Kurtz
+Locke
+Lockhart
+McKenzie
+Meadows
+Navarro
+Oakley
+Ortiz
+Ruiz
+Stephens
+Tillman
+Washburn
+Yarbrough
+Yazzie
+Ziegler
+Abrams
+Allred
+Bowles
+Brady
+Caron
+Cartwright
+Connors
+Corcoran
+Cordova
+Corley
+Enriquez
+Friedman
+Friend
+Gallagher
+Glover
+Harden
+Harrell
+Hatch
+Heller
+Herrera
+Hilton
+Huggins
+Hurt
+Ladner
+Love
+McClendon
+Medina
+Parr
+Pearson
+Porter
+Quintana
+Redmond
+Reeder
+Reilly
+Rios
+Rodriguez
+Vang
+Wilkes
+Wiseman
+Yoder
+Berg
+Bingham
+Branch
+Chin
+Conway
+Corbin
+Crane
+Dill
+Drew
+Gary
+Hendricks
+Hogue
+Hopper
+Huffman
+Juarez
+Lester
+Lim
+Marion
+McRae
+Melton
+Slaughter
+Smallwood
+Spears
+Tapia
+Thacker
+Womack
+Barron
+Begay
+Block
+Burris
+Chan
+Clemons
+Cote
+Driver
+Fry
+Guy
+Haney
+Herbert
+Houser
+Kearney
+Kerns
+Kirk
+Leach
+Lloyd
+Moser
+Person
+Queen
+Roberson
+Rock
+Smiley
+Starnes
+Wells
+Wolf
+Benoit
+Brantley
+Burr
+Cobb
+Emery
+England
+Guerra
+Gutierrez
+Hardy
+Henry
+Jacob
+Joyner
+Kessler
+Marino
+McDermott
+Neff
+Pearce
+Pryor
+Serrano
+Shepard
+Shields
+Simms
+Boston
+Childress
+Christian
+Crews
+Devine
+Dougherty
+Emerson
+Isaac
+Justice
+Kilgore
+Krueger
+Lozano
+Michael
+Montano
+Pate
+Pugh
+Ruffin
+Sheehan
+Stark
+Tidwell
+Woods
+Cardenas
+Carrillo
+Caudill
+Cervantes
+Conley
+Crain
+Cuevas
+Delaney
+Garza
+Hoskins
+Levine
+Lyles
+Lynn
+Marsh
+Randle
+Shoemaker
+Slater
+Staley
+Talley
+Vasquez
+Aguirre
+Akins
+Atwood
+Barlow
+Barnhart
+Burnette
+Cody
+Crockett
+Crum
+Davila
+Dickinson
+Dupree
+Hairston
+Helton
+Hester
+Hodge
+Hollingsworth
+Jarrett
+Keyes
+McClain
+McGraw
+Meza
+Parrish
+Pritchard
+Ransom
+Ricks
+Russo
+Samuels
+Travis
+Atkinson
+Babb
+Boykin
+Bradshaw
+Calderon
+Conklin
+Dickey
+Gifford
+Hinton
+Long
+Middleton
+Mobley
+Pierre
+Rangel
+Santiago
+Vickers
+Winslow
+Barajas
+Blankenship
+Bolden
+Calloway
+Coley
+Cross
+Gentry
+Griggs
+Harper
+Hodges
+Jernigan
+Johns
+Kinney
+Koch
+McCray
+Mejia
+Melvin
+Montes
+Moses
+Orozco
+Platt
+Roach
+Rosario
+Singleton
+Whaley
+Alford
+Barrera
+Boone
+Butcher
+Combs
+Crandall
+Ferrell
+Flood
+Frey
+Gagne
+Gay
+Gilliam
+Grove
+Hines
+Holland
+Ingram
+Irving
+Keenan
+Kimble
+Koehler
+Lowery
+McCracken
+McIntyre
+Payton
+Pritchett
+Reid
+Riley
+Salgado
+Shaver
+Shultz
+Swan
+Thornton
+Tovar
+Waller
+Akers
+Arias
+Biggs
+Booth
+Boudreaux
+Brandt
+Bryson
+Bynum
+Chaney
+Currie
+Daly
+Dunlap
+Galvan
+Grover
+Hancock
+Hurd
+Kauffman
+Kendrick
+Meier
+Putnam
+Sears
+Seay
+Stinson
+Tabor
+Trujillo
+Vann
+Vela
+Wilkerson
+Browning
+Cox
+Crowell
+Downing
+Easley
+Espinoza
+Frazier
+Goldsmith
+Gunter
+Hobson
+Keith
+Kruse
+Lee
+Magee
+Minor
+Perez
+Sanderson
+Stover
+Timmons
+Walton
+Alfaro
+Bird
+Chacon
+Corbett
+Cormier
+Dorsey
+Erickson
+Hinson
+Marcus
+McGowan
+Prater
+Ritchie
+Self
+Simmons
+Skaggs
+Smart
+Sweeney
+Wall
+Witt
+Blanton
+Bolton
+Chatman
+Cope
+Delarosa
+Franks
+Grady
+Hadley
+Haines
+Ham
+Hayden
+Leon
+McCarty
+Morrow
+Morton
+Mullins
+Spaulding
+Belcher
+Dickerson
+Dobson
+Dove
+Fields
+Gomes
+Hendrickson
+Kiser
+Lyons
+McNeal
+Moreno
+Schafer
+Ayers
+Banks
+Corona
+Crow
+Goss
+Harmon
+Ho
+Landers
+Mays
+McFarland
+Phelps
+Rainey
+Wilcox
+Zavala
+Barton
+Blackwell
+Bland
+Bray
+Brunson
+Church
+Cordero
+Crabtree
+Crenshaw
+Escobar
+Farmer
+Haley
+Hammond
+Hewitt
+Honeycutt
+Hurley
+Monroe
+Muller
+Novak
+Purcell
+Sampson
+Ward
+Billings
+Cisneros
+Coates
+Dennis
+Duarte
+Dumas
+Faulk
+Garland
+Gilmore
+Lutz
+Ramirez
+Schmitt
+Sexton
+Stanton
+Tolbert
+Beal
+Buckner
+Crouch
+Dodd
+Lin
+Manning
+McDowell
+McKnight
+Mercado
+Merritt
+Paige
+Peacock
+Pineda
+Romo
+Rosen
+Schmitz
+Stokes
+Wang
+Winters
+Yeager
+Addison
+Arellano
+Ballard
+Beasley
+Frank
+George
+Hartman
+Heard
+Herring
+Lamb
+Larson
+Lockett
+Lucas
+Lusk
+McManus
+Myrick
+Sizemore
+Stiles
+Triplett
+Velazquez
+Aragon
+Carney
+Dalton
+Davenport
+Gamble
+Hooks
+Kirkland
+Lacy
+Madrid
+McCormick
+Medeiros
+Rivers
+Rosa
+Sadler
+Stahl
+Teague
+Villa
+Villanueva
+Blake
+Byers
+Clement
+Cooley
+Crocker
+Drummond
+Gage
+Garner
+Gipson
+Gross
+Hurst
+Kincaid
+Knutson
+McCall
+Nickerson
+Sargent
+Worley
+Ackerman
+Bonilla
+Colbert
+Cruz
+Downs
+Elder
+Gleason
+Lugo
+Marin
+Meeks
+Nava
+Pollard
+Workman
+Aaron
+Comer
+Connor
+Coon
+Espinosa
+Hawk
+Lam
+Molina
+Tobin
+Aguilar
+Aldridge
+Anaya
+Arredondo
+Arroyo
+Arthur
+Atkins
+Barr
+Bassett
+Becker
+Belanger
+Bonds
+Boyce
+Bragg
+Brandon
+Britt
+Britton
+Browne
+Burgos
+Burkett
+Busby
+Cannon
+Cantrell
+Cantu
+Casey
+Castillo
+Chappell
+Cherry
+Christie
+Clements
+Coffman
+Coker
+Colvin
+Contreras
+Couch
+Courtney
+Craft
+Crowder
+Crowe
+Curran
+Dahl
+Dawkins
+Delacruz
+Deleon
+Delong
+Dennison
+Denny
+Dewitt
+Dickson
+Diggs
+Dodson
+Doherty
+Dolan
+Donahue
+Doran
+Dow
+Dowdy
+Dudley
+Dunham
+Edmonds
+Egan
+English
+Fair
+Farr
+Ferreira
+Finch
+Fink
+Fletcher
+Forbes
+Franco
+French
+Fritz
+Fulton
+Gagnon
+Gallo
+Galloway
+Gillis
+Glenn
+Goins
+Goldstein
+Gorman
+Grubbs
+Guidry
+Gunn
+Hackett
+Hagen
+Hager
+Hahn
+Hanley
+Hanna
+Haskins
+Haynes
+Head
+Heath
+Hendrix
+Herndon
+Herrington
+Herron
+Hilliard
+Hopkins
+Huff
+Hutchins
+Jacobson
+Johnston
+Joseph
+Joyce
+Kane
+Katz
+Keene
+Kenney
+Kern
+Kerr
+Knapp
+Lackey
+Landis
+Landry
+Langston
+Lassiter
+Latham
+Law
+Leblanc
+Leslie
+Lott
+Lovett
+Lowry
+Macias
+Madden
+Maher
+Major
+Marks
+Matos
+Mayberry
+Mayer
+McCarthy
+McCord
+McKee
+McKinnon
+McNeil
+McQueen
+Means
+Messer
+Michaud
+Milligan
+Mims
+Moon
+Mooney
+Mosley
+Myles
+Naquin
+Newsome
+Newton
+Nguyen
+Nieves
+Norris
+Oakes
+Otero
+Otto
+Parham
+Parsons
+Patterson
+Paulson
+Pendleton
+Perdue
+Pettit
+Pickett
+Piper
+Pittman
+Plummer
+Polk
+Posey
+Prince
+Quinones
+Ragland
+Randolph
+Ratliff
+Reyna
+Richards
+Richey
+Robles
+Rossi
+Rowe
+Rudolph
+Rushing
+Saldana
+Salter
+Savage
+Segura
+Shearer
+Sheets
+Sheffield
+Shelton
+Sherman
+Sherwood
+Skinner
+Sorensen
+Souza
+Stallings
+Stanford
+Starks
+Strickland
+Stroud
+Suarez
+Swartz
+Sweet
+Sylvester
+Terrell
+Tomlinson
+Trejo
+Trevino
+Valentin
+Valenzuela
+Vaughn
+Velez
+Villegas
+Vincent
+Vogt
+Weiss
+Welsh
+Werner
+Whitlock
+Whitten
+Wilkins
+Wills
+Winter
+Woodall
+Woodard
+Woodson
+Woody
+Wooten
+Wray
+Wyatt
+Wynn
+Adair
+Albright
+Andrade
+Arrington
+Askew
+Ayala
+Bartley
+Benitez
+Bowers
+Camacho
+Childers
+Cho
+Cleveland
+Cortez
+Costa
+Darby
+Daugherty
+Donaldson
+Doty
+Driscoll
+Dunbar
+Durham
+Earl
+Eason
+Eaton
+Fenton
+Floyd
+Forrest
+Gallegos
+Gordon
+Hampton
+Hannah
+Harding
+Hartley
+Hatcher
+Hemphill
+Hess
+Holbrook
+Holliday
+Hood
+Hooker
+Horne
+Jacobsen
+Jeffers
+Kenny
+Langley
+Lara
+Looney
+Marcum
+Mayfield
+McCollum
+McGhee
+Mead
+Medrano
+Mercer
+Mora
+Morin
+Myers
+Nicholson
+Norman
+Ott
+Overton
+Pack
+Pagan
+Pelletier
+Pena
+Pennington
+Peters
+Phipps
+Poe
+Pruitt
+Rasmussen
+Roth
+Schaffer
+Schulz
+Sharpe
+Shea
+Shirley
+Soto
+Sparks
+Sprague
+Stafford
+Stephenson
+Suggs
+Tate
+Tyler
+Velasquez
+Walls
+Walters
+Webber
+Winston
+Wolff
+Woodruff
+Youngblood
+Yu
+Alston
+Christopher
+Cornell
+Culver
+Daley
+Fuentes
+Gaines
+Godfrey
+Gold
+Healy
+Henderson
+Hogan
+Hollis
+Jean
+Lunsford
+Munoz
+Nance
+Neal
+Ogden
+Peoples
+Reaves
+Samuel
+Shaffer
+Sheldon
+Staples
+Tackett
+Thorpe
+Vigil
+Waters
+Whitney
+Buckley
+Cates
+Doss
+Hardin
+Jolly
+Kimball
+Metz
+Preston
+Quick
+Read
+Sapp
+Tompkins
+Granger
+Louis
+Moreland
+Pool
+Sharp
+Alvarez
+Bautista
+Brand
+Cowan
+Duran
+Herman
+Norwood
+Presley
+Downey
+Joiner
+Dwyer
+Eastman
+Vera
+Puckett
+Estes
+Anbinder
+Aronowicz
+Axel
+Axelbrad
+Baarer
+Baran
+Barenzohn
+Barom
+Bartfeld
+Baum
+Berensohn
+Beres
+Birman
+Blaustein
+Blausztein
+Bleich
+Blitz
+Bobicz
+Breslaner
+Breslauer
+Bruh
+Buchsbaum
+Buksbaum
+Charman
+Chmelniker
+Chrousch
+Chrzan
+Chuwes
+Cimmelsohn
+Czaczke
+Deutsch
+Diener
+Dikes
+Dorfler
+Drathman
+Ehrenkranz
+Eizenhart
+Eksstein
+Ellenberg
+Erdheim
+Euenstein
+Fabak
+Fafler
+Feld
+Ferber
+Ferd
+Finkler
+Fischgold
+Fischhof
+Folger
+Freese
+Freiman
+Frischohl
+Fteiszfarb
+Fuchs
+Furischer
+Furmann
+Galanter
+Gedales
+Gelbhard
+Gelbtuch
+Glas
+Goldrosen
+Gotter
+Gottesmann
+Gottlieb
+Grossman
+Grunbaum
+Grunstein
+Gunsberg
+Gunzberg
+Haber
+Halpern
+Hamer
+Handschuh
+Handsohn
+Hansmann
+Herzfeld
+Hirschklau
+Hochberg
+Hornstein
+Horowitz
+Ilsker
+Jaworower
+Jefes
+Jegolnicer
+Joles
+Kaffebaum
+Kanarek
+Kanarik
+Kaniuk
+Kassner
+Kaul
+Keppel
+Kestenbaum
+Kleinberg
+Kornfeld
+Kornitzer
+Kosnetyner
+Kriewer
+Krimmer
+Kriwer
+Kunke
+Kupfer
+Kwasman
+Laks
+Lanzet
+Lewinter
+Lowensztark
+Mandel
+Mandelkern
+Mantel
+Marbach
+Marder
+Mariasz
+Matwes
+Mazi
+Menczel
+Menker
+Menkes
+Menkez
+Mersand
+Metzer
+Migden
+Mitelman
+Mittelman
+Monczer
+Morgenstern
+Motniak
+Nathansohn
+Neuman
+Ochsenhorn
+Peczenyk
+Pfefferbluth
+Plotzel
+Pohorylles
+Polki
+Precz
+Queller
+Rabinowicz
+Reichman
+Rendelstein
+Rondelstein
+Rosenstrauch
+Rosnitiner
+Rozenfeld
+Rozenhauch
+Rozensztrauch
+Sack
+Sak
+Schaller
+Schapire
+Scharfberg
+Scharfspitz
+Schechter
+Scheitel
+Schiner
+Schleyen
+Schonberg
+Schpigelblatt
+Schrank
+Schuler
+Schumsker
+Schupfler
+Schuster
+Schwarz
+Sigall
+Silberman
+Sommerstein
+Speiser
+Spiegel
+Spiezel
+Stand
+Staryk
+Steinbok
+Susserman
+Szarbark
+Szpigel
+Szulman
+Tabacznyk
+Tabak
+Tarantal
+Tarber
+Tauber
+Tennenbaum
+Thaler
+Treberman
+Tumim
+Turkel
+Turtykower
+Tyles
+Wachtel
+Weigler
+Weisser
+Weissmeht
+Wejntraub
+Weledniger
+Wiszniak
+Wurzel
+Wysznowitzer
+Zaks
+Zeid
+Zimer
+Zimring
+Zlatkes
+Zweig
+Zwickel
+Zwilling
+Akselbrad
+Allerhand
+Altneu
+Altstatter
+Atlas
+Auerbach
+Auerbauch
+Augapfel
+Augenblik
+Axelrad
+Baar
+Babad
+Bandler
+Barbasch
+Bardach
+Bardasch
+Baryl
+Bazar
+Bazilinski
+Beizer
+Belar
+Berenhaut
+Berhunker
+Berliner
+Berman
+Bezner
+Bialyk
+Biegeleisen
+Biler
+Bilewicz
+Billig
+Binstok
+Binsztok
+Birkenfeld
+Birnbaum
+Blumenfeld
+Bokserbaum
+Boksernbaum
+Bomse
+Bomze
+Bonde
+Borsuk
+Brandes
+Brandris
+Brandriss
+Breitman
+Breiz
+Bremer
+Breumann
+Brim
+Briner
+Bromberg
+Bronet
+Bruhl
+Brumer
+Brummer
+Chajes
+Chajit
+Charmann
+Chronisch
+Chronisz
+Chunes
+Chuzen
+Czeret
+Dankner
+Dawid
+Dechtar
+Diechter
+Diker
+Dligacz
+Douner
+Dresler
+Dressler
+Drucker
+Drut
+Druth
+Drutmann
+Dubienski
+Eisenhart
+Eisenmann
+Eisman
+Eitelberg
+Eizenberg
+Eizenstark
+Ekstein
+Elfenbeim
+Elfenbein
+Erdhein
+Exelbirth
+Feigenblatt
+Feintuch
+Felberbaum
+Feldmann
+Feller
+Fellgarber
+Fellstein
+Feuerstein
+Finkelsztein
+Finl
+Fischgall
+Fiszer
+Fittinger
+Fiul
+Fleischfarb
+Fleischhacker
+Flieg
+Flugelmann
+Frachtenberg
+Frak
+Francoz
+Frankel
+Franzos
+Freundlich
+Friedlander
+Friedmann
+Friehof
+Fuhrman
+Fuhrmann
+Furkel
+Gans
+Garfunkel
+Gartenberg
+Gehlbard
+Gelbart
+Gelber
+Gelbert
+Gendzier
+Genzer
+Gerje
+Getler
+Glanz
+Glaz
+Glazner
+Gligacz
+Goldfarb
+Goldlust
+Goldrozen
+Goldschein
+Gottesman
+Gottessman
+Gottfried
+Granman
+Grauman
+Ruhig
+Grossmann
+Gruber
+Grunberg
+Grunfeld
+Grunhaut
+Grunspan
+Grunszpan
+Guter
+Hak
+Halberstam
+Halster
+Hapter
+Hassoch
+Hausmann
+Heillmann
+Held
+Hellman
+Hellmann
+Henig
+Herstein
+Hersztein
+Hesten
+Hirschl
+Hirschorn
+Hirszberg
+Hochbaum
+Hollak
+Honig
+Horberg
+Horches
+Horchier
+Horcies
+Horees
+Horeies
+Ingwer
+Jampoler
+Jampuler
+Jaryczower
+Jeces
+Jecies
+Jegolnitzer
+Jolles
+Jorisch
+Jorysch
+Jorysz
+Joszp
+Joszpe
+Joszpy
+Kaczer
+Kaczor
+Kaffehbaum
+Kahane
+Kamchen
+Kamm
+Kanik
+Kanisz
+Kapelusz
+Karmin
+Kass
+Kaufmann
+Kerbman
+Kessel
+Kesten
+Kestenberg
+Kips
+Kitaj
+Kittaj
+Kiwetz
+Klang
+Kleinfeld
+Kleinman
+Kletzel
+Klotzel
+Klugman
+Klugmann
+Knotler
+Koffenbaum
+Koppel
+Korkus
+Kornberg
+Kornbluth
+Kostenbaum
+Krakauer
+Krell
+Krochmal
+Kultus
+Kumel
+Kupferwasser
+Kurfurst
+Kurmin
+Kwasmann
+Kwastel
+Kwaszes
+Landau
+Landman
+Landmann
+Later
+Laufer
+Lax
+Leibstein
+Leichter
+Lekach
+Lenczyc
+Lerner
+Lewites
+Liebster
+Lonczyc
+Low
+Lowenhart
+Lubianiker
+Luftig
+Lutwak
+Maiman
+Maimann
+Males
+Malies
+Margulies
+Markus
+Maryjasz
+Mauer
+Meersand
+Mehler
+Mendelsohn
+Metall
+Meyersohn
+Migdan
+Milter
+Mindes
+Moger
+Munz
+Nussbaum
+Oberlander
+Ochcies
+Ocheis
+Ohl
+Ohrenstein
+Ohrensztein
+Olinger
+Orenberg
+Orenstein
+Ort
+Ostersetzer
+Ostorsetzer
+Parnas
+Patetew
+Pechmann
+Perl
+Perlman
+Perlmann
+Peterzil
+Pick
+Platzman
+Podhorzer
+Pohoryles
+Polek
+Poliak
+Polik
+Poper
+Preis
+Preiss
+Preiz
+Pudless
+Queler
+Rachman
+Rachter
+Rauch
+Rawicz
+Rechel
+Rechter
+Reich
+Reichmann
+Reitman
+Rendelsztein
+Resch
+Rosenbaum
+Rosenblum
+Rosenhauch
+Rosenman
+Rosentrauch
+Rosenzweig
+Rothberg
+Rothstein
+Rotterssman
+Rozen
+Rozenberg
+Rozenblum
+Rozenmann
+Rozenohl
+Rozenschtrauch
+Rozensztok
+Rudbarck
+Salzinger
+Sammet
+Saphir
+Sass
+Sassower
+Schachter
+Schaf
+Schames
+Schapira
+Schechtmann
+Schenkel
+Schimer
+Schmajnik
+Schmajuk
+Schmergel
+Schmetterling
+Schmid
+Schmierer
+Schneiderman
+Schneidermann
+Schnirten
+Schorr
+Schulberg
+Schulman
+Schussel
+Schwadron
+Schwalb
+Schwamm
+Scmergel
+Segall
+Seidman
+Setner
+Setzerman
+Silbermann
+Silberstein
+Silbersztein
+Somerflek
+Sommer
+Sommerfeld
+Sommerfleck
+Spacierer
+Spiegelblatt
+Spiegelmann
+Spiesel
+Spirt
+Spizel
+Srebrna
+Starek
+Stiefelman
+Susser
+Sygall
+Szachowicer
+Szapira
+Szerman
+Szkolnik
+Szmergel
+Szmuger
+Sznur
+Szpeizer
+Szpiegel
+Szpringer
+Szpunberg
+Szteiger
+Szulbaum
+Szulmann
+Szumsker
+Szumski
+Szuster
+Szwarz
+Szymar
+Tabelman
+Tafler
+Teichholz
+Teitelbaum
+Tellig
+Tepper
+Tereszke
+Thiemen
+Thumem
+Tinkel
+Tisch
+Torczyner
+Trachtenberg
+Tumem
+Twischer
+Walach
+Waltuch
+Wasser
+Wasserstrom
+Wassersztrom
+Watler
+Webelmann
+Weieman
+Weiger
+Weihrauch
+Weinbaum
+Weinber
+Weinberg
+Weinreb
+Weintraub
+Weiser
+Weissnicht
+Weisstein
+Weisstopf
+Weitman
+Weiz
+Weizenberg
+Weksler
+Werber
+Wereszczuk
+Wiener
+Wiesel
+Wieselthur
+Wilner
+Winnikow
+Winograd
+Winogrod
+Winykow
+Witrial
+Wittels
+Wolfenhaut
+Wolfzahn
+Wortsmann
+Worzsman
+Wotycer
+Wynikow
+Wyszniak
+Wysznik
+Zeiler
+Zeitlich
+Zelnik
+Ziarkower
+Ziemelsohn
+Zimerman
+Zimmermann
+Zipper
+Zlatkis
+Zwerdling
+Zwikel
+Ackmann
+Aker
+Aszkenaze
+Atlass
+Augenblick
+Barenhaut
+Barensohn
+Berenohn
+Berggrun
+Bieler
+Birnberg
+Bondar
+Branner
+Brennman
+Brun
+Byk
+Cham
+Donner
+Dratman
+Dunner
+Essel
+Eulenberg
+Feichholz
+Feriszke
+Fiszgold
+Flaks
+Flaschen
+Frauenglaz
+Freudenthal
+Frischein
+Fruchtman
+Furman
+Gehlband
+Gelbfarb
+Gertler
+Grosberg
+Grossberg
+Grun
+Hecht
+Helfer
+Hiess
+Hirsch
+Holrych
+Iger
+Jakob
+Jeczes
+Jejces
+Kas
+Kellman
+Kepferwasser
+Kleiner
+Klippel
+Kohn
+Kormann
+Kozower
+Krakaner
+Kramarz
+Kwassmann
+Kweller
+Kwietz
+Landesberg
+Liebergall
+Lorber
+Lowenstark
+Lutwag
+Madfess
+Mandelkorn
+Marmurek
+Mazie
+Meistrich
+Milgrom
+Mondschein
+Nemerower
+Orchicz
+Oryl
+Permisohn
+Philipp
+Pieczenik
+Pikholz
+Plasker
+Platzel
+Platzmann
+Pletzel
+Posaner
+Pudles
+Ramer
+Rappaport
+Rondelsztein
+Rosenfeld
+Rozenbaum
+Rozenstrauch
+Salcinger
+Samet
+Scharf
+Schenker
+Schleien
+Schonbrun
+Schor
+Schwam
+Seideler
+Seidler
+Seliger
+Sielbermann
+Sierot
+Speizer
+Suserman
+Szimmer
+Szulberg
+Szymer
+Tattelbaum
+Thei
+Verstandig
+Wachter
+Wahrhaftig
+Weinfeld
+Weisstaub
+Weitmann
+Weledniker
+Werberg
+Winterfeld
+Wolicer
+Zwanger
+Zwidling
+Acker
+Altney
+Aufrecht
+Barski
+Bazilynski
+Bazylinska
+Bazylinski
+Berkowicz
+Bermann
+Blecher
+Blitzstein
+Brecher
+Brenmann
+Brimmer
+Buxbaum
+Chajet
+Charik
+Chuwen
+Czaczkes
+Czarnobiski
+Dawner
+Dlugacz
+Epstein
+Federschneider
+Fereszki
+Finkel
+Fleiszfarb
+Forster
+Fruks
+Gatter
+Gelband
+Gelbard
+Gelles
+Goldschmied
+Gondzior
+Gutter
+Hagel
+Herzenstein
+Hirschberg
+Hirschel
+Hirszhorn
+Horehier
+Jaecies
+Jariczower
+Jawetz
+Kiezelstein
+Kiwitz
+Knipper
+Krampf
+Kraus
+Kruh
+Kwassman
+Landesbaum
+Lehrner
+Liebling
+Lowenhar
+Mager
+Margules
+Marmorek
+Messing
+Nacht
+Ochl
+Ohrberg
+Parnass
+Parnes
+Parness
+Pechman
+Perlmutter
+Pohryles
+Polke
+Popowicz
+Ryzyder
+Schimmer
+Schonhaut
+Schulmann
+Schwager
+Schwarzman
+Seid
+Seidel
+Sielberman
+Sierota
+Silberberg
+Silberfeld
+Sohl
+Spieler
+Spunberg
+Strumpfler
+Sussermann
+Taffler
+Tennen
+Thaub
+Thierhaus
+Tolczyner
+Tuchs
+Tuchscherer
+Untermann
+Walkenberg
+Webelman
+Wechsler
+Weissberg
+Weissbrod
+Weissmann
+Weistaub
+Wolkenberg
+Zauber
+Zauberman
+Zellermeyer
+Zimmer
+Brimm
+Fleischhaker
+Kerdmann
+Kleinmann
+Rossman
+Schreyer
+Slonimsk
+Somerstein
+Teplicki
+Zilz
+Zimermann
+Zukerman
+Dyszel
+Eismann
+Finkelstein
+Ginssberg
+Kirszner
+Madfes
+Mai
+Niemerower
+Sigal
+Thiemem
+Zeimer
+Barak
+Bienstock
+Kerdman
+Kieselstein
+Krach
+Mordkamm
+Baramm
+Drutman
+Kosten
+Rejkus
+Vogelbaum
+Hirschhorn
+Jejcies
+Kestenband
+Landsmann
+Steig
+Schochet
+Leiner
+Altgeld
+Osborn
+Real
+Maeda
+Graham
+Edwards
+Hockenberry
+McCain
+Heffernan
+Battelle
+Mole
+UnitTestParamilita
+UnitTestMain
+UnitTestWaffled
+UnitTestComer
+UnitTestCataloguin
+UnitTestBribery
+UnitTestTopologica
+UnitTestDisobliged
+UnitTestBuckler
+UnitTestTaejon
+UnitTestMountbatte
+UnitTestMaxillary
+UnitTestEnvisages
+UnitTestVerdure
+UnitTestImpossibil
+UnitTestCompromise
+UnitTestDenebola
+UnitTestChurch
+UnitTestAffliction
+UnitTestLuanda
+UnitTestPolyhymnia
+UnitTestOsborn
+UnitTestLawfulness
+UnitTestPhysicking
+UnitTestDisinteres
+UnitTestDarrin
+UnitTestDevalued
+UnitTestLeeward
+UnitTestExculpated
+UnitTestPerching
+UnitTestExits
+UnitTestCockleshel
+UnitTestMawkish
+UnitTestVandal
+UnitTestUnproved
+UnitTestTheories
+UnitTestSal
+UnitTestMilk
+UnitTestOshawa
+UnitTestGangland
+UnitTestBanks
+UnitTestFootman
+UnitTestMedallions
+UnitTestCoffees
+UnitTestAccustom
+UnitTestCaroler
+UnitTestControlled
+UnitTestDickens
+UnitTestAnesthetis
+UnitTestSalvadoran
+UnitTestDrywall
+UnitTestWindiness
+UnitTestHearsay
+UnitTestLoosen
+UnitTestWon
+UnitTestSaigon
+UnitTestRereads
+UnitTestCircumscri
+UnitTestRusty
+UnitTestSnouts
+UnitTestVagueness
+UnitTestEcclesiast
+UnitTestTinseltown
+UnitTestNationalis
+UnitTestMedici
+UnitTestNeighborho
+UnitTestPollutant
+UnitTestGuaranteed
+UnitTestUnite
+UnitTestGiovanni
+UnitTestCollusive
+UnitTestAquila
+UnitTestSafeguards
+UnitTestWhilst
+UnitTestReelects
+UnitTestConcession
+UnitTestCovey
+UnitTestAmplificat
+UnitTestGrazed
+UnitTestHeadmaster
+UnitTestPeru
+UnitTestWeeknight
+UnitTestTwitters
+UnitTestIndustrial
+UnitTestKeepers
+UnitTestLiverpudli
+UnitTestKaput
+UnitTestPoems
+UnitTestEtymologis
+UnitTestAvatar
+UnitTestShuttlecoc
+UnitTestStraightja
+UnitTestSewage
+UnitTestAccretion
+UnitTestMonologgin
+UnitTestBowstrings
+UnitTestGashing
+UnitTestNaturalize
+UnitTestRefraction
+UnitTestBedder
+UnitTestBands
+UnitTestJoy
+UnitTestTine
+UnitTestSavant
+UnitTestWriggler
+UnitTestDanubian
+UnitTestBattery
+UnitTestCourthouse
+UnitTestWharton
+UnitTestWatusi
+UnitTestYesterdays
+UnitTestBernardo
+UnitTestDecrescend
+UnitTestFrocks
+UnitTestRecipe
+UnitTestStruck
+UnitTestBlazer
+UnitTestJosue
+UnitTestHostelling
+UnitTestFibroid
+UnitTestSpiffies
+UnitTestSnailed
+UnitTestSolomon
+UnitTestWaltzing
+UnitTestStepmother
+UnitTestSkater
+UnitTestSteroid
+UnitTestLocalizati
+UnitTestMollifying
+UnitTestParity
+UnitTestBriefcase
+UnitTestPond
+UnitTestPym
+UnitTestSneeringly
+UnitTestManifestat
+UnitTestFrothier
+UnitTestHookier
+UnitTestSarsaparil
+UnitTestIrtish
+UnitTestNehemiah
+UnitTestAlistair
+UnitTestThreatens
+UnitTestFebruary
+UnitTestBashfully
+UnitTestCartridge
+UnitTestPeed
+UnitTestSwampier
+UnitTestMistassini
+UnitTestReassess
+UnitTestMusicals
+UnitTestForeseeabl
+UnitTestFo
+UnitTestRowboats
+UnitTestArroyo
+UnitTestAgnes
+UnitTestSpooky
+UnitTestDachau
+UnitTestOfferings
+UnitTestProfession
+UnitTestMust
+UnitTestProceeding
+UnitTestSelfish
+UnitTestAsserting
+UnitTestAcquitting
+Banufong
+Bellic
+Bookmite
+Galicia
+Hellershanks
+Lorefield
+Mimulus
+Osterham
+Parx
+Seriman
+Shelman
+Shippe
+Snoodle
+Szczepanski
+Uladstron
+Ansar
+Blaisdale
+Bravin
+Dubrovna
+Finesmith
+Footman
+Gothly
+Gurbux
+Inglewood
+Jarvinen
+Landar
+Luik
+Mavendorf
+Naidoo
+Nootan
+Penucca
+Pevensey
+Poliatevska
+Quan
+Rhiadra
+Siamendes
+Skytower
+Susanowa
+Thespian
+Twine
+Ugajin
+Weezles
+Whybrow
+Xeltentat
+Zapatero
+Andel
+Baxton
+Borkotron
+Burnstein
+Clowes
+Constantine
+Denimore
+Dezno
+Ethaniel
+Exonar
+Fhang
+Fiertze
+Franizzi
+Guisse
+Haystack
+Heliosense
+Jayaram
+Juliesse
+Kaligawa
+Karu
+Kelberwitz
+Khandr
+Koskinen
+Larnia
+Lupindo
+Magic
+Michigan
+Minotaur
+Moonites
+Morpork
+Mubble
+Muhindra
+Muircastle
+Navarathna
+Olifone
+Paule
+Quandry
+Quintessa
+Ragu
+Raviprakash
+Robonaught
+Seetan
+Sirnah
+Sorbet
+String
+Svoboda
+Triellis
+Tunwarm
+Vaher
+Vlodovic
+Wemyss
+Xue
+Yuitza
+Zessinthal
+Helendale
+Perduco
+Prim
+Mono
+Reis
+SimoneDesign
+Honda
+Umusic
+Uphantis
+Angelot
+Hanso
+Brunozzi
+Rice
+Behrend
+CokePremiereGuest
+Underhill
+Diageo
+Dillon
+Headey
+Gerkens
+Bugra
+Lemeur
+Lempert
+Goodwin
+Gourgeon
+Parra
+DuranDuran
+McMurray
+Lichtenstein
+Liguori
+Mule
+Andreessen
+TUVNORD
+Unilever
+GKteen
+Armidi
+ISID
+SParker
+Accubee
+OzIslander
+Schomer
+Renaud
+Lanier
+AmericanCancer
+MLCAmicus
+SportRelief
+CarterFinancial
+Calmund
+Helnwein
+Whammy
+Lenhardt
+Ruso
+Wagner
+Carey
+Casaca
+Fagiola
+MLCAU
+Fake
+Radiks
+Parkinson
+UnitTestImprecisio
+UnitTestObsequious
+Adamski
+Amaterasu
+Ametza
+Aristocrat
+Ashdene
+Belgar
+Beverly
+Bolissima
+Breen
+Caerndow
+Ceriano
+Cooperstone
+Diavolo
+Diesel
+Dirval
+Easterwood
+Eberhardt
+Firanelli
+Foxtrot
+Fromund
+Genira
+Gravois
+Hancroft
+Hendrassen
+Hermit
+Jigsaw
+Jumanya
+Kaestner
+Kiranov
+Kranfel
+Lannock
+Lefevre
+Lemon
+Levenque
+Lorgsval
+Luminos
+MacMoragh
+Mefusula
+Michalski
+Mirajkar
+Mistwallow
+Mortenwold
+Muggins
+Netizen
+Nubalo
+Oanomochi
+Odigaunt
+Palianta
+Parkin
+Paulino
+Plutonian
+Pobieski
+Putzo
+Raghilda
+Rajal
+Renfold
+Rexen
+Scarmon
+Scribe
+Seoung
+Serpente
+Sharple
+Shinn
+Simondsen
+Sporg
+Swashbuckler
+Sweetwater
+Teardrop
+Tharnaby
+Tiratzo
+Turbo
+Udimo
+Urvilan
+Waffle
+Windlow
+Wirefly
+Wulluf
+Zanzibar
+Beningborough
+Haefnir
+Karillion
+Martian
+McMinnar
+Savira
+Sideshow
+Yedmore
+Braveheart
+Vayandar
+DavidStern
+RoyalDutchShell
+Royal
+Knighton
+SIMA
+Silver
+Haleti
+Hillburn
+Burner
+Abbal
+futuresource
+RBS
+Bostonian
+KingdomCome
+Denk
+Fidelity
+Lamonica
+Raccoon
+Serafini
+Storm
+Tiffany
+KaySlay
+MorenoOcampo
+Abeyante
+Aboma
+Aboubakar
+Alecto
+Algoma
+Ampan
+Andretti
+Arbenlow
+Arriaga
+Avril
+Azalee
+Baguier
+Balazic
+Bartavelle
+Beeswing
+Bigbear
+Bikergrrl
+Bluxome
+Bouscario
+Bowenford
+Brandi
+Cabassoun
+Caggles
+Canucci
+Carami
+Cardalines
+Carissa
+Carpaccio
+Cascarino
+Cerise
+Choovio
+Clarity
+Coba
+Coleslaw
+Collazo
+Core
+Crazyboi
+Cvercko
+Cyberschreiber
+Czartza
+Darkfold
+Dawodu
+Delicioso
+Delvalle
+Dembo
+Digfoot
+Dotterkelch
+Dover
+Drezelan
+Dubratt
+Enderfield
+Enyo
+Eourres
+Erin
+Fanbridge
+Farigoule
+Foxclaw
+Frimon
+Funizza
+Goldshark
+Gummibaum
+Haiku
+Halostar
+Hazelnut
+Hepzipig
+Hernandoz
+Himanez
+Hinterland
+Hoffnung
+Huckleberry
+Humburg
+Hunniton
+Inaka
+Inkpen
+Intermenos
+Ireman
+Ivanovic
+Jinx
+Juanos
+Jyraffe
+Kahanamoku
+Kalinakov
+Kamala
+Kanya
+Kelberry
+Keng
+Kenin
+Kimono
+Koopastown
+Koray
+Kytori
+Krautrauch
+Krokus
+Lacombe
+Lamilton
+Landfall
+Langstrumpf
+Lavendel
+Lecker
+Lenroy
+Levee
+Lexenstar
+Lorakeet
+Loudwater
+Mahogany
+Marabana
+Marioman
+Marville
+Menizah
+Miami
+Moleno
+Monigal
+Moonwall
+Moriguchi
+Myrtle
+Nandahar
+Navarita
+Naxos
+Nayar
+Neiro
+Oatsmill
+Odisark
+Ohmai
+Okelli
+Oller
+Omizu
+Oompa
+Paneer
+Pawpad
+Peapod
+Petrovic
+Piers
+Placebo
+Pluvences
+Pooley
+Portland
+Pralou
+Puddlegum
+Quicksand
+Radikal
+Rascon
+Revestel
+Roecastle
+Rothmanay
+Rugani
+Ruissatel
+Sabra
+Salamander
+Sandalwood
+Schnute
+Sciavo
+Seerose
+Shelbyville
+Shilling
+Shim
+Sixpence
+Skizm
+Skute
+Socke
+Sonnenkern
+Spargel
+Sparta
+Stourmead
+Stratten
+Strazytski
+Streusel
+Sugarplum
+Suppenkraut
+Swansong
+Swords
+Tigerauge
+Tigerfish
+Tiponi
+Tiraxibar
+Torvalar
+Tungsten
+Tyran
+Ushimawa
+Vaniva
+Varnish
+Warbaum
+Wickentower
+Wirsing
+Wizenheim
+Xaris
+Xenno
+Yakubu
+Yarrowroot
+Yootz
+Yuhara
+Zadark
+Zeplin
+Zepp
+Ziplon
+Zsun
+Alan
+Eye
+Gillmor
+PontiacGXP
+Ropler
+Abrastraza
+Aljon
+Asamoah
+Aurotharius
+Aycliffe
+Baragula
+Bayn
+Belavidorico
+Berithos
+Braham
+Brinner
+Button
+Byron
+Caerntown
+Chaplynski
+Charisma
+Chau
+Chieng
+Chrome
+Cifuentes
+Cisse
+Copperfield
+Coulibaly
+Cyberstar
+Czavicevic
+Daffyd
+Daxeline
+Daxter
+Debbel
+Dereham
+Direwytch
+Domenitzo
+Donogal
+Draconia
+Earst
+Edelmann
+Eiren
+Ellisson
+Emor
+Engineer
+Falconer
+Farquart
+Fensen
+Fenutzini
+Ferryhill
+Foehammer
+Follet
+Frenburg
+Galaxy
+Garaguru
+Gartner
+Geraln
+Ghost
+Grantham
+Grayman
+Gridolfo
+Guardian
+Haalan
+Hammand
+Heninga
+Horatio
+Huntress
+Ireto
+Ivercourt
+Jardberg
+Jolbey
+Kabila
+Karfield
+Keneinan
+Kimagawa
+Kitalpha
+Kristan
+Latzo
+Lauria
+Leborski
+Leistone
+Leitner
+Lerintzo
+Lethecus
+Lionheart
+Lisa
+Longfall
+Macalroy
+Macarthur
+Macbain
+Madrigal
+Madruga
+Masingh
+Maskelyne
+Maven
+Mavinelli
+McAndrews
+Melody
+Menna
+Metaller
+Mexicola
+Millet
+Milneaux
+Monacular
+Mosely
+Neox
+Nexen
+Nizna
+Ocello
+Ogleby
+Ogrimund
+Olivieri
+Ordinary
+Ormstein
+Palmira
+Panthar
+Paragorn
+Parfort
+Passariello
+Pearl
+Peretz
+Pleides
+Popstar
+Python
+Qendra
+Quar
+Ranimo
+Raynier
+Rebane
+Rembranch
+Renfew
+Rexie
+Rodas
+Ronas
+Ruby
+Rudolf
+Sabetha
+Sabretooth
+Saxmundham
+Scarbridge
+Seubert
+Shamen
+Shoreman
+Silvercloud
+Snowpaw
+Spore
+Steampunk
+Sveiss
+Swordthain
+Tamatzui
+Tchailenov
+Teodosio
+Terasaur
+Thiessam
+Titanium
+Tremor
+Trizomu
+Ulrik
+Valeska
+Vanistok
+Velinov
+Verwood
+Vintner
+Violet
+Vyper
+Walamai
+Walmer
+Walpanheim
+Warwillow
+Webwyre
+Westminster
+Wetherby
+Winstanley
+Ying
+Zaurak
+Zaytsev
+Zdychava
+Cristole
+Umino
+Wasp
+Bradford
+Cyanic
+Eisner
+Koppejan
+Lynx
+FilsAime
+Gingrich
+Higgins
+vLearning
+UH
+Reavis
+keres
+Unito
+Chauliac
+WOSP
+babbler
+Strawberry
+Tequila
+TM
+xAlixia
+Alchemi
+Aldrin
+Alenquer
+Aquila
+Aristocarnas
+Auster
+Avedon
+Azambuja
+Azemus
+Baily
+Barcelos
+Baudin
+Bellingshausen
+Bigboots
+Blackbart
+Blackheart
+Blauvelt
+Blaylock
+Bowdit
+Broadfoot
+Broono
+Bruun
+Burckhardt
+Capelo
+Carrasco
+Carstensz
+Ceriaptrix
+Charlegorn
+Chronowire
+Correia
+December
+Deezul
+Denver
+Dexing
+Diabolito
+Difference
+Dragovar
+Eberdene
+Elcano
+Eleonara
+Fadlan
+Fhloston
+Finchy
+Finistair
+Flinders
+Floresby
+Frychester
+Gabilondo
+Garnburg
+Gloom
+Grau
+Greybeard
+Halsey
+Hamelin
+Hannu
+Henusaki
+Hexicola
+Hinchcliffe
+Horngold
+Horsley
+Huncke
+Hydraconis
+Ishtari
+Jenipe
+Juneberry
+Jupiter
+Kawadias
+Kling
+Kozlov
+Langsdorff
+Lavradorio
+Lourbridge
+Lowtide
+MacFanatic
+Malaspina
+Marialla
+Mascarenhas
+McGillivary
+Medier
+Megadon
+Meridoc
+Metaluna
+Mocha
+Mohegan
+Monday
+Monokarlsefni
+Myanamotu
+Nachtigal
+Naimarc
+Naminosaki
+Nansen
+Nirvana
+Nordenskiold
+Oakleaf
+Oleander
+Optera
+Orellana
+Orfan
+Ormega
+Overland
+Pelliot
+Perdide
+Perian
+Petrolhead
+Pexington
+Philly
+Pizzaro
+Portal
+Porthos
+Przhevalsky
+Rae
+Raleigh
+Razorfen
+Redyard
+Renierd
+Rewell
+Ricantaur
+Riddler
+Rubanis
+Schneuta
+Seljan
+Serendipity
+Serenity
+Serrao
+Shackleton
+Shieldmaiden
+Shuffle
+Soulstar
+Steamer
+Steamweaver
+Straulino
+Stromfield
+Strzelecki
+Tenenbaum
+Texan
+Thorkveld
+Torkelsonn
+Treves
+Trezuguet
+Tsunenaga
+Tylman
+Ubert
+Umbarundu
+Unplugged
+Urdaneta
+Uxlay
+Vectoscope
+Velde
+Verrazzano
+Vespucciano
+Wardell
+Warden
+Waverider
+Wheatcliffe
+Woodrunner
+Xomotron
+Xuanzang
+Yangtz
+Yheng
+Zarco
+Zifanwe
+Arabello
+Bloobury
+Buccaneer
+Fazuku
+Firecaster
+Furuseth
+Gearbox
+Genezzia
+Hanly
+Hassanein
+Herbit
+Karsin
+Kozlowski
+Lamplight
+Loopen
+Pyrithea
+Qork
+Seminario
+Senizen
+Shamrock
+Strathearn
+Verne
+Vyceratops
+Yordstorm
+Zemenis
+Kegel
+Szentmartony
+Teixeira
+Glassman
+Lashes
+YouthVenture
+Tameside
+Naughty
+Actor
+Antiesse
+Anton
+Appletor
+Audeburgh
+Badger
+Benusconi
+Bilasimo
+Bluebird
+Brentley
+Brianna
+Brune
+Brunswick
+Carfield
+Carlucci
+Causten
+Charlesworth
+Chun
+Clarence
+Crumb
+Daines
+Danick
+Danitz
+Davidov
+Dinzel
+Ditko
+Dockal
+Endsleigh
+Enimo
+Eppenberger
+Evanier
+Falodir
+Ferina
+Fireguard
+Flagon
+Foxdale
+Frakture
+Francois
+Galtier
+Galuptra
+Ganloso
+Garobie
+Gearhead
+Giordano
+Glom
+Hambleton
+Hansome
+Haroldsen
+Harvy
+Hawksby
+Hendes
+Humbridge
+India
+Innovia
+Islay
+Josephina
+Kira
+Kobichenko
+Korbitza
+Mekanic
+Meskin
+Migpalion
+Miliandrovic
+Mint
+Moorsider
+Munforth
+Muramabhad
+Pedalo
+Pollemis
+Qarnac
+Rajesh
+Renfort
+Roxley
+Sahara
+Schmidtzau
+Silversmith
+Somerset
+Steerpike
+Stradjinski
+Taurus
+Threebeards
+Udein
+Umia
+Underby
+Veeper
+Viatruso
+Viper
+Wardark
+Weimes
+Wellesley
+Woodford
+Xenobuilder
+Xigalia
+Yacubsen
+Yearsley
+Yiwama
+Zackerly
+Zenfold
+Arrowmint
+Calamity
+Chiung
+Easterling
+Frostbite
+Hammerthall
+Harumabhad
+Helstein
+Ichtama
+Jenvieve
+Jonstone
+Jurassic
+Larimal
+Lexington
+Mohindi
+Quinzet
+Solo
+Adder
+Aries
+Zero
+Mayhem
+Luper
+Quartz
+Crystal
+Fang
+Gearz
+Chauveau
+Barrowstone
+Cheng
+Coberts
+Hallison
+Istmal
+Joseppe
+Kalamunda
+Bunjie
+Bumblefoot
+Boxen
+Couturier
+Marenwolf
+Rizooto
+Bernheim
+Cyannis
+Lavecchia
+Mildor
+Neximus
+Scrabblebat
+Smithson
+Abbot
+Alex
+Annamemnon
+Artful
+Batriani
+Bodenhall
+Bombastic
+Boszormeny
+Bressig
+Brongniart
+Brucato
+Caffarelli
+Caultard
+Citron
+Claven
+Curameyer
+Damiano
+Darbyshire
+Denfu
+Dimitriaski
+Earleno
+Ectonite
+Edenbaum
+Farshore
+Firehawk
+Forsythe
+Freng
+Fretwerk
+Frostwych
+Gargasaur
+Garnet
+Gavenkrantz
+Gilgandra
+Grashnar
+Harbrough
+Heungsung
+Hindrabar
+Hoxley
+Ishmene
+Jiersen
+Junibalya
+Kalnoky
+Karlsvalt
+Kaventipovic
+Kerang
+Kobaleinen
+Langer
+Lanley
+Lawksley
+Lectar
+Leeeroy
+Leimes
+Lemton
+Lennie
+Lexico
+Magnifico
+Malifozik
+Malisotops
+Manimbo
+McKeenan
+McWinnie
+Meriadoc
+Minoptra
+Mistwalker
+Mongrain
+Oberueng
+Olihenge
+Ormenthal
+Orsini
+Oximoxi
+Padroclum
+Paolino
+Piancastellios
+Pixelmaid
+Podlum
+Quinote
+Rallier
+Rembrandt
+Rhiannyr
+Roddenham
+Scholessinger
+Scorfield
+Sharpshire
+Silverfall
+Trapdoor
+Untermeyer
+Vemo
+Wahwah
+Werefox
+Wikifoo
+Wylder
+Xevion
+Yardley
+Yven
+Zeminoba
+Zobovic
+Zufreur
+Nyoki
+Poulter
+Fierenza
+Pelazzi
+Lamplugh
+Riaxik
+Podless
+Dexler
+Kaliopov
+Arentire
+Quihoxil
+Zuta
+Gant
+Alderton
+Krutschek
+Teriatzi
+Idlemind
+Endrizzi
+Corryong
+Afterthought
+Starsider
+Gyranaut
+Raygunn
+Duranske
+PrimeLab
+LevelTwentyFive
+Papadopoulos
+Armstrong
+Kim
+Maker
+Pico
+Apple
+Museum
+SEN
+Abrahams
+Adored
+Allardyce
+Arun
+Audion
+Audurburgh
+Baddingham
+Batistuta
+Beamish
+Beninzap
+Beorn
+Beornssen
+Bhalti
+Blogfan
+Blogger
+Bohemian
+Bonham
+Borgin
+Breil
+Calcutt
+Carminucci
+Catronis
+Chayoo
+Chiantelle
+Chingseng
+Chiwanga
+Christenson
+Chronometrist
+Claridge
+Crannock
+Dartmouth
+Darwinian
+Davi
+Davidovasic
+Dighno
+Dorchester
+Eddenbaum
+Ellsmere
+Elton
+Emerald
+Fairport
+Fallen
+Farspire
+Fenstalker
+FLux
+Foodiboo
+Garsdale
+Geordie
+Grantly
+Harcourt
+Hixantapo
+Inniatzo
+Inventor
+Jhamin
+Jovinavic
+Kariunga
+Kaufmat
+Kayor
+Kinomis
+Klavinham
+Larimore
+Laviscu
+LittleBoots
+Loordes
+Lowbeam
+Maesar
+Mattercaster
+Mendle
+Messinez
+Miggins
+Mixemup
+Molinaxil
+Molko
+Monitor
+Mordly
+Mortensen
+Murfin
+Newey
+Nider
+Nissondorf
+Northman
+Onyett
+Ozigard
+Panache
+Patrucci
+Pexie
+Pinelli
+Plassitz
+Porchers
+Portilo
+Qissinger
+Quixote
+Quorzar
+Qvetcher
+Ravinelli
+Reanimator
+Reilig
+Reinerman
+Rhapsody
+Rodex
+Rookstown
+Rubermeyer
+Runner
+Sapphire
+Scarfould
+Scientist
+Sharktooth
+Silverweb
+Smedley
+Sockington
+Southmoor
+Spanton
+Starship
+Stipe
+Svenson
+Swansen
+Tierbal
+Topaz
+Tyrellium
+Urnestone
+Waddington
+Warilard
+Warrhol
+Wexhome
+Winslet
+Winsmore
+Wonder
+Wrexan
+Xorbun
+Xubersnak
+Yanimayer
+Zebendein
+Zeitman
+Zelin
+Aghurabor
+Arkright
+Auxifur
+Batista
+Dionysus
+Duffield
+Euromat
+Frentis
+Ghiardie
+Glendale
+Jaggernov
+Oberts
+Parabola
+Ubble
+Yazimoto
+Yebut
+Edenflower
+Mowadeng
+Khalim
+Mumsat
+Sofinco
+Stevens
+Resonance
+Pathfinder
+IntelEmbedded
+Uresti
+CSC
+Lauren
+Comsys
+ImmersiveWorkspaces
+ThetiSheri
+Sharpesworth
+Kenyon
+Caiben
+Sleydon
+Rioccan
+Feila
+Phelan
+Whelan
+Verino
+Kalchek
+Limonaxit
+Hatchuk
+Slingshot
+OHanlon
+OHare
+Oddenfen
+Orcenhall
+Oppenbaum
+Loxingly
+Loxtonian
+Poleni
+Pappentas
+Eddingham
+Qissentell
+Qoida
+Querilo
+Weirsider
+Kolonimann
+Haustraun
+Pottzen
+Stroikavskoi
+Juventa
+Braumley
+Audebarn
+Gedenspire
+Darkwatch
+Caeran
+Cuthbertsson
+Hammill
+Tremmor
+Icthan
+Iadyl
+Iramesius
+Hema
+Jiadom
+Janic
+Cliassi
+Fetiocci
+Reluin
+Admiral
+Saxondale
+Slafford
+Shoreland
+Spires
+Selona
+Seda
+Drammond
+Claremont
+Eyre
+Melgund
+Canonmill
+Doune
+Leamouth
+Porterfield
+Pennent
+Dragoone
+Clarrington
+Ormidale
+Murrayforth
+Glendevon
+Marshdevil
+Mothman
+Alderbury
+Merchiston
+Marchant
+SecretSpy
+Moorlord
+Rofanui
+Colinsgrove
+Millar
+Cluny
+SpiritWeaver
+Burnesdean
+Luckstone
+Caedmon
+Ghennyn
+Derryth
+Fearguis
+Ibor
+Odgar
+Leodhais
+Drachnyd
+Emodemon
+Skeltragor
+Bardenboar
+Bearsfoot
+Wrydan
+Xonfor
+Xurina
+Zalivstok
+Zunimoor
+Zulaman
+Genopeak
+Balzibo
+Ranimodo
+Rufus
+Riler
+Toxx
+Hareshide
+Sheryffe
+Morlim
+TopHat
+Crescendo
+Composer
+Herriat
+Naire
+Namiboo
+Nowles
+Neutron
+Darkmatter
+Dimanovic
+Slavicz
+Penberg
+Horchester
+Edring
+Cybertar
+Spingflower
+Gracemount
+Carolina
+Torrance
+Camino
+Avon
+Applewhyte
+Leonoase
+Tragonach
+Bregonis
+Kruyschek
+Feden
+Nuubert
+Edwardstone
+Aonifall
+Jestyr
+DX
+Harlander
+Dirkle
+Drascol
+Renilo
+Narstrom
+Venenbaum
+Serupta
+Ghanduhar
+Messioptra
+Meiler
+Ordram
+Faudeburgh
+Xenga
+Ahren
+Loxely
+Absent
+Jules
+Jeriamas
+Teromaximus
+Vesuvino
+Bradders
+Scorpio
+Wurgle
+Queenstown
+Pookes
+Hoyes
+Oliphaunt
+Sharkfin
+Deanimator
+Catnap
+Doghouse
+Harcassle
+Ysabel
+Luckless
+Freidman
+Trallis
+Urvile
+Jorgental
+Mode
+Frugel
+Hornbridge
+Demonista
+Bakerly
+Irelund
+Moyet
+Wizardly
+Ishelwood
+Genna
+Fetuccio
+Liamano
+Deed
+Endersleigh
+Lycheborne
+Mirabella
+Alphaville
+Oskar
+Gauntley
+Grafta
+Highfield
+Canningham
+Oridium
+Omegaman
+Frequency
+Gradenko
+Soup
+Madzuko
+Static
+Zeritonga
+Collinson
+Roxan
+Bramlington
+Hillburton
+Genesis
+Furlough
+Melodie
+MacIntyre
+Mactavish
+Farrior
+Rumble
+Lemondrop
+Zane
+Sauber
+Footpad
+Mhia
+Leissa
+Mumblewood
+Kingmaker
+Ronwood
+Warcliffe
+Mesmeriser
+Souther
+Cartauld
+Sorrowman
+Modan
+Adderstein
+Holmeforth
+Peliatropis
+Montpenier
+Salubria
+Faith
+Sporaciao
+Elan
+Towton
+Spiritor
+Fairlady
+Mixmaster
+Glendullen
+Glenfadden
+Glenwalker
+Blindside
+Barnside
+Ruben
+Listern
+Radmussen
+Falmer
+Bernitz
+Linette
+Bulmer
+Korpov
+Robespear
+Ashmoot
+Weirman
+Deimatov
+McAuley
+McMahn
+Macpherson
+Macbeth
+Hadisson
+Bergan
+Abonwood
+Stormcrow
+Aulder
+Yorcliffe
+Mellison
+Fenwitch
+Lysette
+Giranamo
+Southpaw
+Bravitz
+Kroitschov
+Modesto
+Nixon
+Leister
+UnitTestSalivating
+UnitTestRogers
+UnitTestThrongs
+UnitTestRifer
+Manager
+Famous
+Primsmith
+Beauty
+Knightpoint
+Buster
+UnitTestExpunging
+Expunging
+Jamkarta
+Niosaki
+Zimberman
+Renobaum
+Refenoir
+Esharham
+Barangaham
+Misupor
+Hadazuma
+Reikaz
+Mofanui
+Stoanes
+Rexerzon
+Breadbin
+Poida
+Undamann
+Zamarung
+Deischer
+Viertz
+Volotenko
+Valimedzic
+Koronikov
+Ullawaio
+Ferengeto
+Ixtar
+Ermintrood
+Qargen
+Classito
+Kontucci
+Limondi
+Serrari
+Naopolitana
+Numbanumba
+Rookswood
+Aedipo
+Novaland
+Hartle
+Qelmo
+Jillybean
+Dorben
+Geddins
+Yowman
+Beedit
+Emolite
+Warziders
+Knave
+Loorden
+Sarjeant
+Juisser
+Jeruben
+Kaptane
+Mondalimare
+Yorkiv
+Bardeslaw
+Sheriffe
+Quillitch
+Expiento
+Redinamus
+Lekvoda
+Massivitus
+Warbunsee
+Hubbenfluff
+Starsmith
+Dethly
+Shelter
+Raremaster
+Redenblack
+Earthboy
+Mistwood
+Snowbear
+Winterwolf
+Luponox
+Wassep
+Avonside
+Serrta
+Mammoth
+Darmoset
+Restless
+Battitude
+Oxhall
+Zerundi
+Stickfigure
+Yuheng
+Dreddmor
+Chiuh
+Shoteka
+Greymoon
+Xootfly
+Dannitza
+Brebenfarm
+Farslider
+Primswitch
+Froobert
+Hilltop
+Ranica
+Celestalis
+Giarbert
+Littlebird
+Homebuilder
+Wobbentay
+Raymation
+Lethdetter
+Lichlore
+Utherwurldly
+Bestijl
+Chatterbox
+Feiri
+Setzer
+Thirdborn
+Mimiteh
+Kutenai
+Paquot
+Rockspider
+Mapochi
+Huillermeyer
+Aelberts
+Holfe
+Bohannes
+Forhilde
+Jarnhilde
+Lardack
+Idesma
+Yuadl
+Yexil
+Iasmertz
+Quirina
+Avindar
+Mearkus
+Lyvette
+Dasmijn
+Poggel
+Blaukempt
+Zifer
+Briebers
+Varthader
+Fessbeinder
+Hiereichler
+Klaber
+Merchi
+Correiado
+Lomes
+Ronzales
+Bernandes
+Farrasco
+Bovarro
+Midal
+Galdonaldo
+Simsider
+Mortmagus
+Corpur
+Decycla
+Domzarjs
+Belwraith
+Belargio
+Oxidor
+Juriya
+Huxxely
+Kiopak
+Auggers
+Feldragonne
+Qusifor
+Jharls
+Terrawyng
+Fyanucci
+Pootawn
+Zeurra
+Oysternatz
+Zoilin
+Wheelwright
+Plodnaco
+Frandevoel
+Vanderbor
+Friller
+Sight
+ProductEngine
+Darkspider
+LabCube
+HarrisBroadcast
+Fresh
+YOG
+TSTC
+Chipka
+GTLLP
+Metaversa
+Pintak
+Skodlow
+Woodells
+Bridger
+Curtau
+Hurikan
+Cheorley
+Herberg
+Mialifo
+Memo
+Polandia
+Krovac
+Djannovic
+Ergaron
+Bowler
+Farstrider
+Hummingly
+Zenoria
+Xofan
+Firelyte
+Hauster
+Jierdon
+Yorfle
+Faerye
+Draegonne
+Bilavio
+Criadic
+Lyter
+Monaron
+Quander
+Querrien
+Oddson
+Vuissent
+Denothar
+Wrentling
+Ergenthal
+Aunerfal
+Ugimachi
+Kujisawa
+Ryada
+Xuisse
+Madeye
+Oaklourne
+Gandt
+Blokke
+Ixito
+Wiskee
+Wandsworth
+Forgraine
+Lordenwych
+Nerido
+Bogbat
+Kraditzio
+Markenly
+Shergood
+Siabonne
+Massenberg
+Ferduccio
+Vordun
+Quingly
+Palletier
+Bouevier
+Bruissardt
+Fravoisse
+Houley
+Rodeyn
+Hallenbook
+McConach
+McConaught
+Mullery
+Faromet
+McMasters
+Dertzer
+Aumenie
+Melune
+Mileman
+Moeleneaux
+Rumsford
+Veriander
+VanDouser
+Voorhees
+Velaystar
+Zahm
+Gellner
+Riegler
+Pinden
+Bagshawe
+Barineaux
+Bracula
+Ernshaw
+Larwyck
+Breuer
+Breuilly
+Brougham
+Brunsen
+Tryce
+Lavender
+Lanfier
+Laroway
+Doomdale
+Elman
+Delwood
+Ryerley
+Seorn
+Indiawood
+Islar
+Organiser
+Oxygen
+Prantis
+Pelia
+Urquan
+Lexigle
+Aura
+Lighthouse
+Nuyasaka
+Nguya
+Kamiguwa
+Hyandi
+Bandalora
+Mumbhata
+Spearsong
+Somersley
+Hindermann
+Uldarmann
+Loomslough
+Zuidde
+Zirgar
+Vrandic
+Cyrado
+Cedarbridge
+Latoe
+Latour
+Ledevre
+Jeansia
+Johnsky
+Keystrel
+Balehawk
+Malso
+Malvogen
+Diranovitz
+Hendachevich
+Milasevic
+Milodanic
+Radinovic
+Meinster
+Leirdrow
+Meriborne
+Miranifone
+Jaynesford
+Lavarock
+Lyvingstone
+Wytchwood
+Westerlow
+Toocool
+Rootcreeper
+Ericson
+Sonnenburg
+MetaverseModSquad
+integer
+float
+vector
+rotation
+string
+list
+key
+for
+if
+else
+do
+while
+jump
+return
+state
+default
+llAbs
+llAcos
+llAddToLandBanList
+llAddToLandPassList
+llAdjustSoundVolume
+llAllowInventoryDrop
+llAngleBetween
+llApplyImpulse
+llApplyRotationalImpulse
+llAsin
+llAtan2
+llAttachToAvatar
+llAvatarOnSitTarget
+llAxes2Rot
+llAxisAngle2Rot
+llBase64ToInteger
+llBase64ToString
+llBreakAllLinks
+llBreakLink
+llCeil
+llClearCameraParams
+llCloseRemoteDataChannel
+llCloud
+llCollisionFilter
+llCollisionSound
+llCollisionSprite
+llCos
+llCreateLink
+llCSV2List
+llDeleteSubList
+llDeleteSubString
+llDetachFromAvatar
+llDetectedGrab
+llDetectedGroup
+llDetectedKey
+llDetectedLinkNumber
+llDetectedName
+llDetectedOwner
+llDetectedPos
+llDetectedRot
+llDetectedType
+llDetectedVel
+llDialog
+llDie
+llDumpList2String
+llEdgeOfWorld
+llEjectFromLand
+llEmail
+llEscapeURL
+llEuler2Rot
+llFabs
+llFloor
+llForceMouselook
+llFrand
+llGetAccel
+llGetAgentInfo
+llGetAgentLanguage
+llGetAgentSize
+llGetAlpha
+llGetAndResetTime
+llGetAnimation
+llGetAnimationList
+llGetAttached
+llGetBoundingBox
+llGetCameraPos
+llGetCameraRot
+llGetCenterOfMass
+llGetColor
+llGetCreator
+llGetDate
+llGetEnergy
+llGetForce
+llGetFreeMemory
+llGetGeometricCenter
+llGetGMTclock
+llGetInventoryCreator
+llGetInventoryKey
+llGetInventoryName
+llGetInventoryNumber
+llGetInventoryPermMask
+llGetInventoryType
+llGetKey
+llGetLandOwnerAt
+llGetLinkKey
+llGetLinkName
+llGetLinkNumber
+llGetListEntryType
+llGetListLength
+llGetLocalPos
+llGetLocalRot
+llGetMass
+llGetNextEmail
+llGetNotecardLine
+llGetNumberOfNotecardLines
+llGetNumberOfPrims
+llGetNumberOfSides
+llGetObjectDesc
+llGetObjectMass
+llGetObjectName
+llGetObjectPermMask
+llGetObjectPrimCount
+llGetOmega
+llGetOwner
+llGetOwnerKey
+llGetParcelDetails
+llGetParcelFlags
+llGetParcelMaxPrims
+llGetParcelPrimCount
+llGetParcelPrimOwners
+llGetPermissions
+llGetPermissionsKey
+llGetPos
+llGetPrimitiveParams
+llGetRegionCorner
+llGetRegionFlags
+llGetRegionFPS
+llGetRegionName
+llGetRegionTimeDilation
+llGetRootPosition
+llGetRootRotation
+llGetRot
+llGetScale
+llGetScriptName
+llGetScriptState
+llGetSimulatorHostname
+llGetStartParameter
+llGetStatus
+llGetSubString
+llGetSunDirection
+llGetTexture
+llGetTextureOffset
+llGetTextureRot
+llGetTextureScale
+llGetTime
+llGetTimeOfDay
+llGetTimestamp
+llGetTorque
+llGetUnixTime
+llGetVel
+llGetWallclock
+llGiveInventory
+llGiveInventoryList
+llGiveMoney
+llGround
+llGroundContour
+llGroundNormal
+llGroundRepel
+llGroundSlope
+llHTTPRequest
+llInsertString
+llInstantMessage
+llIntegerToBase64
+llKey2Name
+llList2CSV
+llList2Float
+llList2Integer
+llList2Key
+llList2List
+llList2ListStrided
+llList2Rot
+llList2String
+llList2Vector
+llListen
+llListenControl
+llListenRemove
+llListFindList
+llListInsertList
+llListRandomize
+llListReplaceList
+llListSort
+llListStatistics
+llLoadURL
+llLog
+llLog10
+llLookAt
+llLoopSound
+llLoopSoundMaster
+llLoopSoundSlave
+llMapDestination
+llMD5String
+llMessageLinked
+llMinEventDelay
+llModifyLand
+llModPow
+llMoveToTarget
+llOffsetTexture
+llOpenRemoteDataChannel
+llOverMyLand
+llOwnerSay
+llParcelMediaCommandList
+llParcelMediaQuery
+llParseString2List
+llParseStringKeepNulls
+llParticleSystem
+llPassCollisions
+llPassTouches
+llPlaySound
+llPlaySoundSlave
+llPointAt
+llPow
+llPreloadSound
+llPushObject
+llReleaseCamera
+llReleaseControls
+llRegionSay
+llRemoteDataReply
+llRemoteDataSetRegion
+llRemoteLoadScriptPin
+llRemoveFromLandBanList
+llRemoveFromLandPassList
+llRemoveInventory
+llRemoveVehicleFlags
+llRequestAgentData
+llRequestInventoryData
+llRequestPermissions
+llRequestSimulatorData
+llResetOtherScript
+llResetScript
+llResetTime
+llRezAtRoot
+llRezObject
+llRot2Angle
+llRot2Axis
+llRot2Euler
+llRot2Fwd
+llRot2Left
+llRot2Up
+llRotateTexture
+llRotBetween
+llRotLookAt
+llRotTarget
+llRotTargetRemove
+llRound
+llSameGroup
+llSay
+llScaleTexture
+llScriptDanger
+llSendRemoteData
+llSensor
+llSensorRemove
+llSensorRepeat
+llSetAlpha
+llSetBuoyancy
+llSetCameraAtOffset
+llSetCameraEyeOffset
+llSetCameraParams
+llSetColor
+llSetDamage
+llSetForce
+llSetForceAndTorque
+llSetHoverHeight
+llSetLinkAlpha
+llSetLinkColor
+llSetLinkPrimitiveParams
+llSetLocalRot
+llSetObjectDesc
+llSetObjectName
+llSetParcelMusicURL
+llSetPayPrice
+llSetPos
+llSetPrimitiveParams
+llSetRemoteScriptAccessPin
+llSetRot
+llSetScale
+llSetScriptState
+llSetSitText
+llSetSoundQueueing
+llSetStatus
+llSetText
+llSetTexture
+llSetTextureAnim
+llSetTimerEvent
+llSetTorque
+llSetTouchText
+llSetVehicleFlags
+llSetVehicleFloatParam
+llSetVehicleRotationParam
+llSetVehicleType
+llSetVehicleVectorParam
+llShout
+llSin
+llSitTarget
+llSleep
+llSqrt
+llStartAnimation
+llStopAnimation
+llStopHover
+llStopLookAt
+llStopMoveToTarget
+llStopPointAt
+llStopSound
+llStringLength
+llStringToBase64
+llSubStringIndex
+llTakeControls
+llTan
+llTarget
+llTargetOmega
+llTargetRemove
+llTeleportAgentHome
+llToLower
+llToUpper
+llTriggerSound
+llTriggerSoundLimited
+llUnescapeURL
+llUnSit
+llVecDist
+llVecMag
+llVecNorm
+llVolumeDetect
+llWater
+llWhisper
+llWind
+llXorBase64StringsCorrect
+llDetectedTouchBinormal
+llDetectedTouchFace
+llDetectedTouchNormal
+llDetectedTouchPos
+llDetectedTouchST
+llDetectedTouchUV
+llTextBox
+llReleaseURL
+llRequestSecureURL
+llRequestURL
+llHTTPResponse
+llGetHTTPHeader
+llGetFreeURLs
+at_rot_target
+at_target
+attach
+changed
+collision
+collision_end
+collision_start
+control
+dataserver
+email
+http_response
+land_collision
+land_collision_end
+land_collision_start
+link_message
+listen
+money
+moving_end
+moving_start
+no_sensor
+not_at_rot_target
+not_at_target
+object_rez
+on_rez
+remote_data
+run_time_permissions
+sensor
+state_entry
+state_exit
+timer
+touch
+touch_end
+touch_start
+http_request
+ACTIVE
+AGENT
+AGENT_ALWAYS_RUN
+AGENT_ATTACHMENTS
+AGENT_AWAY
+AGENT_CROUCHING
+AGENT_FLYING
+AGENT_BUSY
+AGENT_IN_AIR
+AGENT_TYPING
+AGENT_WALKING
+AGENT_MOUSELOOK
+AGENT_ON_OBJECT
+AGENT_SCRIPTED
+AGENT_SITTING
+ALL_SIDES
+ANIM_ON
+ATTACH_BACK
+ATTACH_BELLY
+ATTACH_CHEST
+ATTACH_CHIN
+ATTACH_HEAD
+ATTACH_HUD_BOTTOM
+ATTACH_HUD_BOTTOM_LEFT
+ATTACH_HUD_BOTTOM_RIGHT
+ATTACH_HUD_CENTER_1
+ATTACH_HUD_CENTER_2
+ATTACH_HUD_TOP_CENTER
+ATTACH_HUD_TOP_LEFT
+ATTACH_HUD_TOP_RIGHT
+ATTACH_LEAR
+ATTACH_LEYE
+ATTACH_LFOOT
+ATTACH_LHAND
+ATTACH_LHIP
+ATTACH_LLARM
+ATTACH_LLLEG
+ATTACH_LSHOULDER
+ATTACH_LUARM
+ATTACH_LULEG
+ATTACH_MOUTH
+ATTACH_NOSE
+ATTACH_PELVIS
+ATTACH_REAR
+ATTACH_REYE
+ATTACH_RFOOT
+ATTACH_RHAND
+ATTACH_RHIP
+ATTACH_RLARM
+ATTACH_RLLEG
+ATTACH_RSHOULDER
+ATTACH_RUARM
+ATTACH_RULEG
+CAMERA_ACTIVE
+CAMERA_BEHINDNESS_ANGLE
+CAMERA_BEHINDNESS_LAG
+CAMERA_DISTANCE
+CAMERA_FOCUS
+CAMERA_FOCUS_LAG
+CAMERA_FOCUS_LOCKED
+CAMERA_FOCUS_OFFSET
+CAMERA_FOCUS_THRESHOLD
+CAMERA_PITCH
+CAMERA_POSITION
+CAMERA_POSITION_LAG
+CAMERA_POSITION_LOCKED
+CAMERA_POSITION_THRESHOLD
+CHANGED_ALLOWED_DROP
+CHANGED_COLOR
+CHANGED_INVENTORY
+CHANGED_LINK
+CHANGED_OWNER
+CHANGED_REGION
+CHANGED_SCALE
+CHANGED_SHAPE
+CHANGED_TELEPORT
+CHANGED_TEXTURE
+CLICK_ACTION_BUY
+CLICK_ACTION_NONE
+CLICK_ACTION_OPEN
+CLICK_ACTION_OPEN_MEDIA
+CLICK_ACTION_PAY
+CLICK_ACTION_PLAY
+CLICK_ACTION_SIT
+CLICK_ACTION_TOUCH
+CONTROL_BACK
+CONTROL_DOWN
+CONTROL_FWD
+CONTROL_LBUTTON
+CONTROL_LEFT
+CONTROL_ML_LBUTTON
+CONTROL_RIGHT
+CONTROL_ROT_LEFT
+CONTROL_ROT_RIGHT
+CONTROL_UP
+DATA_BORN
+DATA_NAME
+DATA_ONLINE
+DATA_PAYINFO
+DATA_SIM_POS
+DATA_SIM_RATING
+DATA_SIM_STATUS
+DEBUG_CHANNEL
+EOF
+FALSE
+HTTP_BODY_MAXLENGTH
+HTTP_BODY_TRUNCATED
+HTTP_METHOD
+HTTP_MIMETYPE
+HTTP_VERIFY_CERT
+INVENTORY_ALL
+INVENTORY_ANIMATION
+INVENTORY_BODYPART
+INVENTORY_CLOTHING
+INVENTORY_GESTURE
+INVENTORY_LANDMARK
+INVENTORY_NONE
+INVENTORY_NOTECARD
+INVENTORY_OBJECT
+INVENTORY_SCRIPT
+INVENTORY_SOUND
+INVENTORY_TEXTURE
+LAND_LEVEL
+LAND_LOWER
+LAND_NOISE
+LAND_RAISE
+LAND_REVERT
+LAND_SMOOTH
+LINK_ALL_CHILDREN
+LINK_ALL_OTHERS
+LINK_ROOT
+LINK_SET
+LINK_THIS
+LIST_STAT_GEOMETRIC_MEAN
+LIST_STAT_MAX
+LIST_STAT_MEAN
+LIST_STAT_MEDIAN
+LIST_STAT_MIN
+LIST_STAT_NUM_COUNT
+LIST_STAT_RANGE
+LIST_STAT_STD_DEV
+LIST_STAT_SUM
+LIST_STAT_SUM_SQUARES
+LOOP
+MASK_BASE
+MASK_EVERYONE
+MASK_GROUP
+MASK_NEXT
+MASK_OWNER
+NULL_KEY
+OBJECT_CREATOR
+OBJECT_DESC
+OBJECT_GROUP
+OBJECT_NAME
+OBJECT_OWNER
+OBJECT_POS
+OBJECT_ROT
+OBJECT_UNKNOWN_DETAIL
+OBJECT_VELOCITY
+PARCEL_DETAILS_AREA
+PARCEL_DETAILS_DESC
+PARCEL_DETAILS_GROUP
+PARCEL_DETAILS_NAME
+PARCEL_DETAILS_OWNER
+PARCEL_FLAG_ALLOW_ALL_OBJECT_ENTRY
+PARCEL_FLAG_ALLOW_CREATE_GROUP_OBJECTS
+PARCEL_FLAG_ALLOW_CREATE_OBJECTS
+PARCEL_FLAG_ALLOW_DAMAGE
+PARCEL_FLAG_ALLOW_FLY
+PARCEL_FLAG_ALLOW_GROUP_OBJECT_ENTRY
+PARCEL_FLAG_ALLOW_GROUP_SCRIPTS
+PARCEL_FLAG_ALLOW_LANDMARK
+PARCEL_FLAG_ALLOW_SCRIPTS
+PARCEL_FLAG_ALLOW_TERRAFORM
+PARCEL_FLAG_LOCAL_SOUND_ONLY
+PARCEL_FLAG_RESTRICT_PUSHOBJECT
+PARCEL_FLAG_USE_ACCESS_GROUP
+PARCEL_FLAG_USE_ACCESS_LIST
+PARCEL_FLAG_USE_BAN_LIST
+PARCEL_FLAG_USE_LAND_PASS_LIST
+PARCEL_MEDIA_COMMAND_AGENT
+PARCEL_MEDIA_COMMAND_AUTO_ALIGN
+PARCEL_MEDIA_COMMAND_LOOP
+PARCEL_MEDIA_COMMAND_PAUSE
+PARCEL_MEDIA_COMMAND_PLAY
+PARCEL_MEDIA_COMMAND_STOP
+PARCEL_MEDIA_COMMAND_TEXTURE
+PARCEL_MEDIA_COMMAND_TIME
+PARCEL_MEDIA_COMMAND_UNLOAD
+PARCEL_MEDIA_COMMAND_URL
+PASSIVE
+PAYMENT_INFO_ON_FILE
+PAYMENT_INFO_USED
+PAY_DEFAULT
+PAY_HIDE
+PERMISSION_ATTACH
+PERMISSION_CHANGE_LINKS
+PERMISSION_CONTROL_CAMERA
+PERMISSION_DEBIT
+PERMISSION_TAKE_CONTROLS
+PERMISSION_TRACK_CAMERA
+PERMISSION_TRIGGER_ANIMATION
+PERM_ALL
+PERM_COPY
+PERM_MODIFY
+PERM_MOVE
+PERM_TRANSFER
+PING_PONG
+PRIM_BUMP_BARK
+PRIM_BUMP_BLOBS
+PRIM_BUMP_BRICKS
+PRIM_BUMP_
+PRIM_BUMP_CHECKER
+PRIM_BUMP_CONCRETE
+PRIM_BUMP_DARK
+PRIM_BUMP_DISKS
+PRIM_BUMP_GRAVEL
+PRIM_BUMP_LARGETILE
+PRIM_BUMP_NONE
+PRIM_BUMP_SHINY
+PRIM_BUMP_SIDING
+PRIM_BUMP_STONE
+PRIM_BUMP_STUCCO
+PRIM_BUMP_SUCTION
+PRIM_BUMP_TILE
+PRIM_BUMP_WEAVE
+PRIM_BUMP_WOOD
+PRIM_COLOR
+PRIM_FLEXIBLE
+PRIM_FULL
+PRIM_GLOW
+PRIM_HOLE_CIRCLE
+PRIM_HOLE_DEFAULT
+PRIM_HOLE_SQUARE
+PRIM_HOLE_TRIANGLE
+PRIM_MATERIAL
+PRIM_MATERIAL_FLESH
+PRIM_MATERIAL_GLASS
+PRIM_MATERIAL_METAL
+PRIM_MATERIAL_PLASTIC
+PRIM_MATERIAL_RUBBER
+PRIM_MATERIAL_STONE
+PRIM_MATERIAL_WOOD
+PRIM_PHANTOM
+PRIM_PHYSICS
+PRIM_POINT_LIGHT
+PRIM_POSITION
+PRIM_ROTATION
+PRIM_SCULPT_TYPE_CYLINDER
+PRIM_SCULPT_TYPE_PLANE
+PRIM_SCULPT_TYPE_SPHERE
+PRIM_SCULPT_TYPE_TORUS
+PRIM_SHINY_HIGH
+PRIM_SHINY_LOW
+PRIM_SHINY_MEDIUM
+PRIM_SHINY_NONE
+PRIM_SIZE
+PRIM_TEMP_ON_REZ
+PRIM_TEXGEN
+PRIM_TEXGEN_DEFAULT
+PRIM_TEXGEN_PLANAR
+PRIM_TEXTURE
+PRIM_TYPE
+PRIM_TYPE_BOX
+PRIM_TYPE_CYLINDER
+PRIM_TYPE_PRISM
+PRIM_TYPE_RING
+PRIM_TYPE_SCULPT
+PRIM_TYPE_SPHERE
+PRIM_TYPE_TORUS
+PRIM_TYPE_TUBE
+PUBLIC_CHANNEL
+REMOTE_DATA_CHANNEL
+REMOTE_DATA_REPLY
+REMOTE_DATA_REQUEST
+REVERSE
+ROTATE
+SCALE
+SCRIPTED
+SMOOTH
+STATUS_BLOCK_GRAB
+STATUS_CAST_SHADOWS
+STATUS_DIE_AT_EDGE
+STATUS_PHANTOM
+STATUS_PHYSICS
+STATUS_RETURN_AT_EDGE
+STATUS_ROTATE_X
+STATUS_ROTATE_Y
+STATUS_ROTATE_Z
+STATUS_SANDBOX
+STRING_TRIM
+STRING_TRIM_HEAD
+STRING_TRIM_TAIL
+TRUE
+TYPE_FLOAT
+TYPE_INTEGER
+TYPE_INVALID
+TYPE_KEY
+TYPE_ROTATION
+TYPE_STRING
+TYPE_VECTOR
+VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY
+VEHICLE_ANGULAR_DEFLECTION_TIMESCALE
+VEHICLE_ANGULAR_FRICTION_TIMESCALE
+VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE
+VEHICLE_ANGULAR_MOTOR_DIRECTION
+VEHICLE_ANGULAR_MOTOR_TIMESCALE
+VEHICLE_BANKING_EFFICIENCY
+VEHICLE_BANKING_MIX
+VEHICLE_BANKING_TIMESCALE
+VEHICLE_BUOYANCY
+VEHICLE_FLAG_CAMERA_DECOUPLED
+VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT
+VEHICLE_FLAG_HOVER_TERRAIN_ONLY
+VEHICLE_FLAG_HOVER_UP_ONLY
+VEHICLE_FLAG_HOVER_WATER_ONLY
+VEHICLE_FLAG_LIMIT_MOTOR_UP
+VEHICLE_FLAG_LIMIT_ROLL_ONLY
+VEHICLE_FLAG_MOUSELOOK_BANK
+VEHICLE_FLAG_MOUSELOOK_STEER
+VEHICLE_FLAG_NO_DEFLECTION_UP
+VEHICLE_HOVER_EFFICIENCY
+VEHICLE_HOVER_GLOBAL_HEIGHT
+VEHICLE_HOVER_HEIGHT
+VEHICLE_HOVER_TERRAIN_ONLY
+VEHICLE_HOVER_TIMESCALE
+VEHICLE_HOVER_WATER_ONLY
+VEHICLE_LINEAR_DEFLECTION_EFFICIENCY
+VEHICLE_LINEAR_DEFLECTION_TIMESCALE
+VEHICLE_LINEAR_FRICTION_TIMESCALE
+VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE
+VEHICLE_LINEAR_MOTOR_DIRECTION
+VEHICLE_LINEAR_MOTOR_OFFSET
+VEHICLE_LINEAR_MOTOR_TIMESCALE
+VEHICLE_REFERENCE_FRAME
+VEHICLE_TYPE_AIRPLANE
+VEHICLE_TYPE_BALLOON
+VEHICLE_TYPE_BOAT
+VEHICLE_TYPE_CAR
+VEHICLE_TYPE_NONE
+VEHICLE_TYPE_SLED
+VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY
+VEHICLE_VERTICAL_ATTRACTION_TIMESCALE
+TOUCH_INVALID_FACE
+TOUCH_INVALID_TEXCOORD
+TOUCH_INVALID_VECTOR
+URL_REQUEST_GRANTED
+URL_REQUEST_DENIED
+CHANGED_REGION_START
+DEG_TO_RAD
+PI
+PI_BY_TWO
+SQRT2
+RAD_TO_DEG
+TWO_PI
+ZERO_ROTATION
+ZERO_VECTOR
+PSYS_PART_FLAGS
+PSYS_PART_BOUNCE_MASK
+PSYS_PART_EMISSIVE_MASK
+PSYS_PART_FOLLOW_SRC_MASK
+PSYS_PART_FOLLOW_VELOCITY_MASK
+PSYS_PART_INTERP_COLOR_MASK
+PSYS_PART_INTERP_SCALE_MASK
+PSYS_PART_TARGET_LINEAR_MASK
+PSYS_PART_TARGET_POS_MASK
+PSYS_PART_WIND_MASK
+PSYS_PART_BEAM_MASK
+LL_PART_HUD
+LL_PART_DEAD_MASK
+LL_PART_RANDOM_ACCEL_MASK
+LL_PART_RANDOM_VEL_MASK
+LL_PART_TRAIL_MASK
+PSYS_SRC_PATTERN
+PSYS_SRC_PATTERN_ANGLE
+PSYS_SRC_PATTERN_ANGLE_CONE
+PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY
+PSYS_SRC_PATTERN_DROP
+PSYS_SRC_PATTERN_EXPLODE
+PSYS_SRC_BURST_RADIUS
+PSYS_SRC_ANGLE_BEGIN
+PSYS_SRC_ANGLE_END
+PSYS_SRC_INNERANGLE
+PSYS_SRC_OUTERANGLE
+PSYS_SRC_TARGET_KEY
+PSYS_PART_START_COLOR
+PSYS_PART_END_COLOR
+PSYS_PART_START_ALPHA
+PSYS_PART_END_ALPHA
+PSYS_PART_START_SCALE
+PSYS_PART_END_SCALE
+PSYS_SRC_TEXTURE
+PSYS_SRC_MAX_AGE
+PSYS_PART_MAX_AGE
+PSYS_SRC_BURST_RATE
+PSYS_SRC_BURST_PART_COUNT
+PSYS_SRC_ACCEL
+PSYS_SRC_OMEGA
+PSYS_SRC_BURST_SPEED_MIN
+PSYS_SRC_BURST_SPEED_MAX
+total_number
diff --git a/linden/indra/newview/app_settings/dictionaries/en_us.aff b/linden/indra/newview/app_settings/dictionaries/en_us.aff
new file mode 100644
index 0000000..2ddd985
--- /dev/null
+++ b/linden/indra/newview/app_settings/dictionaries/en_us.aff
@@ -0,0 +1,201 @@
+SET ISO8859-1
+TRY esianrtolcdugmphbyfvkwzESIANRTOLCDUGMPHBYFVKWZ'
+NOSUGGEST !
+
+# ordinal numbers
+COMPOUNDMIN 1
+# only in compounds: 1th, 2th, 3th
+ONLYINCOMPOUND c
+# compound rules:
+# 1. [0-9]*1[0-9]th (10th, 11th, 12th, 56714th, etc.)
+# 2. [0-9]*[02-9](1st|2nd|3rd|[4-9]th) (21st, 22nd, 123rd, 1234th, etc.)
+COMPOUNDRULE 2
+COMPOUNDRULE n*1t
+COMPOUNDRULE n*mp
+WORDCHARS 0123456789
+
+PFX A Y 1
+PFX A 0 re .
+
+PFX I Y 1
+PFX I 0 in .
+
+PFX U Y 1
+PFX U 0 un .
+
+PFX C Y 1
+PFX C 0 de .
+
+PFX E Y 1
+PFX E 0 dis .
+
+PFX F Y 1
+PFX F 0 con .
+
+PFX K Y 1
+PFX K 0 pro .
+
+SFX V N 2
+SFX V e ive e
+SFX V 0 ive [^e]
+
+SFX N Y 3
+SFX N e ion e
+SFX N y ication y
+SFX N 0 en [^ey]
+
+SFX X Y 3
+SFX X e ions e
+SFX X y ications y
+SFX X 0 ens [^ey]
+
+SFX H N 2
+SFX H y ieth y
+SFX H 0 th [^y]
+
+SFX Y Y 1
+SFX Y 0 ly .
+
+SFX G Y 2
+SFX G e ing e
+SFX G 0 ing [^e]
+
+SFX J Y 2
+SFX J e ings e
+SFX J 0 ings [^e]
+
+SFX D Y 4
+SFX D 0 d e
+SFX D y ied [^aeiou]y
+SFX D 0 ed [^ey]
+SFX D 0 ed [aeiou]y
+
+SFX T N 4
+SFX T 0 st e
+SFX T y iest [^aeiou]y
+SFX T 0 est [aeiou]y
+SFX T 0 est [^ey]
+
+SFX R Y 4
+SFX R 0 r e
+SFX R y ier [^aeiou]y
+SFX R 0 er [aeiou]y
+SFX R 0 er [^ey]
+
+SFX Z Y 4
+SFX Z 0 rs e
+SFX Z y iers [^aeiou]y
+SFX Z 0 ers [aeiou]y
+SFX Z 0 ers [^ey]
+
+SFX S Y 4
+SFX S y ies [^aeiou]y
+SFX S 0 s [aeiou]y
+SFX S 0 es [sxzh]
+SFX S 0 s [^sxzhy]
+
+SFX P Y 3
+SFX P y iness [^aeiou]y
+SFX P 0 ness [aeiou]y
+SFX P 0 ness [^y]
+
+SFX M Y 1
+SFX M 0 's .
+
+SFX B Y 3
+SFX B 0 able [^aeiou]
+SFX B 0 able ee
+SFX B e able [^aeiou]e
+
+SFX L Y 1
+SFX L 0 ment .
+
+REP 88
+REP a ei
+REP ei a
+REP a ey
+REP ey a
+REP ai ie
+REP ie ai
+REP are air
+REP are ear
+REP are eir
+REP air are
+REP air ere
+REP ere air
+REP ere ear
+REP ere eir
+REP ear are
+REP ear air
+REP ear ere
+REP eir are
+REP eir ere
+REP ch te
+REP te ch
+REP ch ti
+REP ti ch
+REP ch tu
+REP tu ch
+REP ch s
+REP s ch
+REP ch k
+REP k ch
+REP f ph
+REP ph f
+REP gh f
+REP f gh
+REP i igh
+REP igh i
+REP i uy
+REP uy i
+REP i ee
+REP ee i
+REP j di
+REP di j
+REP j gg
+REP gg j
+REP j ge
+REP ge j
+REP s ti
+REP ti s
+REP s ci
+REP ci s
+REP k cc
+REP cc k
+REP k qu
+REP qu k
+REP kw qu
+REP o eau
+REP eau o
+REP o ew
+REP ew o
+REP oo ew
+REP ew oo
+REP ew ui
+REP ui ew
+REP oo ui
+REP ui oo
+REP ew u
+REP u ew
+REP oo u
+REP u oo
+REP u oe
+REP oe u
+REP u ieu
+REP ieu u
+REP ue ew
+REP ew ue
+REP uff ough
+REP oo ieu
+REP ieu oo
+REP ier ear
+REP ear ier
+REP ear air
+REP air ear
+REP w qu
+REP qu w
+REP z ss
+REP ss z
+REP shun tion
+REP shun sion
+REP shun cion
diff --git a/linden/indra/newview/app_settings/dictionaries/en_us.dic b/linden/indra/newview/app_settings/dictionaries/en_us.dic
new file mode 100644
index 0000000..4f69807
--- /dev/null
+++ b/linden/indra/newview/app_settings/dictionaries/en_us.dic
@@ -0,0 +1,62120 @@
+62118
+0/nm
+1/n1
+2/nm
+3/nm
+4/nm
+5/nm
+6/nm
+7/nm
+8/nm
+9/nm
+0th/pt
+1st/p
+1th/tc
+2nd/p
+2th/tc
+3rd/p
+3th/tc
+4th/pt
+5th/pt
+6th/pt
+7th/pt
+8th/pt
+9th/pt
+a
+A
+AA
+AAA
+Aachen/M
+aardvark/SM
+Aaren/M
+Aarhus/M
+Aarika/M
+Aaron/M
+AB
+aback
+abacus/SM
+abaft
+Abagael/M
+Abagail/M
+abalone/SM
+abandoner/M
+abandon/LGDRS
+abandonment/SM
+abase/LGDSR
+abasement/S
+abaser/M
+abashed/UY
+abashment/MS
+abash/SDLG
+abate/DSRLG
+abated/U
+abatement/MS
+abater/M
+abattoir/SM
+Abba/M
+Abbe/M
+abbé/S
+abbess/SM
+Abbey/M
+abbey/MS
+Abbie/M
+Abbi/M
+Abbot/M
+abbot/MS
+Abbott/M
+abbr
+abbrev
+abbreviated/UA
+abbreviates/A
+abbreviate/XDSNG
+abbreviating/A
+abbreviation/M
+Abbye/M
+Abby/M
+ABC/M
+Abdel/M
+abdicate/NGDSX
+abdication/M
+abdomen/SM
+abdominal/YS
+abduct/DGS
+abduction/SM
+abductor/SM
+Abdul/M
+ab/DY
+abeam
+Abelard/M
+Abel/M
+Abelson/M
+Abe/M
+Aberdeen/M
+Abernathy/M
+aberrant/YS
+aberrational
+aberration/SM
+abet/S
+abetted
+abetting
+abettor/SM
+Abeu/M
+abeyance/MS
+abeyant
+Abey/M
+abhorred
+abhorrence/MS
+abhorrent/Y
+abhorrer/M
+abhorring
+abhor/S
+abidance/MS
+abide/JGSR
+abider/M
+abiding/Y
+Abidjan/M
+Abie/M
+Abigael/M
+Abigail/M
+Abigale/M
+Abilene/M
+ability/IMES
+abjection/MS
+abjectness/SM
+abject/SGPDY
+abjuration/SM
+abjuratory
+abjurer/M
+abjure/ZGSRD
+ablate/VGNSDX
+ablation/M
+ablative/SY
+ablaze
+abler/E
+ables/E
+ablest
+able/U
+abloom
+ablution/MS
+Ab/M
+ABM/S
+abnegate/NGSDX
+abnegation/M
+Abner/M
+abnormality/SM
+abnormal/SY
+aboard
+abode/GMDS
+abolisher/M
+abolish/LZRSDG
+abolishment/MS
+abolitionism/SM
+abolitionist/SM
+abolition/SM
+abominable
+abominably
+abominate/XSDGN
+abomination/M
+aboriginal/YS
+aborigine/SM
+Aborigine/SM
+aborning
+abortionist/MS
+abortion/MS
+abortiveness/M
+abortive/PY
+abort/SRDVG
+Abo/SM!
+abound/GDS
+about/S
+aboveboard
+aboveground
+above/S
+abracadabra/S
+abrader/M
+abrade/SRDG
+Abraham/M
+Abrahan/M
+Abra/M
+Abramo/M
+Abram/SM
+Abramson/M
+Abran/M
+abrasion/MS
+abrasiveness/S
+abrasive/SYMP
+abreaction/MS
+abreast
+abridge/DSRG
+abridged/U
+abridger/M
+abridgment/SM
+abroad
+abrogate/XDSNG
+abrogation/M
+abrogator/SM
+abruptness/SM
+abrupt/TRYP
+ABS
+abscess/GDSM
+abscissa/SM
+abscission/SM
+absconder/M
+abscond/SDRZG
+abseil/SGDR
+absence/SM
+absenteeism/SM
+absentee/MS
+absentia/M
+absentmindedness/S
+absentminded/PY
+absent/SGDRY
+absinthe/SM
+abs/M
+absoluteness/SM
+absolute/NPRSYTX
+absolution/M
+absolutism/MS
+absolutist/SM
+absolve/GDSR
+absolver/M
+absorb/ASGD
+absorbed/U
+absorbency/MS
+absorbent/MS
+absorber/SM
+absorbing/Y
+absorption/MS
+absorptive
+absorptivity/M
+abstainer/M
+abstain/GSDRZ
+abstemiousness/MS
+abstemious/YP
+abstention/SM
+abstinence/MS
+abstinent/Y
+abstractedness/SM
+abstracted/YP
+abstracter/M
+abstractionism/M
+abstractionist/SM
+abstraction/SM
+abstractness/SM
+abstractor/MS
+abstract/PTVGRDYS
+abstruseness/SM
+abstruse/PRYT
+absurdity/SM
+absurdness/SM
+absurd/PRYST
+Abuja
+abundance/SM
+abundant/Y
+abused/E
+abuse/GVZDSRB
+abuser/M
+abuses/E
+abusing/E
+abusiveness/SM
+abusive/YP
+abut/LS
+abutment/SM
+abutted
+abutter/MS
+abutting
+abuzz
+abysmal/Y
+abyssal
+Abyssinia/M
+Abyssinian
+abyss/SM
+AC
+acacia/SM
+academe/MS
+academia/SM
+academical/Y
+academicianship
+academician/SM
+academic/S
+academy/SM
+Acadia/M
+acanthus/MS
+Acapulco/M
+accede/SDG
+accelerated/U
+accelerate/NGSDXV
+accelerating/Y
+acceleration/M
+accelerator/SM
+accelerometer/SM
+accented/U
+accent/SGMD
+accentual/Y
+accentuate/XNGSD
+accentuation/M
+acceptability/SM
+acceptability's/U
+acceptableness/SM
+acceptable/P
+acceptably/U
+acceptance/SM
+acceptant
+acceptation/SM
+accepted/Y
+accepter/M
+accepting/PY
+acceptor/MS
+accept/RDBSZVG
+accessed/A
+accessibility/IMS
+accessible/IU
+accessibly/I
+accession/SMDG
+accessors
+accessory/SM
+access/SDMG
+accidence/M
+accidentalness/M
+accidental/SPY
+accident/MS
+acclaimer/M
+acclaim/SDRG
+acclamation/MS
+acclimate/XSDGN
+acclimation/M
+acclimatisation
+acclimatise/DG
+acclimatization/AMS
+acclimatized/U
+acclimatize/RSDGZ
+acclimatizes/A
+acclivity/SM
+accolade/GDSM
+accommodated/U
+accommodate/XVNGSD
+accommodating/Y
+accommodation/M
+accommodativeness/M
+accommodative/P
+accompanied/U
+accompanier/M
+accompaniment/MS
+accompanist/SM
+accompany/DRSG
+accomplice/MS
+accomplished/U
+accomplisher/M
+accomplishment/SM
+accomplish/SRDLZG
+accordance/SM
+accordant/Y
+accorder/M
+according/Y
+accordionist/SM
+accordion/MS
+accord/SZGMRD
+accost/SGD
+accountability/MS
+accountability's/U
+accountableness/M
+accountable/U
+accountably/U
+accountancy/SM
+accountant/MS
+account/BMDSGJ
+accounted/U
+accounting/M
+accouter/GSD
+accouterments
+accouterment's
+accoutrement/M
+Accra/M
+accreditation/SM
+accredited/U
+accredit/SGD
+accretion/SM
+accrual/MS
+accrue/SDG
+acct
+acculturate/XSDVNG
+acculturation/M
+accumulate/VNGSDX
+accumulation/M
+accumulativeness/M
+accumulative/YP
+accumulator/MS
+accuracy/IMS
+accurate/IY
+accurateness/SM
+accursedness/SM
+accursed/YP
+accusal/M
+accusation/SM
+accusative/S
+accusatory
+accused/M
+accuser/M
+accuse/SRDZG
+accusing/Y
+accustomedness/M
+accustomed/P
+accustom/SGD
+ac/DRG
+aced/M
+acerbate/DSG
+acerbic
+acerbically
+acerbity/MS
+ace/SM
+acetaminophen/S
+acetate/MS
+acetic
+acetone/SM
+acetonic
+acetylene/MS
+Acevedo/M
+Achaean/M
+Achebe/M
+ached/A
+ache/DSG
+achene/SM
+Achernar/M
+aches/A
+Acheson/M
+achievable/U
+achieved/UA
+achieve/LZGRSDB
+achievement/SM
+achiever/M
+Achilles
+aching/Y
+achoo
+achromatic
+achy/TR
+acidic
+acidification/M
+acidify/NSDG
+acidity/SM
+acidness/M
+acidoses
+acidosis/M
+acid/SMYP
+acidulous
+acing/M
+Ackerman/M
+acknowledgeable
+acknowledgedly
+acknowledged/U
+acknowledge/GZDRS
+acknowledger/M
+acknowledgment/SAM
+ACLU
+Ac/M
+ACM
+acme/SM
+acne/MDS
+acolyte/MS
+Aconcagua/M
+aconite/MS
+acorn/SM
+Acosta/M
+acoustical/Y
+acoustician/M
+acoustic/S
+acoustics/M
+acquaintance/MS
+acquaintanceship/S
+acquainted/U
+acquaint/GASD
+acquiesce/GSD
+acquiescence/SM
+acquiescent/Y
+acquirable
+acquire/ASDG
+acquirement/SM
+acquisition's/A
+acquisition/SM
+acquisitiveness/MS
+acquisitive/PY
+acquit/S
+acquittal/MS
+acquittance/M
+acquitted
+acquitter/M
+acquitting
+acreage/MS
+acre/MS
+acridity/MS
+acridness/SM
+acrid/TPRY
+acrimoniousness/MS
+acrimonious/YP
+acrimony/MS
+acrobatically
+acrobatic/S
+acrobatics/M
+acrobat/SM
+acronym/SM
+acrophobia/SM
+Acropolis/M
+acropolis/SM
+across
+acrostic/SM
+Acrux/M
+acrylate/M
+acrylic/S
+ACT
+Actaeon/M
+Acta/M
+ACTH
+acting/S
+actinic
+actinide/SM
+actinium/MS
+actinometer/MS
+action/DMSGB
+actions/AI
+action's/IA
+activate/AXCDSNGI
+activated/U
+activation/AMCI
+activator/SM
+active/APY
+actively/I
+activeness/MS
+actives
+activism/MS
+activist/MS
+activities/A
+activity/MSI
+Acton/M
+actor/MAS
+actress/SM
+act's
+Acts
+act/SADVG
+actuality/SM
+actualization/MAS
+actualize/GSD
+actualizes/A
+actual/SY
+actuarial/Y
+actuary/MS
+actuate/GNXSD
+actuation/M
+actuator/SM
+acuity/MS
+acumen/SM
+acupressure/S
+acupuncture/SM
+acupuncturist/S
+acuteness/MS
+acute/YTSRP
+acyclic
+acyclically
+acyclovir/S
+AD
+adage/MS
+adagio/S
+Adah/M
+Adair/M
+Adaline/M
+Ada/M
+adamant/SY
+Adamo/M
+Adam/SM
+Adamson/M
+Adana/M
+Adan/M
+adaptability/MS
+adaptable/U
+adaptation/MS
+adaptedness/M
+adapted/P
+adapter/M
+adapting/A
+adaption
+adaptively
+adaptiveness/M
+adaptive/U
+adaptivity
+adapt/SRDBZVG
+Adara/M
+ad/AS
+ADC
+Adda/M
+Addams
+addenda
+addend/SM
+addendum/M
+adder/M
+Addia/M
+addiction/MS
+addictive/P
+addict/SGVD
+Addie/M
+Addi/M
+Addison/M
+additional/Y
+addition/MS
+additive/YMS
+additivity
+addle/GDS
+addressability
+addressable/U
+addressed/A
+addressee/SM
+addresser/M
+addresses/A
+address/MDRSZGB
+Addressograph/M
+adduce/GRSD
+adducer/M
+adduct/DGVS
+adduction/M
+adductor/M
+Addy/M
+add/ZGBSDR
+Adelaida/M
+Adelaide/M
+Adela/M
+Adelbert/M
+Adele/M
+Adelheid/M
+Adelice/M
+Adelina/M
+Adelind/M
+Adeline/M
+Adella/M
+Adelle/M
+Adel/M
+Ade/M
+Adena/M
+Adenauer/M
+adenine/SM
+Aden/M
+adenoidal
+adenoid/S
+adeptness/MS
+adept/RYPTS
+adequacy/IMS
+adequate/IPY
+adequateness's/I
+adequateness/SM
+Adey/M
+Adham/M
+Adhara/M
+adherence/SM
+adherent/YMS
+adherer/M
+adhere/ZGRSD
+adhesion/MS
+adhesiveness/MS
+adhesive/PYMS
+adiabatic
+adiabatically
+Adiana/M
+Adidas/M
+adieu/S
+Adi/M
+Adina/M
+adiós
+adipose/S
+Adirondack/SM
+adj
+adjacency/MS
+adjacent/Y
+adjectival/Y
+adjective/MYS
+adjoin/SDG
+adjoint/M
+adjourn/DGLS
+adjournment/SM
+adjudge/DSG
+adjudicate/VNGXSD
+adjudication/M
+adjudicator/SM
+adjudicatory
+adjunct/VSYM
+adjuration/SM
+adjure/GSD
+adjustable/U
+adjustably
+adjust/DRALGSB
+adjusted/U
+adjuster's/A
+adjuster/SM
+adjustive
+adjustment/MAS
+adjustor's
+adjutant/SM
+Adkins/M
+Adlai/M
+Adler/M
+adman/M
+admen
+administer/GDJS
+administrable
+administrate/XSDVNG
+administration/M
+administrative/Y
+administrator/MS
+administratrix/M
+admirableness/M
+admirable/P
+admirably
+admiral/SM
+admiralty/MS
+Admiralty/S
+admiration/MS
+admirer/M
+admire/RSDZBG
+admiring/Y
+admissibility/ISM
+admissible/I
+admissibly
+admission/AMS
+admit/AS
+admittance/MS
+admitted/A
+admittedly
+admitting/A
+admix/SDG
+admixture/SM
+Adm/M
+Ad/MN
+admonisher/M
+admonish/GLSRD
+admonishing/Y
+admonishment/SM
+admonition/MS
+admonitory
+adobe/MS
+adolescence/MS
+adolescent/SYM
+Adolf/M
+Adolfo/M
+Adolphe/M
+Adolph/M
+Adolpho/M
+Adolphus/M
+Ado/M
+ado/MS
+Adonis/SM
+adopted/AU
+adopter/M
+adoption/MS
+adoptive/Y
+adopt/RDSBZVG
+adopts/A
+adorableness/SM
+adorable/P
+adorably
+Adora/M
+adoration/SM
+adore/DSRGZB
+Adoree/M
+Adore/M
+adorer/M
+adoring/Y
+adorned/U
+Adorne/M
+adornment/SM
+adorn/SGLD
+ADP
+Adrea/M
+adrenalin
+adrenaline/MS
+Adrenalin/MS
+adrenal/YS
+Adria/MX
+Adriana/M
+Adriane/M
+Adrian/M
+Adrianna/M
+Adrianne/M
+Adriano/M
+Adriatic
+Adriena/M
+Adrien/M
+Adrienne/M
+adrift
+adroitness/MS
+adroit/RTYP
+ads
+ad's
+adsorbate/M
+adsorbent/S
+adsorb/GSD
+adsorption/MS
+adsorptive/Y
+adulate/GNDSX
+adulation/M
+adulator/SM
+adulatory
+adulterant/SM
+adulterated/U
+adulterate/NGSDX
+adulteration/M
+adulterer/SM
+adulteress/MS
+adulterous/Y
+adultery/SM
+adulthood/MS
+adult/MYPS
+adultness/M
+adumbrate/XSDVGN
+adumbration/M
+adumbrative/Y
+adv
+advance/DSRLZG
+advancement/MS
+advancer/M
+advantage/GMEDS
+advantageous/EY
+advantageousness/M
+Adventist/M
+adventist/S
+adventitiousness/M
+adventitious/PY
+adventive/Y
+Advent/SM
+advent/SVM
+adventurer/M
+adventuresome
+adventure/SRDGMZ
+adventuress/SM
+adventurousness/SM
+adventurous/YP
+adverbial/MYS
+adverb/SM
+adversarial
+adversary/SM
+adverse/DSRPYTG
+adverseness/MS
+adversity/SM
+advert/GSD
+advertised/U
+advertise/JGZSRDL
+advertisement/SM
+advertiser/M
+advertising/M
+advertorial/S
+advice/SM
+Advil/M
+advisability/SIM
+advisable/I
+advisableness/M
+advisably
+advisedly/I
+advised/YU
+advisee/MS
+advisement/MS
+adviser/M
+advise/ZRSDGLB
+advisor/S
+advisor's
+advisory/S
+advocacy/SM
+advocate/NGVDS
+advocation/M
+advt
+adze's
+adz/MDSG
+Aegean
+aegis/SM
+Aelfric/M
+Aeneas
+Aeneid/M
+aeolian
+Aeolus/M
+aeon's
+aerate/XNGSD
+aeration/M
+aerator/MS
+aerialist/MS
+aerial/SMY
+Aeriela/M
+Aeriell/M
+Aeriel/M
+aerie/SRMT
+aeroacoustic
+aerobatic/S
+aerobically
+aerobic/S
+aerodrome/SM
+aerodynamically
+aerodynamic/S
+aerodynamics/M
+aeronautical/Y
+aeronautic/S
+aeronautics/M
+aerosolize/D
+aerosol/MS
+aerospace/SM
+Aeschylus/M
+Aesculapius/M
+Aesop/M
+aesthete/S
+aesthetically
+aestheticism/MS
+aesthetics/M
+aesthetic/U
+aether/M
+aetiology/M
+AF
+AFAIK
+afar/S
+AFB
+AFC
+AFDC
+affability/MS
+affable/TR
+affably
+affair/SM
+affectation/MS
+affectedness/EM
+affected/UEYP
+affect/EGSD
+affecter/M
+affecting/Y
+affectionate/UY
+affectioned
+affection/EMS
+affectioning
+affective/MY
+afferent/YS
+affiance/GDS
+affidavit/SM
+affiliated/U
+affiliate/EXSDNG
+affiliation/EM
+affine
+affinity/SM
+affirm/ASDG
+affirmation/SAM
+affirmative/SY
+affix/SDG
+afflatus/MS
+afflict/GVDS
+affliction/SM
+afflictive/Y
+affluence/SM
+affluent/YS
+afford/DSBG
+afforest/A
+afforestation/SM
+afforested
+afforesting
+afforests
+affray/MDSG
+affricate/VNMS
+affrication/M
+affricative/M
+affright
+affront/GSDM
+Afghani/SM
+Afghanistan/M
+afghan/MS
+Afghan/SM
+aficionado/MS
+afield
+afire
+aflame
+afloat
+aflutter
+afoot
+afore
+aforementioned
+aforesaid
+aforethought/S
+afoul
+Afr
+afraid/U
+afresh
+Africa/M
+African/MS
+Afrikaans/M
+Afrikaner/SM
+afro
+Afrocentric
+Afrocentrism/S
+Afro/MS
+afterbirth/M
+afterbirths
+afterburner/MS
+aftercare/SM
+aftereffect/MS
+afterglow/MS
+afterimage/MS
+afterlife/M
+afterlives
+aftermath/M
+aftermaths
+aftermost
+afternoon/SM
+aftershave/S
+aftershock/SM
+afters/M
+aftertaste/SM
+afterthought/MS
+afterward/S
+afterworld/MS
+Afton/M
+aft/ZR
+Agace/M
+again
+against
+Agamemnon/M
+agapae
+agape/S
+agar/MS
+Agassiz/M
+Agata/M
+agate/SM
+Agatha/M
+Agathe/M
+agave/SM
+agedness/M
+aged/PY
+age/GJDRSMZ
+ageism/S
+ageist/S
+agelessness/MS
+ageless/YP
+agency/SM
+agenda/MS
+agent/AMS
+agented
+agenting
+agentive
+ageratum/M
+Aggie/M
+Aggi/M
+agglomerate/XNGVDS
+agglomeration/M
+agglutinate/VNGXSD
+agglutination/M
+agglutinin/MS
+aggrandize/LDSG
+aggrandizement/SM
+aggravate/SDNGX
+aggravating/Y
+aggravation/M
+aggregated/U
+aggregate/EGNVD
+aggregately
+aggregateness/M
+aggregates
+aggregation/SM
+aggregative/Y
+aggression/SM
+aggressively
+aggressiveness/S
+aggressive/U
+aggressor/MS
+aggrieved/Y
+aggrieve/GDS
+Aggy/SM
+aghast
+agile/YTR
+agility/MS
+agitated/Y
+agitate/XVNGSD
+agitation/M
+agitator/SM
+agitprop/MS
+Aglaia/M
+agleam
+aglitter
+aglow
+Ag/M
+Agna/M
+Agnella/M
+Agnese/M
+Agnes/M
+Agnesse/M
+Agneta/M
+Agnew/M
+Agni/M
+Agnola/M
+agnosticism/MS
+agnostic/SM
+ago
+agog
+agonizedly/S
+agonized/Y
+agonize/ZGRSD
+agonizing/Y
+agony/SM
+agoraphobia/MS
+agoraphobic/S
+Agosto/M
+Agra/M
+agrarianism/MS
+agrarian/S
+agreeable/EP
+agreeableness/SME
+agreeably/E
+agreeing/E
+agree/LEBDS
+agreement/ESM
+agreer/S
+Agretha/M
+agribusiness/SM
+Agricola/M
+agriculturalist/S
+agricultural/Y
+agriculture/MS
+agriculturist/SM
+Agrippa/M
+Agrippina/M
+agrochemicals
+agronomic/S
+agronomist/SM
+agronomy/MS
+aground
+Aguascalientes/M
+ague/MS
+Aguie/M
+Aguilar/M
+Aguinaldo/M
+Aguirre/M
+Aguistin/M
+Aguste/M
+Agustin/M
+ah
+Ahab/M
+Aharon/M
+aha/S
+ahead
+ahem/S
+Ahmadabad
+Ahmad/M
+Ahmed/M
+ahoy/S
+Ahriman/M
+AI
+Aida/M
+Aidan/M
+aided/U
+aide/MS
+aider/M
+AIDS
+aid/ZGDRS
+Aigneis/M
+aigrette/SM
+Aiken/M
+Aila/M
+Ailbert/M
+Ailee/M
+Aileen/M
+Aile/M
+Ailene/M
+aileron/MS
+Ailey/M
+Ailina/M
+Aili/SM
+ail/LSDG
+ailment/SM
+Ailsun/M
+Ailyn/M
+Aimee/M
+Aime/M
+aimer/M
+Aimil/M
+aimlessness/MS
+aimless/YP
+aim/ZSGDR
+Aindrea/M
+Ainslee/M
+Ainsley/M
+Ainslie/M
+ain't
+Ainu/M
+airbag/MS
+airbase/S
+airborne
+airbrush/SDMG
+Airbus/M
+airbus/SM
+aircraft/MS
+aircrew/M
+airdrop/MS
+airdropped
+airdropping
+Airedale/SM
+Aires
+airfare/S
+airfield/MS
+airflow/SM
+airfoil/MS
+airframe/MS
+airfreight/SGD
+airhead/MS
+airily
+airiness/MS
+airing/M
+airlessness/S
+airless/P
+airlift/MDSG
+airliner/M
+airline/SRMZ
+airlock/MS
+airmail/DSG
+airman/M
+airmass
+air/MDRTZGJS
+airmen
+airpark
+airplane/SM
+airplay/S
+airport/MS
+airship/MS
+airsickness/SM
+airsick/P
+airspace/SM
+airspeed/SM
+airstrip/MS
+airtightness/M
+airtight/P
+airtime
+airwaves
+airway/SM
+airworthiness/SM
+airworthy/PTR
+airy/PRT
+Aisha/M
+aisle/DSGM
+aitch/MS
+ajar
+Ajax/M
+Ajay/M
+AK
+aka
+Akbar/M
+Akihito/M
+akimbo
+Akim/M
+akin
+Akita/M
+Akkad/M
+Akron/M
+Aksel/M
+AL
+Alabama/M
+Alabaman/S
+Alabamian/MS
+alabaster/MS
+alack/S
+alacrity/SM
+Aladdin/M
+Alaine/M
+Alain/M
+Alair/M
+Alameda/M
+Alamogordo/M
+Alamo/SM
+ala/MS
+Ala/MS
+Alanah/M
+Alana/M
+Aland/M
+Alane/M
+alanine/M
+Alan/M
+Alanna/M
+Alano/M
+Alanson/M
+Alard/M
+Alaric/M
+Alar/M
+alarming/Y
+alarmist/MS
+alarm/SDG
+Alasdair/M
+Alaska/M
+Alaskan/S
+alas/S
+Alastair/M
+Alasteir/M
+Alaster/M
+Alayne/M
+albacore/SM
+alba/M
+Alba/M
+Albania/M
+Albanian/SM
+Albany/M
+albatross/SM
+albedo/M
+Albee/M
+albeit
+Alberich/M
+Alberik/M
+Alberio/M
+Alberta/M
+Albertan/S
+Albertina/M
+Albertine/M
+Albert/M
+Alberto/M
+Albie/M
+Albigensian
+Albina/M
+albinism/SM
+albino/MS
+Albion/M
+Albireo/M
+alb/MS
+Albrecht/M
+albumen/M
+albumin/MS
+albuminous
+album/MNXS
+Albuquerque/M
+Alcatraz/M
+Alcestis/M
+alchemical
+alchemist/SM
+alchemy/MS
+Alcibiades/M
+Alcmena/M
+Alcoa/M
+alcoholically
+alcoholic/MS
+alcoholism/SM
+alcohol/MS
+Alcott/M
+alcove/MSD
+Alcuin/M
+Alcyone/M
+Aldan/M
+Aldebaran/M
+aldehyde/M
+Alden/M
+Alderamin/M
+alderman/M
+aldermen
+alder/SM
+alderwoman
+alderwomen
+Aldin/M
+Aldis/M
+Aldo/M
+Aldon/M
+Aldous/M
+Aldrich/M
+Aldric/M
+Aldridge/M
+Aldrin/M
+Aldus/M
+Aldwin/M
+aleatory
+Alecia/M
+Aleck/M
+Alec/M
+Aleda/M
+alee
+Aleece/M
+Aleen/M
+alehouse/MS
+Aleichem/M
+Alejandra/M
+Alejandrina/M
+Alejandro/M
+Alejoa/M
+Aleksandr/M
+Alembert/M
+alembic/SM
+ale/MVS
+Alena/M
+Alene/M
+aleph/M
+Aleppo/M
+Aler/M
+alerted/Y
+alertness/MS
+alert/STZGPRDY
+Alessandra/M
+Alessandro/M
+Aleta/M
+Alethea/M
+Aleutian/S
+Aleut/SM
+alewife/M
+alewives
+Alexa/M
+Alexander/SM
+Alexandra/M
+Alexandre/M
+Alexandria/M
+Alexandrian/S
+Alexandrina/M
+Alexandr/M
+Alexandro/MS
+Alexei/M
+Alexia/M
+Alexina/M
+Alexine/M
+Alexio/M
+Alexi/SM
+Alex/M
+alfalfa/MS
+Alfa/M
+Alfie/M
+Alfi/M
+Alf/M
+Alfonse/M
+Alfons/M
+Alfonso/M
+Alfonzo/M
+Alford/M
+Alfreda/M
+Alfred/M
+Alfredo/M
+alfresco
+Alfy/M
+algae
+algaecide
+algal
+alga/M
+algebraic
+algebraical/Y
+algebraist/M
+algebra/MS
+Algenib/M
+Algeria/M
+Algerian/MS
+Alger/M
+Algernon/M
+Algieba/M
+Algiers/M
+alginate/SM
+ALGOL
+Algol/M
+Algonquian/SM
+Algonquin/SM
+algorithmic
+algorithmically
+algorithm/MS
+Alhambra/M
+Alhena/M
+Alia/M
+alias/GSD
+alibi/MDSG
+Alica/M
+Alicea/M
+Alice/M
+Alicia/M
+Alick/M
+Alic/M
+Alida/M
+Alidia/M
+Alie/M
+alienable/IU
+alienate/SDNGX
+alienation/M
+alienist/MS
+alien/RDGMBS
+Alighieri/M
+alight/DSG
+aligned/U
+aligner/SM
+align/LASDG
+alignment/SAM
+Alika/M
+Alikee/M
+alikeness/M
+alike/U
+alimentary
+aliment/SDMG
+alimony/MS
+Ali/MS
+Alina/M
+Aline/M
+alinement's
+Alioth/M
+aliquot/S
+Alisa/M
+Alisander/M
+Alisha/M
+Alison/M
+Alissa/M
+Alistair/M
+Alister/M
+Alisun/M
+aliveness/MS
+alive/P
+Alix/M
+aliyah/M
+aliyahs
+Aliza/M
+Alkaid/M
+alkalies
+alkali/M
+alkaline
+alkalinity/MS
+alkalize/SDG
+alkaloid/MS
+alkyd/S
+alkyl/M
+Allahabad/M
+Allah/M
+Alla/M
+Allan/M
+Allard/M
+allay/GDS
+Allayne/M
+Alleen/M
+allegation/SM
+alleged/Y
+allege/SDG
+Allegheny/MS
+allegiance/SM
+allegiant
+allegoric
+allegoricalness/M
+allegorical/YP
+allegorist/MS
+allegory/SM
+Allegra/M
+allegretto/MS
+allegri
+allegro/MS
+allele/SM
+alleluia/S
+allemande/M
+Allendale/M
+Allende/M
+Allene/M
+Allen/M
+Allentown/M
+allergenic
+allergen/MS
+allergic
+allergically
+allergist/MS
+allergy/MS
+alleviate/SDVGNX
+alleviation/M
+alleviator/MS
+Alley/M
+alley/MS
+Alleyn/M
+alleyway/MS
+Allhallows
+alliance/MS
+Allianora/M
+Allie/M
+allier
+allies/M
+alligator/DMGS
+Alli/MS
+Allina/M
+Allin/M
+Allison/M
+Allissa/M
+Allister/M
+Allistir/M
+alliterate/XVNGSD
+alliteration/M
+alliterative/Y
+Allix/M
+allocable/U
+allocatable
+allocate/ACSDNGX
+allocated/U
+allocation/AMC
+allocative
+allocator/AMS
+allophone/MS
+allophonic
+allotment/MS
+allotments/A
+allotrope/M
+allotropic
+allots/A
+allot/SDL
+allotted/A
+allotter/M
+allotting/A
+allover/S
+allowableness/M
+allowable/P
+allowably
+allowance/GSDM
+allowed/Y
+allowing/E
+allow/SBGD
+allows/E
+alloyed/U
+alloy/SGMD
+all/S
+allspice/MS
+Allstate/M
+Allsun/M
+allude/GSD
+allure/GLSD
+allurement/SM
+alluring/Y
+allusion/MS
+allusiveness/MS
+allusive/PY
+alluvial/S
+alluvions
+alluvium/MS
+Allx/M
+ally/ASDG
+Allyce/M
+Ally/MS
+Allyn/M
+Allys
+Allyson/M
+alma
+Almach/M
+Almaden/M
+almagest
+Alma/M
+almanac/MS
+Almaty/M
+Almeda/M
+Almeria/M
+Almeta/M
+almightiness/M
+Almighty/M
+almighty/P
+Almira/M
+Almire/M
+almond/SM
+almoner/MS
+almost
+Al/MRY
+alms/A
+almshouse/SM
+almsman/M
+alnico
+Alnilam/M
+Alnitak/M
+aloe/MS
+aloft
+aloha/SM
+Aloin/M
+Aloise/M
+Aloisia/M
+aloneness/M
+alone/P
+along
+alongshore
+alongside
+Alon/M
+Alonso/M
+Alonzo/M
+aloofness/MS
+aloof/YP
+aloud
+Aloysia/M
+Aloysius/M
+alpaca/SM
+Alpert/M
+alphabetical/Y
+alphabetic/S
+alphabetization/SM
+alphabetizer/M
+alphabetize/SRDGZ
+alphabet/SGDM
+alpha/MS
+alphanumerical/Y
+alphanumeric/S
+Alphard/M
+Alphecca/M
+Alpheratz/M
+Alphonse/M
+Alphonso/M
+Alpine
+alpine/S
+alp/MS
+Alps
+already
+Alric/M
+alright
+Alsace/M
+Alsatian/MS
+also
+Alsop/M
+Alston/M
+Altaic/M
+Altai/M
+Altair/M
+Alta/M
+altar/MS
+altarpiece/SM
+alterable/UI
+alteration/MS
+altercate/NX
+altercation/M
+altered/U
+alternate/SDVGNYX
+alternation/M
+alternativeness/M
+alternative/YMSP
+alternator/MS
+alter/RDZBG
+Althea/M
+although
+altimeter/SM
+Altiplano/M
+altitude/SM
+altogether/S
+Alton/M
+alto/SM
+Altos/M
+altruism/SM
+altruistic
+altruistically
+altruist/SM
+alt/RZS
+ALU
+Aludra/M
+Aluin/M
+Aluino/M
+alumina/SM
+aluminum/MS
+alumnae
+alumna/M
+alumni
+alumnus/MS
+alum/SM
+alundum
+Alva/M
+Alvan/M
+Alvarado/M
+Alvarez/M
+Alvaro/M
+alveolar/Y
+alveoli
+alveolus/M
+Alvera/M
+Alverta/M
+Alvie/M
+Alvina/M
+Alvinia/M
+Alvin/M
+Alvira/M
+Alvis/M
+Alvy/M
+alway/S
+Alwin/M
+Alwyn/M
+Alyce/M
+Alyda/M
+Alyosha/M
+Alysa/M
+Alyse/M
+Alysia/M
+Alys/M
+Alyson/M
+Alyss
+Alyssa/M
+Alzheimer/M
+AM
+AMA
+Amabelle/M
+Amabel/M
+Amadeus/M
+Amado/M
+amain
+Amalea/M
+Amalee/M
+Amaleta/M
+amalgamate/VNGXSD
+amalgamation/M
+amalgam/MS
+Amalia/M
+Amalie/M
+Amalita/M
+Amalle/M
+Amanda/M
+Amandie/M
+Amandi/M
+Amandy/M
+amanuenses
+amanuensis/M
+Amara/M
+amaranth/M
+amaranths
+amaretto/S
+Amargo/M
+Amarillo/M
+amaryllis/MS
+am/AS
+amasser/M
+amass/GRSD
+Amata/M
+amateurishness/MS
+amateurish/YP
+amateurism/MS
+amateur/SM
+Amati/M
+amatory
+amazed/Y
+amaze/LDSRGZ
+amazement/MS
+amazing/Y
+amazonian
+Amazonian
+amazon/MS
+Amazon/SM
+ambassadorial
+ambassador/MS
+ambassadorship/MS
+ambassadress/SM
+ambergris/SM
+Amberly/M
+amber/MS
+Amber/YM
+ambiance/MS
+ambidexterity/MS
+ambidextrous/Y
+ambience's
+ambient/S
+ambiguity/MS
+ambiguously/U
+ambiguousness/M
+ambiguous/YP
+ambition/GMDS
+ambitiousness/MS
+ambitious/PY
+ambit/M
+ambivalence/SM
+ambivalent/Y
+amble/GZDSR
+Amble/M
+ambler/M
+ambrose
+Ambrose/M
+ambrosial/Y
+ambrosia/SM
+Ambrosi/M
+Ambrosio/M
+Ambrosius/M
+Ambros/M
+ambulance/MS
+ambulant/S
+ambulate/DSNGX
+ambulation/M
+ambulatory/S
+Ambur/M
+ambuscade/MGSRD
+ambuscader/M
+ambusher/M
+ambush/MZRSDG
+Amby/M
+Amdahl/M
+ameba's
+Amelia/M
+Amelie/M
+Amelina/M
+Ameline/M
+ameliorate/XVGNSD
+amelioration/M
+Amelita/M
+amenability/SM
+amenably
+amended/U
+amender/M
+amendment/SM
+amen/DRGTSB
+amend/SBRDGL
+amends/M
+Amenhotep/M
+amenity/MS
+amenorrhea/M
+Amerada/M
+Amerasian/S
+amercement/MS
+amerce/SDLG
+Americana/M
+Americanism/SM
+Americanization/SM
+americanized
+Americanize/SDG
+American/MS
+America/SM
+americium/MS
+Amerigo/M
+Amerindian/MS
+Amerind/MS
+Amer/M
+Amery/M
+Ameslan/M
+Ame/SM
+amethystine
+amethyst/MS
+Amharic/M
+Amherst/M
+amiability/MS
+amiableness/M
+amiable/RPT
+amiably
+amicability/SM
+amicableness/M
+amicable/P
+amicably
+amide/SM
+amid/S
+amidships
+amidst
+Amie/M
+Amiga/M
+amigo/MS
+Amii/M
+Amil/M
+Ami/M
+amines
+aminobenzoic
+amino/M
+amir's
+Amish
+amiss
+Amitie/M
+Amity/M
+amity/SM
+Ammamaria/M
+Amman/M
+Ammerman/M
+ammeter/MS
+ammo/MS
+ammoniac
+ammonia/MS
+ammonium/M
+Am/MR
+ammunition/MS
+amnesiac/MS
+amnesia/SM
+amnesic/S
+amnesty/GMSD
+amniocenteses
+amniocentesis/M
+amnion/SM
+amniotic
+Amoco/M
+amoeba/SM
+amoebic
+amoeboid
+amok/MS
+among
+amongst
+Amontillado/M
+amontillado/MS
+amorality/MS
+amoral/Y
+amorousness/SM
+amorous/PY
+amorphousness/MS
+amorphous/PY
+amortization/SUM
+amortized/U
+amortize/SDG
+Amory/M
+Amos
+amount/SMRDZG
+amour/MS
+Amparo/M
+amperage/SM
+Ampere/M
+ampere/MS
+ampersand/MS
+Ampex/M
+amphetamine/MS
+amphibian/SM
+amphibiousness/M
+amphibious/PY
+amphibology/M
+amphitheater/SM
+amphorae
+amphora/M
+ampleness/M
+ample/PTR
+amplification/M
+amplifier/M
+amplify/DRSXGNZ
+amplitude/MS
+ampoule's
+amp/SGMDY
+ampule/SM
+amputate/DSNGX
+amputation/M
+amputee/SM
+Amritsar/M
+ams
+Amsterdam/M
+amt
+Amtrak/M
+amuck's
+amulet/SM
+Amundsen/M
+Amur/M
+amused/Y
+amuse/LDSRGVZ
+amusement/SM
+amuser/M
+amusingness/M
+amusing/YP
+Amway/M
+Amye/M
+amylase/MS
+amyl/M
+Amy/M
+Anabal/M
+Anabaptist/SM
+Anabella/M
+Anabelle/M
+Anabel/M
+anabolic
+anabolism/MS
+anachronism/SM
+anachronistic
+anachronistically
+Anacin/M
+anaconda/MS
+Anacreon/M
+anaerobe/SM
+anaerobic
+anaerobically
+anaglyph/M
+anagrammatic
+anagrammatically
+anagrammed
+anagramming
+anagram/MS
+Anaheim/M
+Analects/M
+analgesia/MS
+analgesic/S
+Analiese/M
+Analise/M
+Anallese/M
+Anallise/M
+analogical/Y
+analogize/SDG
+analogousness/MS
+analogous/YP
+analog/SM
+analogue/SM
+analogy/MS
+anal/Y
+analysand/MS
+analyses
+analysis/AM
+analyst/SM
+analytical/Y
+analyticity/S
+analytic/S
+analytics/M
+analyzable/U
+analyze/DRSZGA
+analyzed/U
+analyzer/M
+Ana/M
+anamorphic
+Ananias/M
+anapaest's
+anapestic/S
+anapest/SM
+anaphora/M
+anaphoric
+anaphorically
+anaplasmosis/M
+anarchic
+anarchical/Y
+anarchism/MS
+anarchistic
+anarchist/MS
+anarchy/MS
+Anastasia/M
+Anastasie/M
+Anastassia/M
+anastigmatic
+anastomoses
+anastomosis/M
+anastomotic
+anathema/MS
+anathematize/GSD
+Anatola/M
+Anatole/M
+Anatolia/M
+Anatolian
+Anatollo/M
+Anatol/M
+anatomic
+anatomical/YS
+anatomist/MS
+anatomize/GSD
+anatomy/MS
+Anaxagoras/M
+Ancell/M
+ancestor/SMDG
+ancestral/Y
+ancestress/SM
+ancestry/SM
+Anchorage/M
+anchorage/SM
+anchored/U
+anchorite/MS
+anchoritism/M
+anchorman/M
+anchormen
+anchorpeople
+anchorperson/S
+anchor/SGDM
+anchorwoman
+anchorwomen
+anchovy/MS
+ancientness/MS
+ancient/SRYTP
+ancillary/S
+an/CS
+Andalusia/M
+Andalusian
+Andaman
+andante/S
+and/DZGS
+Andean/M
+Andeee/M
+Andee/M
+Anderea/M
+Andersen/M
+Anders/N
+Anderson/M
+Andes
+Andie/M
+Andi/M
+andiron/MS
+Andonis/M
+Andorra/M
+Andover/M
+Andra/SM
+Andrea/MS
+Andreana/M
+Andree/M
+Andrei/M
+Andrej/M
+Andre/SM
+Andrew/MS
+Andrey/M
+Andria/M
+Andriana/M
+Andriette/M
+Andris
+androgenic
+androgen/SM
+androgynous
+androgyny/SM
+android/MS
+Andromache/M
+Andromeda/M
+Andropov/M
+Andros/M
+Andrus/M
+Andy/M
+anecdotal/Y
+anecdote/SM
+anechoic
+anemia/SM
+anemically
+anemic/S
+anemometer/MS
+anemometry/M
+anemone/SM
+anent
+aneroid
+Anestassia/M
+anesthesia/MS
+anesthesiologist/MS
+anesthesiology/SM
+anesthetically
+anesthetic/SM
+anesthetist/MS
+anesthetization/SM
+anesthetizer/M
+anesthetize/ZSRDG
+Anet/M
+Anetta/M
+Anette/M
+Anett/M
+aneurysm/MS
+anew
+Angara/M
+Angela/M
+Angeleno/SM
+Angele/SM
+angelfish/SM
+Angelia/M
+angelic
+angelical/Y
+Angelica/M
+angelica/MS
+Angelico/M
+Angelika/M
+Angeli/M
+Angelina/M
+Angeline/M
+Angelique/M
+Angelita/M
+Angelle/M
+Angel/M
+angel/MDSG
+Angelo/M
+Angelou/M
+Ange/M
+anger/GDMS
+Angevin/M
+Angie/M
+Angil/M
+angina/MS
+angiography
+angioplasty/S
+angiosperm/MS
+Angkor/M
+angle/GMZDSRJ
+angler/M
+Angles
+angleworm/MS
+Anglia/M
+Anglicanism/MS
+Anglican/MS
+Anglicism/SM
+Anglicization/MS
+anglicize/SDG
+Anglicize/SDG
+angling/M
+Anglo/MS
+Anglophile/SM
+Anglophilia/M
+Anglophobe/MS
+Anglophobia/M
+Angola/M
+Angolan/S
+angora/MS
+Angora/MS
+angrily
+angriness/M
+angry/RTP
+angst/MS
+Ångström/M
+angstrom/MS
+Anguilla/M
+anguish/DSMG
+angularity/MS
+angular/Y
+Angus/M
+Angy/M
+Anheuser/M
+anhydride/M
+anhydrite/M
+anhydrous/Y
+Aniakchak/M
+Ania/M
+Anibal/M
+Anica/M
+aniline/SM
+animadversion/SM
+animadvert/DSG
+animalcule/MS
+animal/MYPS
+animated/A
+animatedly
+animately/I
+animateness/MI
+animates/A
+animate/YNGXDSP
+animating/A
+animation/AMS
+animator/SM
+animism/SM
+animistic
+animist/S
+animized
+animosity/MS
+animus/SM
+anionic/S
+anion/MS
+aniseed/MS
+aniseikonic
+anise/MS
+anisette/SM
+anisotropic
+anisotropy/MS
+Anissa/M
+Anita/M
+Anitra/M
+Anjanette/M
+Anjela/M
+Ankara/M
+ankh/M
+ankhs
+anklebone/SM
+ankle/GMDS
+anklet/MS
+Annabal/M
+Annabela/M
+Annabella/M
+Annabelle/M
+Annabell/M
+Annabel/M
+Annadiana/M
+Annadiane/M
+Annalee/M
+Annaliese/M
+Annalise/M
+annalist/MS
+annal/MNS
+Anna/M
+Annamaria/M
+Annamarie/M
+Annapolis/M
+Annapurna/M
+anneal/DRSZG
+annealer/M
+Annecorinne/M
+annelid/MS
+Anneliese/M
+Annelise/M
+Anne/M
+Annemarie/M
+Annetta/M
+Annette/M
+annexation/SM
+annexe/M
+annex/GSD
+Annice/M
+Annie/M
+annihilate/XSDVGN
+annihilation/M
+annihilator/MS
+Anni/MS
+Annissa/M
+anniversary/MS
+Ann/M
+Annmaria/M
+Annmarie/M
+Annnora/M
+Annora/M
+annotated/U
+annotate/VNGXSD
+annotation/M
+annotator/MS
+announced/U
+announcement/SM
+announcer/M
+announce/ZGLRSD
+annoyance/MS
+annoyer/M
+annoying/Y
+annoy/ZGSRD
+annualized
+annual/YS
+annuitant/MS
+annuity/MS
+annular/YS
+annuli
+annulled
+annulling
+annulment/MS
+annul/SL
+annulus/M
+annum
+annunciate/XNGSD
+annunciation/M
+Annunciation/S
+annunciator/SM
+Anny/M
+anode/SM
+anodic
+anodize/GDS
+anodyne/SM
+anoint/DRLGS
+anointer/M
+anointment/SM
+anomalousness/M
+anomalous/YP
+anomaly/MS
+anomic
+anomie/M
+anon/S
+anonymity/MS
+anonymousness/M
+anonymous/YP
+anopheles/M
+anorak/SM
+anorectic/S
+anorexia/SM
+anorexic/S
+another/M
+Anouilh/M
+Ansell/M
+Ansel/M
+Anselma/M
+Anselm/M
+Anselmo/M
+Anshan/M
+ANSI/M
+Ansley/M
+ans/M
+Anson/M
+Anstice/M
+answerable/U
+answered/U
+answerer/M
+answer/MZGBSDR
+antacid/MS
+Antaeus/M
+antagonism/MS
+antagonistic
+antagonistically
+antagonist/MS
+antagonized/U
+antagonize/GZRSD
+antagonizing/U
+Antananarivo/M
+antarctic
+Antarctica/M
+Antarctic/M
+Antares
+anteater/MS
+antebellum
+antecedence/MS
+antecedent/SMY
+antechamber/SM
+antedate/GDS
+antediluvian/S
+anteing
+antelope/MS
+ante/MS
+antenatal
+antennae
+antenna/MS
+anterior/SY
+anteroom/SM
+ant/GSMD
+Anthea/M
+Anthe/M
+anthem/MGDS
+anther/MS
+Anthia/M
+Anthiathia/M
+anthill/S
+anthologist/MS
+anthologize/GDS
+anthology/SM
+Anthony/M
+anthraces
+anthracite/MS
+anthrax/M
+anthropic
+anthropocentric
+anthropogenic
+anthropoid/S
+anthropological/Y
+anthropologist/MS
+anthropology/SM
+anthropometric/S
+anthropometry/M
+anthropomorphic
+anthropomorphically
+anthropomorphism/SM
+anthropomorphizing
+anthropomorphous
+antiabortion
+antiabortionist/S
+antiaircraft
+antibacterial/S
+antibiotic/SM
+antibody/MS
+anticancer
+Antichrist/MS
+anticipated/U
+anticipate/XVGNSD
+anticipation/M
+anticipative/Y
+anticipatory
+anticked
+anticking
+anticlerical/S
+anticlimactic
+anticlimactically
+anticlimax/SM
+anticline/SM
+anticlockwise
+antic/MS
+anticoagulant/S
+anticoagulation/M
+anticommunism/SM
+anticommunist/SM
+anticompetitive
+anticyclone/MS
+anticyclonic
+antidemocratic
+antidepressant/SM
+antidisestablishmentarianism/M
+antidote/DSMG
+Antietam/M
+antifascist/SM
+antiformant
+antifreeze/SM
+antifundamentalist/M
+antigenic
+antigenicity/SM
+antigen/MS
+antigone
+Antigone/M
+Antigua/M
+antiheroes
+antihero/M
+antihistamine/MS
+antihistorical
+antiknock/MS
+antilabor
+Antillean
+Antilles
+antilogarithm/SM
+antilogs
+antimacassar/SM
+antimalarial/S
+antimatter/SM
+antimicrobial/S
+antimissile/S
+antimony/SM
+anting/M
+Antin/M
+antinomian
+antinomy/M
+antinuclear
+Antioch/M
+antioxidant/MS
+antiparticle/SM
+Antipas/M
+antipasti
+antipasto/MS
+antipathetic
+antipathy/SM
+antipersonnel
+antiperspirant/MS
+antiphonal/SY
+antiphon/SM
+antipodal/S
+antipodean/S
+antipode/MS
+Antipodes
+antipollution/S
+antipoverty
+antiquarianism/MS
+antiquarian/MS
+antiquary/SM
+antiquate/NGSD
+antiquation/M
+antique/MGDS
+antiquity/SM
+antiredeposition
+antiresonance/M
+antiresonator
+anti/S
+antisemitic
+antisemitism/M
+antisepses
+antisepsis/M
+antiseptically
+antiseptic/S
+antiserum/SM
+antislavery/S
+antisocial/Y
+antispasmodic/S
+antisubmarine
+antisymmetric
+antisymmetry
+antitank
+antitheses
+antithesis/M
+antithetic
+antithetical/Y
+antithyroid
+antitoxin/MS
+antitrust/MR
+antivenin/MS
+antiviral/S
+antivivisectionist/S
+antiwar
+antler/SDM
+Antofagasta/M
+Antoine/M
+Antoinette/M
+Antonella/M
+Antone/M
+Antonetta/M
+Antonia/M
+Antonie/M
+Antonietta/M
+Antoni/M
+Antonina/M
+Antonin/M
+Antonino/M
+Antoninus/M
+Antonio/M
+Antonius/M
+Anton/MS
+Antonovics/M
+Antony/M
+antonymous
+antonym/SM
+antral
+antsy/RT
+Antwan/M
+Antwerp/M
+Anubis/M
+anus/SM
+anvil/MDSG
+anxiety/MS
+anxiousness/SM
+anxious/PY
+any
+Anya/M
+anybody/S
+anyhow
+Any/M
+anymore
+anyone/MS
+anyplace
+anything/S
+anytime
+anyway/S
+anywhere/S
+anywise
+AOL/M
+aorta/MS
+aortic
+AP
+apace
+apache/MS
+Apache/MS
+Apalachicola/M
+apartheid/SM
+apart/LP
+apartment/MS
+apartness/M
+apathetic
+apathetically
+apathy/SM
+apatite/MS
+APB
+aped/A
+apelike
+ape/MDRSG
+Apennines
+aper/A
+aperiodic
+aperiodically
+aperiodicity/M
+aperitif/S
+aperture/MDS
+apex/MS
+aphasia/SM
+aphasic/S
+aphelia
+aphelion/SM
+aphid/MS
+aphonic
+aphorism/MS
+aphoristic
+aphoristically
+aphrodisiac/SM
+Aphrodite/M
+Apia/M
+apiarist/SM
+apiary/SM
+apical/YS
+apices's
+apiece
+apishness/M
+apish/YP
+aplenty
+aplomb/SM
+APO
+Apocalypse/M
+apocalypse/MS
+apocalyptic
+apocryphalness/M
+apocryphal/YP
+apocrypha/M
+Apocrypha/M
+apogee/MS
+apolar
+apolitical/Y
+Apollinaire/M
+Apollonian
+Apollo/SM
+apologetically/U
+apologetic/S
+apologetics/M
+apologia/SM
+apologist/MS
+apologize/GZSRD
+apologizer/M
+apologizes/A
+apologizing/U
+apology/MS
+apoplectic
+apoplexy/SM
+apostasy/SM
+apostate/SM
+apostatize/DSG
+apostleship/SM
+apostle/SM
+apostolic
+apostrophe/SM
+apostrophized
+apothecary/MS
+apothegm/MS
+apotheoses
+apotheosis/M
+apotheosized
+apotheosizes
+apotheosizing
+Appalachia/M
+Appalachian/MS
+appalling/Y
+appall/SDG
+Appaloosa/MS
+appaloosa/S
+appanage/M
+apparatus/SM
+apparel/SGMD
+apparency
+apparently/I
+apparentness/M
+apparent/U
+apparition/SM
+appealer/M
+appealing/UY
+appeal/SGMDRZ
+appear/AEGDS
+appearance/AMES
+appearer/S
+appease/DSRGZL
+appeased/U
+appeasement/MS
+appeaser/M
+appellant/MS
+appellate/VNX
+appellation/M
+appellative/MY
+appendage/MS
+appendectomy/SM
+appendices
+appendicitis/SM
+appendix/SM
+append/SGZDR
+appertain/DSG
+appetite/MVS
+appetizer/SM
+appetizing/YU
+Appia/M
+Appian/M
+applauder/M
+applaud/ZGSDR
+applause/MS
+applecart/M
+applejack/MS
+Apple/M
+apple/MS
+applesauce/SM
+Appleseed/M
+Appleton/M
+applet/S
+appliance/SM
+applicabilities
+applicability/IM
+applicable/I
+applicably
+applicant/MS
+applicate/V
+application/MA
+applicative/Y
+applicator/MS
+applier/SM
+appliquéd
+appliqué/MSG
+apply/AGSDXN
+appointee/SM
+appoint/ELSADG
+appointer/MS
+appointive
+appointment/ASEM
+Appolonia/M
+Appomattox/M
+apportion/GADLS
+apportionment/SAM
+appose/SDG
+appositeness/MS
+apposite/XYNVP
+apposition/M
+appositive/SY
+appraisal/SAM
+appraised/A
+appraisees
+appraiser/M
+appraises/A
+appraise/ZGDRS
+appraising/Y
+appreciable/I
+appreciably/I
+appreciated/U
+appreciate/XDSNGV
+appreciation/M
+appreciativeness/MI
+appreciative/PIY
+appreciator/MS
+appreciatory
+apprehend/DRSG
+apprehender/M
+apprehensible
+apprehension/SM
+apprehensiveness/SM
+apprehensive/YP
+apprentice/DSGM
+apprenticeship/SM
+apprise/DSG
+apprizer/SM
+apprizingly
+apprizings
+approachability/UM
+approachable/UI
+approach/BRSDZG
+approacher/M
+approbate/NX
+approbation/EMS
+appropriable
+appropriated/U
+appropriately/I
+appropriateness/SMI
+appropriate/XDSGNVYTP
+appropriation/M
+appropriator/SM
+approval/ESM
+approve/DSREG
+approved/U
+approver's/E
+approver/SM
+approving/YE
+approx
+approximate/XGNVYDS
+approximation/M
+approximative/Y
+appurtenance/MS
+appurtenant/S
+APR
+apricot/MS
+Aprilette/M
+April/MS
+Apr/M
+apron/SDMG
+apropos
+apse/MS
+apsis/M
+apter
+aptest
+aptitude/SM
+aptness/SMI
+aptness's/U
+apt/UPYI
+Apuleius/M
+aquaculture/MS
+aqualung/SM
+aquamarine/SM
+aquanaut/SM
+aquaplane/GSDM
+aquarium/MS
+Aquarius/MS
+aqua/SM
+aquatically
+aquatic/S
+aquavit/SM
+aqueduct/MS
+aqueous/Y
+aquiculture's
+aquifer/SM
+Aquila/M
+aquiline
+Aquinas/M
+Aquino/M
+Aquitaine/M
+AR
+Arabela/M
+Arabele/M
+Arabella/M
+Arabelle/M
+Arabel/M
+arabesque/SM
+Arabia/M
+Arabian/MS
+Arabic/M
+arability/MS
+Arabist/MS
+arable/S
+Arab/MS
+Araby/M
+Araceli/M
+arachnid/MS
+arachnoid/M
+arachnophobia
+Arafat/M
+Araguaya/M
+Araldo/M
+Aral/M
+Ara/M
+Aramaic/M
+Aramco/M
+Arapahoes
+Arapahoe's
+Arapaho/MS
+Ararat/M
+Araucanian/M
+Arawakan/M
+Arawak/M
+arbiter/MS
+arbitrage/GMZRSD
+arbitrager/M
+arbitrageur/S
+arbitrament/MS
+arbitrarily
+arbitrariness/MS
+arbitrary/P
+arbitrate/SDXVNG
+arbitration/M
+arbitrator/SM
+arbor/DMS
+arboreal/Y
+arbores
+arboretum/MS
+arborvitae/MS
+arbutus/SM
+ARC
+arcade/SDMG
+Arcadia/M
+Arcadian
+arcana/M
+arcane/P
+arc/DSGM
+archaeological/Y
+archaeologist/SM
+archaically
+archaic/P
+Archaimbaud/M
+archaism/SM
+archaist/MS
+archaize/GDRSZ
+archaizer/M
+Archambault/M
+archangel/SM
+archbishopric/SM
+archbishop/SM
+archdeacon/MS
+archdiocesan
+archdiocese/SM
+archduchess/MS
+archduke/MS
+Archean
+archenemy/SM
+archeologist's
+archeology/MS
+archer/M
+Archer/M
+archery/MS
+archetypal
+archetype/SM
+archfiend/SM
+archfool
+Archibald/M
+Archibaldo/M
+Archibold/M
+Archie/M
+archiepiscopal
+Archimedes/M
+arching/M
+archipelago/SM
+architect/MS
+architectonic/S
+architectonics/M
+architectural/Y
+architecture/SM
+architrave/MS
+archival
+archive/DRSGMZ
+archived/U
+archivist/MS
+Arch/MR
+archness/MS
+arch/PGVZTMYDSR
+archway/SM
+Archy/M
+arclike
+ARCO/M
+arcsine
+arctangent
+Arctic/M
+arctic/S
+Arcturus/M
+Ardabil
+Arda/MH
+Ardath/M
+Ardeen/M
+Ardelia/M
+Ardelis/M
+Ardella/M
+Ardelle/M
+ardency/M
+Ardene/M
+Ardenia/M
+Arden/M
+ardent/Y
+Ardine/M
+Ardisj/M
+Ardis/M
+Ardith/M
+ardor/SM
+Ardra/M
+arduousness/SM
+arduous/YP
+Ardyce/M
+Ardys
+Ardyth/M
+areal
+area/SM
+areawide
+are/BS
+Arel/M
+arenaceous
+arena/SM
+aren't
+Arequipa/M
+Ares
+Aretha/M
+Argentina/M
+Argentinean/S
+Argentine/SM
+Argentinian/S
+argent/MS
+arginine/MS
+Argonaut/MS
+argonaut/S
+argon/MS
+Argonne/M
+Argo/SM
+argosy/SM
+argot/SM
+arguable/IU
+arguably/IU
+argue/DSRGZ
+arguer/M
+argumentation/SM
+argumentativeness/MS
+argumentative/YP
+argument/SM
+Argus/M
+argyle/S
+Ariadne/M
+Ariana/M
+Arianism/M
+Arianist/SM
+aria/SM
+Aridatha/M
+aridity/SM
+aridness/M
+arid/TYRP
+Ariela/M
+Ariella/M
+Arielle/M
+Ariel/M
+Arie/SM
+Aries/S
+aright
+Ari/M
+Arin/M
+Ario/M
+Ariosto/M
+arise/GJSR
+arisen
+Aristarchus/M
+Aristides
+aristocracy/SM
+aristocratic
+aristocratically
+aristocrat/MS
+Aristophanes/M
+Aristotelean
+Aristotelian/M
+Aristotle/M
+arithmetical/Y
+arithmetician/SM
+arithmetic/MS
+arithmetize/SD
+Arius/M
+Ariz/M
+Arizona/M
+Arizonan/S
+Arizonian/S
+Arjuna/M
+Arkansan/MS
+Arkansas/M
+Arkhangelsk/M
+Ark/M
+ark/MS
+Arkwright/M
+Arlana/M
+Arlan/M
+Arlee/M
+Arleen/M
+Arlena/M
+Arlene/M
+Arlen/M
+Arleta/M
+Arlette/M
+Arley/M
+Arleyne/M
+Arlie/M
+Arliene/M
+Arlina/M
+Arlinda/M
+Arline/M
+Arlington/M
+Arlin/M
+Arluene/M
+Arly/M
+Arlyne/M
+Arlyn/M
+Armada/M
+armada/SM
+armadillo/MS
+Armageddon/SM
+Armagnac/M
+armament/EAS
+armament's/E
+Armand/M
+Armando/M
+Arman/M
+arm/ASEDG
+Armata/M
+armature/MGSD
+armband/SM
+armchair/MS
+Armco/M
+armed/U
+Armenia/M
+Armenian/MS
+armer/MES
+armful/SM
+armhole/MS
+arming/M
+Arminius/M
+Armin/M
+armistice/MS
+armless
+armlet/SM
+armload/M
+Armonk/M
+armored/U
+armorer/M
+armorial/S
+armory/DSM
+armor/ZRDMGS
+Armour/M
+armpit/MS
+armrest/MS
+arm's
+Armstrong/M
+Ar/MY
+army/SM
+Arnaldo/M
+Arneb/M
+Arne/M
+Arney/M
+Arnhem/M
+Arnie/M
+Arni/M
+Arnold/M
+Arnoldo/M
+Arno/M
+Arnuad/M
+Arnulfo/M
+Arny/M
+aroma/SM
+aromatherapist/S
+aromatherapy/S
+aromatically
+aromaticity/M
+aromaticness/M
+aromatic/SP
+Aron/M
+arose
+around
+arousal/MS
+aroused/U
+arouse/GSD
+ARPA/M
+Arpanet/M
+ARPANET/M
+arpeggio/SM
+arrack/M
+Arragon/M
+arraignment/MS
+arraign/SDGL
+arrangeable/A
+arranged/EA
+arrangement/AMSE
+arranger/M
+arranges/EA
+arrange/ZDSRLG
+arranging/EA
+arrant/Y
+arras/SM
+arrayer
+array/ESGMD
+arrear/SM
+arrest/ADSG
+arrestee/MS
+arrester/MS
+arresting/Y
+arrestor/MS
+Arrhenius/M
+arrhythmia/SM
+arrhythmic
+arrhythmical
+Arri/M
+arrival/MS
+arriver/M
+arrive/SRDG
+arrogance/MS
+arrogant/Y
+arrogate/XNGDS
+arrogation/M
+Arron/M
+arrowhead/SM
+arrowroot/MS
+arrow/SDMG
+arroyo/MS
+arr/TV
+arsenal/MS
+arsenate/M
+arsenic/MS
+arsenide/M
+arsine/MS
+arsonist/MS
+arson/SM
+Artair/M
+Artaxerxes/M
+artefact's
+Arte/M
+Artemas
+Artemis/M
+Artemus/M
+arterial/SY
+arteriolar
+arteriole/SM
+arterioscleroses
+arteriosclerosis/M
+artery/SM
+artesian
+artfulness/SM
+artful/YP
+Arther/M
+arthritic/S
+arthritides
+arthritis/M
+arthrogram/MS
+arthropod/SM
+arthroscope/S
+arthroscopic
+Arthurian
+Arthur/M
+artichoke/SM
+article/GMDS
+articulable/I
+articular
+articulated/EU
+articulately/I
+articulateness/IMS
+articulates/I
+articulate/VGNYXPSD
+articulation/M
+articulator/SM
+articulatory
+Artie/M
+artifact/MS
+artificer/M
+artifice/ZRSM
+artificiality/MS
+artificialness/M
+artificial/PY
+artillerist
+artilleryman/M
+artillerymen
+artillery/SM
+artiness/MS
+artisan/SM
+artiste/SM
+artistically/I
+artistic/I
+artist/MS
+artistry/SM
+artlessness/MS
+artless/YP
+Art/M
+art/SM
+artsy/RT
+Artur/M
+Arturo/M
+Artus/M
+artwork/MS
+Arty/M
+arty/TPR
+Aruba/M
+arum/MS
+Arvie/M
+Arvin/M
+Arv/M
+Arvy/M
+Aryan/MS
+Aryn/M
+as
+As
+A's
+Asa/M
+Asama/M
+asap
+ASAP
+asbestos/MS
+Ascella/M
+ascend/ADGS
+ascendancy/MS
+ascendant/SY
+ascender/SM
+Ascension/M
+ascension/SM
+ascent/SM
+ascertain/DSBLG
+ascertainment/MS
+ascetically
+asceticism/MS
+ascetic/SM
+ASCII
+ascot/MS
+ascribe/GSDB
+ascription/MS
+ascriptive
+Ase/M
+aseptically
+aseptic/S
+asexuality/MS
+asexual/Y
+Asgard/M
+ashame/D
+ashamed/UY
+Ashanti/M
+Ashbey/M
+Ashby/M
+ashcan/SM
+Ashely/M
+Asher/M
+Asheville/M
+Ashia/M
+Ashien/M
+Ashil/M
+Ashkenazim
+Ashkhabad/M
+Ashla/M
+Ashland/M
+Ashlan/M
+ashlar/GSDM
+Ashlee/M
+Ashleigh/M
+Ashlen/M
+Ashley/M
+Ashlie/M
+Ashli/M
+Ashlin/M
+Ashly/M
+ashman/M
+ash/MNDRSG
+Ashmolean/M
+Ash/MRY
+ashore
+ashram/SM
+Ashton/M
+ashtray/MS
+Ashurbanipal/M
+ashy/RT
+Asia/M
+Asian/MS
+Asiatic/SM
+aside/S
+Asilomar/M
+Asimov
+asinine/Y
+asininity/MS
+askance
+ask/DRZGS
+asked/U
+asker/M
+askew/P
+ASL
+aslant
+asleep
+Asmara/M
+asocial/S
+Asoka/M
+asparagus/MS
+aspartame/S
+ASPCA
+aspect/SM
+Aspell/M
+aspen/M
+Aspen/M
+asperity/SM
+asper/M
+aspersion/SM
+asphalt/MDRSG
+asphodel/MS
+asphyxia/MS
+asphyxiate/GNXSD
+asphyxiation/M
+aspic/MS
+Aspidiske/M
+aspidistra/MS
+aspirant/MS
+aspirate/NGDSX
+aspirational
+aspiration/M
+aspirator/SM
+aspire/GSRD
+aspirer/M
+aspirin/SM
+asplenium
+asp/MNRXS
+Asquith/M
+Assad/M
+assailable/U
+assailant/SM
+assail/BGDS
+Assamese/M
+Assam/M
+assassinate/DSGNX
+assassination/M
+assassin/MS
+assaulter/M
+assaultive/YP
+assault/SGVMDR
+assayer/M
+assay/SZGRD
+assemblage/MS
+assemble/ADSREG
+assembled/U
+assembler/EMS
+assemblies/A
+assembly/EAM
+assemblyman/M
+assemblymen
+Assembly/MS
+assemblywoman
+assemblywomen
+assent/SGMRD
+assert/ADGS
+asserter/MS
+assertional
+assertion/AMS
+assertiveness/SM
+assertive/PY
+assess/BLSDG
+assessed/A
+assesses/A
+assessment/SAM
+assessor/MS
+asset/SM
+asseverate/XSDNG
+asseveration/M
+asshole/MS!
+assiduity/SM
+assiduousness/SM
+assiduous/PY
+assign/ALBSGD
+assignation/MS
+assigned/U
+assignee/MS
+assigner/MS
+assignment/MAS
+assignor/MS
+assigns/CU
+assimilate/VNGXSD
+assimilationist/M
+assimilation/M
+Assisi/M
+assistance/SM
+assistantship/SM
+assistant/SM
+assisted/U
+assister/M
+assist/RDGS
+assize/MGSD
+ass/MNS
+assn
+assoc
+associable
+associated/U
+associate/SDEXNG
+associateship
+associational
+association/ME
+associative/Y
+associativity/S
+associator/MS
+assonance/SM
+assonant/S
+assorter/M
+assort/LRDSG
+assortment/SM
+asst
+assuaged/U
+assuage/SDG
+assumability
+assumer/M
+assume/SRDBJG
+assuming/UA
+assumption/SM
+assumptive
+assurance/AMS
+assure/AGSD
+assuredness/M
+assured/PYS
+assurer/SM
+assuring/YA
+Assyria/M
+Assyrian/SM
+Assyriology/M
+Astaire/SM
+Astarte/M
+astatine/MS
+aster/ESM
+asteria
+asterisked/U
+asterisk/SGMD
+astern
+asteroidal
+asteroid/SM
+asthma/MS
+asthmatic/S
+astigmatic/S
+astigmatism/SM
+astir
+astonish/GSDL
+astonishing/Y
+astonishment/SM
+Aston/M
+Astoria/M
+Astor/M
+astounding/Y
+astound/SDG
+astraddle
+Astrakhan/M
+astrakhan/SM
+astral/SY
+Astra/M
+astray
+astride
+Astrid/M
+astringency/SM
+astringent/YS
+Astrix/M
+astrolabe/MS
+astrologer/MS
+astrological/Y
+astrologist/M
+astrology/SM
+astronautical
+astronautic/S
+astronautics/M
+astronaut/SM
+astronomer/MS
+astronomic
+astronomical/Y
+astronomy/SM
+astrophysical
+astrophysicist/SM
+astrophysics/M
+Astroturf/M
+AstroTurf/S
+Asturias/M
+astuteness/MS
+astute/RTYP
+Asunción/M
+asunder
+Aswan/M
+asylum/MS
+asymmetric
+asymmetrical/Y
+asymmetry/MS
+asymptomatic
+asymptomatically
+asymptote/MS
+asymptotically
+asymptotic/Y
+asynchronism/M
+asynchronous/Y
+asynchrony
+at
+Atacama/M
+Atahualpa/M
+Atalanta/M
+Atari/M
+Atatürk/M
+atavism/MS
+atavistic
+atavist/MS
+ataxia/MS
+ataxic/S
+atelier/SM
+atemporal
+ate/S
+Athabasca/M
+Athabascan's
+Athabaskan/MS
+Athabaska's
+atheism/SM
+atheistic
+atheist/SM
+Athena/M
+Athene/M
+Athenian/SM
+Athens/M
+atheroscleroses
+atherosclerosis/M
+athirst
+athlete/MS
+athletically
+athleticism/M
+athletic/S
+athletics/M
+athwart
+atilt
+Atkins/M
+Atkinson/M
+Atlanta/M
+Atlante/MS
+atlantes
+Atlantic/M
+Atlantis/M
+atlas/SM
+Atlas/SM
+At/M
+Atman
+ATM/M
+atmosphere/DSM
+atmospherically
+atmospheric/S
+atoll/MS
+atomically
+atomicity/M
+atomic/S
+atomics/M
+atomistic
+atomization/SM
+atomize/GZDRS
+atomizer/M
+atom/SM
+atonality/MS
+atonal/Y
+atone/LDSG
+atonement/SM
+atop
+ATP
+Atreus/M
+atria
+atrial
+Atria/M
+atrium/M
+atrociousness/SM
+atrocious/YP
+atrocity/SM
+atrophic
+atrophy/DSGM
+atropine/SM
+Atropos/M
+Ats
+attach/BLGZMDRS
+attached/UA
+attacher/M
+attaché/S
+attachment/ASM
+attacker/M
+attack/GBZSDR
+attainabilities
+attainability/UM
+attainableness/M
+attainable/U
+attainably/U
+attain/AGSD
+attainder/MS
+attained/U
+attainer/MS
+attainment/MS
+attar/MS
+attempt/ADSG
+attempter/MS
+attendance/MS
+attendant/SM
+attended/U
+attendee/SM
+attender/M
+attend/SGZDR
+attentional
+attentionality
+attention/IMS
+attentiveness/IMS
+attentive/YIP
+attenuated/U
+attenuate/SDXGN
+attenuation/M
+attenuator/MS
+attestation/SM
+attested/U
+attester/M
+attest/GSDR
+Attic
+Attica/M
+attic/MS
+Attila/M
+attire/SDG
+attitude/MS
+attitudinal/Y
+attitudinize/SDG
+Attlee/M
+attn
+Attn
+attorney/SM
+attractant/SM
+attract/BSDGV
+attraction/MS
+attractivenesses
+attractiveness/UM
+attractive/UYP
+attractor/MS
+attributable/U
+attribute/BVNGRSDX
+attributed/U
+attributer/M
+attributional
+attribution/M
+attributive/SY
+attrition/MS
+Attucks
+attune/SDG
+atty
+ATV/S
+atwitter
+Atwood/M
+atypical/Y
+Aube/M
+Auberge/M
+aubergine/MS
+Auberon/M
+Auberta/M
+Aubert/M
+Aubine/M
+Aubree/M
+Aubrette/M
+Aubrey/M
+Aubrie/M
+Aubry/M
+auburn/SM
+Auckland/M
+auctioneer/SDMG
+auction/MDSG
+audaciousness/SM
+audacious/PY
+audacity/MS
+Auden/M
+audibility/MSI
+audible/I
+audibles
+audibly/I
+Audie/M
+audience/MS
+Audi/M
+audiogram/SM
+audiological
+audiologist/MS
+audiology/SM
+audiometer/MS
+audiometric
+audiometry/M
+audiophile/SM
+audio/SM
+audiotape/S
+audiovisual/S
+audited/U
+audition/MDSG
+auditorium/MS
+auditor/MS
+auditory/S
+audit/SMDVG
+Audra/M
+Audre/M
+Audrey/M
+Audrie/M
+Audrye/M
+Audry/M
+Audubon/M
+Audy/M
+Auerbach/M
+Augean
+auger/SM
+aught/S
+Augie/M
+Aug/M
+augmentation/SM
+augmentative/S
+augment/DRZGS
+augmenter/M
+augur/GDMS
+augury/SM
+Augusta/M
+Augustan/S
+Auguste/M
+Augustina/M
+Augustine/M
+Augustinian/S
+Augustin/M
+augustness/SM
+Augusto/M
+August/SM
+august/STPYR
+Augustus/M
+Augy/M
+auk/MS
+Au/M
+Aundrea/M
+auntie/MS
+aunt/MYS
+aunty's
+aural/Y
+Aura/M
+aura/SM
+Aurea/M
+Aurelea/M
+Aurelia/M
+Aurelie/M
+Aurelio/M
+Aurelius/M
+Aurel/M
+aureole/GMSD
+aureomycin
+Aureomycin/M
+Auria/M
+auric
+auricle/SM
+auricular
+Aurie/M
+Auriga/M
+Aurilia/M
+Aurlie/M
+Auroora/M
+auroral
+Aurora/M
+aurora/SM
+Aurore/M
+Aurthur/M
+Auschwitz/M
+auscultate/XDSNG
+auscultation/M
+auspice/SM
+auspicious/IPY
+auspiciousnesses
+auspiciousness/IM
+Aussie/MS
+Austen/M
+austereness/M
+austere/TYRP
+austerity/SM
+Austina/M
+Austine/M
+Austin/SM
+austral
+Australasia/M
+Australasian/S
+australes
+Australia/M
+Australian/MS
+Australis/M
+australites
+Australoid
+Australopithecus/M
+Austria/M
+Austrian/SM
+Austronesian
+authentically
+authenticated/U
+authenticate/GNDSX
+authentication/M
+authenticator/MS
+authenticity/MS
+authentic/UI
+author/DMGS
+authoress/S
+authorial
+authoritarianism/MS
+authoritarian/S
+authoritativeness/SM
+authoritative/PY
+authority/SM
+authorization/MAS
+authorize/AGDS
+authorized/U
+authorizer/SM
+authorizes/U
+authorship/MS
+autism/MS
+autistic/S
+autobahn/MS
+autobiographer/MS
+autobiographic
+autobiographical/Y
+autobiography/MS
+autoclave/SDGM
+autocollimator/M
+autocorrelate/GNSDX
+autocorrelation/M
+autocracy/SM
+autocratic
+autocratically
+autocrat/SM
+autodial/R
+autodidact/MS
+autofluorescence
+autograph/MDG
+autographs
+autoignition/M
+autoimmune
+autoimmunity/S
+autoloader
+automaker/S
+automata's
+automate/NGDSX
+automatically
+automatic/S
+automation/M
+automatism/SM
+automatize/DSG
+automaton/SM
+automobile/GDSM
+automorphism/SM
+automotive
+autonavigator/SM
+autonomic/S
+autonomous/Y
+autonomy/MS
+autopilot/SM
+autopsy/MDSG
+autoregressive
+autorepeat/GS
+auto/SDMG
+autostart
+autosuggestibility/M
+autotransformer/M
+autoworker/S
+autumnal/Y
+Autumn/M
+autumn/MS
+aux
+auxiliary/S
+auxin/MS
+AV
+availability/USM
+availableness/M
+available/U
+availably
+avail/BSZGRD
+availing/U
+avalanche/MGSD
+Avalon/M
+Ava/M
+avant
+avarice/SM
+avariciousness/M
+avaricious/PY
+avast/S
+avatar/MS
+avaunt/S
+avdp
+Aveline/M
+Ave/MS
+avenged/U
+avenger/M
+avenge/ZGSRD
+Aventine/M
+Aventino/M
+avenue/MS
+average/DSPGYM
+Averell/M
+Averill/M
+Averil/M
+Avernus/M
+averred
+averrer
+averring
+Averroes/M
+averseness/M
+averse/YNXP
+aversion/M
+avers/V
+avert/GSD
+Averyl/M
+Avery/M
+ave/S
+aves/C
+Avesta/M
+avg
+avian/S
+aviary/SM
+aviate/NX
+aviation/M
+aviator/SM
+aviatrices
+aviatrix/SM
+Avicenna/M
+Avictor/M
+avidity/MS
+avid/TPYR
+Avie/M
+Avigdor/M
+Avignon/M
+Avila/M
+avionic/S
+avionics/M
+Avior/M
+Avis
+avitaminoses
+avitaminosis/M
+Avivah/M
+Aviva/M
+Aviv/M
+avocado/MS
+avocational
+avocation/SM
+Avogadro/M
+avoidable/U
+avoidably/U
+avoidance/SM
+avoider/M
+avoid/ZRDBGS
+avoirdupois/MS
+Avon/M
+avouch/GDS
+avowal/EMS
+avowed/Y
+avower/M
+avow/GEDS
+Avram/M
+Avril/M
+Avrit/M
+Avrom/M
+avuncular
+av/ZR
+AWACS
+await/SDG
+awake/GS
+awakened/U
+awakener/M
+awakening/S
+awaken/SADG
+awarder/M
+award/RDSZG
+awareness/MSU
+aware/TRP
+awash
+away/PS
+aweigh
+awe/SM
+awesomeness/SM
+awesome/PY
+awestruck
+awfuller
+awfullest
+awfulness/SM
+awful/YP
+aw/GD
+awhile/S
+awkwardness/MS
+awkward/PRYT
+awl/MS
+awning/DM
+awn/MDJGS
+awoke
+awoken
+AWOL
+awry/RT
+ax/DRSZGM
+axehead/S
+Axel/M
+Axe/M
+axeman
+axial/Y
+axillary
+axiological/Y
+axiology/M
+axiomatically
+axiomatic/S
+axiomatization/MS
+axiomatize/GDS
+axiom/SM
+axion/SM
+axis/SM
+axle/MS
+axletree/MS
+Ax/M
+axolotl/SM
+axon/SM
+ayah/M
+ayahs
+Ayala/M
+ayatollah
+ayatollahs
+aye/MZRS
+Ayers
+Aylmar/M
+Aylmer/M
+Aymara/M
+Aymer/M
+Ayn/M
+AZ
+azalea/SM
+Azania/M
+Azazel/M
+Azerbaijan/M
+azimuthal/Y
+azimuth/M
+azimuths
+Azores
+Azov/M
+AZT
+Aztecan
+Aztec/MS
+azure/MS
+BA
+Baal/SM
+baa/SDG
+Babara/M
+Babar's
+Babbage/M
+Babbette/M
+Babbie/M
+babbitt/GDS
+Babbitt/M
+babbler/M
+babble/RSDGZ
+Babb/M
+Babcock/M
+Babel/MS
+babel/S
+babe/SM
+Babette/M
+Babita/M
+Babka/M
+baboon/MS
+Bab/SM
+babushka/MS
+babyhood/MS
+babyish
+Babylonia/M
+Babylonian/SM
+Babylon/MS
+babysat
+babysit/S
+babysitter/S
+babysitting
+baby/TDSRMG
+Bacall/M
+Bacardi/M
+baccalaureate/MS
+baccarat/SM
+bacchanalia
+Bacchanalia/M
+bacchanalian/S
+bacchanal/SM
+Bacchic
+Bacchus/M
+bachelorhood/SM
+bachelor/SM
+Bach/M
+bacillary
+bacilli
+bacillus/MS
+backache/SM
+backarrow
+backbencher/M
+backbench/ZR
+backbiter/M
+backbite/S
+backbitten
+backbit/ZGJR
+backboard/SM
+backbone/SM
+backbreaking
+backchaining
+backcloth/M
+backdate/GDS
+backdrop/MS
+backdropped
+backdropping
+backed/U
+backer/M
+backfield/SM
+backfill/SDG
+backfire/GDS
+backgammon/MS
+background/SDRMZG
+back/GZDRMSJ
+backhanded/Y
+backhander/M
+backhand/RDMSZG
+backhoe/S
+backing/M
+backlash/GRSDM
+backless
+backlogged
+backlogging
+backlog/MS
+backorder
+backpacker/M
+backpack/ZGSMRD
+backpedal/DGS
+backplane/MS
+backplate/SM
+backrest/MS
+backscatter/SMDG
+backseat/S
+backside/SM
+backslapper/MS
+backslapping/M
+backslash/DSG
+backslider/M
+backslide/S
+backslid/RZG
+backspace/GSD
+backspin/SM
+backstabber/M
+backstabbing
+backstage
+backstair/S
+backstitch/GDSM
+backstop/MS
+backstopped
+backstopping
+backstreet/M
+backstretch/SM
+backstroke/GMDS
+backtalk/S
+backtrack/SDRGZ
+backup/SM
+Backus/M
+backwardness/MS
+backward/YSP
+backwash/SDMG
+backwater/SM
+backwood/S
+backwoodsman/M
+backwoodsmen
+backyard/MS
+baconer/M
+Bacon/M
+bacon/SRM
+bacterial/Y
+bacteria/MS
+bactericidal
+bactericide/SM
+bacteriologic
+bacteriological
+bacteriologist/MS
+bacteriology/SM
+bacterium/M
+Bactria/M
+badder
+baddest
+baddie/MS
+bade
+Baden/M
+badge/DSRGMZ
+badger/DMG
+badinage/DSMG
+badland/S
+Badlands/M
+badman/M
+badmen
+badminton/MS
+badmouth/DG
+badmouths
+badness/SM
+bad/PSNY
+Baedeker/SM
+Baez/M
+Baffin/M
+bafflement/MS
+baffler/M
+baffle/RSDGZL
+baffling/Y
+bagatelle/MS
+bagel/SM
+bagful/MS
+baggageman
+baggagemen
+baggage/SM
+bagged/M
+bagger/SM
+baggily
+bagginess/MS
+bagging/M
+baggy/PRST
+Baghdad/M
+bagpiper/M
+bagpipe/RSMZ
+Bagrodia/MS
+bag/SM
+baguette/SM
+Baguio/M
+bah
+Baha'i
+Bahama/MS
+Bahamanian/S
+Bahamian/MS
+Baha'ullah
+Bahia/M
+Bahrain/M
+bahs
+Baikal/M
+Bailey/SM
+bail/GSMYDRB
+Bailie/M
+bailiff/SM
+bailiwick/MS
+Baillie/M
+Bail/M
+bailout/MS
+bailsman/M
+bailsmen
+Baily/M
+Baird/M
+bairn/SM
+baiter/M
+bait/GSMDR
+baize/GMDS
+Baja/M
+baked/U
+bakehouse/M
+Bakelite/M
+baker/M
+Baker/M
+Bakersfield/M
+bakery/SM
+bakeshop/S
+bake/ZGJDRS
+baking/M
+baklava/M
+baksheesh/SM
+Baku/M
+Bakunin/M
+balaclava/MS
+balalaika/MS
+balanced/A
+balancedness
+balancer/MS
+balance's
+balance/USDG
+Balanchine/M
+Balboa/M
+balboa/SM
+balcony/MSD
+balderdash/MS
+Balder/M
+baldfaced
+Bald/MR
+baldness/MS
+bald/PYDRGST
+baldric/SM
+Balduin/M
+Baldwin/M
+baldy
+Balearic/M
+baleen/MS
+balefuller
+balefullest
+balefulness/MS
+baleful/YP
+Bale/M
+bale/MZGDRS
+baler/M
+Balfour/M
+Bali/M
+Balinese
+balkanization
+balkanize/DG
+Balkan/SM
+balker/M
+balk/GDRS
+Balkhash/M
+balkiness/M
+balky/PRT
+balladeer/MS
+ballade/MS
+balladry/MS
+ballad/SM
+Ballard/SM
+ballast/SGMD
+ballcock/S
+ballerina/MS
+baller/M
+balletic
+ballet/MS
+ballfields
+ballgame/S
+ball/GZMSDR
+ballistic/S
+ballistics/M
+Ball/M
+balloonist/S
+balloon/RDMZGS
+balloter/M
+ballot/MRDGS
+ballpark/SM
+ballplayer/SM
+ballpoint/SM
+ballroom/SM
+ballsy/TR
+ballyhoo/SGMD
+balminess/SM
+balm/MS
+balmy/PRT
+baloney/SM
+balsam/GMDS
+balsamic
+balsa/MS
+Balthazar/M
+Baltic/M
+Baltimore/M
+Baluchistan/M
+baluster/MS
+balustrade/SM
+Balzac/M
+Ba/M
+Bamako/M
+Bamberger/M
+Bambie/M
+Bambi/M
+bamboo/SM
+bamboozle/GSD
+Bamby/M
+Banach/M
+banality/MS
+banal/TYR
+banana/SM
+Bancroft/M
+bandager/M
+bandage/RSDMG
+bandanna/SM
+bandbox/MS
+bandeau/M
+bandeaux
+band/EDGS
+bander/M
+banding/M
+bandit/MS
+banditry/MS
+bandmaster/MS
+bandoleer/SM
+bandpass
+band's
+bandsman/M
+bandsmen
+bandstand/SM
+bandstop
+Bandung/M
+bandwagon/MS
+bandwidth/M
+bandwidths
+bandy/TGRSD
+banefuller
+banefullest
+baneful/Y
+bane/MS
+Bangalore/M
+banger/M
+bang/GDRZMS
+bangkok
+Bangkok/M
+Bangladeshi/S
+Bangladesh/M
+bangle/MS
+Bangor/M
+Bangui/M
+bani
+banisher/M
+banishment/MS
+banish/RSDGL
+banister/MS
+Banjarmasin/M
+banjoist/SM
+banjo/MS
+Banjul/M
+bankbook/SM
+bankcard/S
+banker/M
+bank/GZJDRMBS
+banking/M
+Bank/MS
+banknote/S
+bankroll/DMSG
+bankruptcy/MS
+bankrupt/DMGS
+Banky/M
+Ban/M
+banned/U
+Banneker/M
+banner/SDMG
+banning/U
+Bannister/M
+bannister's
+bannock/SM
+banns
+banqueter/M
+banquet/SZGJMRD
+banquette/MS
+ban/SGMD
+banshee/MS
+bans/U
+bantam/MS
+bantamweight/MS
+banterer/M
+bantering/Y
+banter/RDSG
+Banting/M
+Bantu/SM
+banyan/MS
+banzai/S
+baobab/SM
+Baotou/M
+baptismal/Y
+baptism/SM
+Baptiste/M
+baptistery/MS
+baptist/MS
+Baptist/MS
+baptistry's
+baptized/U
+baptizer/M
+baptize/SRDZG
+baptizes/U
+Barabbas/M
+Barbabas/M
+Barbabra/M
+Barbadian/S
+Barbados/M
+Barbaraanne/M
+Barbara/M
+Barbarella/M
+barbarianism/MS
+barbarian/MS
+barbaric
+barbarically
+barbarism/MS
+barbarity/SM
+barbarize/SDG
+Barbarossa/M
+barbarousness/M
+barbarous/PY
+Barbary/M
+barb/DRMSGZ
+barbecue/DRSMG
+barbed/P
+Barbee/M
+barbell/SM
+barbel/MS
+Barbe/M
+barbeque's
+barber/DMG
+barbered/U
+Barber/M
+barberry/MS
+barbershop/MS
+Barbette/M
+Barbey/M
+Barbie/M
+Barbi/M
+barbital/M
+barbiturate/MS
+Barbour/M
+Barbra/M
+Barb/RM
+Barbuda/M
+barbwire/SM
+Barby/M
+barcarole/SM
+Barcelona/M
+Barclay/M
+Bardeen/M
+Barde/M
+bardic
+Bard/M
+bard/MDSG
+bareback/D
+barefacedness/M
+barefaced/YP
+barefoot/D
+barehanded
+bareheaded
+barelegged
+bareness/MS
+Barents/M
+bare/YSP
+barfly/SM
+barf/YDSG
+bargainer/M
+bargain/ZGSDRM
+barge/DSGM
+bargeman/M
+bargemen
+bargepole/M
+barhopped
+barhopping
+barhop/S
+Bari/M
+baritone/MS
+barium/MS
+barked/C
+barkeeper/M
+barkeep/SRZ
+barker/M
+Barker/M
+bark/GZDRMS
+Barkley/M
+barks/C
+barleycorn/MS
+barley/MS
+Barlow/M
+barmaid/SM
+barman/M
+barmen
+Bar/MH
+Barnabas
+Barnabe/M
+Barnaby/M
+barnacle/MDS
+Barnard/M
+Barnaul/M
+Barnebas/M
+Barnes
+Barnett/M
+Barney/M
+barnful
+barn/GDSM
+Barnhard/M
+Barnie/M
+Barn/M
+barnsful
+barnstorm/DRGZS
+barnstormer/M
+Barnum/M
+barnyard/MS
+Barny/M
+Baroda/M
+barometer/MS
+barometric
+barometrically
+baronage/MS
+baroness/MS
+baronetcy/SM
+baronet/MS
+baronial
+Baron/M
+baron/SM
+barony/SM
+baroque/SPMY
+barque's
+Barquisimeto/M
+barracker/M
+barrack/SDRG
+barracuda/MS
+barrage/MGSD
+Barranquilla/M
+barred/ECU
+barre/GMDSJ
+barrel/SGMD
+barrenness/SM
+barren/SPRT
+Barrera/M
+Barret/M
+barrette/SM
+Barrett/M
+barricade/SDMG
+Barrie/M
+barrier/MS
+barring/R
+barrio/SM
+Barri/SM
+barrister/MS
+Barr/M
+Barron/M
+barroom/SM
+barrow/MS
+Barry/M
+Barrymore/MS
+bars/ECU
+barstool/SM
+Barstow/M
+Bartel/M
+bartender/M
+bartend/ZR
+barterer/M
+barter/SRDZG
+bar/TGMDRS
+Barthel/M
+Barth/M
+Bartholdi/M
+Bartholemy/M
+Bartholomeo/M
+Bartholomeus/M
+Bartholomew/M
+Bartie/M
+Bartlet/M
+Bartlett/M
+Bart/M
+Bartók/M
+Bartolemo/M
+Bartolomeo/M
+Barton/M
+Bartram/M
+Barty/M
+barycenter
+barycentre's
+barycentric
+Bary/M
+baryon/SM
+Baryram/M
+Baryshnikov/M
+basaltic
+basalt/SM
+basal/Y
+Bascom/M
+bas/DRSTG
+baseball/MS
+baseband
+baseboard/MS
+base/CGRSDL
+baseless
+baseline/SM
+Basel/M
+basely
+Base/M
+baseman/M
+basemen
+basement/CSM
+baseness/MS
+baseplate/M
+base's
+basetting
+bashfulness/MS
+bashful/PY
+bash/JGDSR
+Basho/M
+Basia/M
+BASIC
+basically
+basic/S
+Basie/M
+basilar
+Basile/M
+basilica/SM
+Basilio/M
+basilisk/SM
+Basilius/M
+Basil/M
+basil/MS
+basin/DMS
+basinful/S
+basis/M
+basketball/MS
+basketry/MS
+basket/SM
+basketwork/SM
+bask/GSD
+basophilic
+Basque/SM
+Basra/M
+Basseterre/M
+basset/GMDS
+Bassett/M
+bassinet/SM
+bassist/MS
+Bass/M
+basso/MS
+bassoonist/MS
+bassoon/MS
+bass/SM
+basswood/SM
+bastardization/MS
+bastardized/U
+bastardize/SDG
+bastard/MYS
+bastardy/MS
+baste/NXS
+baster/M
+Bastian/M
+Bastien/M
+Bastille/M
+basting/M
+bastion/DM
+bast/SGZMDR
+Basutoland/M
+Bataan/M
+Batavia/M
+batch/MRSDG
+bated/U
+bate/KGSADC
+bater/AC
+Bates
+bathe
+bather/M
+bathetic
+bathhouse/SM
+bath/JMDSRGZ
+bathmat/S
+Batholomew/M
+bathos/SM
+bathrobe/MS
+bathroom/SDM
+baths
+Bathsheba/M
+bathtub/MS
+bathwater
+bathyscaphe's
+bathysphere/MS
+batik/DMSG
+Batista/M
+batiste/SM
+Bat/M
+batman/M
+Batman/M
+batmen
+baton/SM
+Batsheva/M
+batsman/M
+bat/SMDRG
+batsmen
+battalion/MS
+batted
+batten/SDMG
+batter/SRDZG
+battery/MS
+batting/MS
+battledore/MS
+battledress
+battlefield/SM
+battlefront/SM
+battle/GMZRSDL
+battleground/SM
+Battle/M
+battlement/SMD
+battler/M
+battleship/MS
+batty/RT
+Batu/M
+batwings
+bauble/SM
+Baudelaire/M
+baud/M
+Baudoin/M
+Baudouin/M
+Bauer/M
+Bauhaus/M
+baulk/GSDM
+Bausch/M
+bauxite/SM
+Bavaria/M
+Bavarian/S
+bawdily
+bawdiness/MS
+bawd/SM
+bawdy/PRST
+bawler/M
+bawl/SGDR
+Baxie/M
+Bax/M
+Baxter/M
+Baxy/M
+Bayamon
+Bayard/M
+bayberry/MS
+Bayda/M
+Bayer/M
+Bayes
+Bayesian
+bay/GSMDY
+Baylor/M
+Bay/MR
+bayonet/SGMD
+Bayonne/M
+bayou/MS
+Bayreuth/M
+bazaar/MS
+bazillion/S
+bazooka/MS
+BB
+BBB
+BBC
+bbl
+BBQ
+BBS
+BC
+BCD
+bdrm
+beachcomber/SM
+beachhead/SM
+Beach/M
+beach/MSDG
+beachwear/M
+beacon/DMSG
+beading/M
+Beadle/M
+beadle/SM
+bead/SJGMD
+beadsman/M
+beadworker
+beady/TR
+beagle/SDGM
+beaker/M
+beak/ZSDRM
+Beale/M
+Bealle/M
+Bea/M
+beam/MDRSGZ
+beanbag/SM
+bean/DRMGZS
+beanie/SM
+Bean/M
+beanpole/MS
+beanstalk/SM
+bearable/U
+bearably/U
+beard/DSGM
+bearded/P
+beardless
+Beard/M
+Beardmore/M
+Beardsley/M
+bearer/M
+bearing/M
+bearishness/SM
+bearish/PY
+bearlike
+Bear/M
+Bearnaise/M
+Bearnard/M
+bearskin/MS
+bear/ZBRSJG
+Beasley/M
+beasties
+beastings/M
+beastliness/MS
+beastly/PTR
+beast/SJMY
+beatable/U
+beatably/U
+beaten/U
+beater/M
+beatific
+beatifically
+beatification/M
+beatify/GNXDS
+beating/M
+beatitude/MS
+Beatlemania/M
+Beatles/M
+beatnik/SM
+beat/NRGSBZJ
+Beatrice/M
+Beatrisa/M
+Beatrix/M
+Beatriz/M
+Beauchamps
+Beaufort/M
+Beaujolais/M
+Beau/M
+Beaumarchais/M
+Beaumont/M
+beau/MS
+Beauregard/M
+beauteousness/M
+beauteous/YP
+beautician/MS
+beautification/M
+beautifier/M
+beautifully/U
+beautifulness/M
+beautiful/PTYR
+beautify/SRDNGXZ
+beaut/SM
+beauty/SM
+Beauvoir/M
+beaux's
+beaver/DMSG
+Beaverton/M
+Bebe/M
+bebop/MS
+becalm/GDS
+became
+because
+Becca/M
+Bechtel/M
+Becka/M
+Becker/M
+Becket/M
+Beckett/M
+beck/GSDM
+Beckie/M
+Becki/M
+beckon/SDG
+Beck/RM
+Becky/M
+becloud/SGD
+become/GJS
+becoming/UY
+Becquerel/M
+bedaub/GDS
+bedazzle/GLDS
+bedazzlement/SM
+bedbug/SM
+bedchamber/M
+bedclothes
+bedded
+bedder/MS
+bedding/MS
+bedeck/DGS
+Bede/M
+bedevil/DGLS
+bedevilment/SM
+bedfast
+bedfellow/MS
+Bedford/M
+bedimmed
+bedimming
+bedim/S
+bedizen/DGS
+bedlam/MS
+bedlinen
+bedmaker/SM
+bedmate/MS
+bed/MS
+Bedouin/SM
+bedpan/SM
+bedpost/SM
+bedraggle/GSD
+bedridden
+bedrock/SM
+bedroll/SM
+bedroom/DMS
+bedsheets
+bedside/MS
+bedsit
+bedsitter/M
+bedsore/MS
+bedspread/SM
+bedspring/SM
+bedstead/SM
+bedstraw/M
+bedtime/SM
+Beebe/M
+beebread/MS
+Beecher/M
+beech/MRSN
+beechnut/MS
+beechwood
+beefburger/SM
+beefcake/MS
+beef/GZSDRM
+beefiness/MS
+beefsteak/MS
+beefy/TRP
+beehive/MS
+beekeeper/MS
+beekeeping/SM
+beeline/MGSD
+Beelzebub/M
+Bee/M
+bee/MZGJRS
+been/S
+beeper/M
+beep/GZSMDR
+Beerbohm/M
+beer/M
+beermat/S
+beery/TR
+beeswax/DSMG
+Beethoven/M
+beetle/GMRSD
+Beeton/M
+beetroot/M
+beet/SM
+beeves/M
+befall/SGN
+befell
+befit/SM
+befitted
+befitting/Y
+befogged
+befogging
+befog/S
+before
+beforehand
+befoul/GSD
+befriend/DGS
+befuddle/GLDS
+befuddlement/SM
+began
+beget/S
+begetting
+beggar/DYMSG
+beggarliness/M
+beggarly/P
+beggary/MS
+begged
+begging
+Begin/M
+beginner/MS
+beginning/MS
+begin/S
+begone/S
+begonia/SM
+begot
+begotten
+begrime/SDG
+begrudge/GDRS
+begrudging/Y
+beg/S
+beguilement/SM
+beguiler/M
+beguile/RSDLZG
+beguiling/Y
+beguine/SM
+begum/MS
+begun
+behalf/M
+behalves
+Behan/M
+behave/GRSD
+behavioral/Y
+behaviorism/MS
+behavioristic/S
+behaviorist/S
+behavior/SMD
+behead/GSD
+beheld
+behemoth/M
+behemoths
+behest/SM
+behindhand
+behind/S
+beholder/M
+behold/ZGRNS
+behoofs
+behoove/SDJMG
+behooving/YM
+Behring/M
+Beiderbecke/M
+beige/MS
+Beijing
+Beilul/M
+being/M
+Beirut/M
+Beitris/M
+bejewel/SDG
+Bekesy/M
+Bekki/M
+be/KS
+belabor/MDSG
+Bela/M
+Belarus
+belate/D
+belatedness/M
+belated/PY
+Belau/M
+belay/GSD
+belch/GSD
+beleaguer/GDS
+Belem/M
+Belfast/M
+belfry/SM
+Belgian/MS
+Belgium/M
+Belg/M
+Belgrade/M
+Belia/M
+Belicia/M
+belie
+belief/ESUM
+belier/M
+believability's
+believability/U
+believable/U
+believably/U
+believed/U
+believe/EZGDRS
+believer/MUSE
+believing/U
+Belinda/M
+Belita/M
+belittlement/MS
+belittler/M
+belittle/RSDGL
+Belize/M
+belladonna/MS
+Bella/M
+Bellamy/M
+Bellanca/M
+Bellatrix/M
+bellboy/MS
+belled/A
+Belle/M
+belle/MS
+belletristic
+belletrist/SM
+Belleville/M
+bellflower/M
+bell/GSMD
+bellhop/MS
+bellicoseness/M
+bellicose/YP
+bellicosity/MS
+belligerence/SM
+belligerency/MS
+belligerent/SMY
+Bellina/M
+belling/A
+Bellini/M
+Bell/M
+bellman/M
+bellmen
+Bellovin/M
+bellow/DGS
+Bellow/M
+bellows/M
+bells/A
+bellwether/MS
+Bellwood/M
+bellyacher/M
+bellyache/SRDGM
+bellybutton/MS
+bellyfull
+bellyful/MS
+belly/SDGM
+Bel/M
+Belmont/M
+Belmopan/M
+Beloit/M
+belong/DGJS
+belonging/MP
+Belorussian/S
+Belorussia's
+belove/D
+beloved/S
+below/S
+Belshazzar/M
+belted/U
+belt/GSMD
+belting/M
+Belton/M
+Beltran/M
+Beltsville/M
+beltway/SM
+beluga/SM
+Belushi/M
+Belva/M
+belvedere/M
+Belvia/M
+bely/DSRG
+beman
+Be/MH
+bemire/SDG
+bemoan/GDS
+bemused/Y
+bemuse/GSDL
+bemusement/SM
+Benacerraf/M
+Benares's
+bencher/M
+benchmark/GDMS
+bench/MRSDG
+bend/BUSG
+bended
+Bender/M
+bender/MS
+Bendick/M
+Bendicty/M
+Bendite/M
+Bendix/M
+beneath
+Benedetta/M
+Benedetto/M
+Benedick/M
+Benedicta/M
+Benedictine/MS
+benediction/MS
+Benedict/M
+Benedicto/M
+benedictory
+Benedikta/M
+Benedikt/M
+benefaction/MS
+benefactor/MS
+benefactress/S
+benefice/MGSD
+beneficence/SM
+beneficent/Y
+beneficialness/M
+beneficial/PY
+beneficiary/MS
+benefiter/M
+benefit/SRDMZG
+Benelux/M
+Benet/M
+Benetta/M
+Benetton/M
+benevolence/SM
+benevolentness/M
+benevolent/YP
+Bengali/M
+Bengal/SM
+Benghazi/M
+Bengt/M
+Beniamino/M
+benightedness/M
+benighted/YP
+benignant
+benignity/MS
+benign/Y
+Beninese
+Benin/M
+Benita/M
+Benito/M
+Benjamen/M
+Benjamin/M
+Benjie/M
+Benji/M
+Benjy/M
+Ben/M
+Bennett/M
+Bennie/M
+Benni/M
+Bennington/M
+Benn/M
+Benny/M
+Benoite/M
+Benoit/M
+Benson/M
+Bentham/M
+Bentlee/M
+Bentley/MS
+Bent/M
+Benton/M
+bents
+bent/U
+bentwood/SM
+benumb/SGD
+Benyamin/M
+Benzedrine/M
+benzene/MS
+benzine/SM
+Benz/M
+Beograd's
+Beowulf/M
+bequeath/GSD
+bequeaths
+bequest/MS
+berate/GSD
+Berber/MS
+bereave/GLSD
+bereavement/MS
+bereft
+Berenice/M
+Beret/M
+beret/SM
+Bergen/M
+Bergerac/M
+Berger/M
+Berget/M
+Berglund/M
+Bergman/M
+Berg/NRM
+berg/NRSM
+Bergson/M
+Bergsten/M
+Bergstrom/M
+beribbon/D
+beriberi/SM
+Beringer/M
+Bering/RM
+Berkeley/M
+berkelium/SM
+Berke/M
+Berkie/M
+Berkley/M
+Berkly/M
+Berkowitz/M
+Berkshire/SM
+Berky/M
+Berk/YM
+Berle/M
+Berliner/M
+Berlin/SZRM
+Berlioz/M
+Berlitz/M
+Berman/M
+Ber/MG
+berm/SM
+Bermuda/MS
+Bermudan/S
+Bermudian/S
+Bernadene/M
+Bernadette/M
+Bernadina/M
+Bernadine/M
+Berna/M
+Bernardina/M
+Bernardine/M
+Bernardino/M
+Bernard/M
+Bernardo/M
+Bernarr/M
+Bernays/M
+Bernbach/M
+Bernelle/M
+Berne's
+Bernese
+Bernete/M
+Bernetta/M
+Bernette/M
+Bernhard/M
+Bernhardt/M
+Bernice/M
+Berniece/M
+Bernie/M
+Berni/M
+Bernini/M
+Bernita/M
+Bern/M
+Bernoulli/M
+Bernstein/M
+Berny/M
+Berra/M
+Berrie/M
+Berri/M
+berrylike
+Berry/M
+berry/SDMG
+berserker/M
+berserk/SR
+Berta/M
+Berte/M
+Bertha/M
+Berthe/M
+berth/MDGJ
+berths
+Bertie/M
+Bertillon/M
+Berti/M
+Bertina/M
+Bertine/M
+Bert/M
+Berton/M
+Bertram/M
+Bertrand/M
+Bertrando/M
+Berty/M
+Beryle/M
+beryllium/MS
+Beryl/M
+beryl/SM
+Berzelius/M
+bes
+beseecher/M
+beseeching/Y
+beseech/RSJZG
+beseem/GDS
+beset/S
+besetting
+beside/S
+besieger/M
+besiege/SRDZG
+besmear/GSD
+besmirch/GSD
+besom/GMDS
+besot/S
+besotted
+besotting
+besought
+bespangle/GSD
+bespatter/SGD
+bespeak/SG
+bespectacled
+bespoke
+bespoken
+Bess
+Bessel/M
+Bessemer/M
+Bessie/M
+Bessy/M
+best/DRSG
+bestiality/MS
+bestial/Y
+bestiary/MS
+bestirred
+bestirring
+bestir/S
+Best/M
+bestowal/SM
+bestow/SGD
+bestrew/DGS
+bestrewn
+bestridden
+bestride/SG
+bestrode
+bestseller/MS
+bestselling
+bestubble/D
+betaken
+betake/SG
+beta/SM
+betatron/M
+betcha
+Betelgeuse/M
+betel/MS
+Bethanne/M
+Bethany/M
+bethel/M
+Bethe/M
+Bethena/M
+Bethesda/M
+Bethina/M
+bethink/GS
+Bethlehem/M
+beth/M
+Beth/M
+bethought
+Bethune
+betide/GSD
+betimes
+bet/MS
+betoken/GSD
+betook
+betrayal/SM
+betrayer/M
+betray/SRDZG
+betrothal/SM
+betrothed/U
+betroth/GD
+betroths
+Betsey/M
+Betsy/M
+Betta/M
+Betteanne/M
+Betteann/M
+Bette/M
+betterment/MS
+better/SDLG
+Bettie/M
+Betti/M
+Bettina/M
+Bettine/M
+betting
+bettor/SM
+Bettye/M
+Betty/SM
+betweenness/M
+between/SP
+betwixt
+Beulah/M
+Bevan/M
+bevel/SJGMRD
+beverage/MS
+Beverie/M
+Beverlee/M
+Beverley/M
+Beverlie/M
+Beverly/M
+Bevin/M
+Bevon/M
+Bev's
+Bevvy/M
+bevy/SM
+bewail/GDS
+beware/GSD
+bewhisker/D
+bewigged
+bewildered/PY
+bewildering/Y
+bewilder/LDSG
+bewilderment/SM
+bewitching/Y
+bewitch/LGDS
+bewitchment/SM
+bey/MS
+beyond/S
+bezel/MS
+bf
+B/GT
+Bhopal/M
+Bhutanese
+Bhutan/M
+Bhutto/M
+Bialystok/M
+Bianca/M
+Bianco/M
+Bianka/M
+biannual/Y
+bias/DSMPG
+biased/U
+biathlon/MS
+biaxial/Y
+bibbed
+Bibbie/M
+bibbing
+Bibbye/M
+Bibby/M
+Bibi/M
+bible/MS
+Bible/MS
+biblical/Y
+biblicists
+bibliographer/MS
+bibliographical/Y
+bibliographic/S
+bibliography/MS
+bibliophile/MS
+Bib/M
+bib/MS
+bibulous
+bicameral
+bicameralism/MS
+bicarb/MS
+bicarbonate/MS
+bicentenary/S
+bicentennial/S
+bicep/S
+biceps/M
+bichromate/DM
+bickerer/M
+bickering/M
+bicker/SRDZG
+biconcave
+biconnected
+biconvex
+bicuspid/S
+bicycler/M
+bicycle/RSDMZG
+bicyclist/SM
+biddable
+bidden/U
+bidder/MS
+Biddie/M
+bidding/MS
+Biddle/M
+Biddy/M
+biddy/SM
+bider/M
+bide/S
+bidet/SM
+Bidget/M
+bid/GMRS
+bidiagonal
+bidirectional/Y
+bids/A
+biennial/SY
+biennium/SM
+Bienville/M
+Bierce/M
+bier/M
+bifocal/S
+bifurcate/SDXGNY
+bifurcation/M
+bigamist/SM
+bigamous
+bigamy/SM
+Bigelow/M
+Bigfoot
+bigged
+bigger
+biggest
+biggie/SM
+bigging
+biggish
+bighead/MS
+bigheartedness/S
+bighearted/P
+bighorn/MS
+bight/SMDG
+bigmouth/M
+bigmouths
+bigness/SM
+bigoted/Y
+bigot/MDSG
+bigotry/MS
+big/PYS
+bigwig/MS
+biharmonic
+bijection/MS
+bijective/Y
+bijou/M
+bijoux
+bike/MZGDRS
+biker/M
+bikini/SMD
+Biko/M
+bilabial/S
+bilateralness/M
+bilateral/PY
+bilayer/S
+Bilbao/M
+bilberry/MS
+Bilbo/M
+bile/SM
+bilge/GMDS
+biliary
+Bili/M
+bilinear
+bilingualism/SM
+bilingual/SY
+biliousness/SM
+bilious/P
+bilker/M
+bilk/GZSDR
+billboard/MDGS
+biller/M
+billet/MDGS
+billfold/MS
+billiard/SM
+Billie/M
+Billi/M
+billing/M
+billingsgate/SM
+Billings/M
+billionaire/MS
+billion/SHM
+billionths
+bill/JGZSBMDR
+Bill/JM
+billow/DMGS
+billowy/RT
+billposters
+Billye/M
+Billy/M
+billy/SM
+Bil/MY
+bi/M
+Bi/M
+bimbo/MS
+bimetallic/S
+bimetallism/MS
+Bimini/M
+bimodal
+bimolecular/Y
+bimonthly/S
+binary/S
+binaural/Y
+binder/M
+bindery/MS
+binding/MPY
+bindingness/M
+bind/JDRGZS
+bindle/M
+binds/AU
+bindweed/MS
+binge/MS
+bing/GNDM
+Bingham/M
+Binghamton/M
+Bing/M
+bingo/MS
+Bini/M
+Bink/M
+Binky/M
+binnacle/MS
+binned
+Binnie/M
+Binni/M
+binning
+Binny/M
+binocular/SY
+binodal
+binomial/SYM
+bin/SM
+binuclear
+biochemical/SY
+biochemist/MS
+biochemistry/MS
+biodegradability/S
+biodegradable
+biodiversity/S
+bioengineering/M
+bioethics
+biofeedback/SM
+biographer/M
+biographic
+biographical/Y
+biograph/RZ
+biography/MS
+biog/S
+Bioko/M
+biol
+biological/SY
+biologic/S
+biologist/SM
+biology/MS
+biomass/SM
+biomedical
+biomedicine/M
+biometric/S
+biometrics/M
+biometry/M
+biomolecule/S
+biomorph
+bionically
+bionic/S
+bionics/M
+biophysical/Y
+biophysicist/SM
+biophysic/S
+biophysics/M
+biopic/S
+biopsy/SDGM
+biorhythm/S
+BIOS
+bioscience/S
+biosphere/MS
+biostatistic/S
+biosynthesized
+biotechnological
+biotechnologist
+biotechnology/SM
+biotic
+biotin/SM
+bipartisan
+bipartisanship/MS
+bipartite/YN
+bipartition/M
+bipedal
+biped/MS
+biplane/MS
+bipolar
+bipolarity/MS
+biracial
+Birch/M
+birch/MRSDNG
+birdbath/M
+birdbaths
+birdbrain/SDM
+birdcage/SM
+birder/M
+birdhouse/MS
+birdieing
+Birdie/M
+birdie/MSD
+birdlike
+birdlime/MGDS
+Bird/M
+birdseed/MS
+Birdseye/M
+bird/SMDRGZ
+birdsong
+birdtables
+birdwatch/GZR
+birefringence/M
+birefringent
+biretta/SM
+Birgit/M
+Birgitta/M
+Birkenstock/M
+Birk/M
+Birmingham/M
+Biro/M
+Biron/M
+birthday/SM
+birthmark/MS
+birth/MDG
+birthplace/SM
+birthrate/MS
+birthright/MS
+birth's/A
+births/A
+birthstone/SM
+bis
+Biscay/M
+Biscayne/M
+biscuit/MS
+bisect/DSG
+bisection/MS
+bisector/MS
+biserial
+bisexuality/MS
+bisexual/YMS
+Bishkek
+bishop/DGSM
+Bishop/M
+bishopric/SM
+Bismarck/M
+Bismark/M
+bismuth/M
+bismuths
+bison/M
+bisque/SM
+Bissau/M
+bistable
+bistate
+bistro/SM
+bisyllabic
+bitblt/S
+bitchily
+bitchiness/MS
+bitch/MSDG
+bitchy/PTR
+biter/M
+bite/S
+biting/Y
+bitmap/SM
+bit/MRJSZG
+BITNET/M
+bit's/C
+bits/C
+bitser/M
+bitted
+bitten
+bitterness/SM
+bittern/SM
+bitternut/M
+bitter/PSRDYTG
+bitterroot/M
+bittersweet/YMSP
+bitting
+bitty/PRT
+bitumen/MS
+bituminous
+bitwise
+bivalent/S
+bivalve/MSD
+bivariate
+bivouacked
+bivouacking
+bivouac/MS
+biweekly/S
+biyearly
+bizarreness/M
+bizarre/YSP
+Bizet/M
+biz/M
+bizzes
+Bjorn/M
+bk
+b/KGD
+Bk/M
+blabbed
+blabber/GMDS
+blabbermouth/M
+blabbermouths
+blabbing
+blab/S
+blackamoor/SM
+blackball/SDMG
+blackberry/GMS
+blackbirder/M
+blackbird/SGDRM
+blackboard/SM
+blackbody/S
+Blackburn/M
+blackcurrant/M
+blackener/M
+blacken/GDR
+Blackfeet
+Blackfoot/M
+blackguard/MDSG
+blackhead/SM
+blacking/M
+blackish
+blackjack/SGMD
+blackleg/M
+blacklist/DRMSG
+blackmail/DRMGZS
+blackmailer/M
+Blackman/M
+Blackmer/M
+blackness/MS
+blackout/SM
+Blackpool/M
+Black's
+black/SJTXPYRDNG
+blacksmith/MG
+blacksmiths
+blacksnake/MS
+blackspot
+Blackstone/M
+blackthorn/MS
+blacktop/MS
+blacktopped
+blacktopping
+Blackwell/MS
+bladder/MS
+bladdernut/M
+bladderwort/M
+blade/DSGM
+blah/MDG
+blahs
+Blaine/M
+Blaire/M
+Blair/M
+Blakelee/M
+Blakeley/M
+Blake/M
+Blakey/M
+blame/DSRBGMZ
+blamelessness/SM
+blameless/YP
+blamer/M
+blameworthiness/SM
+blameworthy/P
+Blanca/M
+Blancha/M
+Blanchard/M
+blanch/DRSG
+Blanche/M
+blancher/M
+Blanch/M
+blanc/M
+blancmange/SM
+blandishment/MS
+blandish/SDGL
+blandness/MS
+bland/PYRT
+Blane/M
+Blankenship/M
+blanketing/M
+blanket/SDRMZG
+blankness/MS
+blank/SPGTYRD
+Blanton/M
+Blantyre/M
+blare/DSG
+blarney/DMGS
+blasé
+blasphemer/M
+blaspheme/RSDZG
+blasphemousness/M
+blasphemous/PY
+blasphemy/SM
+blaster/M
+blasting/M
+blastoff/SM
+blast/SMRDGZ
+blatancy/SM
+blatant/YP
+blather/DRGS
+blatting
+Blatz/M
+Blavatsky/M
+Blayne/M
+blaze/DSRGMZ
+blazer/M
+blazing/Y
+blazoner/M
+blazon/SGDR
+bl/D
+bldg
+bleach/DRSZG
+bleached/U
+bleacher/M
+bleakness/MS
+bleak/TPYRS
+blear/GDS
+blearily
+bleariness/SM
+bleary/PRT
+bleater/M
+bleat/RDGS
+bleeder/M
+bleed/ZRJSG
+Bleeker/M
+bleep/GMRDZS
+blemish/DSMG
+blemished/U
+blench/DSG
+blender/M
+blend/GZRDS
+Blenheim/M
+blessedness/MS
+blessed/PRYT
+blessing/M
+bless/JGSD
+Blevins/M
+blew
+Bligh/M
+blighter/M
+blight/GSMDR
+blimey/S
+blimp/MS
+blinded/U
+blinder/M
+blindfold/SDG
+blinding/MY
+blind/JGTZPYRDS
+blindness/MS
+blindside/SDG
+blinker/MDG
+blinking/U
+blink/RDGSZ
+blinks/M
+Blinnie/M
+Blinni/M
+Blinny/M
+blintze/M
+blintz/SM
+blip/MS
+blipped
+blipping
+Blisse/M
+blissfulness/MS
+blissful/PY
+Bliss/M
+bliss/SDMG
+blistering/Y
+blister/SMDG
+blistery
+Blithe/M
+blitheness/SM
+blither/G
+blithesome
+blithe/TYPR
+blitz/GSDM
+blitzkrieg/SM
+blizzard/MS
+bloater/M
+bloat/SRDGZ
+blobbed
+blobbing
+blob/MS
+Bloch/M
+blockader/M
+blockade/ZMGRSD
+blockage/MS
+blockbuster/SM
+blockbusting/MS
+blocker/MS
+blockhead/MS
+blockhouse/SM
+block's
+block/USDG
+blocky/R
+bloc/MS
+Bloemfontein/M
+bloke/SM
+Blomberg/M
+Blomquist/M
+Blondelle/M
+Blondell/M
+blonde's
+Blondie/M
+blondish
+blondness/MS
+blond/SPMRT
+Blondy/M
+bloodbath
+bloodbaths
+bloodcurdling
+bloodhound/SM
+bloodied/U
+bloodiness/MS
+bloodlessness/SM
+bloodless/PY
+bloodletting/MS
+bloodline/SM
+bloodmobile/MS
+bloodroot/M
+bloodshed/SM
+bloodshot
+blood/SMDG
+bloodsport/S
+bloodstain/MDS
+bloodstock/SM
+bloodstone/M
+bloodstream/SM
+bloodsucker/SM
+bloodsucking/S
+bloodthirstily
+bloodthirstiness/MS
+bloodthirsty/RTP
+bloodworm/M
+bloodymindedness
+bloody/TPGDRS
+bloomer/M
+Bloomer/M
+Bloomfield/M
+Bloomington/M
+Bloom/MR
+bloom/SMRDGZ
+blooper/M
+bloop/GSZRD
+blossom/DMGS
+blossomy
+blotch/GMDS
+blotchy/RT
+blot/MS
+blotted
+blotter/MS
+blotting
+blotto
+blouse/GMSD
+blower/M
+blowfish/M
+blowfly/MS
+blowgun/SM
+blow/GZRS
+blowing/M
+blown/U
+blowout/MS
+blowpipe/SM
+blowtorch/SM
+blowup/MS
+blowy/RST
+blowzy/RT
+BLT
+blubber/GSDR
+blubbery
+Blucher/M
+bludgeon/GSMD
+blueback
+Bluebeard/M
+bluebell/MS
+blueberry/SM
+bluebill/M
+bluebird/MS
+bluebonnet/SM
+bluebook/M
+bluebottle/MS
+bluebush
+bluefish/SM
+bluegill/SM
+bluegrass/MS
+blueing's
+blueish
+bluejacket/MS
+bluejeans
+blue/JMYTGDRSP
+blueness/MS
+bluenose/MS
+bluepoint/SM
+blueprint/GDMS
+bluer/M
+bluest/M
+bluestocking/SM
+bluesy/TR
+bluet/MS
+bluffer/M
+bluffness/MS
+bluff/SPGTZYRD
+bluing/M
+bluishness/M
+bluish/P
+Blumenthal/M
+Blum/M
+blunderbuss/MS
+blunderer/M
+blunder/GSMDRJZ
+blundering/Y
+bluntness/MS
+blunt/PSGTYRD
+blurb/GSDM
+blur/MS
+blurred/Y
+blurriness/S
+blurring/Y
+blurry/RPT
+blurt/GSRD
+blusher/M
+blushing/UY
+blush/RSDGZ
+blusterer/M
+blustering/Y
+blusterous
+bluster/SDRZG
+blustery
+blvd
+Blvd
+Blythe/M
+BM
+BMW/M
+BO
+boarded
+boarder/SM
+boardgames
+boardinghouse/SM
+boarding/SM
+board/IS
+boardroom/MS
+board's
+boardwalk/SM
+boar/MS
+boa/SM
+boaster/M
+boastfulness/MS
+boastful/YP
+boast/SJRDGZ
+boatclubs
+boater/M
+boathouse/SM
+boating/M
+boatload/SM
+boatman/M
+boat/MDRGZJS
+boatmen
+boatswain/SM
+boatyard/SM
+bobbed
+Bobbee/M
+Bobbe/M
+Bobbette/M
+Bobbie/M
+Bobbi/M
+bobbing/M
+bobbin/MS
+Bobbitt/M
+bobble/SDGM
+Bobbsey/M
+Bobbye/M
+Bobby/M
+bobby/SM
+bobbysoxer's
+bobcat/MS
+Bobette/M
+Bobina/M
+Bobine/M
+Bobinette/M
+Bob/M
+bobolink/SM
+Bobrow/M
+bobsledded
+bobsledder/MS
+bobsledding/M
+bobsled/MS
+bobsleigh/M
+bobsleighs
+bobs/M
+bob/SM
+bobtail/SGDM
+bobwhite/SM
+Boca/M
+Boccaccio/M
+boccie/SM
+bock/GDS
+bockwurst
+bodega/MS
+Bodenheim/M
+bode/S
+Bodhidharma/M
+bodhisattva
+Bodhisattva/M
+bodice/SM
+bodied/M
+bodiless
+bodily
+boding/M
+bodkin/SM
+bod/SGMD
+bodybuilder/SM
+bodybuilding/S
+body/DSMG
+bodyguard/MS
+bodying/M
+bodysuit/S
+bodyweight
+bodywork/SM
+Boeing/M
+Boeotia/M
+Boeotian
+Boer/M
+Bogartian/M
+Bogart/M
+Bogey/M
+bogeyman/M
+bogeymen
+bogey/SGMD
+bogged
+bogging
+boggle/SDG
+boggling/Y
+boggy/RT
+bogie's
+bog/MS
+Bogotá/M
+bogus
+bogyman
+bogymen
+bogy's
+Boheme/M
+bohemianism/S
+bohemian/S
+Bohemian/SM
+Bohemia/SM
+Bohr/M
+Boigie/M
+boiled/AU
+boiler/M
+boilermaker/MS
+boilerplate/SM
+boil/JSGZDR
+boils/A
+Boise/M
+Bois/M
+boisterousness/MS
+boisterous/YP
+bola/SM
+boldface/SDMG
+boldness/MS
+bold/YRPST
+bole/MS
+bolero/MS
+Boleyn/M
+bolivares
+Bolivar/M
+bolivar/MS
+Bolivia/M
+Bolivian/S
+bollard/SM
+bollix/GSD
+boll/MDSG
+Bologna/M
+bologna/MS
+bolometer/MS
+bolo/MS
+boloney's
+Bolshevik/MS
+Bolshevism/MS
+Bolshevistic/M
+Bolshevist/MS
+Bolshoi/M
+bolsterer/M
+bolster/SRDG
+bolted/U
+bolter/M
+bolt/MDRGS
+Bolton/M
+bolts/U
+Boltzmann/M
+bolus/SM
+bombardier/MS
+bombard/LDSG
+bombardment/SM
+bombastic
+bombastically
+bombast/RMS
+Bombay/M
+bomber/M
+bombproof
+bomb/SGZDRJ
+bombshell/SM
+Bo/MRZ
+bona
+bonanza/MS
+Bonaparte/M
+Bonaventure/M
+bonbon/SM
+bondage/SM
+bonder/M
+bondholder/SM
+Bondie/M
+bond/JMDRSGZ
+Bond/M
+bondman/M
+bondmen
+Bondon/M
+bonds/A
+bondsman/M
+bondsmen
+bondwoman/M
+bondwomen
+Bondy/M
+boned/U
+bonehead/SDM
+boneless
+Bone/M
+bone/MZDRSG
+boner/M
+bonfire/MS
+bong/GDMS
+bongo/MS
+Bonham/M
+bonhomie/MS
+Boniface/M
+boniness/MS
+Bonita/M
+bonito/MS
+bonjour
+bonkers
+Bonnee/M
+Bonner/M
+bonneted/U
+bonnet/SGMD
+Bonneville/M
+Bonnibelle/M
+bonnie
+Bonnie/M
+Bonni/M
+Bonn/RM
+Bonny/M
+bonny/RT
+bonsai/SM
+Bontempo/M
+bonus/SM
+bony/RTP
+bonzes
+boob/DMSG
+booby/SM
+boodle/GMSD
+boogeyman's
+boogieing
+boogie/SD
+boo/GSDH
+boohoo/GDS
+bookbinder/M
+bookbindery/SM
+bookbinding/M
+bookbind/JRGZ
+bookcase/MS
+booked/U
+bookend/SGD
+Booker/M
+book/GZDRMJSB
+bookie/SM
+booking/M
+bookishness/M
+bookish/PY
+bookkeeper/M
+bookkeep/GZJR
+bookkeeping/M
+booklet/MS
+bookmaker/MS
+bookmaking/MS
+bookmark/MDGS
+bookmobile/MS
+bookplate/SM
+bookseller/SM
+bookshelf/M
+bookshelves
+bookshop/MS
+bookstall/MS
+bookstore/SM
+bookwork/M
+bookworm/MS
+Boolean
+boolean/S
+Boole/M
+boom/DRGJS
+boomerang/MDSG
+boomer/M
+boomtown/S
+boondocks
+boondoggle/DRSGZ
+boondoggler/M
+Boone/M
+Boonie/M
+boonies
+boon/MS
+Boony/M
+boorishness/SM
+boorish/PY
+boor/MS
+boosterism
+booster/M
+boost/SGZMRD
+boot/AGDS
+bootblack/MS
+bootee/MS
+Boote/M
+Boötes
+Boothe/M
+booth/M
+Booth/M
+booths
+bootie's
+bootlaces
+bootlegged/M
+bootlegger/SM
+bootlegging/M
+bootleg/S
+Bootle/M
+bootless
+Boot/M
+bootprints
+boot's
+bootstrapped
+bootstrapping
+bootstrap/SM
+booty/SM
+booze/DSRGMZ
+boozer/M
+boozy/TR
+bopped
+bopping
+bop/S
+borate/MSD
+borax/MS
+Bordeaux/M
+bordello/MS
+Borden/M
+borderer/M
+border/JRDMGS
+borderland/SM
+borderline/MS
+Bordie/M
+Bord/MN
+Bordon/M
+Bordy/M
+Borealis/M
+Boreas/M
+boredom/MS
+boreholes
+borer/M
+bore/ZGJDRS
+Borges
+Borgia/M
+Borg/M
+boric
+boring/YMP
+Boris
+Bork/M
+born/AIU
+Borneo/M
+borne/U
+Born/M
+Borodin/M
+boron/SM
+borosilicate/M
+borough/M
+boroughs
+Borroughs/M
+borrower/M
+borrowing/M
+borrow/JZRDGBS
+borscht/SM
+borstal/MS
+Boru/M
+borzoi/MS
+Bosch/M
+Bose/M
+bosh/MS
+Bosnia/M
+Bosnian/S
+bosom's
+bosom/SGUD
+bosomy/RT
+boson/SM
+Bosporus/M
+boss/DSRMG
+bossily
+bossiness/MS
+bossism/MS
+bossy/PTSR
+Bostitch/M
+Bostonian/SM
+Boston/MS
+bosun's
+Boswell/MS
+botanical/SY
+botanic/S
+botanist/SM
+botany/SM
+botcher/M
+botch/SRDGZ
+botfly/M
+bother/DG
+bothersome
+bothy/M
+both/ZR
+bot/S
+Botswana/M
+Botticelli/M
+bottle/GMZSRD
+bottleneck/GSDM
+bottler/M
+bottomlessness/M
+bottomless/YP
+bottommost
+bottom/SMRDG
+botulin/M
+botulinus/M
+botulism/SM
+Boucher/M
+boudoir/MS
+bouffant/S
+bougainvillea/SM
+bough/MD
+boughs
+bought/N
+bouillabaisse/MS
+bouillon/MS
+boulder/GMDS
+Boulder/M
+boulevard/MS
+bouncer/M
+bounce/SRDGZ
+bouncily
+bouncing/Y
+bouncy/TRP
+boundary/MS
+bound/AUDI
+boundedness/MU
+bounded/UP
+bounden
+bounder/AM
+bounders
+bounding
+boundlessness/SM
+boundless/YP
+bounds/IA
+bounteousness/MS
+bounteous/PY
+bountifulness/SM
+bountiful/PY
+bounty/SDM
+bouquet/SM
+Bourbaki/M
+bourbon/SM
+Bourbon/SM
+bourgeoisie/SM
+bourgeois/M
+Bourke/M
+Bourne/M
+Bournemouth/M
+boutique/MS
+bout/MS
+boutonnière/MS
+Bouvier
+Bovary/M
+bovine/YS
+Bowditch/M
+bowdlerization/MS
+bowdlerize/GRSD
+bowed/U
+bowel/GMDS
+Bowell/M
+Bowen/M
+bower/DMG
+Bowers
+Bowery/M
+Bowes
+bowie
+Bowie/M
+bowing/M
+bowlder's
+bowlegged
+bowleg/SM
+bowler/M
+bowlful/S
+bowl/GZSMDR
+bowline/MS
+bowling/M
+bowman/M
+Bowman/M
+bowmen
+bowser/M
+bowsprit/SM
+bows/R
+bowstring/GSMD
+bow/SZGNDR
+bowwow/DMGS
+boxcar/SM
+box/DRSJZGM
+boxer/M
+boxful/M
+boxing/M
+boxlike
+boxtops
+boxwood/SM
+boxy/TPR
+Boyce/M
+Boycey/M
+Boycie/M
+boycotter/M
+boycott/RDGS
+Boyd/M
+Boyer/M
+boyfriend/MS
+boyhood/SM
+boyishness/MS
+boyish/PY
+Boyle/M
+Boy/MR
+boy/MRS
+boyscout
+boysenberry/SM
+bozo/SM
+bpi
+bps
+BR
+brace/DSRJGM
+braced/U
+bracelet/MS
+bracer/M
+brachia
+brachium/M
+bracken/SM
+bracketed/U
+bracketing/M
+bracket/SGMD
+brackishness/SM
+brackish/P
+bract/SM
+Bradan/M
+bradawl/M
+Bradbury/M
+Bradburys
+bradded
+bradding
+Braddock/M
+Brade/M
+Braden/M
+Bradford/M
+Bradley/M
+Bradly/M
+Brad/MYN
+Bradney/M
+Bradshaw/M
+brad/SM
+Bradstreet/M
+Brady/M
+brae/SM
+braggadocio/SM
+braggart/SM
+bragged
+bragger/MS
+braggest
+bragging
+Bragg/M
+brag/S
+Brahe/M
+Brahma/MS
+Brahmanism/MS
+Brahman/SM
+Brahmaputra/M
+Brahmin's
+Brahms
+braider/M
+braiding/M
+braid/RDSJG
+braille/DSG
+Braille/GDSM
+Brainard/SM
+braincell/S
+brainchild/M
+brainchildren
+brain/GSDM
+braininess/MS
+brainlessness/M
+brainless/YP
+Brain/M
+brainpower/M
+brainstorm/DRMGJS
+brainstorming/M
+brainteaser/S
+brainteasing
+brainwasher/M
+brainwashing/M
+brainwash/JGRSD
+brainwave/S
+brainy/RPT
+braise/SDG
+brake/DSGM
+brakeman/M
+brakemen/M
+bramble/DSGM
+brambling/M
+brambly/RT
+Bram/M
+Brampton/M
+bra/MS
+Brana/M
+branched/U
+branching/M
+branchlike
+Branch/M
+branch/MDSJG
+Branchville/M
+Brandais/M
+Brandea/M
+branded/U
+Brandeis/M
+Brandel/M
+Brande/M
+Brandenburg/M
+Branden/M
+brander/GDM
+Brander/M
+Brandice/M
+Brandie/M
+Brandi/M
+Brandise/M
+brandish/GSD
+Brand/MRN
+Brando/M
+Brandon/M
+brand/SMRDGZ
+Brandt/M
+Brandtr/M
+brandy/GDSM
+Brandy/M
+Brandyn/M
+brandywine
+Braniff/M
+Bran/M
+branned
+branning
+Brannon/M
+bran/SM
+Brantley/M
+Brant/M
+Braque/M
+brashness/MS
+brash/PYSRT
+Brasilia
+brasserie/SM
+brass/GSDM
+brassiere/MS
+brassily
+brassiness/SM
+brassy/RSPT
+Bratislava/M
+brat/SM
+Brattain/M
+bratty/RT
+bratwurst/MS
+Braun/M
+bravadoes
+bravado/M
+brave/DSRGYTP
+braveness/MS
+bravery/MS
+bravest/M
+bravo/SDG
+bravura/SM
+brawler/M
+brawl/MRDSGZ
+brawniness/SM
+brawn/MS
+brawny/TRP
+brayer/M
+Bray/M
+bray/SDRG
+braze/GZDSR
+brazenness/MS
+brazen/PYDSG
+brazer/M
+brazier/SM
+Brazilian/MS
+Brazil/M
+Brazos/M
+Brazzaville/M
+breacher/M
+breach/MDRSGZ
+breadbasket/SM
+breadboard/SMDG
+breadbox/S
+breadcrumb/S
+breadfruit/MS
+breadline/MS
+bread/SMDHG
+breadth/M
+breadths
+breadwinner/MS
+breakables
+breakable/U
+breakage/MS
+breakaway/MS
+breakdown/MS
+breaker/M
+breakfaster/M
+breakfast/RDMGZS
+breakfront/S
+breaking/M
+breakneck
+breakout/MS
+breakpoint/SMDG
+break/SZRBG
+breakthroughs
+breakthrough/SM
+breakup/SM
+breakwater/SM
+bream/SDG
+Breanne/M
+Brear/M
+breastbone/MS
+breastfed
+breastfeed/G
+breasting/M
+breast/MDSG
+breastplate/SM
+breaststroke/SM
+breastwork/MS
+breathable/U
+breathalyser/S
+Breathalyzer/SM
+breathe
+breather/M
+breathing/M
+breathlessness/SM
+breathless/PY
+breaths
+breathtaking/Y
+breathy/TR
+breath/ZBJMDRSG
+Brecht/M
+Breckenridge/M
+bred/DG
+bredes
+breeching/M
+breech/MDSG
+breeder/I
+breeder's
+breeding/IM
+breeds/I
+breed/SZJRG
+Bree/M
+Breena/M
+breeze/GMSD
+breezeway/SM
+breezily
+breeziness/SM
+breezy/RPT
+Bremen/M
+bremsstrahlung/M
+Brena/M
+Brenda/M
+Brendan/M
+Brenden/M
+Brendin/M
+Brendis/M
+Brendon/M
+Bren/M
+Brenna/M
+Brennan/M
+Brennen/M
+Brenner/M
+Brenn/RNM
+Brent/M
+Brenton/M
+Bresenham/M
+Brest/M
+brethren
+Bret/M
+Breton
+Brett/M
+breve/SM
+brevet/MS
+brevetted
+brevetting
+breviary/SM
+brevity/MS
+brew/DRGZS
+brewer/M
+Brewer/M
+brewery/MS
+brewing/M
+brewpub/S
+Brew/RM
+Brewster/M
+Brezhnev/M
+Bria/M
+Briana/M
+Brian/M
+Brianna/M
+Brianne/M
+Briano/M
+Briant/M
+briar's
+bribe/GZDSR
+briber/M
+bribery/MS
+Brice/M
+brickbat/SM
+brick/GRDSM
+bricklayer/MS
+bricklaying/SM
+brickmason/S
+brickwork/SM
+brickyard/M
+bridal/S
+Bridalveil/M
+bridegroom/MS
+Bride/M
+bride/MS
+bridesmaid/MS
+Bridewell/M
+bridgeable/U
+bridged/U
+bridgehead/MS
+Bridgeport/M
+Bridger/M
+Bridges
+bridge/SDGM
+Bridget/M
+Bridgetown/M
+Bridgette/M
+Bridgett/M
+Bridgewater/M
+bridgework/MS
+bridging/M
+Bridgman/M
+Bridie/M
+bridled/U
+bridle/SDGM
+bridleway/S
+briefcase/SM
+briefed/C
+briefing/M
+briefness/MS
+briefs/C
+brief/YRDJPGTS
+Brien/M
+Brier/M
+brier/MS
+Brie/RSM
+Brietta/M
+brigade/GDSM
+brigadier/MS
+Brigadoon
+brigandage/MS
+brigand/MS
+brigantine/MS
+Brigg/MS
+Brigham/M
+brightener/M
+brighten/RDZG
+bright/GXTPSYNR
+Bright/M
+brightness/SM
+Brighton/M
+Brigida/M
+Brigid/M
+Brigit/M
+Brigitta/M
+Brigitte/M
+Brig/M
+brig/SM
+brilliance/MS
+brilliancy/MS
+brilliantine/MS
+brilliantness/M
+brilliant/PSY
+Brillo
+Brillouin/M
+brimful
+brimless
+brimmed
+brimming
+brim/SM
+brimstone/MS
+Brina/M
+Brindisi/M
+brindle/DSM
+brine/GMDSR
+briner/M
+Briney/M
+bringer/M
+bring/RGZS
+brininess/MS
+Brinkley/M
+brinkmanship/SM
+brink/MS
+Brinna/M
+Brinn/M
+Briny/M
+briny/PTSR
+brioche/SM
+Brion/M
+briquet's
+briquette/MGSD
+Brisbane/M
+brisket/SM
+briskness/MS
+brisk/YRDPGTS
+bristle/DSGM
+bristly/TR
+Bristol/M
+bristol/S
+Britain/M
+Brita/M
+Britannia/M
+Britannic
+Britannica/M
+britches
+Briticism/MS
+Britisher/M
+Britishly/M
+British/RYZ
+Brit/MS
+Britney/M
+Britni/M
+Briton/MS
+Britta/M
+Brittaney/M
+Brittani/M
+Brittan/M
+Brittany/MS
+Britte/M
+Britten/M
+Britteny/M
+brittleness/MS
+brittle/YTPDRSG
+Britt/MN
+Brittne/M
+Brittney/M
+Brittni/M
+Brnaba/M
+Brnaby/M
+Brno/M
+broach/DRSG
+broacher/M
+broadband
+broadcaster/M
+broadcast/RSGZJ
+broadcasts/A
+broadcloth/M
+broadcloths
+broaden/JGRDZ
+broadleaved
+broadloom/SM
+broadminded/P
+broadness/S
+broadsheet/MS
+broadside/SDGM
+broadsword/MS
+broad/TXSYRNP
+Broadway/SM
+Brobdingnagian
+Brobdingnag/M
+brocade/DSGM
+broccoli/MS
+brochette/SM
+brochure/SM
+Brockie/M
+Brock/M
+Brocky/M
+Broddie/M
+Broddy/M
+Broderick/M
+Broderic/M
+Brodie/M
+Brod/M
+Brody/M
+brogan/MS
+Broglie/M
+brogue/MS
+broiler/M
+broil/RDSGZ
+brokenhearted/Y
+brokenness/MS
+broken/YP
+brokerage/MS
+broker/DMG
+broke/RGZ
+Brok/M
+bromide/MS
+bromidic
+bromine/MS
+bronchial
+bronchi/M
+bronchiolar
+bronchiole/MS
+bronchiolitis
+bronchitic/S
+bronchitis/MS
+broncho's
+bronchus/M
+broncobuster/SM
+bronco/SM
+bronc/S
+Bron/M
+Bronnie/M
+Bronny/M
+Bronson/M
+Bronte
+brontosaur/SM
+brontosaurus/SM
+Bronx/M
+bronzed/M
+bronze/SRDGM
+bronzing/M
+brooch/MS
+brooder/M
+broodiness/M
+brooding/Y
+broodmare/SM
+brood/SMRDGZ
+broody/PTR
+Brookdale/M
+Brooke/M
+Brookfield/M
+Brookhaven/M
+brooklet/MS
+Brooklyn/M
+Brookmont/M
+brook/SGDM
+brookside
+Brook/SM
+broom/SMDG
+broomstick/MS
+Bros
+Brose/M
+bro/SH
+bros/S
+brothel/MS
+brother/DYMG
+brotherhood/SM
+brotherliness/MS
+brotherly/P
+broths
+broth/ZMR
+brougham/MS
+brought
+brouhaha/MS
+browbeat/NSG
+brow/MS
+Brownell/M
+Browne/M
+Brownian/M
+Brownie/MS
+brownie/MTRS
+browning/M
+Browning/M
+brownish
+Brown/MG
+brownness/MS
+brownout/MS
+brownstone/MS
+Brownsville/M
+brown/YRDMSJGTP
+browse
+browser/M
+brows/SRDGZ
+brr
+Br/TMN
+Brubeck/M
+brucellosis/M
+Bruce/M
+Brucie/M
+Bruckner/M
+Bruegel/M
+Brueghel's
+bruin/MS
+bruised/U
+bruise/JGSRDZ
+bruiser/M
+Bruis/M
+bruit/DSG
+Brumidi/M
+Brummel/M
+brunch/MDSG
+Brunei/M
+Brunelleschi/M
+brunet/S
+brunette/SM
+Brunhilda/M
+Brunhilde/M
+Bruno/M
+Brunswick/M
+brunt/GSMD
+brusher/M
+brushfire/MS
+brushlike
+brush/MSRDG
+brushoff/S
+brushwood/SM
+brushwork/MS
+brushy/R
+brusqueness/MS
+brusque/PYTR
+Brussels
+brutality/SM
+brutalization/SM
+brutalized/U
+brutalizes/AU
+brutalize/SDG
+brutal/Y
+brute/DSRGM
+brutishness/SM
+brutish/YP
+Brutus/M
+Bruxelles/M
+Bryana/M
+Bryan/M
+Bryant/M
+Bryanty/M
+Bryce/M
+Bryna/M
+Bryn/M
+Brynna/M
+Brynne/M
+Brynner/M
+Brynn/RM
+Bryon/M
+Brzezinski/M
+B's
+BS
+BSA
+BSD
+Btu
+BTU
+BTW
+bu
+bubblegum/S
+bubbler/M
+bubble/RSDGM
+bubbly/TRS
+Buber/M
+bub/MS
+buboes
+bubo/M
+bubonic
+buccaneer/GMDS
+Buchanan/M
+Bucharest/M
+Buchenwald/M
+Buchwald/M
+buckaroo/SM
+buckboard/SM
+bucker/M
+bucketful/MS
+bucket/SGMD
+buckeye/SM
+buck/GSDRM
+buckhorn/M
+Buckie/M
+Buckingham/M
+buckled/U
+buckler/MDG
+buckle/RSDGMZ
+buckles/U
+Buckley/M
+buckling's
+buckling/U
+Buck/M
+Buckner/M
+buckram/GSDM
+bucksaw/SM
+buckshot/MS
+buckskin/SM
+buckteeth
+bucktooth/DM
+buckwheat/SM
+Bucky/M
+bucolically
+bucolic/S
+Budapest/M
+budded
+Buddha/MS
+Buddhism/SM
+Buddhist/SM
+Buddie/M
+budding/S
+Budd/M
+buddy/GSDM
+Buddy/M
+budge/GDS
+budgerigar/MS
+budgetary
+budgeter/M
+budget/GMRDZS
+budgie/MS
+budging/U
+Bud/M
+bud/MS
+Budweiser/MS
+Buehring/M
+Buena/M
+buffaloes
+Buffalo/M
+buffalo/MDG
+buff/ASGD
+buffered/U
+bufferer/M
+buffer/RDMSGZ
+buffet/GMDJS
+bufflehead/M
+buffoonery/MS
+buffoonish
+buffoon/SM
+buff's
+Buffy/M
+Buford/M
+bugaboo/SM
+Bugatti/M
+bugbear/SM
+bug/CS
+bugeyed
+bugged/C
+buggered
+buggering
+bugger/SCM!
+buggery/M
+bugging/C
+buggy/RSMT
+bugle/GMDSRZ
+bugler/M
+bug's
+Buick/M
+builder/SM
+building/SM
+build/SAG
+buildup/MS
+built/AUI
+Buiron/M
+Bujumbura/M
+Bukhara/M
+Bukharin/M
+Bulawayo/M
+Bulba/M
+bulb/DMGS
+bulblet
+bulbous
+Bulfinch/M
+Bulganin/M
+Bulgaria/M
+Bulgarian/S
+bulge/DSGM
+bulgy/RT
+bulimarexia/S
+bulimia/MS
+bulimic/S
+bulk/GDRMS
+bulkhead/SDM
+bulkiness/SM
+bulky/RPT
+bulldogged
+bulldogger
+bulldogging
+bulldog/SM
+bulldoze/GRSDZ
+bulldozer/M
+bullet/GMDS
+bulletin/SGMD
+bulletproof/SGD
+bullfighter/M
+bullfighting/M
+bullfight/SJGZMR
+bullfinch/MS
+bullfrog/SM
+bullhead/DMS
+bullheadedness/SM
+bullheaded/YP
+bullhide
+bullhorn/SM
+bullied/M
+bullion/SM
+bullishness/SM
+bullish/PY
+bull/MDGS
+Bullock/M
+bullock/MS
+bullpen/MS
+bullring/SM
+bullseye
+bullshit/MS!
+bullshitted/!
+bullshitter/S!
+bullshitting/!
+bullwhackers
+Bullwinkle/M
+bullyboy/MS
+bullying/M
+bully/TRSDGM
+bulrush/SM
+Bultmann/M
+bulwark/GMDS
+bumblebee/MS
+bumble/JGZRSD
+bumbler/M
+bumbling/Y
+Bumbry/M
+bummed/M
+bummer/MS
+bummest
+bumming/M
+bumper/DMG
+bump/GZDRS
+bumpiness/MS
+bumpkin/MS
+Bumppo/M
+bumptiousness/SM
+bumptious/PY
+bumpy/PRT
+bum/SM
+Bunche/M
+bunch/MSDG
+bunchy/RT
+buncombe's
+bunco's
+Bundestag/M
+bundled/U
+bundle/GMRSD
+bundler/M
+Bundy/M
+bungalow/MS
+bungee/SM
+bung/GDMS
+bunghole/MS
+bungle/GZRSD
+bungler/M
+bungling/Y
+Bunin/M
+bunion/SM
+bunk/CSGDR
+Bunker/M
+bunker's/C
+bunker/SDMG
+bunkhouse/SM
+bunkmate/MS
+bunko's
+bunk's
+bunkum/SM
+Bunnie/M
+Bunni/M
+Bunny/M
+bunny/SM
+Bunsen/SM
+bun/SM
+bunt/GJZDRS
+bunting/M
+Buñuel/M
+Bunyan/M
+buoyancy/MS
+buoyant/Y
+buoy/SMDG
+Burbank/M
+burbler/M
+burble/RSDG
+burbs
+Burch/M
+burden's
+burdensomeness/M
+burdensome/PY
+burden/UGDS
+burdock/SM
+bureaucracy/MS
+bureaucratically
+bureaucratic/U
+bureaucratization/MS
+bureaucratize/SDG
+bureaucrat/MS
+bureau/MS
+burgeon/GDS
+burger/M
+Burger/M
+Burgess/M
+burgess/MS
+burgher/M
+burgh/MRZ
+burghs
+burglarize/GDS
+burglarproof/DGS
+burglar/SM
+burglary/MS
+burgle/SDG
+burgomaster/SM
+Burgoyne/M
+Burg/RM
+burg/SZRM
+Burgundian/S
+Burgundy/MS
+burgundy/S
+burial/ASM
+buried/U
+burier/M
+Burke/M
+Burk/SM
+burlap/MS
+burler/M
+burlesquer/M
+burlesque/SRDMYG
+burley/M
+Burlie/M
+burliness/SM
+Burlingame/M
+Burlington/M
+Burl/M
+burl/SMDRG
+burly/PRT
+Burma/M
+Burmese
+bur/MYS
+burnable/S
+Burnaby/M
+Burnard/M
+burned/U
+Burne/MS
+burner/M
+Burnett/M
+burn/GZSDRBJ
+burning/Y
+burnisher/M
+burnish/GDRSZ
+burnoose/MS
+burnout/MS
+Burns
+Burnside/MS
+burnt/YP
+burp/SGMD
+burr/GSDRM
+Burris/M
+burrito/S
+Burr/M
+burro/SM
+Burroughs/M
+burrower/M
+burrow/GRDMZS
+bursae
+bursa/M
+Bursa/M
+bursar/MS
+bursary/MS
+bursitis/MS
+burster/M
+burst/SRG
+Burtie/M
+Burt/M
+Burton/M
+Burty/M
+Burundian/S
+Burundi/M
+bury/ASDG
+busboy/MS
+busby/SM
+Busch/M
+buses/A
+busgirl/S
+bus/GMDSJ
+bushel/MDJSG
+Bushido/M
+bushiness/MS
+bushing/M
+bush/JMDSRG
+bushland
+Bush/M
+bushman/M
+bushmaster/SM
+bushmen
+Bushnell/M
+bushwhacker/M
+bushwhacking/M
+bushwhack/RDGSZ
+bushy/PTR
+busily
+businesslike
+businessman/M
+businessmen
+business/MS
+businesspeople
+businessperson/S
+businesswoman/M
+businesswomen
+busker/M
+busk/GRM
+buskin/SM
+bus's/A
+buss/D
+bustard/MS
+buster/M
+bustle/GSD
+bustling/Y
+bust/MSDRGZ
+busty/RT
+busybody/MS
+busy/DSRPTG
+busyness/MS
+busywork/SM
+but/ACS
+butane/MS
+butcherer/M
+butcher/MDRYG
+butchery/MS
+Butch/M
+butch/RSZ
+butene/M
+Butler/M
+butler/SDMG
+butted/A
+butte/MS
+butterball/MS
+buttercup/SM
+buttered/U
+butterfat/MS
+Butterfield/M
+butterfingered
+butterfingers/M
+butterfly/MGSD
+buttermilk/MS
+butternut/MS
+butter/RDMGZ
+butterscotch/SM
+buttery/TRS
+butting/M
+buttock/SGMD
+buttoner/M
+buttonhole/GMRSD
+buttonholer/M
+button's
+button/SUDG
+buttonweed
+buttonwood/SM
+buttress/MSDG
+butt/SGZMDR
+butyl/M
+butyrate/M
+buxomness/M
+buxom/TPYR
+Buxtehude/M
+buyback/S
+buyer/M
+buyout/S
+buy/ZGRS
+buzzard/MS
+buzz/DSRMGZ
+buzzer/M
+buzzword/SM
+buzzy
+bx
+bxs
+byelaw's
+Byelorussia's
+bye/MZS
+Byers/M
+bygone/S
+bylaw/SM
+byliner/M
+byline/RSDGM
+BYOB
+bypass/GSDM
+bypath/M
+bypaths
+byplay/S
+byproduct/SM
+Byram/M
+Byran/M
+Byrann/M
+Byrd/M
+byre/SM
+Byrle/M
+Byrne/M
+byroad/MS
+Byrom/M
+Byronic
+Byronism/M
+Byron/M
+bystander/SM
+byte/SM
+byway/SM
+byword/SM
+byzantine
+Byzantine/S
+Byzantium/M
+by/ZR
+C
+ca
+CA
+cabala/MS
+caballed
+caballero/SM
+caballing
+cabal/SM
+cabana/MS
+cabaret/SM
+cabbage/MGSD
+cabbed
+cabbing
+cabby's
+cabdriver/SM
+caber/M
+Cabernet/M
+cabinetmaker/SM
+cabinetmaking/MS
+cabinet/MS
+cabinetry/SM
+cabinetwork/MS
+cabin/GDMS
+cablecast/SG
+cable/GMDS
+cablegram/SM
+cabochon/MS
+caboodle/SM
+caboose/MS
+Cabot/M
+Cabrera/M
+Cabrini/M
+cabriolet/MS
+cab/SMR
+cabstand/MS
+cacao/SM
+cacciatore
+cache/DSRGM
+cachepot/MS
+cachet/MDGS
+Cacilia/M
+Cacilie/M
+cackler/M
+cackle/RSDGZ
+cackly
+CACM
+cacophonist
+cacophonous
+cacophony/SM
+cacti
+cactus/M
+CAD
+cadaverous/Y
+cadaver/SM
+caddishness/SM
+caddish/PY
+Caddric/M
+caddy/GSDM
+cadence/CSM
+cadenced
+cadencing
+cadent/C
+cadenza/MS
+cadet/SM
+Cadette/S
+cadge/DSRGZ
+cadger/M
+Cadillac/MS
+Cadiz/M
+Cad/M
+cadmium/MS
+cadre/SM
+cad/SM
+caducei
+caduceus/M
+Caedmon/M
+Caesar/MS
+caesura/SM
+café/MS
+cafeteria/SM
+caffeine/SM
+caftan/SM
+caged/U
+Cage/M
+cage/MZGDRS
+cager/M
+cagey/P
+cagier
+cagiest
+cagily
+caginess/MS
+Cagney/M
+Cahokia/M
+cahoot/MS
+Cahra/M
+CAI
+Caiaphas/M
+caiman's
+Caine/M
+Cain/MS
+Cairistiona/M
+cairn/SDM
+Cairo/M
+caisson/SM
+caitiff/MS
+Caitlin/M
+Caitrin/M
+cajole/LGZRSD
+cajolement/MS
+cajoler/M
+cajolery/SM
+Cajun/MS
+cake/MGDS
+cakewalk/SMDG
+calabash/SM
+calaboose/MS
+Calais/M
+calamari/S
+calamine/GSDM
+calamitousness/M
+calamitous/YP
+calamity/MS
+cal/C
+calcareousness/M
+calcareous/PY
+calciferous
+calcification/M
+calcify/XGNSD
+calcimine/GMSD
+calcine/SDG
+calcite/SM
+calcium/SM
+Calcomp/M
+CalComp/M
+CALCOMP/M
+calculability/IM
+calculable/IP
+calculate/AXNGDS
+calculated/PY
+calculatingly
+calculating/U
+calculation/AM
+calculative
+calculator/SM
+calculi
+calculus/M
+Calcutta/M
+caldera/SM
+Calder/M
+Calderon/M
+caldron's
+Caldwell/M
+Caleb/M
+Caledonia/M
+Cale/M
+calendar/MDGS
+calender/MDGS
+calf/M
+calfskin/SM
+Calgary/M
+Calhoun/M
+Caliban/M
+caliber/SM
+calibrated/U
+calibrater's
+calibrate/XNGSD
+calibrating/A
+calibration/M
+calibrator/MS
+calicoes
+calico/M
+Calida/M
+Calif/M
+California/M
+Californian/MS
+californium/SM
+calif's
+Caligula/M
+Cali/M
+caliper/SDMG
+caliphate/SM
+caliph/M
+caliphs
+calisthenic/S
+calisthenics/M
+Callaghan/M
+call/AGRDBS
+Callahan/M
+calla/MS
+Calla/MS
+Callao/M
+callback/S
+Callean/M
+called/U
+callee/M
+caller/MS
+Calley/M
+Callida/M
+Callie/M
+calligrapher/M
+calligraphic
+calligraphist/MS
+calligraph/RZ
+calligraphy/MS
+Calli/M
+calling/SM
+Calliope/M
+calliope/SM
+callisthenics's
+Callisto/M
+callosity/MS
+callousness/SM
+callous/PGSDY
+callowness/MS
+callow/RTSP
+callus/SDMG
+Cally/M
+calming/Y
+calmness/MS
+calm/PGTYDRS
+Cal/MY
+Caloocan/M
+caloric/S
+calorie/SM
+calorific
+calorimeter/MS
+calorimetric
+calorimetry/M
+Caltech/M
+Calumet/M
+calumet/MS
+calumniate/NGSDX
+calumniation/M
+calumniator/SM
+calumnious
+calumny/MS
+calvary/M
+Calvary/M
+calve/GDS
+Calvert/M
+calves/M
+Calvinism/MS
+Calvinistic
+Calvinist/MS
+Calvin/M
+Calv/M
+calyces's
+Calypso/M
+calypso/SM
+calyx/MS
+Ca/M
+CAM
+Camacho/M
+Camala/M
+camaraderie/SM
+camber/DMSG
+cambial
+cambium/SM
+Cambodia/M
+Cambodian/S
+Cambrian/S
+cambric/MS
+Cambridge/M
+camcorder/S
+Camden/M
+camelhair's
+Camella/M
+Camellia/M
+camellia/MS
+Camel/M
+Camelopardalis/M
+Camelot/M
+camel/SM
+Camembert/MS
+cameo/GSDM
+camerae
+cameraman/M
+cameramen
+camera/MS
+camerawoman
+camerawomen
+Cameron/M
+Cameroonian/S
+Cameroon/SM
+came/N
+Camey/M
+Camila/M
+Camile/M
+Camilla/M
+Camille/M
+Cami/M
+Camino/M
+camion/M
+camisole/MS
+Cam/M
+cammed
+Cammie/M
+Cammi/M
+cam/MS
+Cammy/M
+Camoens/M
+camomile's
+camouflage/DRSGZM
+camouflager/M
+campaigner/M
+campaign/ZMRDSG
+campanile/SM
+campanological
+campanologist/SM
+campanology/MS
+Campbell/M
+Campbellsport/M
+camper/SM
+campesinos
+campest
+campfire/SM
+campground/MS
+camphor/MS
+Campinas/M
+camping/S
+Campos
+camp's
+camp/SCGD
+campsite/MS
+campus/GSDM
+campy/RT
+Camry/M
+camshaft/SM
+Camus/M
+Canaanite/SM
+Canaan/M
+Canada/M
+Canadianism/SM
+Canadian/S
+Canad/M
+Canaletto/M
+canalization/MS
+canalize/GSD
+canal/SGMD
+canapé/S
+canard/MS
+Canaries
+canary/SM
+canasta/SM
+Canaveral/M
+Canberra/M
+cancan/SM
+cancelate/D
+canceled/U
+canceler/M
+cancellation/MS
+cancel/RDZGS
+cancer/MS
+Cancer/MS
+cancerous/Y
+Cancun/M
+Candace/M
+candelabra/S
+candelabrum/M
+Candice/M
+candidacy/MS
+Candida/M
+candidate/SM
+candidature/S
+Candide/M
+candidly/U
+candidness/SM
+candid/TRYPS
+Candie/M
+Candi/SM
+candle/GMZRSD
+candlelight/SMR
+candlelit
+candlepower/SM
+candler/M
+candlestick/SM
+Candlewick/M
+candlewick/MS
+candor/MS
+Candra/M
+candy/GSDM
+Candy/M
+canebrake/SM
+caner/M
+cane/SM
+canine/S
+caning/M
+Canis/M
+canister/SGMD
+cankerous
+canker/SDMG
+Can/M
+can/MDRSZGJ
+cannabis/MS
+canned
+cannelloni
+canner/SM
+cannery/MS
+Cannes
+cannibalism/MS
+cannibalistic
+cannibalization/SM
+cannibalize/GSD
+cannibal/SM
+cannily/U
+canninesses
+canniness/UM
+canning/M
+cannister/SM
+cannonade/SDGM
+cannonball/SGDM
+Cannon/M
+cannon/SDMG
+cannot
+canny/RPUT
+canoe/DSGM
+canoeist/SM
+Canoga/M
+canonic
+canonicalization
+canonicalize/GSD
+canonical/SY
+canonist/M
+canonization/MS
+canonized/U
+canonize/SDG
+canon/SM
+Canopus/M
+canopy/GSDM
+canst
+can't
+cantabile/S
+Cantabrigian
+cantaloupe/MS
+cantankerousness/SM
+cantankerous/PY
+cantata/SM
+cant/CZGSRD
+canted/IA
+canteen/MS
+Canterbury/M
+canter/CM
+cantered
+cantering
+canticle/SM
+cantilever/SDMG
+canto/MS
+cantonal
+Cantonese/M
+Canton/M
+cantonment/SM
+canton/MGSLD
+Cantor/M
+cantor/MS
+Cantrell/M
+cant's
+cants/A
+Cantu/M
+Canute/M
+canvasback/MS
+canvas/RSDMG
+canvasser/M
+canvass/RSDZG
+canyon/MS
+CAP
+capability/ISM
+capableness/IM
+capable/PI
+capabler
+capablest
+capably/I
+capaciousness/MS
+capacious/PY
+capacitance/SM
+capacitate/V
+capacitive/Y
+capacitor/MS
+capacity/IMS
+caparison/SDMG
+Capek/M
+Capella/M
+caper/GDM
+capeskin/SM
+cape/SM
+Capet/M
+Capetown/M
+Caph/M
+capillarity/MS
+capillary/S
+Capistrano/M
+capitalism/SM
+capitalistic
+capitalistically
+capitalist/SM
+capitalization/SMA
+capitalized/AU
+capitalizer/M
+capitalize/RSDGZ
+capitalizes/A
+capital/SMY
+capita/M
+Capitan/M
+capitation/CSM
+Capitoline/M
+Capitol/MS
+capitol/SM
+capitulate/AXNGSD
+capitulation/MA
+caplet/S
+cap/MDRSZB
+Capone/M
+capon/SM
+capo/SM
+Capote/M
+capped/UA
+capping/M
+cappuccino/MS
+Cappy/M
+Capra/M
+Caprice/M
+caprice/MS
+capriciousness/MS
+capricious/PY
+Capricorn/MS
+Capri/M
+caps/AU
+capsicum/MS
+capsize/SDG
+capstan/MS
+capstone/MS
+capsular
+capsule/MGSD
+capsulize/GSD
+captaincy/MS
+captain/SGDM
+caption/GSDRM
+captiousness/SM
+captious/PY
+captivate/XGNSD
+captivation/M
+captivator/SM
+captive/MS
+captivity/SM
+Capt/M
+captor/SM
+capture/AGSD
+capturer/MS
+capt/V
+Capulet/M
+Caputo/M
+Caracalla/M
+Caracas/M
+caracul's
+carafe/SM
+Caralie/M
+Cara/M
+caramelize/SDG
+caramel/MS
+carapace/SM
+carapaxes
+carat/SM
+Caravaggio/M
+caravan/DRMGS
+caravaner/M
+caravansary/MS
+caravanserai's
+caravel/MS
+caraway/MS
+carbide/MS
+carbine/MS
+carbohydrate/MS
+carbolic
+Carboloy/M
+carbonaceous
+carbonate/SDXMNG
+carbonation/M
+Carbondale/M
+Carbone/MS
+carbonic
+carboniferous
+Carboniferous
+carbonization/SAM
+carbonizer/AS
+carbonizer's
+carbonizes/A
+carbonize/ZGRSD
+carbon/MS
+carbonyl/M
+carborundum
+Carborundum/MS
+carboy/MS
+carbuncle/SDM
+carbuncular
+carburetor/MS
+carburetter/S
+carburettor/SM
+carcase/MS
+carcass/SM
+Carce/M
+carcinogenic
+carcinogenicity/MS
+carcinogen/SM
+carcinoma/SM
+cardamom/MS
+cardboard/MS
+card/EDRSG
+Cardenas/M
+carder/MS
+carder's/E
+cardholders
+cardiac/S
+Cardiff/M
+cardigan/SM
+cardinality/SM
+cardinal/SYM
+carding/M
+Cardin/M
+Cardiod/M
+cardiogram/MS
+cardiograph/M
+cardiographs
+cardioid/M
+cardiologist/SM
+cardiology/MS
+cardiomegaly/M
+cardiopulmonary
+cardiovascular
+card's
+cardsharp/ZSMR
+CARE
+cared/U
+careen/DSG
+careerism/M
+careerist/MS
+career/SGRDM
+carefree
+carefuller
+carefullest
+carefulness/MS
+careful/PY
+caregiver/S
+carelessness/MS
+careless/YP
+Care/M
+Carena/M
+Caren/M
+carer/M
+care/S
+Caresa/M
+Caressa/M
+Caresse/M
+caresser/M
+caressing/Y
+caressive/Y
+caress/SRDMVG
+caretaker/SM
+caret/SM
+careworn
+Carey/M
+carfare/MS
+cargoes
+cargo/M
+carhopped
+carhopping
+carhop/SM
+Caria/M
+Caribbean/S
+Carib/M
+caribou/MS
+caricature/GMSD
+caricaturisation
+caricaturist/MS
+caricaturization
+Carie/M
+caries/M
+carillonned
+carillonning
+carillon/SM
+Caril/M
+Carilyn/M
+Cari/M
+Carina/M
+Carine/M
+caring/U
+Carin/M
+Cariotta/M
+carious
+Carissa/M
+Carita/M
+Caritta/M
+carjack/GSJDRZ
+Carla/M
+Carlee/M
+Carleen/M
+Carlene/M
+Carlen/M
+Carletonian/M
+Carleton/M
+Carley/M
+Carlie/M
+Carlina/M
+Carline/M
+Carling/M
+Carlin/M
+Carlita/M
+Carl/MNG
+carload/MSG
+Carlo/SM
+Carlota/M
+Carlotta/M
+Carlsbad/M
+Carlson/M
+Carlton/M
+Carlye/M
+Carlyle/M
+Carly/M
+Carlyn/M
+Carlynne/M
+Carlynn/M
+Carma/M
+Carmela/M
+Carmelia/M
+Carmelina/M
+Carmelita/M
+Carmella/M
+Carmelle/M
+Carmel/M
+Carmelo/M
+Carmencita/M
+Carmen/M
+Carmichael/M
+Carmina/M
+Carmine/M
+carmine/MS
+Carmita/M
+Car/MNY
+Carmon/M
+carnage/MS
+carnality/SM
+carnal/Y
+Carnap/M
+carnation/IMS
+Carnegie/M
+carnelian/SM
+Carney/M
+carney's
+carnival/MS
+carnivore/SM
+carnivorousness/MS
+carnivorous/YP
+Carnot/M
+Carny/M
+carny/SDG
+carob/SM
+Carola/M
+Carolan/M
+Carolann/M
+Carolee/M
+Carole/M
+caroler/M
+Carolina/MS
+Caroline/M
+Carolingian
+Carolinian/S
+Carolin/M
+Caroljean/M
+Carol/M
+carol/SGZMRD
+Carolus/M
+Carolyne/M
+Carolyn/M
+Carolynn/M
+Caro/M
+carom/GSMD
+Caron/M
+carotene/MS
+carotid/MS
+carousal/MS
+carousel/MS
+carouser/M
+carouse/SRDZG
+carpal/SM
+Carpathian/MS
+carpel/SM
+carpenter/DSMG
+carpentering/M
+Carpenter/M
+carpentry/MS
+carper/M
+carpetbagged
+carpetbagger/MS
+carpetbagging
+carpetbag/MS
+carpeting/M
+carpet/MDJGS
+carpi/M
+carping/Y
+carp/MDRSGZ
+carpool/DGS
+carport/MS
+carpus/M
+carrageen/M
+Carree/M
+carrel/SM
+carriage/SM
+carriageway/SM
+Carrie/M
+carrier/M
+Carrier/M
+Carrillo/M
+Carri/M
+carrion/SM
+Carrissa/M
+Carr/M
+Carroll/M
+Carrol/M
+carrot/MS
+carroty/RT
+carrousel's
+carryall/MS
+Carry/MR
+carryout/S
+carryover/S
+carry/RSDZG
+carsickness/SM
+carsick/P
+Carson/M
+cartage/MS
+cartel/SM
+carte/M
+carter/M
+Carter/M
+Cartesian
+Carthage/M
+Carthaginian/S
+carthorse/MS
+Cartier/M
+cartilage/MS
+cartilaginous
+cartload/MS
+cart/MDRGSZ
+Cart/MR
+cartographer/MS
+cartographic
+cartography/MS
+carton/GSDM
+cartoon/GSDM
+cartoonist/MS
+cartridge/SM
+cartwheel/MRDGS
+Cartwright/M
+Carty/RM
+Caruso/M
+carve/DSRJGZ
+carven
+carver/M
+Carver/M
+carving/M
+caryatid/MS
+Caryl/M
+Cary/M
+Caryn/M
+car/ZGSMDR
+casaba/SM
+Casablanca/M
+Casals/M
+Casandra/M
+Casanova/SM
+Casar/M
+casbah/M
+cascade/MSDG
+Cascades/M
+cascara/MS
+casebook/SM
+case/DSJMGL
+cased/U
+caseharden/SGD
+casein/SM
+caseload/MS
+Case/M
+casement/SM
+caseworker/M
+casework/ZMRS
+Casey/M
+cashbook/SM
+cashew/MS
+cash/GZMDSR
+cashier/SDMG
+cashless
+Cash/M
+cashmere/MS
+Casie/M
+Casi/M
+casing/M
+casino/MS
+casket/SGMD
+cask/GSDM
+Caspar/M
+Casper/M
+Caspian
+Cass
+Cassandra/SM
+Cassandre/M
+Cassandry/M
+Cassatt/M
+Cassaundra/M
+cassava/MS
+casserole/MGSD
+cassette/SM
+Cassey/M
+cassia/MS
+Cassie/M
+Cassi/M
+cassino's
+Cassiopeia/M
+Cassite/M
+Cassius/M
+cassock/SDM
+Cassondra/M
+cassowary/SM
+Cassy/M
+Castaneda/M
+castanet/SM
+castaway/SM
+castellated
+caste/MHS
+caster/M
+cast/GZSJMDR
+castigate/XGNSD
+castigation/M
+castigator/SM
+Castile's
+Castillo/M
+casting/M
+castle/GMSD
+castoff/S
+Castor/M
+castor's
+castrate/DSNGX
+castration/M
+Castries/M
+Castro/M
+casts/A
+casualness/SM
+casual/SYP
+casualty/SM
+casuistic
+casuist/MS
+casuistry/SM
+cataclysmal
+cataclysmic
+cataclysm/MS
+catacomb/MS
+catafalque/SM
+Catalan/MS
+catalepsy/MS
+cataleptic/S
+Catalina/M
+cataloger/M
+catalog/SDRMZG
+Catalonia/M
+catalpa/SM
+catalysis/M
+catalyst/SM
+catalytic
+catalytically
+catalyze/DSG
+catamaran/MS
+catapult/MGSD
+cataract/MS
+Catarina/M
+catarrh/M
+catarrhs
+catastrophe/SM
+catastrophic
+catastrophically
+catatonia/MS
+catatonic/S
+Catawba/M
+catbird/MS
+catboat/SM
+catcall/SMDG
+catchable/U
+catchall/MS
+catch/BRSJLGZ
+catcher/M
+catchment/SM
+catchpenny/S
+catchphrase/S
+catchup/MS
+catchword/MS
+catchy/TR
+catechism/MS
+catechist/SM
+catechize/SDG
+catecholamine/MS
+categoric
+categorical/Y
+categorization/MS
+categorized/AU
+categorize/RSDGZ
+category/MS
+Cate/M
+catenate/NF
+catenation/MF
+catercorner
+caterer/M
+cater/GRDZ
+Caterina/M
+catering/M
+Caterpillar
+caterpillar/SM
+caterwaul/DSG
+catfish/MS
+catgut/SM
+Catha/M
+Catharina/M
+Catharine/M
+catharses
+catharsis/M
+cathartic/S
+Cathay/M
+cathedral/SM
+Cathee/M
+Catherina/M
+Catherine/M
+Catherin/M
+Cather/M
+Cathe/RM
+catheterize/GSD
+catheter/SM
+Cathie/M
+Cathi/M
+Cathleen/M
+Cathlene/M
+cathode/MS
+cathodic
+catholicism
+Catholicism/SM
+catholicity/MS
+catholic/MS
+Catholic/S
+Cathrine/M
+Cathrin/M
+Cathryn/M
+Cathyleen/M
+Cathy/M
+Catie/M
+Catiline/M
+Cati/M
+Catina/M
+cationic
+cation/MS
+catkin/SM
+Catlaina/M
+Catlee/M
+catlike
+Catlin/M
+catnapped
+catnapping
+catnap/SM
+catnip/MS
+Cato/M
+Catrina/M
+Catriona/M
+Catskill/SM
+cat/SMRZ
+catsup's
+cattail/SM
+catted
+cattery/M
+cattily
+cattiness/SM
+catting
+cattle/M
+cattleman/M
+cattlemen
+Catt/M
+catty/PRST
+Catullus/M
+CATV
+catwalk/MS
+Caty/M
+Caucasian/S
+Caucasoid/S
+Caucasus/M
+Cauchy/M
+caucus/SDMG
+caudal/Y
+caught/U
+cauldron/MS
+cauliflower/MS
+caulker/M
+caulk/JSGZRD
+causality/SM
+causal/YS
+causate/XVN
+causation/M
+causative/SY
+cause/DSRGMZ
+caused/U
+causeless
+causerie/MS
+causer/M
+causeway/SGDM
+caustically
+causticity/MS
+caustic/YS
+cauterization/SM
+cauterized/U
+cauterize/GSD
+cautionary
+cautioner/M
+caution/GJDRMSZ
+cautiousness's/I
+cautiousness/SM
+cautious/PIY
+cavalcade/MS
+cavalierness/M
+cavalier/SGYDP
+cavalryman/M
+cavalrymen
+cavalry/MS
+caveat/SM
+caveatted
+caveatting
+cave/GFRSD
+caveman/M
+cavemen
+Cavendish/M
+caver/M
+cavern/GSDM
+cavernous/Y
+cave's
+caviar/MS
+caviler/M
+cavil/SJRDGZ
+caving/MS
+cavity/MFS
+cavort/SDG
+Cavour/M
+caw/SMDG
+Caxton/M
+Caye/M
+Cayenne/M
+cayenne/SM
+Cayla/M
+Cayman/M
+cayman/SM
+cay's
+cay/SC
+Cayuga/M
+cayuse/SM
+Caz/M
+Cazzie/M
+c/B
+CB
+CBC
+Cb/M
+CBS
+cc
+Cchaddie/M
+CCTV
+CCU
+CD
+CDC/M
+Cd/M
+CDT
+Ce
+cease/DSCG
+ceasefire/S
+ceaselessness/SM
+ceaseless/YP
+ceasing/U
+Ceausescu/M
+Cebuano/M
+Cebu/M
+ceca
+cecal
+Cecelia/M
+Cece/M
+Cecile/M
+Ceciley/M
+Cecilia/M
+Cecilio/M
+Cecilius/M
+Cecilla/M
+Cecil/M
+Cecily/M
+cecum/M
+cedar/SM
+ceded/A
+cede/FRSDG
+ceder's/F
+ceder/SM
+cedes/A
+cedilla/SM
+ceding/A
+Ced/M
+Cedric/M
+ceilidh/M
+ceiling/MDS
+Ceil/M
+celandine/MS
+Celanese/M
+Celebes's
+celebrant/MS
+celebratedness/M
+celebrated/P
+celebrate/XSDGN
+celebration/M
+celebrator/MS
+celebratory
+celebrity/MS
+Cele/M
+Celene/M
+celerity/SM
+celery/SM
+Celesta/M
+celesta/SM
+Celeste/M
+celestial/YS
+Celestia/M
+Celestina/M
+Celestine/M
+Celestyna/M
+Celestyn/M
+Celia/M
+celibacy/MS
+celibate/SM
+Celie/M
+Celina/M
+Celinda/M
+Celine/M
+Celinka/M
+Celisse/M
+Celka/M
+cellarer/M
+cellar/RDMGS
+Celle/M
+cell/GMDS
+Cellini/M
+cellist/SM
+Cello/M
+cello/MS
+cellophane/SM
+cellphone/S
+cellular/SY
+cellulite/S
+celluloid/SM
+cellulose/SM
+Celsius/S
+Celtic/SM
+Celt/MS
+cementa
+cementer/M
+cementum/SM
+cement/ZGMRDS
+cemetery/MS
+cenobite/MS
+cenobitic
+cenotaph/M
+cenotaphs
+Cenozoic
+censer/MS
+censored/U
+censor/GDMS
+censorial
+censoriousness/MS
+censorious/YP
+censorship/MS
+censure/BRSDZMG
+censurer/M
+census/SDMG
+centaur/SM
+Centaurus/M
+centavo/SM
+centenarian/MS
+centenary/S
+centennial/YS
+center/AC
+centerboard/SM
+centered
+centerer/S
+centerfold/S
+centering/SM
+centerline/SM
+centerpiece/SM
+center's
+Centigrade
+centigrade/S
+centigram/SM
+centiliter/MS
+centime/SM
+centimeter/SM
+centipede/MS
+Centralia/M
+centralism/M
+centralist/M
+centrality/MS
+centralization/CAMS
+centralize/CGSD
+centralizer/SM
+centralizes/A
+central/STRY
+centrefold's
+Centrex
+CENTREX/M
+centric/F
+centrifugal/SY
+centrifugate/NM
+centrifugation/M
+centrifuge/GMSD
+centripetal/Y
+centrist/MS
+centroid/MS
+cent/SZMR
+centurion/MS
+century/MS
+CEO
+cephalic/S
+Cepheid
+Cepheus/M
+ceramicist/S
+ceramic/MS
+ceramist/MS
+cerate/MD
+Cerberus/M
+cereal/MS
+cerebellar
+cerebellum/MS
+cerebra
+cerebral/SY
+cerebrate/XSDGN
+cerebration/M
+cerebrum/MS
+cerement/SM
+ceremonial/YSP
+ceremoniousness/MS
+ceremoniousness's/U
+ceremonious/YUP
+ceremony/MS
+Cerenkov/M
+Ceres/M
+Cerf/M
+cerise/SM
+cerium/MS
+cermet/SM
+CERN/M
+certainer
+certainest
+certainty/UMS
+certain/UY
+cert/FS
+certifiable
+certifiably
+certificate/SDGM
+certification/AMC
+certified/U
+certifier/M
+certify/DRSZGNX
+certiorari/M
+certitude/ISM
+cerulean/MS
+Cervantes/M
+cervical
+cervices/M
+cervix/M
+Cesarean
+cesarean/S
+Cesare/M
+Cesar/M
+Cesaro/M
+cesium/MS
+cessation/SM
+cession/FAMSK
+Cessna/M
+cesspit/M
+cesspool/SM
+Cesya/M
+cetacean/S
+cetera/S
+Cetus/M
+Ceylonese
+Ceylon/M
+Cezanne/S
+cf
+CF
+CFC
+Cf/M
+CFO
+cg
+Chablis/SM
+Chaddie/M
+Chadd/M
+Chaddy/M
+Chadian/S
+Chad/M
+Chadwick/M
+chafe/GDSR
+chafer/M
+chaffer/DRG
+chafferer/M
+Chaffey/M
+chaff/GRDMS
+chaffinch/SM
+Chagall/M
+chagrin/DGMS
+Chaim/M
+chainlike
+chain's
+chainsaw/SGD
+chain/SGUD
+chairlady/M
+chairlift/MS
+chairman/MDGS
+chairmanship/MS
+chairmen
+chairperson/MS
+chair/SGDM
+chairwoman/M
+chairwomen
+chaise/SM
+chalcedony/MS
+Chaldea/M
+Chaldean/M
+chalet/SM
+chalice/DSM
+chalkboard/SM
+chalk/DSMG
+chalkiness/S
+chalkline
+chalky/RPT
+challenged/U
+challenger/M
+challenge/ZGSRD
+challenging/Y
+challis/SM
+Chalmers
+chamberer/M
+Chamberlain/M
+chamberlain/MS
+chambermaid/MS
+chamberpot/S
+Chambers/M
+chamber/SZGDRM
+chambray/MS
+chameleon/SM
+chamfer/DMGS
+chammy's
+chamois/DSMG
+chamomile/MS
+champagne/MS
+champaign/M
+champ/DGSZ
+champion/MDGS
+championship/MS
+Champlain/M
+chanced/M
+chance/GMRSD
+chancellery/SM
+chancellorship/SM
+chancellor/SM
+Chancellorsville/M
+chancel/SM
+Chance/M
+chancery/SM
+Chancey/M
+chanciness/S
+chancing/M
+chancre/SM
+chancy/RPT
+Chandal/M
+Chanda/M
+chandelier/SM
+Chandigarh/M
+Chandler/M
+chandler/MS
+Chandragupta/M
+Chandra/M
+Chandrasekhar/M
+Chandy/M
+Chanel/M
+Chane/M
+Chaney/M
+Changchun/M
+changeabilities
+changeability/UM
+changeableness/SM
+changeable/U
+changeably/U
+changed/U
+change/GZRSD
+changeless
+changeling/M
+changeover/SM
+changer/M
+changing/U
+Chang/M
+Changsha/M
+Chan/M
+Channa/M
+channeler/M
+channeling/M
+channelization/SM
+channelize/GDS
+channellings
+channel/MDRZSG
+Channing/M
+chanson/SM
+Chantalle/M
+Chantal/M
+chanter/M
+chanteuse/MS
+chantey/SM
+chanticleer/SM
+Chantilly/M
+chantry/MS
+chant/SJGZMRD
+chanty's
+Chanukah's
+Chao/M
+chaos/SM
+chaotic
+chaotically
+chaparral/MS
+chapbook/SM
+chapeau/MS
+chapel/MS
+chaperonage/MS
+chaperoned/U
+chaperone's
+chaperon/GMDS
+chaplaincy/MS
+chaplain/MS
+chaplet/SM
+Chaplin/M
+Chapman/M
+chap/MS
+Chappaquiddick/M
+chapped
+chapping
+chapter/SGDM
+Chara
+charabanc/MS
+characterful
+characteristically/U
+characteristic/SM
+characterizable/MS
+characterization/MS
+characterize/DRSBZG
+characterized/U
+characterizer/M
+characterless
+character/MDSG
+charade/SM
+charbroil/SDG
+charcoal/MGSD
+Chardonnay
+chardonnay/S
+chard/SM
+chargeableness/M
+chargeable/P
+charged/U
+charge/EGRSDA
+charger/AME
+chargers
+char/GS
+Charil/M
+charily
+chariness/MS
+Charin/M
+charioteer/GSDM
+Chariot/M
+chariot/SMDG
+Charis
+charisma/M
+charismata
+charismatically
+charismatic/S
+Charissa/M
+Charisse/M
+charitablenesses
+charitableness/UM
+charitable/UP
+charitably/U
+Charita/M
+Charity/M
+charity/MS
+charlady/M
+Charla/M
+charlatanism/MS
+charlatanry/SM
+charlatan/SM
+Charlean/M
+Charleen/M
+Charlemagne/M
+Charlena/M
+Charlene/M
+Charles/M
+Charleston/SM
+Charley/M
+Charlie/M
+Charline/M
+Charlot/M
+Charlotta/M
+Charlotte/M
+Charlottesville/M
+Charlottetown/M
+Charlton/M
+Charmaine/M
+Charmain/M
+Charmane/M
+charmer/M
+Charmian/M
+Charmine/M
+charming/RYT
+Charmin/M
+Charmion/M
+charmless
+charm/SGMZRD
+Charolais
+Charo/M
+Charon/M
+charred
+charring
+charted/U
+charter/AGDS
+chartered/U
+charterer/SM
+charter's
+chartist/SM
+Chartres/M
+chartreuse/MS
+chartroom/S
+chart/SJMRDGBZ
+charwoman/M
+charwomen
+Charybdis/M
+Charyl/M
+chary/PTR
+Chas
+chase/DSRGZ
+Chase/M
+chaser/M
+chasing/M
+Chasity/M
+chasm/SM
+chassis/M
+chastely
+chasteness/SM
+chasten/GSD
+chaste/UTR
+chastisement/SM
+chastiser/M
+chastise/ZGLDRS
+Chastity/M
+chastity/SM
+chastity's/U
+chasuble/SM
+Chateaubriand
+château/M
+chateaus
+châteaux
+châtelaine/SM
+chat/MS
+Chattahoochee/M
+Chattanooga/M
+chatted
+chattel/MS
+chatterbox/MS
+chatterer/M
+Chatterley/M
+chatter/SZGDRY
+Chatterton/M
+chattily
+chattiness/SM
+chatting
+chatty/RTP
+Chaucer/M
+chauffeur/GSMD
+Chaunce/M
+Chauncey/M
+Chautauqua/M
+chauvinism/MS
+chauvinistic
+chauvinistically
+chauvinist/MS
+Chavez/M
+chaw
+Chayefsky/M
+cheapen/DG
+cheapish
+cheapness/MS
+cheapskate/MS
+cheap/YRNTXSP
+cheater/M
+cheat/RDSGZ
+Chechen/M
+Chechnya/M
+checkable/U
+checkbook/MS
+checked/UA
+checkerboard/MS
+checker/DMG
+check/GZBSRDM
+checklist/S
+checkmate/MSDG
+checkoff/SM
+checkout/S
+checkpoint/MS
+checkroom/MS
+check's/A
+checks/A
+checksummed
+checksumming
+checksum/SM
+checkup/MS
+Cheddar/MS
+cheddar/S
+cheekbone/SM
+cheek/DMGS
+cheekily
+cheekiness/SM
+cheeky/PRT
+cheep/GMDS
+cheerer/M
+cheerfuller
+cheerfullest
+cheerfulness/MS
+cheerful/YP
+cheerily
+cheeriness/SM
+cheerio/S
+Cheerios/M
+cheerleader/SM
+cheerlessness/SM
+cheerless/PY
+cheers/S
+cheery/PTR
+cheer/YRDGZS
+cheeseburger/SM
+cheesecake/SM
+cheesecloth/M
+cheesecloths
+cheeseparing/S
+cheese/SDGM
+cheesiness/SM
+cheesy/PRT
+cheetah/M
+cheetahs
+Cheeto/M
+Cheever/M
+cheffed
+cheffing
+chef/SM
+Chekhov/M
+chelate/XDMNG
+chelation/M
+Chelsae/M
+Chelsea/M
+Chelsey/M
+Chelsie/M
+Chelsy/M
+Chelyabinsk/M
+chem
+Che/M
+chemic
+chemical/SYM
+chemiluminescence/M
+chemiluminescent
+chemise/SM
+chemistry/SM
+chemist/SM
+chemotherapeutic/S
+chemotherapy/SM
+chemurgy/SM
+Chengdu
+Cheng/M
+chenille/SM
+Chen/M
+Cheops/M
+Chere/M
+Cherey/M
+Cherianne/M
+Cherice/M
+Cherida/M
+Cherie/M
+Cherilyn/M
+Cherilynn/M
+Cheri/M
+Cherin/M
+Cherise/M
+cherisher/M
+cherish/GDRS
+Cherish/M
+Cheriton/M
+Cherlyn/M
+Cher/M
+Chernenko/M
+Chernobyl/M
+Cherokee/MS
+cheroot/MS
+Cherri/M
+Cherrita/M
+Cherry/M
+cherry/SM
+chert/MS
+cherubic
+cherubim/S
+cherub/SM
+chervil/MS
+Cherye/M
+Cheryl/M
+Chery/M
+Chesapeake/M
+Cheshire/M
+Cheslie/M
+chessboard/SM
+chessman/M
+chessmen
+chess/SM
+Chesterfield/M
+chesterfield/MS
+Chester/M
+Chesterton/M
+chestful/S
+chest/MRDS
+chestnut/SM
+Cheston/M
+chesty/TR
+Chet/M
+Chevalier/M
+chevalier/SM
+Cheviot/M
+cheviot/S
+Chev/M
+Chevrolet/M
+chevron/DMS
+Chevy/M
+chewer/M
+chew/GZSDR
+chewiness/S
+chewy/RTP
+Cheyenne/SM
+chg
+chge
+Chiang/M
+chianti/M
+Chianti/S
+chiaroscuro/SM
+Chiarra/M
+Chiba/M
+Chicagoan/SM
+Chicago/M
+Chicana/MS
+chicane/MGDS
+chicanery/MS
+Chicano/MS
+chichi/RTS
+chickadee/SM
+Chickasaw/SM
+chickenfeed
+chicken/GDM
+chickenhearted
+chickenpox/MS
+Chickie/M
+Chick/M
+chickpea/MS
+chickweed/MS
+chick/XSNM
+Chicky/M
+chicle/MS
+Chic/M
+chicness/S
+Chico/M
+chicory/MS
+chic/SYRPT
+chide/GDS
+chiding/Y
+chiefdom/MS
+chieftain/SM
+chief/YRMST
+chiffonier/MS
+chiffon/MS
+chigger/MS
+chignon/MS
+Chihuahua/MS
+chihuahua/S
+chilblain/MS
+childbearing/MS
+childbirth/M
+childbirths
+childcare/S
+childes
+child/GMYD
+childhood/MS
+childishness/SM
+childish/YP
+childlessness/SM
+childless/P
+childlikeness/M
+childlike/P
+childminders
+childproof/GSD
+childrearing
+children/M
+Chilean/S
+Chile/MS
+chile's
+chilies
+chili/M
+chiller/M
+chilliness/MS
+chilling/Y
+chilli's
+chill/MRDJGTZPS
+chillness/MS
+chilly/TPRS
+Chilton/M
+Chi/M
+chimaera's
+chimaerical
+Chimborazo/M
+chime/DSRGMZ
+Chimera/S
+chimera/SM
+chimeric
+chimerical
+chimer/M
+Chimiques
+chimney/SMD
+chimpanzee/SM
+chimp/MS
+chi/MS
+Chimu/M
+Ch'in
+China/M
+Chinaman/M
+Chinamen
+china/MS
+Chinatown/SM
+chinchilla/SM
+chine/MS
+Chinese/M
+Ching/M
+chink/DMSG
+chinless
+Chin/M
+chinned
+chinner/S
+chinning
+chino/MS
+Chinook/MS
+chin/SGDM
+chinstrap/S
+chintz/SM
+chintzy/TR
+chipboard/M
+Chipewyan/M
+Chip/M
+chipmunk/SM
+chipped
+Chippendale/M
+chipper/DGS
+Chippewa/MS
+chipping/MS
+chip/SM
+Chiquia/M
+Chiquita/M
+chiral
+Chirico/M
+chirography/SM
+chiropodist/SM
+chiropody/MS
+chiropractic/MS
+chiropractor/SM
+chirp/GDS
+chirpy/RT
+chirrup/DGS
+chiseler/M
+chisel/ZGSJMDR
+Chisholm/M
+Chisinau/M
+chitchat/SM
+chitchatted
+chitchatting
+chitinous
+chitin/SM
+chit/SM
+Chittagong/M
+chitterlings
+chivalric
+chivalrously/U
+chivalrousness/MS
+chivalrous/YP
+chivalry/SM
+chive/GMDS
+chivvy/D
+chivying
+chlamydiae
+chlamydia/S
+Chloe/M
+Chloette/M
+Chlo/M
+chloral/MS
+chlorate/M
+chlordane/MS
+chloride/MS
+chlorinated/C
+chlorinates/C
+chlorinate/XDSGN
+chlorination/M
+chlorine/MS
+Chloris
+chlorofluorocarbon/S
+chloroform/DMSG
+chlorophyll/SM
+chloroplast/MS
+chloroquine/M
+chm
+Ch/MGNRS
+chockablock
+chock/SGRDM
+chocoholic/S
+chocolate/MS
+chocolaty
+Choctaw/MS
+choiceness/M
+choice/RSMTYP
+choirboy/MS
+choirmaster/SM
+choir/SDMG
+chokeberry/M
+chokecherry/SM
+choke/DSRGZ
+choker/M
+chokes/M
+choking/Y
+cholera/SM
+choleric
+choler/SM
+cholesterol/SM
+choline/M
+cholinesterase/M
+chomp/DSG
+Chomsky/M
+Chongqing
+choose/GZRS
+chooser/M
+choosiness/S
+choosy/RPT
+chophouse/SM
+Chopin/M
+chopped
+chopper/SDMG
+choppily
+choppiness/MS
+chopping
+choppy/RPT
+chop/S
+chopstick/SM
+chorale/MS
+choral/SY
+chordal
+chordata
+chordate/MS
+chording/M
+chord/SGMD
+chorea/MS
+chore/DSGNM
+choreographer/M
+choreographic
+choreographically
+choreographs
+choreography/MS
+choreograph/ZGDR
+chorines
+chorion/M
+chorister/SM
+choroid/S
+chortler/M
+chortle/ZGDRS
+chorus/GDSM
+chosen/U
+chose/S
+Chou/M
+chowder/SGDM
+chow/DGMS
+Chretien/M
+Chris/M
+chrism/SM
+chrissake
+Chrisse/M
+Chrissie/M
+Chrissy/M
+Christabella/M
+Christabel/M
+Christalle/M
+Christal/M
+Christa/M
+Christan/M
+Christchurch/M
+Christean/M
+Christel/M
+Christendom/MS
+christened/U
+christening/SM
+Christen/M
+christen/SAGD
+Christensen/M
+Christenson/M
+Christiana/M
+Christiane/M
+Christianity/SM
+Christianize/GSD
+Christian/MS
+Christiano/M
+Christiansen/M
+Christians/N
+Christie/SM
+Christi/M
+Christina/M
+Christine/M
+Christin/M
+Christlike
+Christmas/SM
+Christmastide/SM
+Christmastime/S
+Christoffel/M
+Christoffer/M
+Christoforo/M
+Christoper/M
+Christophe/M
+Christopher/M
+Christoph/MR
+Christophorus/M
+Christos/M
+Christ/SMN
+Christye/M
+Christyna/M
+Christy's
+Chrisy/M
+chroma/M
+chromate/M
+chromatically
+chromaticism/M
+chromaticness/M
+chromatic/PS
+chromatics/M
+chromatin/MS
+chromatogram/MS
+chromatograph
+chromatographic
+chromatography/M
+chrome/GMSD
+chromic
+chromite/M
+chromium/SM
+chromosomal
+chromosome/MS
+chromosphere/M
+chronically
+chronicled/U
+chronicler/M
+chronicle/SRDMZG
+chronic/S
+chronograph/M
+chronographs
+chronography
+chronological/Y
+chronologist/MS
+chronology/MS
+chronometer/MS
+chronometric
+Chrotoem/M
+chrysalids
+chrysalis/SM
+Chrysa/M
+chrysanthemum/MS
+Chrysler/M
+Chrysostom/M
+Chrystal/M
+Chrystel/M
+Chryste/M
+chubbiness/SM
+chubby/RTP
+chub/MS
+Chucho/M
+chuck/GSDM
+chuckhole/SM
+chuckle/DSG
+chuckling/Y
+Chuck/M
+chuff/DM
+chugged
+chugging
+chug/MS
+Chukchi/M
+chukka/S
+Chumash/M
+chummed
+chummily
+chumminess/MS
+chumming
+chum/MS
+chummy/SRTP
+chumping/M
+chump/MDGS
+Chungking's
+Chung/M
+chunkiness/MS
+chunk/SGDM
+chunky/RPT
+chuntering
+churchgoer/SM
+churchgoing/SM
+Churchillian
+Churchill/M
+churchliness/M
+churchly/P
+churchman/M
+church/MDSYG
+churchmen
+Church/MS
+churchwarden/SM
+churchwoman/M
+churchwomen
+churchyard/SM
+churlishness/SM
+churlish/YP
+churl/SM
+churner/M
+churning/M
+churn/SGZRDM
+chute/DSGM
+chutney/MS
+chutzpah/M
+chutzpahs
+chutzpa/SM
+Chuvash/M
+ch/VT
+chyme/SM
+Ci
+CIA
+ciao/S
+cicada/MS
+cicatrice/S
+cicatrix's
+Cicely/M
+Cicero/M
+cicerone/MS
+ciceroni
+Ciceronian
+Cicily/M
+CID
+cider's/C
+cider/SM
+Cid/M
+Ciel/M
+cigarette/MS
+cigarillo/MS
+cigar/SM
+cilantro/S
+cilia/M
+ciliate/FDS
+ciliately
+cilium/M
+Cilka/M
+cinch/MSDG
+cinchona/SM
+Cincinnati/M
+cincture/MGSD
+Cinda/M
+Cindee/M
+Cindelyn/M
+cinder/DMGS
+Cinderella/MS
+Cindie/M
+Cindi/M
+Cindra/M
+Cindy/M
+cine/M
+cinema/SM
+cinematic
+cinematographer/MS
+cinematographic
+cinematography/MS
+Cinerama/M
+cinnabar/MS
+Cinnamon/M
+cinnamon/MS
+ciphered/C
+cipher/MSGD
+ciphers/C
+cir
+circa
+circadian
+Circe/M
+circler/M
+circle/RSDGM
+circlet/MS
+circuital
+circuit/GSMD
+circuitousness/MS
+circuitous/YP
+circuitry/SM
+circuity/MS
+circulant
+circularity/SM
+circularize/GSD
+circularness/M
+circular/PSMY
+circulate/ASDNG
+circulation/MA
+circulations
+circulative
+circulatory
+circumcise/DRSXNG
+circumcised/U
+circumciser/M
+circumcision/M
+circumference/SM
+circumferential/Y
+circumflex/MSDG
+circumlocution/MS
+circumlocutory
+circumnavigate/DSNGX
+circumnavigational
+circumnavigation/M
+circumpolar
+circumscribe/GSD
+circumscription/SM
+circumspection/SM
+circumspect/Y
+circumsphere
+circumstance/SDMG
+circumstantial/YS
+circumvention/MS
+circumvent/SBGD
+circus/SM
+Cirillo/M
+Cirilo/M
+Ciro/M
+cirque/SM
+cirrhoses
+cirrhosis/M
+cirrhotic/S
+cirri/M
+cirrus/M
+Cissiee/M
+Cissy/M
+cistern/SM
+citadel/SM
+citations/I
+citation/SMA
+cit/DSG
+cite/ISDAG
+Citibank/M
+citified
+citizenry/SM
+citizenship/MS
+citizen/SYM
+citrate/DM
+citric
+Citroen/M
+citronella/MS
+citron/MS
+citrus/SM
+city/DSM
+cityscape/MS
+citywide
+civet/SM
+civic/S
+civics/M
+civilian/SM
+civility/IMS
+civilizational/MS
+civilization/AMS
+civilizedness/M
+civilized/PU
+civilize/DRSZG
+civilizer/M
+civilizes/AU
+civil/UY
+civvies
+ck/C
+clack/SDG
+cladding/SM
+clads
+clad/U
+Claiborne/M
+Claiborn/M
+claimable
+claimant/MS
+claim/CDRSKAEGZ
+claimed/U
+claimer/KMACE
+Claire/M
+Clair/M
+Clairol/M
+clairvoyance/MS
+clairvoyant/YS
+clambake/MS
+clamberer/M
+clamber/SDRZG
+clammed
+clammily
+clamminess/MS
+clamming
+clam/MS
+clammy/TPR
+clamorer/M
+clamor/GDRMSZ
+clamorousness/UM
+clamorous/PUY
+clampdown/SM
+clamper/M
+clamp/MRDGS
+clamshell/MS
+Clancy/M
+clandestineness/M
+clandestine/YP
+clanger/M
+clangor/MDSG
+clangorous/Y
+clang/SGZRD
+clanking/Y
+clank/SGDM
+clan/MS
+clannishness/SM
+clannish/PY
+clansman/M
+clansmen
+clapboard/SDGM
+Clapeyron/M
+clapped
+clapper/GMDS
+clapping
+clap/S
+Clapton/M
+claptrap/SM
+claque/MS
+Clarabelle/M
+Clara/M
+Clarance/M
+Clare/M
+Claremont/M
+Clarence/M
+Clarendon/M
+Claresta/M
+Clareta/M
+claret/MDGS
+Claretta/M
+Clarette/M
+Clarey/M
+Claribel/M
+Clarice/M
+Clarie/M
+clarification/M
+clarifier/M
+clarify/NGXDRS
+Clari/M
+Clarinda/M
+Clarine/M
+clarinetist/SM
+clarinet/SM
+clarinettist's
+clarion/GSMD
+Clarissa/M
+Clarisse/M
+Clarita/M
+clarities
+clarity/UM
+Clarke/M
+Clark/M
+Clarridge/M
+Clary/M
+clasher/M
+clash/RSDG
+clasped/M
+clasper/M
+clasp's
+clasp/UGSD
+classer/M
+class/GRSDM
+classical/Y
+classicism/SM
+classicist/SM
+classic/S
+classics/M
+classifiable/U
+classification/AMC
+classificatory
+classified/S
+classifier/SM
+classify/CNXASDG
+classiness/SM
+classless/P
+classmate/MS
+classroom/MS
+classwork/M
+classy/PRT
+clatterer/M
+clattering/Y
+clatter/SGDR
+clattery
+Claudelle/M
+Claudell/M
+Claude/M
+Claudetta/M
+Claudette/M
+Claudia/M
+Claudian/M
+Claudianus/M
+Claudie/M
+Claudina/M
+Claudine/M
+Claudio/M
+Claudius/M
+clausal
+clause/MS
+Clausen/M
+Clausewitz/M
+Clausius/M
+Claus/NM
+claustrophobia/SM
+claustrophobic
+clave/RM
+clave's/F
+clavichord/SM
+clavicle/MS
+clavier/MS
+clawer/M
+claw/GDRMS
+Clayborne/M
+Clayborn/M
+Claybourne/M
+clayey
+clayier
+clayiest
+Clay/M
+clay/MDGS
+claymore/MS
+Clayson/M
+Clayton/M
+Clea/M
+cleanable
+cleaner/MS
+cleaning/SM
+cleanliness/UMS
+cleanly/PRTU
+cleanness/MSU
+cleanse
+cleanser/M
+cleans/GDRSZ
+cleanup/MS
+clean/UYRDPT
+clearance/MS
+clearcut
+clearer/M
+clearheadedness/M
+clearheaded/PY
+clearinghouse/S
+clearing/MS
+clearly
+clearness/MS
+clears
+clear/UTRD
+Clearwater/M
+clearway/M
+cleat/MDSG
+cleavage/MS
+cleaver/M
+cleave/RSDGZ
+Cleavland/M
+clef/SM
+cleft/MDGS
+clematis/MS
+clemence
+Clemenceau/M
+Clemence/M
+clemency/ISM
+Clemente/M
+Clementia/M
+Clementina/M
+Clementine/M
+Clementius/M
+clement/IY
+Clement/MS
+clements
+Clemmie/M
+Clemmy/M
+Clemons
+Clemson/M
+Clem/XM
+clenches
+clenching
+clench/UD
+Cleo/M
+Cleon/M
+Cleopatra/M
+Clerc/M
+clerestory/MS
+clergyman/M
+clergymen
+clergy/MS
+clergywoman
+clergywomen
+clericalism/SM
+clerical/YS
+cleric/SM
+Clerissa/M
+clerk/SGYDM
+clerkship/MS
+Cletis
+Cletus/M
+Cleveland/M
+Cleve/M
+cleverness/SM
+clever/RYPT
+Clevey/M
+Clevie/M
+clevis/SM
+clew/DMGS
+cl/GJ
+Cliburn/M
+clichéd
+cliché/SM
+clicker/M
+click/GZSRDM
+clientèle/SM
+client/SM
+cliffhanger/MS
+cliffhanging
+Cliff/M
+Clifford/M
+cliff/SM
+Clifton/M
+climacteric/SM
+climactic
+climate/MS
+climatic
+climatically
+climatological/Y
+climatologist/SM
+climatology/MS
+climax/MDSG
+climbable/U
+climb/BGZSJRD
+climbdown
+climbed/U
+climber/M
+clime/SM
+Clim/M
+clinch/DRSZG
+clincher/M
+clinching/Y
+Cline/M
+clinger/MS
+clinging
+cling/U
+clingy/TR
+clinical/Y
+clinician/MS
+clinic/MS
+clinker/GMD
+clink/RDGSZ
+clinometer/MIS
+Clint/M
+Clinton/M
+Clio/M
+cliometrician/S
+cliometric/S
+clipboard/SM
+clipped/U
+clipper/MS
+clipping/SM
+clip/SM
+clique/SDGM
+cliquey
+cliquier
+cliquiest
+cliquishness/SM
+cliquish/YP
+clitoral
+clitorides
+clitoris/MS
+Clive/M
+cloacae
+cloaca/M
+cloakroom/MS
+cloak's
+cloak/USDG
+clobber/DGS
+cloche/MS
+clocker/M
+clockmaker/M
+clock/SGZRDMJ
+clockwatcher
+clockwise
+clockwork/MS
+clodded
+clodding
+cloddishness/M
+cloddish/P
+clodhopper/SM
+clod/MS
+Cloe/M
+clogged/U
+clogging/U
+clog's
+clog/US
+cloisonné
+cloisonnes
+cloister/MDGS
+cloistral
+Clo/M
+clomp/MDSG
+clonal
+clone/DSRGMZ
+clonk/SGD
+clopped
+clopping
+clop/S
+Cloris/M
+closed/U
+close/EDSRG
+closefisted
+closely
+closemouthed
+closeness/MS
+closeout/MS
+closer/EM
+closers
+closest
+closet/MDSG
+closeup/S
+closing/S
+closured
+closure/EMS
+closure's/I
+closuring
+clothbound
+clothesbrush
+clotheshorse/MS
+clothesline/SDGM
+clothesman
+clothesmen
+clothespin/MS
+clothe/UDSG
+cloth/GJMSD
+clothier/MS
+clothing/M
+Clotho/M
+cloths
+Clotilda/M
+clot/MS
+clotted
+clotting
+cloture/MDSG
+cloudburst/MS
+clouded/U
+cloudiness/SM
+cloudlessness/M
+cloudless/YP
+cloudscape/SM
+cloud/SGMD
+cloudy/TPR
+clout/GSMD
+cloven
+cloverleaf/MS
+clover/M
+clove/SRMZ
+Clovis/M
+clown/DMSG
+clownishness/SM
+clownish/PY
+cloy/DSG
+cloying/Y
+clubbed/M
+clubbing/M
+clubfeet
+clubfoot/DM
+clubhouse/SM
+club/MS
+clubroom/SM
+cluck/GSDM
+clueless
+clue/MGDS
+Cluj/M
+clump/MDGS
+clumpy/RT
+clumsily
+clumsiness/MS
+clumsy/PRT
+clung
+clunk/SGZRDM
+clunky/PRYT
+clustered/AU
+clusters/A
+cluster/SGJMD
+clutch/DSG
+cluttered/U
+clutter/GSD
+Cl/VM
+Clyde/M
+Clydesdale/M
+Cly/M
+Clytemnestra/M
+Clyve/M
+Clywd/M
+cm
+Cm/M
+CMOS
+cnidarian/MS
+CNN
+CNS
+CO
+coacher/M
+coachman/M
+coachmen
+coach/MSRDG
+coachwork/M
+coadjutor/MS
+coagulable
+coagulant/SM
+coagulate/GNXSD
+coagulation/M
+coagulator/S
+coaler/M
+coalesce/GDS
+coalescence/SM
+coalescent
+coalface/SM
+coalfield/MS
+coalitionist/SM
+coalition/MS
+coal/MDRGS
+coalminers
+coarseness/SM
+coarsen/SGD
+coarse/TYRP
+coastal
+coaster/M
+coastguard/MS
+coastline/SM
+coast/SMRDGZ
+coated/U
+Coates/M
+coating/M
+coat/MDRGZJS
+coattail/S
+coattest
+coauthor/MDGS
+coaxer/M
+coax/GZDSR
+coaxial/Y
+coaxing/Y
+Cobain/M
+cobalt/MS
+cobbed
+Cobbie/M
+cobbing
+cobbler/M
+cobble/SRDGMZ
+cobblestone/MSD
+Cobb/M
+Cobby/M
+coble/M
+Cob/M
+COBOL
+Cobol/M
+cobra/MS
+cob/SM
+cobwebbed
+cobwebbing
+cobwebby/RT
+cobweb/SM
+cocaine/MS
+coca/MS
+cocci/MS
+coccus/M
+coccyges
+coccyx/M
+Cochabamba/M
+cochineal/SM
+Cochin/M
+Cochise/M
+cochleae
+cochlear
+cochlea/SM
+Cochran/M
+cockade/SM
+cockamamie
+cockatoo/SM
+cockatrice/MS
+cockcrow/MS
+cockerel/MS
+cocker/M
+cockeye/DM
+cockeyed/PY
+cockfighting/M
+cockfight/MJSG
+cock/GDRMS
+cockily
+cockiness/MS
+cocklebur/M
+cockle/SDGM
+cockleshell/SM
+Cockney
+cockney/MS
+cockpit/MS
+cockroach/SM
+cockscomb/SM
+cockshies
+cocksucker/S!
+cocksure
+cocktail/GDMS
+cocky/RPT
+cocoa/SM
+coco/MS
+coconut/SM
+cocoon/GDMS
+Cocteau/M
+COD
+coda/SM
+codded
+codding
+coddle/GSRD
+coddler/M
+codebook/S
+codebreak/R
+coded/UA
+Codee/M
+codeine/MS
+codename/D
+codependency/S
+codependent/S
+coder/CM
+code's
+co/DES
+codes/A
+code/SCZGJRD
+codetermine/S
+codeword/SM
+codex/M
+codfish/SM
+codger/MS
+codices/M
+codicil/SM
+Codie/M
+codification/M
+codifier/M
+codify/NZXGRSD
+Codi/M
+coding/M
+codling/M
+Cod/M
+cod/MDRSZGJ
+codpiece/MS
+Cody/M
+coedited
+coediting
+coeditor/MS
+coedits
+coed/SM
+coeducational
+coeducation/SM
+coefficient/SYM
+coelenterate/MS
+coequal/SY
+coercer/M
+coerce/SRDXVGNZ
+coercible/I
+coercion/M
+coerciveness/M
+coercive/PY
+coeval/YS
+coexistence/MS
+coexistent
+coexist/GDS
+coextensive/Y
+cofactor/MS
+coffeecake/SM
+coffeecup
+coffeehouse/SM
+coffeemaker/S
+coffeepot/MS
+coffee/SM
+cofferdam/SM
+coffer/DMSG
+Coffey/M
+coffin/DMGS
+Coffman/M
+cogency/MS
+cogent/Y
+cogged
+cogging
+cogitate/DSXNGV
+cogitation/M
+cogitator/MS
+cog/MS
+Cognac/M
+cognac/SM
+cognate/SXYN
+cognation/M
+cognitional
+cognition/SAM
+cognitive/SY
+cognizable
+cognizance/MAI
+cognizances/A
+cognizant/I
+cognomen/SM
+cognoscente
+cognoscenti
+cogwheel/SM
+cohabitant/MS
+cohabitational
+cohabitation/SM
+cohabit/SDG
+Cohan/M
+coheir/MS
+Cohen/M
+cohere/GSRD
+coherence/SIM
+coherencies
+coherency/I
+coherent/IY
+coherer/M
+cohesion/MS
+cohesiveness/SM
+cohesive/PY
+Cohn/M
+cohoes
+coho/MS
+cohort/SM
+coiffed
+coiffing
+coiffure/MGSD
+coif/SM
+coil/UGSAD
+Coimbatore/M
+coinage's/A
+coinage/SM
+coincide/GSD
+coincidence/MS
+coincidental/Y
+coincident/Y
+coined/U
+coiner/M
+coin/GZSDRM
+coinsurance/SM
+Cointon/M
+cointreau
+coital/Y
+coitus/SM
+coke/MGDS
+Coke/MS
+COL
+COLA
+colander/SM
+Colan/M
+Colas
+cola/SM
+colatitude/MS
+Colbert/M
+Colby/M
+coldblooded
+coldish
+coldness/MS
+cold/YRPST
+Coleen/M
+Cole/M
+Coleman/M
+Colene/M
+Coleridge/M
+coleslaw/SM
+Colet/M
+Coletta/M
+Colette/M
+coleus/SM
+Colfax/M
+Colgate/M
+colicky
+colic/SM
+coliform
+Colin/M
+coliseum/SM
+colitis/MS
+collaborate/VGNXSD
+collaboration/M
+collaborative/SY
+collaborator/SM
+collage/MGSD
+collagen/M
+collapse/SDG
+collapsibility/M
+collapsible
+collarbone/MS
+collar/DMGS
+collard/SM
+collarless
+collated/U
+collateral/SYM
+collate/SDVNGX
+collation/M
+collator/MS
+colleague/SDGM
+collectedness/M
+collected/PY
+collectible/S
+collection/AMS
+collective/SY
+collectivism/SM
+collectivist/MS
+collectivity/MS
+collectivization/MS
+collectivize/DSG
+collector/MS
+collect/SAGD
+Colleen/M
+colleen/SM
+college/SM
+collegiality/S
+collegian/SM
+collegiate/Y
+Collen/M
+Collete/M
+Collette/M
+coll/G
+collide/SDG
+Collie/M
+collie/MZSRD
+collier/M
+Collier/M
+colliery/MS
+collimate/C
+collimated/U
+collimates
+collimating
+collimation/M
+collimator/M
+collinear
+collinearity/M
+Colline/M
+Collin/MS
+collisional
+collision/SM
+collocate/XSDGN
+collocation/M
+colloidal/Y
+colloid/MS
+colloq
+colloquialism/MS
+colloquial/SY
+colloquies
+colloquium/SM
+colloquy/M
+collude/SDG
+collusion/SM
+collusive
+collying
+Colly/RM
+Colman/M
+Col/MY
+Cologne/M
+cologne/MSD
+Colo/M
+Colombia/M
+Colombian/S
+Colombo/M
+colonelcy/MS
+colonel/MS
+colonialism/MS
+colonialist/MS
+colonial/SPY
+colonist/SM
+colonization/ACSM
+colonize/ACSDG
+colonized/U
+colonizer/MS
+colonizes/U
+Colon/M
+colonnade/MSD
+colon/SM
+colony/SM
+colophon/SM
+Coloradan/S
+Coloradoan/S
+Colorado/M
+colorant/SM
+coloration/EMS
+coloratura/SM
+colorblindness/S
+colorblind/P
+colored/USE
+colorer/M
+colorfastness/SM
+colorfast/P
+colorfulness/MS
+colorful/PY
+colorimeter/SM
+colorimetry
+coloring/M
+colorization/S
+colorize/GSD
+colorizing/C
+colorlessness/SM
+colorless/PY
+colors/EA
+color/SRDMGZJ
+colossal/Y
+Colosseum/M
+colossi
+colossus/M
+colostomy/SM
+colostrum/SM
+col/SD
+colter/M
+coltishness/M
+coltish/PY
+Colt/M
+colt/MRS
+Coltrane/M
+Columbia/M
+Columbian
+Columbine/M
+columbine/SM
+Columbus/M
+columnar
+columnist/MS
+columnize/GSD
+column/SDM
+Colver/M
+Co/M
+comae
+comaker/SM
+Comanche/MS
+coma/SM
+comatose
+combatant/SM
+combativeness/MS
+combative/PY
+combat/SVGMD
+combed/U
+comber/M
+combinational/A
+combination/ASM
+combinatorial/Y
+combinatoric/S
+combinator/SM
+combined/AU
+combiner/M
+combines/A
+combine/ZGBRSD
+combining/A
+combo/MS
+comb/SGZDRMJ
+Combs/M
+combusted
+combustibility/SM
+combustible/SI
+combustion/MS
+combustive
+Comdex/M
+Comdr/M
+comeback/SM
+comedian/SM
+comedic
+comedienne/SM
+comedown/MS
+comedy/SM
+come/IZSRGJ
+comeliness/SM
+comely/TPR
+comer/IM
+comes/M
+comestible/MS
+cometary
+cometh
+comet/SM
+comeuppance/SM
+comfit's
+comfit/SE
+comfortability/S
+comfortableness/MS
+comfortable/U
+comfortably/U
+comforted/U
+comforter/MS
+comfort/ESMDG
+comforting/YE
+comfy/RT
+comicality/MS
+comical/Y
+comic/MS
+Cominform/M
+comity/SM
+com/LJRTZG
+comm
+Com/M
+comma/MS
+commandant/MS
+commandeer/SDG
+commander/M
+commanding/Y
+commandment/SM
+commando/SM
+command/SZRDMGL
+commemorate/SDVNGX
+commemoration/M
+commemorative/YS
+commemorator/S
+commence/ALDSG
+commencement/AMS
+commencer/M
+commendably
+commendation/ASM
+commendatory/A
+commender/AM
+commend/GSADRB
+commensurable/I
+commensurate/IY
+commensurates
+commensuration/SM
+commentary/MS
+commentate/GSD
+commentator/SM
+commenter/M
+comment's
+comment/SUGD
+commerce/MGSD
+commercialism/MS
+commercialization/SM
+commercialize/GSD
+commercial/PYS
+Commie
+commie/SM
+commingle/GSD
+commiserate/VGNXSD
+commiseration/M
+commissariat/MS
+commissar/MS
+commissary/MS
+commission/ASCGD
+commissioner/SM
+commission's/A
+commitment/SM
+commit/SA
+committable
+committal/MA
+committals
+committed/UA
+committeeman/M
+committeemen
+committee/MS
+committeewoman/M
+committeewomen
+committing/A
+commode/MS
+commodes/IE
+commodiousness/MI
+commodious/YIP
+commodity/MS
+commodore/SM
+commonality/MS
+commonalty/MS
+commoner/MS
+commonness/MSU
+commonplaceness/M
+commonplace/SP
+common/RYUPT
+commonsense
+commons/M
+Commons/M
+commonweal/SHM
+commonwealth/M
+Commonwealth/M
+commonwealths
+Commonwealths
+commotion/MS
+communality/M
+communal/Y
+commune/XSDNG
+communicability/MS
+communicable/IU
+communicably
+communicant/MS
+communicate/VNGXSD
+communicational
+communication/M
+communicativeness/M
+communicative/PY
+communicator/SM
+communion/M
+Communion/SM
+communique/S
+communism/MS
+Communism/S
+communistic
+communist/MS
+Communist/S
+communitarian/M
+community/MS
+communize/SDG
+commutable/I
+commutate/XVGNSD
+commutation/M
+commutative/Y
+commutativity
+commutator/MS
+commute/BZGRSD
+commuter/M
+Comoros
+compaction/M
+compactness/MS
+compactor/MS
+compact/TZGSPRDY
+companionableness/M
+companionable/P
+companionably
+companion/GBSMD
+companionship/MS
+companionway/MS
+company/MSDG
+Compaq/M
+comparabilities
+comparability/IM
+comparableness/M
+comparable/P
+comparably/I
+comparativeness/M
+comparative/PYS
+comparator/SM
+compare/GRSDB
+comparer/M
+comparison/MS
+compartmental
+compartmentalization/SM
+compartmentalize/DSG
+compartment/SDMG
+compassionateness/M
+compassionate/PSDGY
+compassion/MS
+compass/MSDG
+compatibility/IMS
+compatibleness/M
+compatible/SI
+compatibly/I
+compatriot/SM
+compeer/DSGM
+compellable
+compelled
+compelling/YM
+compel/S
+compendious
+compendium/MS
+compensable
+compensated/U
+compensate/XVNGSD
+compensation/M
+compensator/M
+compensatory
+compete/GSD
+competence/ISM
+competency/IS
+competency's
+competent/IY
+competition/SM
+competitiveness/SM
+competitive/YP
+competitor/MS
+comp/GSYD
+compilable/U
+compilation/SAM
+compile/ASDCG
+compiler/CS
+compiler's
+complacence/S
+complacency/SM
+complacent/Y
+complainant/MS
+complainer/M
+complain/GZRDS
+complaining/YU
+complaint/MS
+complaisance/SM
+complaisant/Y
+complected
+complementariness/M
+complementarity
+complementary/SP
+complementation/M
+complementer/M
+complement/ZSMRDG
+complete/BTYVNGPRSDX
+completed/U
+completely/I
+completeness/ISM
+completer/M
+completion/MI
+complexional
+complexion/DMS
+complexity/MS
+complexness/M
+complex/TGPRSDY
+compliance/SM
+compliant/Y
+complicatedness/M
+complicated/YP
+complicate/SDG
+complication/M
+complicator/SM
+complicit
+complicity/MS
+complier/M
+complimentary/U
+complimenter/M
+compliment/ZSMRDG
+comply/ZXRSDNG
+component/SM
+comport/GLSD
+comportment/SM
+compose/CGASDE
+composedness/M
+composed/PY
+composer/CM
+composers
+composite/YSDXNG
+compositional/Y
+composition/CMA
+compositions/C
+compositor/MS
+compost/DMGS
+composure/ESM
+compote/MS
+compounded/U
+compounder/M
+compound/RDMBGS
+comprehend/DGS
+comprehending/U
+comprehensibility/SIM
+comprehensibleness/IM
+comprehensible/PI
+comprehensibly/I
+comprehension/IMS
+comprehensiveness/SM
+comprehensive/YPS
+compressed/Y
+compressibility/IM
+compressible/I
+compressional
+compression/CSM
+compressive/Y
+compressor/MS
+compress/SDUGC
+comprise/GSD
+compromiser/M
+compromise/SRDGMZ
+compromising/UY
+Compton/M
+comptroller/SM
+compulsion/SM
+compulsiveness/MS
+compulsive/PYS
+compulsivity
+compulsorily
+compulsory/S
+compunction/MS
+Compuserve/M
+CompuServe/M
+computability/M
+computable/UI
+computably
+computational/Y
+computation/SM
+computed/A
+computerese
+computerization/MS
+computerize/SDG
+computer/M
+compute/RSDZBG
+computes/A
+computing/A
+comradely/P
+comradeship/MS
+comrade/YMS
+Comte/M
+Conakry/M
+Conan/M
+Conant/M
+concatenate/XSDG
+concaveness/MS
+concave/YP
+conceal/BSZGRDL
+concealed/U
+concealer/M
+concealing/Y
+concealment/MS
+conceded/Y
+conceitedness/SM
+conceited/YP
+conceit/SGDM
+conceivable/IU
+conceivably/I
+conceive/BGRSD
+conceiver/M
+concentrate/VNGSDX
+concentration/M
+concentrator/MS
+concentrically
+Concepción/M
+conceptional
+conception/MS
+concept/SVM
+conceptuality/M
+conceptualization/A
+conceptualizations
+conceptualization's
+conceptualize/DRSG
+conceptualizing/A
+conceptual/Y
+concerned/YU
+concern/USGD
+concerted/PY
+concert/EDSG
+concertina/MDGS
+concertize/GDS
+concertmaster/MS
+concerto/SM
+concert's
+concessionaire/SM
+concessional
+concessionary
+concession/R
+Concetta/M
+Concettina/M
+Conchita/M
+conch/MDG
+conchs
+concierge/SM
+conciliar
+conciliate/GNVX
+conciliation/ASM
+conciliator/MS
+conciliatory/A
+conciseness/SM
+concise/TYRNPX
+concision/M
+conclave/S
+concluder/M
+conclude/RSDG
+conclusion/SM
+conclusive/IPY
+conclusiveness/ISM
+concocter/M
+concoction/SM
+concoct/RDVGS
+concomitant/YS
+concordance/MS
+concordant/Y
+concordat/SM
+Concorde/M
+Concordia/M
+Concord/MS
+concourse
+concreteness/MS
+concrete/NGXRSDPYM
+concretion/M
+concubinage/SM
+concubine/SM
+concupiscence/SM
+concupiscent
+concurrence/MS
+concur/S
+concussion/MS
+concuss/VD
+condemnate/XN
+condemnation/M
+condemnatory
+condemner/M
+condemn/ZSGRDB
+condensate/NMXS
+condensation/M
+condenser/M
+condense/ZGSD
+condensible
+condescend
+condescending/Y
+condescension/MS
+condign
+condiment/SM
+condition/AGSJD
+conditionals
+conditional/UY
+conditioned/U
+conditioner/MS
+conditioning/M
+condition's
+condole
+condolence/MS
+condominium/MS
+condom/SM
+condone/GRSD
+condoner/M
+Condorcet/M
+condor/MS
+condo/SM
+conduce/VGSD
+conduciveness/M
+conducive/P
+conductance/SM
+conductibility/SM
+conductible
+conduction/MS
+conductive/Y
+conductivity/MS
+conductor/MS
+conductress/MS
+conduct/V
+conduit/MS
+coneflower/M
+Conestoga
+coney's
+confabbed
+confabbing
+confab/MS
+confabulate/XSDGN
+confabulation/M
+confectioner/M
+confectionery/SM
+confectionist
+confection/RDMGZS
+confect/S
+Confederacy/M
+confederacy/MS
+confederate/M
+Confederate/S
+conferee/MS
+conference/DSGM
+conferrable
+conferral/SM
+conferred
+conferrer/SM
+conferring
+confer/SB
+confessed/Y
+confessional/SY
+confession/MS
+confessor/SM
+confetti/M
+confidante/SM
+confidant/SM
+confidence/SM
+confidentiality/MS
+confidentialness/M
+confidential/PY
+confident/Y
+confider/M
+confide/ZGRSD
+confiding/PY
+configuration/ASM
+configure/AGSDB
+confined/U
+confine/L
+confinement/MS
+confiner/M
+confirm/AGDS
+confirmation/ASM
+confirmatory
+confirmedness/M
+confirmed/YP
+confiscate/DSGNX
+confiscation/M
+confiscator/MS
+confiscatory
+conflagration/MS
+conflate/NGSDX
+conflation/M
+conflicting/Y
+conflict/SVGDM
+confluence/MS
+conformable/U
+conformal
+conformance/SM
+conformational/Y
+conform/B
+conformer/M
+conformism/SM
+conformist/SM
+conformities
+conformity/MUI
+confounded/Y
+confound/R
+confrère/MS
+confrontational
+confrontation/SM
+confronter/M
+confront/Z
+Confucianism/SM
+Confucian/S
+Confucius/M
+confusedness/M
+confused/PY
+confuse/RBZ
+confusing/Y
+confutation/MS
+confute/GRSD
+confuter/M
+conga/MDG
+congeal/GSDL
+congealment/MS
+congeniality/UM
+congenial/U
+congeries/M
+conger/SM
+congestion/MS
+congest/VGSD
+conglomerate/XDSNGVM
+conglomeration/M
+Cong/M
+Congolese
+Congo/M
+congrats
+congratulate/NGXSD
+congratulation/M
+congratulatory
+congregate/DSXGN
+congregational
+Congregational
+congregationalism/MS
+congregationalist/MS
+Congregationalist/S
+congregation/M
+congressional/Y
+congressman/M
+congressmen
+Congress/MS
+congress/MSDG
+congresspeople
+congressperson/S
+congresswoman/M
+congresswomen
+Congreve/M
+congruence/IM
+congruences
+congruency/M
+congruential
+congruent/YI
+congruity/MSI
+congruousness/IM
+congruous/YIP
+conicalness/M
+conical/PSY
+conic/S
+conics/M
+conifer/MS
+coniferous
+conjectural/Y
+conjecture/GMDRS
+conjecturer/M
+conjoint
+conjugacy
+conjugal/Y
+conjugate/XVNGYSDP
+conjugation/M
+conjunct/DSV
+conjunctiva/MS
+conjunctive/YS
+conjunctivitis/SM
+conjuration/MS
+conjurer/M
+conjure/RSDZG
+conjuring/M
+conker/M
+conk/ZDR
+Conley/M
+Con/M
+conman
+connect/ADGES
+connectedly/E
+connectedness/ME
+connected/U
+connectible
+Connecticut/M
+connection/AME
+connectionless
+connections/E
+connective/SYM
+connectivity/MS
+connector/MS
+Connelly/M
+Conner/M
+Connery/M
+connexion/MS
+Conney/M
+conn/GVDR
+Connie/M
+Conni/M
+conniption/MS
+connivance/MS
+conniver/M
+connive/ZGRSD
+connoisseur/MS
+Connor/SM
+connotative/Y
+Conn/RM
+connubial/Y
+Conny/M
+conquerable/U
+conquered/AU
+conqueror/MS
+conquer/RDSBZG
+conquers/A
+conquest/ASM
+conquistador/MS
+Conrade/M
+Conrad/M
+Conrado/M
+Conrail/M
+Conroy/M
+Consalve/M
+consanguineous/Y
+consanguinity/SM
+conscienceless
+conscientiousness/MS
+conscientious/YP
+conscionable/U
+consciousness/MUS
+conscious/UYSP
+conscription/SM
+consecrated/AU
+consecrates/A
+consecrate/XDSNGV
+consecrating/A
+consecration/AMS
+consecutiveness/M
+consecutive/YP
+consensus/SM
+consenter/M
+consenting/Y
+consent/SZGRD
+consequence
+consequentiality/S
+consequential/IY
+consequentialness/M
+consequently/I
+consequent/PSY
+conservancy/SM
+conservationism
+conservationist/SM
+conservation/SM
+conservatism/SM
+conservativeness/M
+Conservative/S
+conservative/SYP
+conservator/MS
+conservatory/MS
+con/SGM
+considerable/I
+considerables
+considerably/I
+considerateness/MSI
+considerate/XIPNY
+consideration/ASMI
+considered/U
+considerer/M
+consider/GASD
+considering/S
+consign/ASGD
+consignee/SM
+consignment/SM
+consist/DSG
+consistence/S
+consistency/IMS
+consistent/IY
+consistory/MS
+consolable/I
+Consolata/M
+consolation/MS
+consolation's/E
+consolatory
+consoled/U
+consoler/M
+console/ZBG
+consolidated/AU
+consolidate/NGDSX
+consolidates/A
+consolidation/M
+consolidator/SM
+consoling/Y
+consommé/S
+consonance/IM
+consonances
+consonantal
+consonant/MYS
+consortia
+consortium/M
+conspectus/MS
+conspicuousness/IMS
+conspicuous/YIP
+conspiracy/MS
+conspiratorial/Y
+conspirator/SM
+constable
+Constable/M
+constabulary/MS
+constance
+Constance/M
+Constancia/M
+constancy/IMS
+Constancy/M
+Constanta/M
+Constantia/M
+Constantina/M
+Constantine/M
+Constantin/M
+Constantino/M
+Constantinople/M
+constant/IY
+constants
+constellation/SM
+consternate/XNGSD
+consternation/M
+constipate/XDSNG
+constipation/M
+constituency/MS
+constituent/SYM
+constituted/A
+constitute/NGVXDS
+constitutes/A
+constituting/A
+Constitution
+constitutionality's
+constitutionality/US
+constitutionally/U
+constitutional/SY
+constitution/AMS
+constitutive/Y
+constrain
+constrainedly
+constrained/U
+constraint/MS
+constriction/MS
+constrictor/MS
+constrict/SDGV
+construable
+construct/ASDGV
+constructibility
+constructible/A
+constructional/Y
+constructionist/MS
+construction/MAS
+constructions/C
+constructiveness/SM
+constructive/YP
+constructor/MS
+construe/GSD
+Consuela/M
+Consuelo/M
+consular/S
+consulate/MS
+consul/KMS
+consulship/MS
+consultancy/S
+consultant/MS
+consultation/SM
+consultative
+consulted/A
+consulter/M
+consult/RDVGS
+consumable/S
+consumed/Y
+consume/JZGSDB
+consumerism/MS
+consumerist/S
+consumer/M
+consuming/Y
+consummate/DSGVY
+consummated/U
+consumption/SM
+consumptive/YS
+cont
+contact/BGD
+contacted/A
+contact's/A
+contacts/A
+contagion/SM
+contagiousness/MS
+contagious/YP
+containerization/SM
+containerize/GSD
+container/M
+containment/SM
+contain/SLZGBRD
+contaminant/SM
+contaminated/AU
+contaminates/A
+contaminate/SDCXNG
+contaminating/A
+contamination/CM
+contaminative
+contaminator/MS
+contd
+cont'd
+contemn/SGD
+contemplate/DVNGX
+contemplation/M
+contemplativeness/M
+contemplative/PSY
+contemporaneity/MS
+contemporaneousness/M
+contemporaneous/PY
+contemptibleness/M
+contemptible/P
+contemptibly
+contempt/M
+contemptuousness/SM
+contemptuous/PY
+contentedly/E
+contentedness/SM
+contented/YP
+content/EMDLSG
+contention/MS
+contentiousness/SM
+contentious/PY
+contently
+contentment/ES
+contentment's
+conterminous/Y
+contestable/I
+contestant/SM
+contested/U
+contextualize/GDS
+contiguity/MS
+contiguousness/M
+contiguous/YP
+continence/ISM
+Continental/S
+continental/SY
+continent/IY
+Continent/M
+continents
+continent's
+contingency/SM
+contingent/SMY
+continua
+continuable
+continual/Y
+continuance/ESM
+continuant/M
+continuation/ESM
+continue/ESDG
+continuer/M
+continuity/SEM
+continuousness/M
+continuous/YE
+continuum/M
+contortionist/SM
+contortion/MS
+contort/VGD
+contour
+contraband/SM
+contrabass/M
+contraception/SM
+contraceptive/S
+contract/DG
+contractible
+contractile
+contractual/Y
+contradict/GDS
+contradiction/MS
+contradictorily
+contradictoriness/M
+contradictory/PS
+contradistinction/MS
+contraflow/S
+contrail/M
+contraindicate/SDVNGX
+contraindication/M
+contralto/SM
+contrapositive/S
+contraption/MS
+contrapuntal/Y
+contrariety/MS
+contrarily
+contrariness/MS
+contrariwise
+contrary/PS
+contra/S
+contrasting/Y
+contrastive/Y
+contrast/SRDVGZ
+contravene/GSRD
+contravener/M
+contravention/MS
+Contreras/M
+contretemps/M
+contribute/XVNZRD
+contribution/M
+contributive/Y
+contributorily
+contributor/SM
+contributory/S
+contriteness/M
+contrite/NXP
+contrition/M
+contrivance/SM
+contriver/M
+contrive/ZGRSD
+control/CS
+controllability/M
+controllable/IU
+controllably/U
+controlled/CU
+controller/SM
+controlling/C
+control's
+controversialists
+controversial/UY
+controversy/MS
+controvert/DGS
+controvertible/I
+contumacious/Y
+contumacy/MS
+contumelious
+contumely/MS
+contuse/NGXSD
+contusion/M
+conundrum/SM
+conurbation/MS
+convalesce/GDS
+convalescence/SM
+convalescent/S
+convect/DSVG
+convectional
+convection/MS
+convector
+convene/ASDG
+convener/MS
+convenience/ISM
+convenient/IY
+conventicle/SM
+conventionalism/M
+conventionalist/M
+conventionality/SUM
+conventionalize/GDS
+conventional/UY
+convention/MA
+conventions
+convergence/MS
+convergent
+conversant/Y
+conversationalist/SM
+conversational/Y
+conversation/SM
+conversazione/M
+converse/Y
+conversion/AM
+conversioning
+converted/U
+converter/MS
+convert/GADS
+convertibility's/I
+convertibility/SM
+convertibleness/M
+convertible/PS
+convexity/MS
+convex/Y
+conveyance/DRSGMZ
+conveyancer/M
+conveyancing/M
+convey/BDGS
+conveyor/MS
+conviction/MS
+convict/SVGD
+convinced/U
+convincer/M
+convince/RSDZG
+convincingness/M
+convincing/PUY
+conviviality/MS
+convivial/Y
+convoke/GSD
+convolute/XDNY
+convolution/M
+convolve/C
+convolved
+convolves
+convolving
+convoy/GMDS
+convulse/SDXVNG
+convulsion/M
+convulsiveness/M
+convulsive/YP
+Conway/M
+cony/SM
+coo/GSD
+cookbook/SM
+cooked/AU
+Cooke/M
+cooker/M
+cookery/MS
+cook/GZDRMJS
+Cookie/M
+cookie/SM
+cooking/M
+Cook/M
+cookout/SM
+cooks/A
+cookware/SM
+cooky's
+coolant/SM
+cooled/U
+cooler/M
+Cooley/M
+coolheaded
+Coolidge/M
+coolie/MS
+coolness/MS
+cool/YDRPJGZTS
+coon/MS!
+coonskin/MS
+cooperage/MS
+cooperate/VNGXSD
+cooperation/M
+cooperativeness/SM
+cooperative/PSY
+cooperator/MS
+cooper/GDM
+Cooper/M
+coop/MDRGZS
+Coop/MR
+coordinated/U
+coordinateness/M
+coordinate/XNGVYPDS
+coordination/M
+coordinator/MS
+Coors/M
+cootie/SM
+coot/MS
+copay/S
+Copeland/M
+Copenhagen/M
+coper/M
+Copernican
+Copernicus/M
+cope/S
+copied/A
+copier/M
+copies/A
+copilot/SM
+coping/M
+copiousness/SM
+copious/YP
+coplanar
+Copland/M
+Copley/M
+copolymer/MS
+copora
+copped
+Copperfield/M
+copperhead/MS
+copper/MSGD
+copperplate/MS
+coppersmith/M
+coppersmiths
+coppery
+coppice's
+copping
+Coppola/M
+copra/MS
+coprolite/M
+coprophagous
+copse/M
+cops/GDS
+cop/SJMDRG
+copter/SM
+Coptic/M
+copula/MS
+copulate/XDSNGV
+copulation/M
+copulative/S
+copybook/MS
+copycat/SM
+copycatted
+copycatting
+copyist/SM
+copy/MZBDSRG
+copyrighter/M
+copyright/MSRDGZ
+copywriter/MS
+coquetry/MS
+coquette/DSMG
+coquettish/Y
+Corabella/M
+Corabelle/M
+Corabel/M
+coracle/SM
+Coralie/M
+Coraline/M
+coralline
+Coral/M
+coral/SM
+Coralyn/M
+Cora/M
+corbel/GMDJS
+Corbet/M
+Corbett/M
+Corbie/M
+Corbin/M
+Corby/M
+cordage/MS
+corded/AE
+Cordelia/M
+Cordelie/M
+Cordell/M
+corder/AM
+Cordey/M
+cord/FSAEM
+cordiality/MS
+cordialness/M
+cordial/PYS
+Cordie/M
+cordillera/MS
+Cordilleras
+Cordi/M
+cording/MA
+cordite/MS
+cordless
+Cord/M
+Cordoba
+cordon/DMSG
+cordovan/SM
+Cordula/M
+corduroy/GDMS
+Cordy/M
+cored/A
+Coreen/M
+Corella/M
+core/MZGDRS
+Corenda/M
+Corene/M
+corer/M
+corespondent/MS
+Coretta/M
+Corette/M
+Corey/M
+Corfu/M
+corgi/MS
+coriander/SM
+Corie/M
+Corilla/M
+Cori/M
+Corina/M
+Corine/M
+coring/M
+Corinna/M
+Corinne/M
+Corinthian/S
+Corinthians/M
+Corinth/M
+Coriolanus/M
+Coriolis/M
+Corissa/M
+Coriss/M
+corked/U
+corker/M
+cork/GZDRMS
+Cork/M
+corkscrew/DMGS
+corks/U
+Corliss/M
+Corly/M
+Cormack/M
+corm/MS
+cormorant/MS
+Cornall/M
+cornball/SM
+cornbread/S
+corncob/SM
+corncrake/M
+corneal
+cornea/SM
+Corneille/M
+Cornela/M
+Cornelia/M
+Cornelius/M
+Cornelle/M
+Cornell/M
+corner/GDM
+cornerstone/MS
+cornet/SM
+Corney/M
+cornfield/SM
+cornflake/S
+cornflour/M
+cornflower/SM
+corn/GZDRMS
+cornice/GSDM
+Cornie/M
+cornily
+corniness/S
+Cornish/S
+cornmeal/S
+cornrow/GDS
+cornstalk/MS
+cornstarch/SM
+cornucopia/MS
+Cornwallis/M
+Cornwall/M
+Corny/M
+corny/RPT
+corolla/MS
+corollary/SM
+Coronado/M
+coronal/MS
+coronary/S
+corona/SM
+coronate/NX
+coronation/M
+coroner/MS
+coronet/DMS
+Corot/M
+coroutine/SM
+Corp
+corporal/SYM
+corpora/MS
+corporate/INVXS
+corporately
+corporation/MI
+corporatism/M
+corporatist
+corporeality/MS
+corporeal/IY
+corporealness/M
+corp/S
+corpse/M
+corpsman/M
+corpsmen
+corps/SM
+corpulence/MS
+corpulentness/S
+corpulent/YP
+corpuscle/SM
+corpuscular
+corpus/M
+corr
+corralled
+corralling
+corral/MS
+correctable/U
+correct/BPSDRYTGV
+corrected/U
+correctional
+correction/MS
+corrective/YPS
+correctly/I
+correctness/MSI
+corrector/MS
+Correggio/M
+correlated/U
+correlate/SDXVNG
+correlation/M
+correlative/YS
+Correna/M
+correspond/DSG
+correspondence/MS
+correspondent/SM
+corresponding/Y
+Correy/M
+Corrianne/M
+corridor/SM
+Corrie/M
+corrigenda
+corrigendum/M
+corrigible/I
+Corri/M
+Corrina/M
+Corrine/M
+Corrinne/M
+corroborated/U
+corroborate/GNVXDS
+corroboration/M
+corroborative/Y
+corroborator/MS
+corroboratory
+corrode/SDG
+corrodible
+corrosion/SM
+corrosiveness/M
+corrosive/YPS
+corrugate/NGXSD
+corrugation/M
+corrupt/DRYPTSGV
+corrupted/U
+corrupter/M
+corruptibility/SMI
+corruptible/I
+corruption/IM
+corruptions
+corruptive/Y
+corruptness/MS
+Corry/M
+corsage/MS
+corsair/SM
+corset/GMDS
+Corsica/M
+Corsican/S
+cortège/MS
+Cortes/S
+cortex/M
+Cortez's
+cortical/Y
+cortices
+corticosteroid/SM
+Cortie/M
+cortisone/SM
+Cortland/M
+Cort/M
+Cortney/M
+Corty/M
+corundum/MS
+coruscate/XSDGN
+coruscation/M
+Corvallis/M
+corvette/MS
+Corvus/M
+Cory/M
+Cos
+Cosby/M
+Cosetta/M
+Cosette/M
+cos/GDS
+cosignatory/MS
+cosign/SRDZG
+cosily
+Cosimo/M
+cosine/MS
+cosiness/MS
+Cosme/M
+cosmetically
+cosmetician/MS
+cosmetic/SM
+cosmetologist/MS
+cosmetology/MS
+cosmic
+cosmical/Y
+cosmogonist/MS
+cosmogony/SM
+cosmological/Y
+cosmologist/MS
+cosmology/SM
+Cosmo/M
+cosmonaut/MS
+cosmopolitanism/MS
+cosmopolitan/SM
+cosmos/SM
+cosponsor/DSG
+cossack/S
+Cossack/SM
+cosset/GDS
+Costa/M
+Costanza/M
+costarred
+costarring
+costar/S
+Costello/M
+costiveness/M
+costive/PY
+costless
+costliness/SM
+costly/RTP
+cost/MYGVJS
+Costner/M
+costumer/M
+costume/ZMGSRD
+cotangent/SM
+Cote/M
+cote/MS
+coterie/MS
+coterminous/Y
+cotillion/SM
+Cotonou/M
+Cotopaxi/M
+cot/SGMD
+cottager/M
+cottage/ZMGSRD
+cottar's
+cotted
+cotter/SDM
+cotton/GSDM
+Cotton/M
+cottonmouth/M
+cottonmouths
+cottonseed/MS
+cottontail/SM
+cottonwood/SM
+cottony
+cotyledon/MS
+couching/M
+couch/MSDG
+cougar/MS
+cougher/M
+cough/RDG
+coughs
+couldn't
+could/T
+could've
+coulée/MS
+Coulomb/M
+coulomb/SM
+councilman/M
+councilmen
+councilor/MS
+councilperson/S
+council/SM
+councilwoman/M
+councilwomen
+counsel/GSDM
+counsellings
+counselor/MS
+countability/E
+countable/U
+countably/U
+countdown/SM
+counted/U
+count/EGARDS
+countenance/EGDS
+countenancer/M
+countenance's
+counteract/DSVG
+counteraction/SM
+counterargument/SM
+counterattack/DRMGS
+counterbalance/MSDG
+counterclaim/GSDM
+counterclockwise
+counterculture/MS
+countercyclical
+counterespionage/MS
+counterexample/S
+counterfeiter/M
+counterfeit/ZSGRD
+counterflow
+counterfoil/MS
+counterforce/M
+counter/GSMD
+counterinsurgency/MS
+counterintelligence/MS
+counterintuitive
+countermand/DSG
+counterman/M
+countermeasure/SM
+countermen
+counteroffensive/SM
+counteroffer/SM
+counterpane/SM
+counterpart/SM
+counterpoint/GSDM
+counterpoise/GMSD
+counterproductive
+counterproposal/M
+counterrevolutionary/MS
+counterrevolution/MS
+counter's/E
+counters/E
+countersignature/MS
+countersign/SDG
+countersink/SG
+counterspy/MS
+counterstrike
+countersunk
+countertenor/SM
+countervail/DSG
+counterweight/GMDS
+countess/MS
+countless/Y
+countrify/D
+countryman/M
+countrymen
+country/MS
+countryside/MS
+countrywide
+countrywoman/M
+countrywomen
+county/SM
+coup/ASDG
+coupe/MS
+Couperin/M
+couple/ACU
+coupled/CU
+coupler/C
+couplers
+coupler's
+couple's
+couples/CU
+couplet/SM
+coupling's/C
+coupling/SM
+coupon/SM
+coup's
+courage/MS
+courageously
+courageousness/MS
+courageous/U
+courages/E
+Courbet/M
+courgette/MS
+courier/GMDS
+course/EGSRDM
+courser's/E
+courser/SM
+course's/AF
+courses/FA
+coursework
+coursing/M
+Courtenay/M
+courteousness/EM
+courteousnesses
+courteous/PEY
+courtesan/MS
+courtesied
+courtesy/ESM
+courtesying
+court/GZMYRDS
+courthouse/MS
+courtier/SM
+courtliness/MS
+courtly/RTP
+Court/M
+Courtnay/M
+Courtney/M
+courtroom/MS
+courtship/SM
+courtyard/SM
+couscous/MS
+cousinly/U
+cousin/YMS
+Cousteau/M
+couture/SM
+couturier/SM
+covalent/Y
+covariance/SM
+covariant/S
+covariate/SN
+covary
+cove/DRSMZG
+covenanted/U
+covenanter/M
+covenant/SGRDM
+coven/SM
+Covent/M
+Coventry/MS
+coverable/E
+cover/AEGUDS
+coverage/MS
+coverall/DMS
+coverer/AME
+covering/MS
+coverlet/MS
+coversheet
+covers/M
+covertness/SM
+covert/YPS
+coveter/M
+coveting/Y
+covetousness/SM
+covetous/PY
+covet/SGRD
+covey/SM
+covington
+cowardice/MS
+cowardliness/MS
+cowardly/P
+Coward/M
+coward/MYS
+cowbell/MS
+cowbird/MS
+cowboy/MS
+cowcatcher/SM
+cowed/Y
+cowering/Y
+cower/RDGZ
+cowgirl/MS
+cowhand/S
+cowherd/SM
+cowhide/MGSD
+Cowley/M
+cowlick/MS
+cowling/M
+cowl/SGMD
+cowman/M
+cow/MDRSZG
+cowmen
+coworker/MS
+Cowper/M
+cowpoke/MS
+cowpony
+cowpox/MS
+cowpuncher/M
+cowpunch/RZ
+cowrie/SM
+cowshed/SM
+cowslip/MS
+coxcomb/MS
+Cox/M
+cox/MDSG
+coxswain/GSMD
+coy/CDSG
+coyer
+coyest
+coyly
+Coy/M
+coyness/MS
+coyote/SM
+coypu/SM
+cozenage/MS
+cozen/SGD
+cozily
+coziness/MS
+Cozmo/M
+Cozumel/M
+cozy/DSRTPG
+CPA
+cpd
+CPI
+cpl
+Cpl
+CPO
+CPR
+cps
+CPU/SM
+crabapple
+crabbedness/M
+crabbed/YP
+Crabbe/M
+crabber/MS
+crabbily
+crabbiness/S
+crabbing/M
+crabby/PRT
+crabgrass/S
+crablike
+crab/MS
+crackable/U
+crackdown/MS
+crackerjack/S
+cracker/M
+crackle/GJDS
+crackling/M
+crackly/RT
+crackpot/SM
+crackup/S
+crack/ZSBYRDG
+cradler/M
+cradle/SRDGM
+cradling/M
+craftily
+craftiness/SM
+Craft/M
+craft/MRDSG
+craftsman/M
+craftsmanship/SM
+craftsmen
+craftspeople
+craftspersons
+craftswoman
+craftswomen
+crafty/TRP
+Craggie/M
+cragginess/SM
+Craggy/M
+craggy/RTP
+crag/SM
+Craig/M
+Cramer/M
+crammed
+crammer/M
+cramming
+cramper/M
+cramp/MRDGS
+crampon/SM
+cram/S
+Cranach/M
+cranberry/SM
+Crandall/M
+crane/DSGM
+cranelike
+Crane/M
+Cranford/M
+cranial
+cranium/MS
+crankcase/MS
+crankily
+crankiness/MS
+crank/SGTRDM
+crankshaft/MS
+cranky/TRP
+Cranmer/M
+cranny/DSGM
+Cranston/M
+crape/SM
+crapped
+crappie/M
+crapping
+crappy/RST
+crapshooter/SM
+crap/SMDG!
+crasher/M
+crashing/Y
+crash/SRDGZ
+crassness/MS
+crass/TYRP
+crate/DSRGMZ
+crater/DMG
+Crater/M
+cravat/SM
+cravatted
+cravatting
+crave/DSRGJ
+cravenness/SM
+craven/SPYDG
+craver/M
+craving/M
+crawdad/S
+crawfish's
+Crawford/M
+crawler/M
+crawl/RDSGZ
+crawlspace/S
+crawlway
+crawly/TRS
+craw/SYM
+crayfish/GSDM
+Crayola/M
+crayon/GSDM
+Cray/SM
+craze/GMDS
+crazily
+craziness/MS
+crazy/SRTP
+creakily
+creakiness/SM
+creak/SDG
+creaky/PTR
+creamer/M
+creamery/MS
+creamily
+creaminess/SM
+cream/SMRDGZ
+creamy/TRP
+creased/CU
+crease/IDRSG
+crease's
+creases/C
+creasing/C
+created/U
+create/XKVNGADS
+creationism/MS
+creationist/MS
+Creation/M
+creation/MAK
+creativeness/SM
+creative/YP
+creativities
+creativity/K
+creativity's
+Creator/M
+creator/MS
+creatureliness/M
+creaturely/P
+creature/YMS
+crèche/SM
+credence/MS
+credent
+credential/SGMD
+credenza/SM
+credibility/IMS
+credible/I
+credibly/I
+creditability/M
+creditableness/M
+creditable/P
+creditably/E
+credited/U
+credit/EGBSD
+creditor/MS
+credit's
+creditworthiness
+credo/SM
+credulity/ISM
+credulous/IY
+credulousness/SM
+creedal
+creed/C
+creeds
+creed's
+creekside
+creek/SM
+Creek/SM
+creel/SMDG
+Cree/MDS
+creeper/M
+creepily
+creepiness/SM
+creep/SGZR
+creepy/PRST
+Creigh/M
+Creight/M
+Creighton/M
+cremate/XDSNG
+cremation/M
+crematoria
+crematorium/MS
+crematory/S
+creme/S
+crenelate/XGNSD
+crenelation/M
+Creole/MS
+creole/SM
+Creon/M
+creosote/MGDS
+crepe/DSGM
+crept
+crescendoed
+crescendoing
+crescendo/SCM
+crescent/MS
+cress/S
+crestfallenness/M
+crestfallen/PY
+cresting/M
+crestless
+crest/SGMD
+Crestview/M
+cretaceous
+Cretaceously/M
+Cretaceous/Y
+Cretan/S
+Crete/M
+cretinism/MS
+cretin/MS
+cretinous
+cretonne/SM
+crevasse/DSMG
+crevice/SM
+crew/DMGS
+crewel/SM
+crewelwork/SM
+crewman/M
+crewmen
+cribbage/SM
+cribbed
+cribber/SM
+cribbing/M
+crib/SM
+Crichton/M
+cricketer/M
+cricket/SMZRDG
+crick/GDSM
+Crick/M
+cried/C
+crier/CM
+cries/C
+Crimea/M
+Crimean
+crime/GMDS
+criminality/MS
+criminalization/C
+criminalize/GC
+criminal/SYM
+criminologist/SM
+criminology/MS
+crimper/M
+crimp/RDGS
+crimson/DMSG
+cringer/M
+cringe/SRDG
+crinkle/DSG
+crinkly/TRS
+Crin/M
+crinoline/SM
+cripple/GMZDRS
+crippler/M
+crippling/Y
+Crisco/M
+crises
+crisis/M
+Cris/M
+crisper/M
+crispiness/SM
+crispness/MS
+crisp/PGTYRDS
+crispy/RPT
+criss
+crisscross/GDS
+Crissie/M
+Crissy/M
+Cristabel/M
+Cristal/M
+Crista/M
+Cristen/M
+Cristian/M
+Cristiano/M
+Cristie/M
+Cristi/M
+Cristina/M
+Cristine/M
+Cristin/M
+Cristionna/M
+Cristobal/M
+Cristy/M
+criteria
+criterion/M
+criticality
+critically/U
+criticalness/M
+critical/YP
+criticism/MS
+criticized/U
+criticize/GSRDZ
+criticizer/M
+criticizes/A
+criticizingly/S
+criticizing/UY
+critic/MS
+critique/MGSD
+critter/SM
+Cr/M
+croaker/M
+croak/SRDGZ
+croaky/RT
+Croatia/M
+Croatian/S
+Croat/SM
+Croce/M
+crocheter/M
+crochet/RDSZJG
+crockery/SM
+Crockett/M
+Crockpot/M
+crock/SGRDM
+crocodile/MS
+crocus/SM
+Croesus/SM
+crofter/M
+croft/MRGZS
+croissant/MS
+Croix/M
+Cromwellian
+Cromwell/M
+crone/SM
+Cronin/M
+Cronkite/M
+Cronus/M
+crony/SM
+crookedness/SM
+crooked/TPRY
+Crookes/M
+crookneck/MS
+crook/SGDM
+crooner/M
+croon/SRDGZ
+cropland/MS
+crop/MS
+cropped
+cropper/SM
+cropping
+croquet/MDSG
+croquette/SM
+Crosby/M
+crosier/SM
+crossarm
+crossbarred
+crossbarring
+crossbar/SM
+crossbeam/MS
+crossbones
+crossbowman/M
+crossbowmen
+crossbow/SM
+crossbred/S
+crossbreed/SG
+crosscheck/SGD
+crosscurrent/SM
+crosscut/SM
+crosscutting
+crossed/UA
+crosses/UA
+crossfire/SM
+crosshatch/GDS
+crossing/M
+Cross/M
+crossness/MS
+crossover/MS
+crosspatch/MS
+crosspiece/SM
+crosspoint
+crossproduct/S
+crossroad/GSM
+crossroads/M
+crosstalk/M
+crosstown
+crosswalk/MS
+crossway/M
+crosswind/SM
+crosswise
+crossword/MS
+cross/ZTYSRDMPBJG
+crotchetiness/M
+crotchet/MS
+crotchety/P
+crotchless
+crotch/MDS
+crouch/DSG
+croupier/M
+croup/SMDG
+croupy/TZR
+croûton/MS
+crowbait
+crowbarred
+crowbarring
+crowbar/SM
+crowdedness/M
+crowded/P
+crowd/MRDSG
+crowfeet
+crowfoot/M
+crow/GDMS
+Crowley/M
+crowned/U
+crowner/M
+crown/RDMSJG
+crozier's
+CRT/S
+crucial/Y
+crucible/MS
+crucifiable
+crucifixion/MS
+Crucifixion/MS
+crucifix/SM
+cruciform/S
+crucify/NGDS
+crudded
+crudding
+cruddy/TR
+crudeness/MS
+crude/YSP
+crudités
+crudity/MS
+crud/STMR
+cruelness/MS
+cruelty/SM
+cruel/YRTSP
+cruet/MS
+cruft
+crufty
+Cruikshank/M
+cruise/GZSRD
+cruiser/M
+cruller/SM
+crumb/GSYDM
+crumble/DSJG
+crumbliness/MS
+crumbly/PTRS
+crumby/RT
+crumminess/S
+crummy/SRTP
+crump
+crumpet/SM
+crumple/DSG
+crunch/DSRGZ
+crunchiness/MS
+crunchy/TRP
+crupper/MS
+crusade/GDSRMZ
+crusader/M
+cruse/MS
+crushable/U
+crusher/M
+crushing/Y
+crushproof
+crush/SRDBGZ
+Crusoe/M
+crustacean/MS
+crustal
+crust/GMDS
+crustily
+crustiness/SM
+crusty/SRTP
+crutch/MDSG
+Crux/M
+crux/MS
+Cruz/M
+crybaby/MS
+cry/JGDRSZ
+cryogenic/S
+cryogenics/M
+cryostat/M
+cryosurgery/SM
+cryptanalysis/M
+cryptanalyst/M
+cryptanalytic
+crypt/CS
+cryptic
+cryptically
+cryptogram/MS
+cryptographer/MS
+cryptographic
+cryptographically
+cryptography/MS
+cryptologic
+cryptological
+cryptologist/M
+cryptology/M
+Cryptozoic/M
+crypt's
+crystalline/S
+crystallite/SM
+crystallization/AMS
+crystallized/UA
+crystallizes/A
+crystallize/SRDZG
+crystallizing/A
+crystallographer/MS
+crystallographic
+crystallography/M
+Crystal/M
+crystal/SM
+Crysta/M
+Crystie/M
+Cs
+C's
+cs/EA
+cs's
+CST
+ct
+CT
+Cthrine/M
+Ct/M
+ctn
+ctr
+Cuba/M
+Cuban/S
+cubbed
+cubbing
+cubbyhole/MS
+cuber/M
+cube/SM
+cubical/Y
+cubicle/SM
+cubic/YS
+cubism/SM
+cubist/MS
+cubit/MS
+cub/MDRSZG
+cuboid
+Cuchulain/M
+cuckold/GSDM
+cuckoldry/MS
+cuckoo/SGDM
+cucumber/MS
+cuddle/GSD
+cuddly/TRP
+cu/DG
+cudgel/GSJMD
+cud/MS
+cue/MS
+cuff/GSDM
+Cuisinart/M
+cuisine/MS
+Culbertson/M
+culinary
+Cullan/M
+cull/DRGS
+cullender's
+Cullen/M
+culler/M
+Culley/M
+Cullie/M
+Cullin/M
+Cull/MN
+Cully/M
+culminate/XSDGN
+culmination/M
+culotte/S
+culpability/MS
+culpable/I
+culpableness/M
+culpably
+culpa/SM
+culprit/SM
+cultism/SM
+cultist/SM
+cultivable
+cultivated/U
+cultivate/XBSDGN
+cultivation/M
+cultivator/SM
+cult/MS
+cultural/Y
+cultured/U
+culture/SDGM
+Culver/MS
+culvert/SM
+Cu/M
+cumber/DSG
+Cumberland/M
+cumbersomeness/MS
+cumbersome/YP
+cumbrous
+cumin/MS
+cummerbund/MS
+Cummings
+cumquat's
+cum/S
+cumulate/XVNGSD
+cumulation/M
+cumulative/Y
+cumuli
+cumulonimbi
+cumulonimbus/M
+cumulus/M
+Cunard/M
+cuneiform/S
+cunnilingus/SM
+Cunningham/M
+cunningness/M
+cunning/RYSPT
+cunt/SM!
+cupboard/SM
+cupcake/SM
+Cupertino/M
+cupful/SM
+cupidinously
+cupidity/MS
+Cupid/M
+cupid/S
+cup/MS
+cupola/MDGS
+cupped
+cupping/M
+cupric
+cuprous
+curability/MS
+curable/IP
+curableness/MI
+curably/I
+Curacao/M
+curacy/SM
+curare/MS
+curate/VGMSD
+curative/YS
+curatorial
+curator/KMS
+curbing/M
+curbside
+curb/SJDMG
+curbstone/MS
+Curcio/M
+curdle/SDG
+curd/SMDG
+cured/U
+cure/KBDRSGZ
+curer/MK
+curettage/SM
+curfew/SM
+curfs
+curiae
+curia/M
+cur/IBS
+Curie/M
+curie/SM
+curiosity/SM
+curio/SM
+curiousness/SM
+curious/TPRY
+Curitiba/M
+curium/MS
+curler/SM
+curlew/MS
+curlicue/MGDS
+curliness/SM
+curling/M
+curl/UDSG
+curlycue's
+curly/PRT
+curmudgeon/MYS
+Curran/M
+currant/SM
+curred/AFI
+currency's
+currency/SF
+current/FSY
+currently/A
+currentness/M
+Currey/M
+curricle/M
+curricula
+curricular
+curriculum/M
+Currie/M
+currier/M
+Currier/M
+curring/FAI
+Curr/M
+currycomb/DMGS
+Curry/MR
+curry/RSDMG
+cur's
+curs/ASDVG
+curse/A
+cursedness/M
+cursed/YRPT
+curse's
+cursive/EPYA
+cursiveness/EM
+cursives
+cursor/DMSG
+cursorily
+cursoriness/SM
+cursory/P
+curtailer/M
+curtail/LSGDR
+curtailment/SM
+curtain/GSMD
+Curtice/M
+Curtis/M
+Curt/M
+curtness/MS
+curtsey's
+curtsy/SDMG
+curt/TYRP
+curvaceousness/S
+curvaceous/YP
+curvature/MS
+curved/A
+curved's
+curve/DSGM
+curvilinearity/M
+curvilinear/Y
+curving/M
+curvy/RT
+cushion/SMDG
+Cushman/M
+cushy/TR
+cuspid/MS
+cuspidor/MS
+cusp/MS
+cussedness/M
+cussed/YP
+cuss/EGDSR
+cusses/F
+cussing/F
+cuss's
+custard/MS
+Custer/M
+custodial
+custodianship/MS
+custodian/SM
+custody/MS
+customarily
+customariness/M
+customary/PS
+customer/M
+customhouse/S
+customization/SM
+customize/ZGBSRD
+custom/SMRZ
+cutaneous/Y
+cutaway/SM
+cutback/SM
+cuteness/MS
+cute/SPY
+cutesy/RT
+cuticle/SM
+cutlass/MS
+cutler/SM
+cutlery/MS
+cutlet/SM
+cut/MRST
+cutoff/MS
+cutout/SM
+cutter/SM
+cutthroat/SM
+cutting/MYS
+cuttlebone/SM
+cuttlefish/MS
+cuttle/M
+cutup/MS
+cutworm/MS
+Cuvier/M
+Cuzco/M
+CV
+cw
+cwt
+Cyanamid/M
+cyanate/M
+cyanic
+cyanide/GMSD
+cyan/MS
+cyanogen/M
+Cybele/M
+cybernetic/S
+cybernetics/M
+cyberpunk/S
+cyberspace/S
+Cybill/M
+Cybil/M
+Cyb/M
+cyborg/S
+Cyclades
+cyclamen/MS
+cycle/ASDG
+cycler
+cycle's
+cycleway/S
+cyclic
+cyclical/SY
+cycling/M
+cyclist/MS
+cyclohexanol
+cycloidal
+cycloid/SM
+cyclometer/MS
+cyclone/SM
+cyclonic
+cyclopean
+cyclopedia/MS
+cyclopes
+Cyclopes
+cyclops
+Cyclops/M
+cyclotron/MS
+cyder/SM
+cygnet/MS
+Cygnus/M
+cylinder/GMDS
+cylindric
+cylindrical/Y
+Cy/M
+cymbalist/MS
+cymbal/SM
+Cymbre/M
+Cynde/M
+Cyndia/M
+Cyndie/M
+Cyndi/M
+Cyndy/M
+cynical/UY
+cynicism/MS
+cynic/MS
+cynosure/SM
+Cynthea/M
+Cynthia/M
+Cynthie/M
+Cynthy/M
+cypher/MGSD
+cypreses
+cypress/SM
+Cyprian
+Cypriot/SM
+Cyprus/M
+Cyrano/M
+Cyrille/M
+Cyrillic
+Cyrill/M
+Cyrillus/M
+Cyril/M
+Cyrus/M
+cystic
+cyst/MS
+cytochemistry/M
+cytochrome/M
+cytologist/MS
+cytology/MS
+cytolysis/M
+cytoplasmic
+cytoplasm/SM
+cytosine/MS
+cytotoxic
+CZ
+czarevitch/M
+czarina/SM
+czarism/M
+czarist/S
+czarship
+czar/SM
+Czech
+Czechoslovakia/M
+Czechoslovakian/S
+Czechoslovak/S
+Czechs
+Czerniak/M
+Czerny/M
+D
+DA
+dabbed
+dabber/MS
+dabbing
+dabbler/M
+dabble/RSDZG
+dab/S
+Dacca's
+dace/MS
+Dacey/M
+dacha/SM
+Dachau/M
+dachshund/SM
+Dacia/M
+Dacie/M
+Dacron/MS
+dactylic/S
+dactyl/MS
+Dacy/M
+Dadaism/M
+dadaism/S
+Dadaist/M
+dadaist/S
+Dada/M
+daddy/SM
+Dade/M
+dado/DMG
+dadoes
+dad/SM
+Daedalus/M
+Dael/M
+daemonic
+daemon/SM
+Daffie/M
+Daffi/M
+daffiness/S
+daffodil/MS
+Daffy/M
+daffy/PTR
+daftness/MS
+daft/TYRP
+DAG
+dagger/DMSG
+Dag/M
+Dagmar/M
+Dagny/M
+Daguerre/M
+daguerreotype/MGDS
+Dagwood/M
+Dahlia/M
+dahlia/MS
+Dahl/M
+Dahomey/M
+Daile/M
+dailiness/MS
+daily/PS
+Daimler/M
+daintily
+daintiness/MS
+dainty/TPRS
+daiquiri/SM
+dairying/M
+dairyland
+dairymaid/SM
+dairyman/M
+dairymen
+dairy/MJGS
+dairywoman/M
+dairywomen
+Daisey/M
+Daisie/M
+Daisi/M
+dais/SM
+Daisy/M
+daisy/SM
+Dakar/M
+Dakotan
+Dakota/SM
+Dale/M
+Dalenna/M
+dale/SMH
+daleth/M
+Daley/M
+Dalhousie/M
+Dalia/M
+Dalian/M
+Dalila/M
+Dali/SM
+Dallas/M
+dalliance/SM
+dallier/M
+Dalli/MS
+Dall/M
+Dallon/M
+dally/ZRSDG
+Dal/M
+Dalmatia/M
+dalmatian/S
+Dalmatian/SM
+Daloris/M
+Dalston/M
+Dalt/M
+Dalton/M
+Daly/M
+damageable
+damaged/U
+damage/MZGRSD
+damager/M
+damaging/Y
+Damara/M
+Damaris/M
+Damascus/M
+damask/DMGS
+dame/SM
+Dame/SMN
+Damian/M
+Damiano/M
+Damien/M
+Damion/M
+Damita/M
+dam/MDS
+dammed
+damming
+dammit/S
+damnably
+damnation/MS
+damnedest/MS
+damned/TR
+damn/GSBRD
+damning/Y
+Damocles/M
+Damon/M
+damped/U
+dampener/M
+dampen/RDZG
+damper/M
+dampness/MS
+damp/SGZTXYRDNP
+damselfly/MS
+damsel/MS
+damson/MS
+Danaë
+Dana/M
+Danbury/M
+dancelike
+dancer/M
+dance/SRDJGZ
+dandelion/MS
+dander/DMGS
+dandify/SDG
+dandily
+dandle/GSD
+dandruff/MS
+dandy/TRSM
+Danelaw/M
+Danella/M
+Danell/M
+Dane/SM
+Danette/M
+danger/DMG
+Dangerfield/M
+dangerousness/M
+dangerous/YP
+dangler/M
+dangle/ZGRSD
+dangling/Y
+dang/SGZRD
+Danial/M
+Dania/M
+Danica/M
+Danice/M
+Daniela/M
+Daniele/M
+Daniella/M
+Danielle/M
+Daniel/SM
+Danielson/M
+Danie/M
+Danika/M
+Danila/M
+Dani/M
+Danish
+danish/S
+Danita/M
+Danit/M
+dankness/MS
+dank/TPYR
+Danna/M
+Dannel/M
+Dannie/M
+Danni/M
+Dannye/M
+Danny/M
+danseuse/SM
+Dan/SM
+Dante/M
+Danton/M
+Danube/M
+Danubian
+Danville/M
+Danya/M
+Danyelle/M
+Danyette/M
+Danzig/M
+Daphene/M
+Daphna/M
+Daphne/M
+dapperness/M
+dapper/PSTRY
+dapple/SDG
+Dara/M
+Darbee/M
+Darbie/M
+Darb/M
+Darby/M
+Darcee/M
+Darcey/M
+Darcie/M
+Darci/M
+D'Arcy
+Darcy/M
+Darda/M
+Dardanelles
+daredevil/MS
+daredevilry/S
+Dareen/M
+Darelle/M
+Darell/M
+Dare/M
+Daren/M
+darer/M
+daresay
+dare/ZGDRSJ
+d'Arezzo
+Daria/M
+Darice/M
+Darill/M
+Dari/M
+daringness/M
+daring/PY
+Darin/M
+Dario/M
+Darius/M
+Darjeeling/M
+darkener/M
+darken/RDZG
+dark/GTXYRDNSP
+darkish
+darkly/TR
+darkness/MS
+darkroom/SM
+Darla/M
+Darleen/M
+Darlene/M
+Darline/M
+Darling/M
+darlingness/M
+Darlington/M
+darling/YMSP
+Darlleen/M
+Dar/MNH
+Darnall/M
+darned/TR
+Darnell/M
+darner/M
+darn/GRDZS
+darning/M
+Darn/M
+Daron/M
+DARPA/M
+Darrelle/M
+Darrell/M
+Darrel/M
+Darren/M
+Darrick/M
+Darrin/M
+Darrow/M
+Darryl/M
+Darsey/M
+Darsie/M
+d'art
+dartboard/SM
+darter/M
+Darth/M
+Dartmouth/M
+dart/MRDGZS
+Darvon/M
+Darwinian/S
+Darwinism/MS
+Darwinist/MS
+Darwin/M
+Darya/M
+Daryle/M
+Daryl/M
+Daryn/M
+Dasha/M
+dashboard/SM
+dasher/M
+dash/GZSRD
+dashiki/SM
+dashing/Y
+Dasie/M
+Dasi/M
+dastardliness/SM
+dastardly/P
+dastard/MYS
+Dasya/M
+DAT
+database/DSMG
+datafile
+datagram/MS
+data/M
+Datamation/M
+Datamedia/M
+dataset/S
+datedly
+datedness
+date/DRSMZGV
+dated/U
+dateless
+dateline/DSMG
+dater/M
+Datha/M
+dative/S
+Datsun/M
+datum/MS
+dauber/M
+daub/RDSGZ
+Daugherty/M
+daughter/MYS
+Daumier/M
+Daune/M
+daunt/DSG
+daunted/U
+daunting/Y
+dauntlessness/SM
+dauntless/PY
+dauphin/SM
+Davao/M
+Daveen/M
+Dave/M
+Daven/M
+Davenport/M
+davenport/MS
+Daveta/M
+Davey/M
+Davida/M
+Davidde/M
+Davide/M
+David/SM
+Davidson/M
+Davie/M
+Davina/M
+Davine/M
+Davinich/M
+Davin/M
+Davis/M
+Davita/M
+davit/SM
+Dav/MN
+Davon/M
+Davy/SM
+dawdler/M
+dawdle/ZGRSD
+Dawes/M
+Dawna/M
+dawn/GSDM
+Dawn/M
+Dawson/M
+daybed/S
+daybreak/SM
+daycare/S
+daydreamer/M
+daydream/RDMSZG
+Dayle/M
+daylight/GSDM
+Day/M
+Dayna/M
+daysack
+day/SM
+daytime/SM
+Dayton/M
+dazed/PY
+daze/DSG
+dazzler/M
+dazzle/ZGJRSD
+dazzling/Y
+db
+DB
+dbl
+dB/M
+DBMS
+DC
+DD
+Ddene/M
+DDS
+DDT
+DE
+deacon/DSMG
+deaconess/MS
+deadbeat/SM
+deadbolt/S
+deadener/M
+deadening/MY
+deaden/RDG
+deadhead/MS
+deadline/MGDS
+deadliness/SM
+deadlock/MGDS
+deadly/RPT
+deadness/M
+deadpanned
+deadpanner
+deadpanning
+deadpan/S
+dead/PTXYRN
+deadwood/SM
+deafening/MY
+deafen/JGD
+deafness/MS
+deaf/TXPYRN
+dealer/M
+dealership/MS
+dealing/M
+deallocator
+deal/RSGZJ
+dealt
+Deana/M
+dean/DMG
+Deandre/M
+Deane/M
+deanery/MS
+Dean/M
+Deanna/M
+Deanne/M
+Deann/M
+deanship/SM
+Dearborn/M
+dearness/MS
+dearth/M
+dearths
+dear/TYRHPS
+deary/MS
+deassign
+deathbed/MS
+deathblow/SM
+deathless/Y
+deathlike
+deathly/TR
+death/MY
+deaths
+deathtrap/SM
+deathward
+deathwatch/MS
+debacle/SM
+debarkation/SM
+debark/G
+debar/L
+debarment/SM
+debarring
+debaser/M
+debatable/U
+debate/BMZ
+debater/M
+debauchedness/M
+debauched/PY
+debauchee/SM
+debaucher/M
+debauchery/SM
+debauch/GDRS
+Debbie/M
+Debbi/M
+Debby/M
+Debee/M
+debenture/MS
+Debera/M
+debilitate/NGXSD
+debilitation/M
+debility/MS
+Debi/M
+debit/DG
+deb/MS
+Deb/MS
+debonairness/SM
+debonair/PY
+Deborah/M
+Debora/M
+Debor/M
+debouch/DSG
+Debra/M
+debrief/GJ
+debris/M
+debtor/SM
+debt/SM
+Debussy/M
+débutante/SM
+debut/MDG
+decade/MS
+decadency/S
+decadent/YS
+decaffeinate/DSG
+decaf/S
+decagon/MS
+Decalogue/M
+decal/SM
+decamp/L
+decampment/MS
+decapitate/GSD
+decapitator/SM
+decathlon/SM
+Decatur/M
+decay/GRD
+Decca/M
+Deccan/M
+decease/M
+decedent/MS
+deceitfulness/SM
+deceitful/PY
+deceit/SM
+deceived/U
+deceiver/M
+deceives/U
+deceive/ZGRSD
+deceivingly
+deceiving/U
+decelerate/XNGSD
+deceleration/M
+decelerator/SM
+December/SM
+decency/ISM
+decennial/SY
+decent/TIYR
+deception/SM
+deceptiveness/SM
+deceptive/YP
+decertify/N
+dechlorinate/N
+decibel/MS
+decidability/U
+decidable/U
+decidedness/M
+decided/PY
+decide/GRSDB
+deciduousness/M
+deciduous/YP
+decile/SM
+deciliter/SM
+decimal/SYM
+decimate/XNGDS
+decimation/M
+decimeter/MS
+decipherable/IU
+decipher/BRZG
+decipherer/M
+decisional
+decisioned
+decisioning
+decision/ISM
+decisive/IPY
+decisiveness/MSI
+deckchair
+decker/M
+Decker/M
+deck/GRDMSJ
+deckhand/S
+decking/M
+Deck/RM
+declamation/SM
+declamatory
+declarable
+declaration/MS
+declaration's/A
+declarative/SY
+declarator/MS
+declaratory
+declare/AGSD
+declared/U
+declarer/MS
+declension/SM
+declination/MS
+decliner/M
+decline/ZGRSD
+declivity/SM
+Dec/M
+DEC/M
+DECNET
+DECnet/M
+deco
+décolletage/S
+décolleté
+decolletes
+decolorising
+decomposability/M
+decomposable/IU
+decompose/B
+decompress/R
+decongestant/S
+deconstruction
+deconvolution
+decorated/AU
+decorate/NGVDSX
+decorates/A
+decorating/A
+decoration/ASM
+decorativeness/M
+decorative/YP
+decorator/SM
+decorousness/MS
+decorousness's/I
+decorous/PIY
+decor/S
+decorticate/GNDS
+decortication/M
+decorum/MS
+decoupage/MGSD
+decouple/G
+decoy/M
+decrease
+decreasing/Y
+decreeing
+decree/RSM
+decremental
+decrement/DMGS
+decrepit
+decrepitude/SM
+decriminalization/S
+decriminalize/DS
+decry/G
+decrypt/GD
+decryption
+DECstation/M
+DECsystem/M
+DECtape/M
+decustomised
+Dedekind/M
+Dede/M
+dedicate/AGDS
+dedicated/Y
+dedication/MS
+dedicative
+dedicator/MS
+dedicatory
+Dedie/M
+Dedra/M
+deduce/RSDG
+deducible
+deductibility/M
+deductible/S
+deduction/SM
+deductive/Y
+deduct/VG
+Deeanne/M
+Deeann/M
+deeded
+Deedee/M
+deeding
+deed/IS
+deed's
+deejay/MDSG
+Dee/M
+deem/ADGS
+deemphasis
+Deena/M
+deepen/DG
+deepish
+deepness/MS
+deep/PTXSYRN
+Deerdre/M
+Deere/M
+deerskin/MS
+deer/SM
+deerstalker/SM
+deerstalking/M
+Deeyn/M
+deface/LZ
+defacement/SM
+defaecate
+defalcate/NGXSD
+defalcation/M
+defamation/SM
+defamatory
+defamer/M
+defame/ZR
+defaulter/M
+default/ZR
+defeated/U
+defeater/M
+defeatism/SM
+defeatist/SM
+defeat/ZGD
+defecate/DSNGX
+defecation/M
+defection/SM
+defectiveness/MS
+defective/PYS
+defect/MDSVG
+defector/MS
+defendant/SM
+defended/U
+defenestrate/GSD
+defenselessness/MS
+defenseless/PY
+defenses/U
+defense/VGSDM
+defensibility/M
+defensible/I
+defensibly/I
+defensiveness/MS
+defensive/PSY
+deference/MS
+deferential/Y
+deferent/S
+deferrable
+deferral/SM
+deferred
+deferrer/MS
+deferring
+deffer
+defiance/MS
+defiant/Y
+defibrillator/M
+deficiency/MS
+deficient/SY
+deficit/MS
+defier/M
+defile/L
+defilement/MS
+definable/UI
+definably/I
+define/AGDRS
+defined/U
+definer/SM
+definite/IPY
+definiteness/IMS
+definitional
+definition/ASM
+definitiveness/M
+definitive/SYP
+defis
+deflate/XNGRSDB
+deflationary
+deflation/M
+deflect/DSGV
+deflected/U
+deflection/MS
+deflector/MS
+defocus
+defocussing
+Defoe/M
+defog
+defogger/S
+defoliant/SM
+defoliator/SM
+deformational
+deform/B
+deformed/U
+deformity/SM
+defrauder/M
+defraud/ZGDR
+defrayal/SM
+defroster/M
+defrost/RZ
+deftness/MS
+deft/TYRP
+defunct/S
+defying/Y
+defy/RDG
+def/Z
+deg
+Degas/M
+degassing
+degauss/GD
+degeneracy/MS
+degenerateness/M
+degenerate/PY
+degrade/B
+degradedness/M
+degraded/YP
+degrading/Y
+degrease
+degree/SM
+degum
+Dehlia/M
+dehumanize
+dehydrator/MS
+deicer/M
+deice/ZR
+deictic
+Deidre/M
+deification/M
+deify/SDXGN
+deign/DGS
+Deimos/M
+Deina/M
+Deirdre/MS
+deistic
+deist/SM
+Deity/M
+deity/SM
+deja
+deject/DSG
+dejectedness/M
+dejected/PY
+dejection/SM
+Dejesus/M
+DeKalb/M
+DeKastere/M
+Delacroix/M
+Delacruz/M
+Delainey/M
+Dela/M
+Delaney/M
+Delano/M
+Delawarean/SM
+Delaware/MS
+delay/D
+delayer/G
+Delbert/M
+Delcina/M
+Delcine/M
+delectableness/M
+delectable/SP
+delectably
+delectation/MS
+delegable
+Deleon/M
+deleted/U
+deleteriousness/M
+deleterious/PY
+delete/XBRSDNG
+deletion/M
+delfs
+Delft/M
+delft/MS
+delftware/S
+Delgado/M
+Delhi/M
+Delia/M
+deliberateness/SM
+deliberate/PVY
+deliberativeness/M
+deliberative/PY
+Delibes/M
+delicacy/IMS
+delicate/IYP
+delicatenesses
+delicateness/IM
+delicates
+delicatessen/MS
+deliciousness/MS
+delicious/YSP
+delicti
+delightedness/M
+delighted/YP
+delightfulness/M
+delightful/YP
+Delilah/M
+Delilahs
+Delila/M
+Delinda/M
+delineate/SDXVNG
+delineation/M
+delinquency/MS
+delinquent/SYM
+deliquesce/GSD
+deliquescent
+deliriousness/MS
+delirious/PY
+delirium/SM
+deli/SM
+Delius/M
+deliverables
+deliverable/U
+deliver/AGSD
+deliverance/SM
+delivered/U
+deliverer/SM
+delivery/AM
+deliverymen/M
+Della/M
+Dell/M
+dell/SM
+Dellwood/M
+Delly/M
+Delmar/M
+Delmarva/M
+Delmer/M
+Delmonico
+Delmore/M
+Delmor/M
+Del/MY
+Delora/M
+Delores/M
+Deloria/M
+Deloris/M
+Delphic
+Delphi/M
+Delphine/M
+Delphinia/M
+delphinium/SM
+Delphinus/M
+Delta/M
+delta/MS
+deltoid/SM
+deluder/M
+delude/RSDG
+deluding/Y
+deluge/SDG
+delusional
+delusion/SM
+delusiveness/M
+delusive/PY
+deluxe
+delve/GZSRD
+delver/M
+demagnify/N
+demagogic
+demagogue/GSDM
+demagoguery/SM
+demagogy/MS
+demander/M
+demand/GSRD
+demandingly
+demanding/U
+demarcate/SDNGX
+demarcation/M
+Demavend/M
+demean/GDS
+demeanor/SM
+dementedness/M
+demented/YP
+dementia/MS
+Demerol/M
+demesne/SM
+Demeter/M
+Demetra/M
+Demetre/M
+Demetria/M
+Demetri/MS
+Demetrius/M
+demigod/MS
+demijohn/MS
+demimondaine/SM
+demimonde/SM
+demineralization/SM
+Deming/M
+demise/DMG
+demit
+demitasse/MS
+demitted
+demitting
+Dem/MG
+democracy/MS
+Democratic
+democratically/U
+democratic/U
+democratization/MS
+democratize/DRSG
+democratizes/U
+Democrat/MS
+democrat/SM
+Democritus/M
+démodé
+demo/DMPG
+demographer/MS
+demographical/Y
+demographic/S
+demography/MS
+demolisher/M
+demolish/GSRD
+demolition/MS
+demonetization/S
+demoniacal/Y
+demoniac/S
+demonic
+demonology/M
+demon/SM
+demonstrable/I
+demonstrableness/M
+demonstrably/I
+demonstrate/XDSNGV
+demonstration/M
+demonstrativenesses
+demonstrativeness/UM
+demonstratives
+demonstrative/YUP
+demonstrator/MS
+demoralization/M
+demoralizer/M
+demoralizing/Y
+DeMorgan/M
+Demosthenes/M
+demote/DGX
+demotic/S
+Demott/M
+demount/B
+Dempsey/M
+demulcent/S
+demultiplex
+demureness/SM
+demure/YP
+demurral/MS
+demurred
+demurrer/MS
+demurring
+demur/RTS
+demythologization/M
+demythologize/R
+den
+Dena/M
+dendrite/MS
+Deneb/M
+Denebola/M
+Deneen/M
+Dene/M
+Deng/M
+dengue/MS
+deniable/U
+denial/SM
+Denice/M
+denier/M
+denigrate/VNGXSD
+denigration/M
+denim/SM
+Denise/M
+Deni/SM
+denizen/SMDG
+Den/M
+De/NM
+Denmark/M
+Denna/M
+denned
+Dennet/M
+Denney/M
+Dennie/M
+Denni/MS
+denning
+Dennison/M
+Denny/M
+denominate/V
+denominational/Y
+denote/B
+denouement/MS
+denounce/LZRSDG
+denouncement/SM
+denouncer/M
+dense/FR
+densely
+denseness/SM
+densitometer/MS
+densitometric
+densitometry/M
+density/MS
+dens/RT
+dental/YS
+dentifrice/SM
+dentine's
+dentin/SM
+dent/ISGD
+dentistry/MS
+dentist/SM
+dentition/MS
+dent's
+denture/IMS
+denuclearize/GSD
+denudation/SM
+denude/DG
+denuder/M
+denunciate/VNGSDX
+denunciation/M
+Denver/M
+denying/Y
+Deny/M
+Denys
+Denyse/M
+deny/SRDZG
+deodorant/SM
+deodorization/SM
+deodorize/GZSRD
+deodorizer/M
+Deon/M
+Deonne/M
+deoxyribonucleic
+depart/L
+departmentalization/SM
+departmentalize/DSG
+departmental/Y
+department/MS
+departure/MS
+dependability/MS
+dependableness/M
+dependable/P
+dependably
+Dependant/MS
+depend/B
+dependence/ISM
+dependency/MS
+dependent/IYS
+dependent's
+depicted/U
+depicter/M
+depiction/SM
+depict/RDSG
+depilatory/S
+deplete/VGNSDX
+depletion/M
+deplorableness/M
+deplorable/P
+deplorably
+deplorer/M
+deplore/SRDBG
+deploring/Y
+deployable
+deploy/AGDLS
+deployment/SAM
+depolarize
+deponent/S
+deportation/MS
+deportee/SM
+deport/LG
+deportment/MS
+depose
+deposit/ADGS
+depositary/M
+deposition/A
+depositor/SAM
+depository/MS
+depravedness/M
+depraved/PY
+deprave/GSRD
+depraver/M
+depravity/SM
+deprecate/XSDNG
+deprecating/Y
+deprecation/M
+deprecatory
+depreciable
+depreciate/XDSNGV
+depreciating/Y
+depreciation/M
+depreciative/Y
+depressant/S
+depressible
+depression/MS
+depressive/YS
+depressor/MS
+depress/V
+deprive/GSD
+depth/M
+depths
+Dept/M
+deputation/SM
+depute/SDG
+deputize/DSG
+deputy/MS
+dequeue
+derail/L
+dérailleur/MS
+derailment/MS
+derange/L
+derangement/MS
+Derbyshire/M
+derby/SM
+Derby/SM
+dereference/Z
+Derek/M
+dereliction/SM
+derelict/S
+Derick/M
+deride/D
+deriding/Y
+derision/SM
+derisiveness/MS
+derisive/PY
+derisory
+derivable/U
+derivate/XNV
+derivation/M
+derivativeness/M
+derivative/SPYM
+derive/B
+derived/U
+Derk/M
+Der/M
+dermal
+dermatitides
+dermatitis/MS
+dermatological
+dermatologist/MS
+dermatology/MS
+dermis/SM
+Dermot/M
+derogate/XDSNGV
+derogation/M
+derogatorily
+derogatory
+Derrek/M
+Derrick/M
+derrick/SMDG
+Derrida/M
+derrière/S
+Derrik/M
+Derril/M
+derringer/SM
+Derron/M
+Derry/M
+dervish/SM
+Derward/M
+Derwin/M
+Des
+desalinate/NGSDX
+desalination/M
+desalinization/MS
+desalinize/GSD
+desalt/G
+descant/M
+Descartes/M
+descendant/SM
+descended/FU
+descendent's
+descender/M
+descending/F
+descends/F
+descend/ZGSDR
+descent
+describable/I
+describe/ZB
+description/MS
+descriptiveness/MS
+descriptive/SYP
+descriptor/SM
+descry/SDG
+Desdemona/M
+desecrater/M
+desecrate/SRDGNX
+desecration/M
+deserter/M
+desertification
+desertion/MS
+desert/ZGMRDS
+deservedness/M
+deserved/YU
+deserve/J
+deserving/Y
+déshabillé's
+desiccant/S
+desiccate/XNGSD
+desiccation/M
+desiccator/SM
+desiderata
+desideratum/M
+designable
+design/ADGS
+designate/VNGSDX
+designational
+designation/M
+designator/SM
+designed/Y
+designer/M
+designing/U
+Desi/M
+desirabilia
+desirability's
+desirability/US
+desirableness/SM
+desirableness's/U
+desirable/UPS
+desirably/U
+Desirae/M
+desire/BR
+desired/U
+Desiree/M
+desirer/M
+Desiri/M
+desirousness/M
+desirous/PY
+desist/DSG
+desk/SM
+desktop/S
+Desmond/M
+Desmund/M
+desolateness/SM
+desolate/PXDRSYNG
+desolater/M
+desolating/Y
+desolation/M
+desorption/M
+despairer/M
+despairing/Y
+despair/SGDR
+desperadoes
+desperado/M
+desperateness/SM
+desperate/YNXP
+desperation/M
+despicable
+despicably
+despiser/M
+despise/SRDG
+despoil/L
+despoilment/MS
+despond
+despondence/S
+despondency/MS
+despondent/Y
+despotic
+despotically
+despotism/SM
+dessert/SM
+dessicate/DN
+d'Estaing
+destinate/NX
+destination/M
+destine/GSD
+destiny/MS
+destituteness/M
+destitute/NXP
+destitution/M
+destroy/BZGDRS
+destroyer/M
+destructibility/SMI
+destructible/I
+destruction/SM
+destructiveness/MS
+destructive/YP
+destructor/M
+destruct/VGSD
+desuetude/MS
+desultorily
+desultoriness/M
+desultory/P
+detachedness/M
+detached/YP
+detacher/M
+detach/LSRDBG
+detachment/SM
+detailedness/M
+detailed/YP
+detainee/S
+detainer/M
+detain/LGRDS
+detainment/MS
+d'etat
+detectability/U
+detectable/U
+detectably/U
+detect/DBSVG
+detected/U
+detection/SM
+detective/MS
+detector/MS
+détente
+detentes
+detention/SM
+detergency/M
+detergent/SM
+deteriorate/XDSNGV
+deterioration/M
+determent/SM
+determinability/M
+determinable/IP
+determinableness/IM
+determinacy/I
+determinant/MS
+determinateness/IM
+determinate/PYIN
+determination/IM
+determinativeness/M
+determinative/P
+determinedly
+determinedness/M
+determined/U
+determine/GASD
+determiner/SM
+determinism/MS
+determinism's/I
+deterministically
+deterministic/I
+deterred/U
+deterrence/SM
+deterrent/SMY
+deterring
+detersive/S
+deter/SL
+deters/V
+detestableness/M
+detestable/P
+detestably
+detestation/SM
+dethrone/L
+dethronement/SM
+detonable
+detonated/U
+detonate/XDSNGV
+detonation/M
+detonator/MS
+detour/G
+detoxification/M
+detoxify/NXGSD
+detox/SDG
+detract/GVD
+detractive/Y
+d'etre
+detribalize/GSD
+detrimental/SY
+detriment/SM
+detritus/M
+Detroit/M
+deuced/Y
+deuce/SDGM
+deus
+deuterium/MS
+deuteron/M
+Deuteronomy/M
+Deutsch/M
+Deva/M
+Devanagari/M
+Devan/M
+devastate/XVNGSD
+devastating/Y
+devastation/M
+devastator/SM
+develop/ALZSGDR
+developed/U
+developer/MA
+developmental/Y
+development/ASM
+deviance/MS
+deviancy/S
+deviant/YMS
+deviated/U
+deviate/XSDGN
+deviating/U
+deviation/M
+devilishness/MS
+devilish/PY
+devilment/SM
+devilry/MS
+devil/SLMDG
+deviltry/MS
+Devi/M
+Devina/M
+Devin/M
+Devinne/M
+deviousness/SM
+devious/YP
+devise/JR
+deviser/M
+Devland/M
+Devlen/M
+Devlin/M
+Dev/M
+devoice
+devolution/MS
+devolve/GSD
+Devondra/M
+Devonian
+Devon/M
+Devonna/M
+Devonne/M
+Devonshire/M
+Devora/M
+devoted/Y
+devotee/MS
+devote/XN
+devotional/YS
+devotion/M
+devourer/M
+devour/SRDZG
+devoutness/MS
+devout/PRYT
+Devy/M
+Dewain/M
+dewar
+Dewar/M
+Dewayne/M
+dewberry/MS
+dewclaw/SM
+dewdrop/MS
+Dewey/M
+Dewie/M
+dewiness/MS
+Dewitt/M
+dewlap/MS
+Dew/M
+dew/MDGS
+dewy/TPR
+Dexedrine/M
+dexes/I
+Dex/M
+dexter
+dexterity/MS
+Dexter/M
+dexterousness/MS
+dexterous/PY
+dextrose/SM
+DH
+Dhaka
+Dhaulagiri/M
+dhoti/SM
+dhow/MS
+DI
+diabase/M
+diabetes/M
+diabetic/S
+diabolic
+diabolicalness/M
+diabolical/YP
+diabolism/M
+diachronic/P
+diacritical/YS
+diacritic/MS
+diadem/GMDS
+diaereses
+diaeresis/M
+Diaghilev/M
+diagnometer/SM
+diagnosable/U
+diagnose/BGDS
+diagnosed/U
+diagnosis/M
+diagnostically
+diagnostician/SM
+diagnostic/MS
+diagnostics/M
+diagonalize/GDSB
+diagonal/YS
+diagrammable
+diagrammatic
+diagrammaticality
+diagrammatically
+diagrammed
+diagrammer/SM
+diagramming
+diagram/MS
+Diahann/M
+dialectal/Y
+dialectical/Y
+dialectic/MS
+dialect/MS
+dialed/A
+dialer/M
+dialing/M
+dial/MRDSGZJ
+dialogged
+dialogging
+dialog/MS
+dials/A
+dialysis/M
+dialyzed/U
+dialyzes
+diam
+diamagnetic
+diameter/MS
+diametric
+diametrical/Y
+diamondback/SM
+diamond/GSMD
+Diana/M
+Diandra/M
+Diane/M
+Dianemarie/M
+Dian/M
+Dianna/M
+Dianne/M
+Diann/M
+Diannne/M
+diapason/MS
+diaper/SGDM
+diaphanousness/M
+diaphanous/YP
+diaphragmatic
+diaphragm/SM
+diarist/SM
+Diarmid/M
+diarrheal
+diarrhea/MS
+diary/MS
+diaspora
+Diaspora/SM
+diastase/SM
+diastole/MS
+diastolic
+diathermy/SM
+diathesis/M
+diatomic
+diatom/SM
+diatonic
+diatribe/MS
+Diaz's
+dibble/SDMG
+dibs
+DiCaprio/M
+dice/GDRS
+dicer/M
+dicey
+dichloride/M
+dichotomization/M
+dichotomize/DSG
+dichotomous/PY
+dichotomy/SM
+dicier
+diciest
+dicing/M
+Dickensian/S
+dickens/M
+Dickens/M
+dicker/DG
+Dickerson/M
+dickey/SM
+dick/GZXRDMS!
+Dickie/M
+dickier
+dickiest
+Dickinson/M
+Dickson/M
+Dick/XM
+Dicky/M
+dicky's
+dicotyledonous
+dicotyledon/SM
+dicta/M
+Dictaphone/SM
+dictate/SDNGX
+dictation/M
+dictatorialness/M
+dictatorial/YP
+dictator/MS
+dictatorship/SM
+dictionary/SM
+diction/MS
+dictum/M
+didactically
+didactic/S
+didactics/M
+did/AU
+diddler/M
+diddle/ZGRSD
+Diderot/M
+Didi/M
+didn't
+didoes
+dido/M
+Dido/M
+didst
+die/DS
+Diefenbaker/M
+Diego/M
+dieing
+dielectric/MS
+diem
+Diem/M
+Diena/M
+Dierdre/M
+diereses
+dieresis/M
+diesel/GMDS
+Diesel's
+dies's
+dies/U
+dietary/S
+dieter/M
+Dieter/M
+dietetic/S
+dietetics/M
+diethylaminoethyl
+diethylstilbestrol/M
+dietitian/MS
+diet/RDGZSM
+Dietrich/M
+Dietz/M
+difference/DSGM
+difference's/I
+differences/I
+differentiability
+differentiable
+differential/SMY
+differentiated/U
+differentiate/XSDNG
+differentiation/M
+differentiator/SM
+differentness
+different/YI
+differ/SZGRD
+difficile
+difficult/Y
+difficulty/SM
+diffidence/MS
+diffident/Y
+diffract/GSD
+diffraction/SM
+diffractometer/SM
+diffuseness/MS
+diffuse/PRSDZYVXNG
+diffuser/M
+diffusible
+diffusional
+diffusion/M
+diffusiveness/M
+diffusive/YP
+diffusivity/M
+digerati
+digested/IU
+digester/M
+digestibility/MS
+digestible/I
+digestifs
+digestion/ISM
+digestive/YSP
+digest/RDVGS
+digger/MS
+digging/S
+digitalis/M
+digitalization/MS
+digitalized
+digitalizes
+digitalizing
+digital/SY
+digitization/M
+digitizer/M
+digitize/ZGDRS
+digit/SM
+dignified/U
+dignify/DSG
+dignitary/SM
+dignity/ISM
+digram
+digraph/M
+digraphs
+digress/GVDS
+digression/SM
+digressiveness/M
+digressive/PY
+dig/TS
+dihedral
+Dijkstra/M
+Dijon/M
+dike/DRSMG
+diker/M
+diktat/SM
+Dilan/M
+dilapidate/XGNSD
+dilapidation/M
+dilatation/SM
+dilated/YP
+dilate/XVNGSD
+dilation/M
+dilatoriness/M
+dilator/SM
+dilatory/P
+Dilbert/M
+dilemma/MS
+dilettante/MS
+dilettantish
+dilettantism/MS
+diligence/SM
+diligentness/M
+diligent/YP
+dilithium
+Dillard/M
+Dillie/M
+Dillinger/M
+dilling/R
+dillis
+Dill/M
+Dillon/M
+dill/SGMD
+dillydally/GSD
+Dilly/M
+dilly/SM
+dilogarithm
+diluent
+diluted/U
+diluteness/M
+dilute/RSDPXYVNG
+dilution/M
+Di/M
+DiMaggio/M
+dimensionality/M
+dimensional/Y
+dimensionless
+dimension/MDGS
+dimer/M
+dime/SM
+dimethylglyoxime
+dimethyl/M
+diminished/U
+diminish/SDGBJ
+diminuendo/SM
+diminution/SM
+diminutiveness/M
+diminutive/SYP
+Dimitri/M
+Dimitry/M
+dimity/MS
+dimmed/U
+dimmer/MS
+dimmest
+dimming
+dimness/SM
+dimorphism/M
+dimple/MGSD
+dimply/RT
+dim/RYPZS
+dimwit/MS
+dimwitted
+Dinah/M
+Dina/M
+dinar/SM
+diner/M
+dine/S
+dinette/MS
+dingbat/MS
+ding/GD
+dinghy/SM
+dingily
+dinginess/SM
+dingle/MS
+dingoes
+dingo/MS
+dingus/SM
+dingy/PRST
+dinky/RST
+din/MDRZGS
+dinned
+dinner/SM
+dinnertime/S
+dinnerware/MS
+Dinnie/M
+dinning
+Dinny/M
+Dino/M
+dinosaur/MS
+dint/SGMD
+diocesan/S
+diocese/SM
+Diocletian/M
+diode/SM
+Diogenes/M
+Dione/M
+Dionisio/M
+Dionis/M
+Dion/M
+Dionne/M
+Dionysian
+Dionysus/M
+Diophantine/M
+diopter/MS
+diorama/SM
+Dior/M
+dioxalate
+dioxide/MS
+dioxin/S
+diphtheria/SM
+diphthong/SM
+diplexers
+diploid/S
+diplomacy/SM
+diploma/SMDG
+diplomata
+diplomatically
+diplomatic/S
+diplomatics/M
+diplomatist/SM
+diplomat/MS
+dipodic
+dipody/M
+dipole/MS
+dipped
+Dipper/M
+dipper/SM
+dipping/S
+dippy/TR
+dip/S
+dipsomaniac/MS
+dipsomania/SM
+dipstick/MS
+dipterous
+diptych/M
+diptychs
+Dir
+Dirac/M
+directed/IUA
+directionality
+directional/SY
+direction/MIS
+directions/A
+directive/SM
+directivity/M
+directly/I
+directness/ISM
+director/AMS
+directorate/SM
+directorial
+directorship/SM
+directory/SM
+direct/RDYPTSVG
+directrix/MS
+directs/IA
+direful/Y
+direness/M
+dire/YTRP
+dirge/GSDM
+Dirichlet/M
+dirigible/S
+dirk/GDMS
+Dirk/M
+dirndl/MS
+dirtily
+dirtiness/SM
+dirt/MS
+dirty/GPRSDT
+Dis
+disable/LZGD
+disablement/MS
+disabler/M
+disabuse
+disadvantaged/P
+disagreeable/S
+disallow/D
+disambiguate/DSGNX
+disappointed/Y
+disappointing/Y
+disarming/Y
+disarrange/L
+disastrous/Y
+disband/L
+disbandment/SM
+disbar/L
+disbarment/MS
+disbarring
+disbelieving/Y
+disbursal/S
+disburse/GDRSL
+disbursement/MS
+disburser/M
+discerner/M
+discernibility
+discernible/I
+discernibly
+discerning/Y
+discernment/MS
+discern/SDRGL
+disc/GDM
+discharged/U
+disciple/DSMG
+discipleship/SM
+disciplinarian/SM
+disciplinary
+disciplined/U
+discipline/IDM
+discipliner/M
+disciplines
+disciplining
+disclosed/U
+discography/MS
+discolored/MP
+discoloreds/U
+discolor/G
+discombobulate/SDGNX
+discomfit/DG
+discomfiture/MS
+disco/MG
+discommode/DG
+disconcerting/Y
+disconnectedness/S
+disconnected/P
+disconnecter/M
+disconnect/R
+disconsolate/YN
+discordance/SM
+discordant/Y
+discord/G
+discorporate/D
+discotheque/MS
+discount/B
+discourage/LGDR
+discouragement/MS
+discouraging/Y
+discoverable/I
+discover/ADGS
+discovered/U
+discoverer/S
+discovery/SAM
+discreetly/I
+discreetness's/I
+discreetness/SM
+discreet/TRYP
+discrepancy/SM
+discrepant/Y
+discreteness/SM
+discrete/YPNX
+discretionary
+discretion/IMS
+discretization
+discretized
+discriminable
+discriminant/MS
+discriminated/U
+discriminate/SDVNGX
+discriminating/YI
+discrimination/MI
+discriminator/MS
+discriminatory
+discursiveness/S
+discussant/MS
+discussed/UA
+discusser/M
+discussion/SM
+discus/SM
+disdainfulness/M
+disdainful/YP
+disdain/MGSD
+disease/G
+disembowelment/SM
+disembowel/SLGD
+disengage/L
+disfigure/L
+disfigurement/MS
+disfranchise/L
+disfranchisement/MS
+disgorge
+disgrace/R
+disgracer/M
+disgruntle/DSLG
+disgruntlement/MS
+disguised/UY
+disguise/R
+disguiser/M
+disgust
+disgusted/Y
+disgustful/Y
+disgusting/Y
+dishabille/SM
+disharmonious
+dishcloth/M
+dishcloths
+dishevel/LDGS
+dishevelment/MS
+dish/GD
+dishonest
+dishonored/U
+dishpan/MS
+dishrag/SM
+dishtowel/SM
+dishwasher/MS
+dishwater/SM
+disillusion/LGD
+disillusionment/SM
+disinfectant/MS
+disinherit
+disinterestedness/SM
+disinterested/P
+disinvest/L
+disjoin
+disjointedness/S
+disjunctive/YS
+disjunct/VS
+disk/D
+diskette/S
+dislike/G
+dislodge/LG
+dislodgement/M
+dismalness/M
+dismal/PSTRY
+dismantle/L
+dismantlement/SM
+dismay/D
+dismayed/U
+dismaying/Y
+dis/MB
+dismember/LG
+dismemberment/MS
+dismissive/Y
+dismiss/RZ
+Disneyland/M
+Disney/M
+disoblige/G
+disorderedness/M
+disordered/YP
+disorderliness/M
+disorderly/P
+disorder/Y
+disorganize
+disorganized/U
+disparagement/MS
+disparager/M
+disparage/RSDLG
+disparaging/Y
+disparateness/M
+disparate/PSY
+dispatch/Z
+dispelled
+dispelling
+dispel/S
+dispensable/I
+dispensary/MS
+dispensate/NX
+dispensation/M
+dispenser/M
+dispense/ZGDRSB
+dispersal/MS
+dispersant/M
+dispersed/Y
+disperser/M
+disperse/XDRSZLNGV
+dispersible
+dispersion/M
+dispersiveness/M
+dispersive/PY
+dispirit/DSG
+displace/L
+display/AGDS
+displayed/U
+displeased/Y
+displease/G
+displeasure
+disport
+disposable/S
+disposal/SM
+dispose/IGSD
+dispositional
+disposition/ISM
+disproportional
+disproportionate/N
+disproportionation/M
+disprove/B
+disputable/I
+disputably/I
+disputant/SM
+disputation/SM
+disputatious/Y
+disputed/U
+disputer/M
+dispute/ZBGSRD
+disquieting/Y
+disquiet/M
+disquisition/SM
+Disraeli/M
+disregardful
+disrepair/M
+disreputableness/M
+disreputable/P
+disrepute/M
+disrespect
+disrupted/U
+disrupter/M
+disrupt/GVDRS
+disruption/MS
+disruptive/YP
+disruptor/M
+dissatisfy
+dissect/DG
+dissed
+dissembler/M
+dissemble/ZGRSD
+disseminate/XGNSD
+dissemination/M
+dissension/SM
+dissenter/M
+dissent/ZGSDR
+dissertation/SM
+disservice
+disses
+dissever
+dissidence/SM
+dissident/MS
+dissimilar/S
+dissing
+dissipatedly
+dissipatedness/M
+dissipated/U
+dissipater/M
+dissipate/XRSDVNG
+dissipation/M
+dissociable/I
+dissociate/DSXNGV
+dissociated/U
+dissociation/M
+dissociative/Y
+dissoluble/I
+dissoluteness/SM
+dissolute/PY
+dissolve/ASDG
+dissolved/U
+dissonance/SM
+dissonant/Y
+dissuade/GDRS
+dissuader/M
+dissuasive
+dist
+distaff/SM
+distal/Y
+distance/DSMG
+distantness/M
+distant/YP
+distaste
+distemper
+distend
+distension
+distention/SM
+distillate/XNMS
+distillation/M
+distillery/MS
+distincter
+distinctest
+distinction/MS
+distinctiveness/MS
+distinctive/YP
+distinct/IYVP
+distinctness/MSI
+distinguishable/I
+distinguishably/I
+distinguish/BDRSG
+distinguished/U
+distinguisher/M
+distort/BGDR
+distorted/U
+distorter/M
+distortion/MS
+distract/DG
+distractedness/M
+distracted/YP
+distracting/Y
+distrait
+distraught/Y
+distress
+distressful
+distressing/Y
+distribute/ADXSVNGB
+distributed/U
+distributer
+distributional
+distribution/AM
+distributiveness/M
+distributive/SPY
+distributivity
+distributorship/M
+distributor/SM
+district/GSAD
+district's
+distrust/G
+disturbance/SM
+disturbed/U
+disturber/M
+disturbing/Y
+disturb/ZGDRS
+disulfide/M
+disuse/M
+disyllable/M
+Dita/M
+ditcher/M
+ditch/MRSDG
+dither/RDZSG
+ditsy/TR
+ditto/DMGS
+ditty/SDGM
+Ditzel/M
+ditz/S
+diuresis/M
+diuretic/S
+diurnal/SY
+divalent/S
+diva/MS
+divan/SM
+dived/M
+divergence/SM
+divergent/Y
+diverge/SDG
+diver/M
+diverseness/MS
+diverse/XYNP
+diversification/M
+diversifier/M
+diversify/GSRDNX
+diversionary
+diversion/M
+diversity/SM
+divert/GSD
+diverticulitis/SM
+divertimento/M
+dive/S
+divestiture/MS
+divest/LDGS
+divestment/S
+dividable
+divide/AGDS
+divided/U
+dividend/MS
+divider/MS
+divination/SM
+diviner/M
+divine/RSDTZYG
+divinity/MS
+divisibility/IMS
+divisible/I
+divisional
+division/SM
+divisiveness/MS
+divisive/PY
+divisor/SM
+divorcée/MS
+divorce/GSDLM
+divorcement/MS
+divot/MS
+div/TZGJDRS
+divulge/GSD
+divvy/GSDM
+Dixiecrat/MS
+dixieland
+Dixieland/MS
+Dixie/M
+Dix/M
+Dixon/M
+dizzily
+dizziness/SM
+dizzying/Y
+dizzy/PGRSDT
+DJ
+Djakarta's
+djellabah's
+djellaba/S
+d/JGVX
+Djibouti/M
+DMD
+Dmitri/M
+DMZ
+DNA
+Dnepropetrovsk/M
+Dnepr's
+Dnieper's
+Dniester/M
+Dniren/M
+DOA
+doable
+DOB
+Dobbin/M
+dobbin/MS
+Doberman
+Dobro/M
+docent/SM
+docile/Y
+docility/MS
+docker/M
+docket/GSMD
+dock/GZSRDM
+dockland/MS
+dockside/M
+dockworker/S
+dockyard/SM
+doc/MS
+Doctor
+doctoral
+doctorate/SM
+doctor/GSDM
+Doctorow/M
+doctrinaire/S
+doctrinal/Y
+doctrine/SM
+docudrama/S
+documentary/MS
+documentation/MS
+documented/U
+document/RDMZGS
+DOD
+dodder/DGS
+dodecahedra
+dodecahedral
+dodecahedron/M
+Dode/M
+dodge/GZSRD
+Dodge/M
+dodgem/S
+dodger/M
+Dodgson/M
+Dodie/M
+Dodi/M
+Dodington/M
+Dodoma/M
+dodo/SM
+Dodson/M
+Dody/M
+DOE
+Doe/M
+doe/MS
+doer/MU
+does/AU
+doeskin/MS
+doesn't
+d'oeuvre
+doff/SGD
+dogcart/SM
+dogcatcher/MS
+dogeared
+Doge/M
+doge/SM
+dogfight/GMS
+dogfish/SM
+dogfought
+doggedness/SM
+dogged/PY
+doggerel/SM
+dogging
+doggone/RSDTG
+doggy/SRMT
+doghouse/SM
+dogie/SM
+doglegged
+doglegging
+dogleg/SM
+dogma/MS
+dogmatically/U
+dogmatic/S
+dogmatics/M
+dogmatism/SM
+dogmatist/SM
+dogsbody/M
+dog/SM
+dogtooth/M
+Dogtown/M
+dogtrot/MS
+dogtrotted
+dogtrotting
+dogwood/SM
+dogy's
+Doha/M
+doh's
+doily/SM
+doing/MU
+Dolby/SM
+doldrum/S
+doldrums/M
+doled/F
+dolefuller
+dolefullest
+dolefulness/MS
+doleful/PY
+Dole/M
+dole/MGDS
+doles/F
+Dolf/M
+doling/F
+dollar/SM
+Dolley/M
+Dollie/M
+Dolli/M
+Doll/M
+doll/MDGS
+dollop/GSMD
+Dolly/M
+dolly/SDMG
+dolmen/MS
+dolomite/SM
+dolomitic
+Dolores/M
+Dolorita/SM
+dolorous/Y
+dolor/SM
+dolphin/SM
+Dolph/M
+doltishness/SM
+doltish/YP
+dolt/MS
+domain/MS
+dome/DSMG
+Domenic/M
+Domenico/M
+Domeniga/M
+Domesday/M
+domestically
+domesticate/DSXGN
+domesticated/U
+domestication/M
+domesticity/MS
+domestic/S
+domicile/SDMG
+domiciliary
+dominance/MS
+dominant/YS
+dominate/VNGXSD
+domination/M
+dominator/M
+dominatrices
+dominatrix
+domineer/DSG
+domineeringness/M
+domineering/YP
+Dominga/M
+Domingo/M
+Dominguez/M
+Dominica/M
+Dominican/MS
+Dominick/M
+Dominic/M
+Dominik/M
+Domini/M
+dominion/MS
+Dominique/M
+dominoes
+domino/M
+Domitian/M
+Dom/M
+Donahue/M
+Donald/M
+Donaldson/M
+Donall/M
+Donal/M
+Donalt/M
+Dona/M
+dona/MS
+Donatello/M
+donate/XVGNSD
+donation/M
+donative/M
+Donaugh/M
+Donavon/M
+done/AUF
+Donella/M
+Donelle/M
+Donetsk/M
+Donetta/M
+dong/GDMS
+dongle/S
+Donia/M
+Donica/M
+Donielle/M
+Donizetti/M
+donkey/MS
+Donna/M
+Donnamarie/M
+donned
+Donnell/M
+Donnelly/M
+Donne/M
+Donner/M
+Donnie/M
+Donni/M
+donning
+donnishness/M
+donnish/YP
+Donn/RM
+donnybrook/MS
+Donny/M
+donor/MS
+Donovan/M
+don/S
+Don/SM
+don't
+donut/MS
+donutted
+donutting
+doodad/MS
+doodlebug/MS
+doodler/M
+doodle/SRDZG
+doohickey/MS
+Dooley/M
+Doolittle/M
+doom/MDGS
+doomsday/SM
+Doonesbury/M
+doorbell/SM
+door/GDMS
+doorhandles
+doorkeeper/M
+doorkeep/RZ
+doorknob/SM
+doorman/M
+doormat/SM
+doormen
+doornail/M
+doorplate/SM
+doors/I
+doorstep/MS
+doorstepped
+doorstepping
+doorstop/MS
+doorway/MS
+dooryard/SM
+dopamine
+dopant/M
+dopa/SM
+dope/DRSMZG
+doper/M
+dopey
+dopier
+dopiest
+dopiness/S
+Doppler/M
+Dorado/M
+Doralia/M
+Doralin/M
+Doralyn/M
+Doralynne/M
+Doralynn/M
+Dora/M
+Dorcas
+Dorchester/M
+Doreen/M
+Dorelia/M
+Dorella/M
+Dorelle/M
+Doré/M
+Dorena/M
+Dorene/M
+Doretta/M
+Dorette/M
+Dorey/M
+Doria/M
+Dorian/M
+Doric
+Dorice/M
+Dorie/M
+Dori/MS
+Dorine/M
+Dorisa/M
+Dorise/M
+Dorita/M
+dork/S
+dorky/RT
+dormancy/MS
+dormant/S
+dormer/M
+dormice
+dormitory/SM
+dorm/MRZS
+dormouse/M
+Dorolice/M
+Dorolisa/M
+Doro/M
+Dorotea/M
+Doroteya/M
+Dorothea/M
+Dorothee/M
+Dorothy/M
+Dorree/M
+Dorrie/M
+Dorri/SM
+Dorry/M
+dorsal/YS
+Dorsey/M
+Dorthea/M
+Dorthy/M
+Dortmund/M
+Dory/M
+dory/SM
+DOS
+dosage/SM
+dose/M
+dos/GDS
+Dosi/M
+dosimeter/MS
+dosimetry/M
+dossier/MS
+dost
+Dostoevsky/M
+DOT
+dotage/SM
+dotard/MS
+doter/M
+dote/S
+Doti/M
+doting/Y
+Dot/M
+dot/MDRSJZG
+Dotson/M
+dotted
+Dottie/M
+Dotti/M
+dottiness/M
+dotting
+Dotty/M
+dotty/PRT
+do/TZRHGJ
+Douala/M
+Douay/M
+Doubleday/M
+doubled/UA
+double/GPSRDZ
+doubleheader/MS
+doubleness/M
+doubler/M
+doubles/M
+doublespeak/S
+doublethink/M
+doublet/MS
+doubleton/M
+doubling/A
+doubloon/MS
+doubly
+doubt/AGSDMB
+doubted/U
+doubter/SM
+doubtfulness/SM
+doubtful/YP
+doubting/Y
+doubtlessness/M
+doubtless/YP
+douche/GSDM
+Dougherty/M
+dough/M
+doughs
+doughty/RT
+doughy/RT
+Dougie/M
+Douglas/M
+Douglass
+Doug/M
+Dougy/M
+dourness/MS
+Douro/M
+dour/TYRP
+douser/M
+douse/SRDG
+dovecote/MS
+Dover/M
+dove/RSM
+dovetail/GSDM
+dovish
+Dov/MR
+dowager/SM
+dowdily
+dowdiness/MS
+dowdy/TPSR
+dowel/GMDS
+dower/GDMS
+Dow/M
+downbeat/SM
+downcast/S
+downdraft/M
+downer/M
+Downey/M
+downfall/NMS
+downgrade/GSD
+down/GZSRD
+downheartedness/MS
+downhearted/PY
+downhill/RS
+downland
+download/DGS
+downpipes
+downplay/GDS
+downpour/MS
+downrange
+downrightness/M
+downright/YP
+downriver
+Downs
+downscale/GSD
+downside/S
+downsize/DSG
+downslope
+downspout/SM
+downstage/S
+downstairs
+downstate/SR
+downstream
+downswing/MS
+downtime/SM
+downtowner/M
+downtown/MRS
+downtrend/M
+downtrodden
+downturn/MS
+downwardness/M
+downward/YPS
+downwind
+downy/RT
+dowry/SM
+dowse/GZSRD
+dowser/M
+doxology/MS
+doyenne/SM
+doyen/SM
+Doyle/M
+Doy/M
+doze
+dozen/GHD
+dozenths
+dozer/M
+doz/XGNDRS
+dozy
+DP
+DPs
+dpt
+DPT
+drabbed
+drabber
+drabbest
+drabbing
+drabness/MS
+drab/YSP
+drachma/MS
+Draco/M
+draconian
+Draconian
+Dracula/M
+draft/AMDGS
+draftee/SM
+drafter/MS
+draftily
+draftiness/SM
+drafting/S
+draftsman/M
+draftsmanship/SM
+draftsmen
+draftsperson
+draftswoman
+draftswomen
+drafty/PTR
+dragged
+dragger/M
+dragging/Y
+draggy/RT
+drag/MS
+dragnet/MS
+dragonfly/SM
+dragonhead/M
+dragon/SM
+dragoon/DMGS
+drainage/MS
+drainboard/SM
+drained/U
+drainer/M
+drainpipe/MS
+drain/SZGRDM
+Drake/M
+drake/SM
+Dramamine/MS
+drama/SM
+dramatically/U
+dramatical/Y
+dramatic/S
+dramatics/M
+dramatist/MS
+dramatization/MS
+dramatized/U
+dramatizer/M
+dramatize/SRDZG
+dramaturgy/M
+Drambuie/M
+drammed
+dramming
+dram/MS
+drank
+Drano/M
+draper/M
+drapery/MS
+drape/SRDGZ
+drastic
+drastically
+drat/S
+dratted
+dratting
+Dravidian/M
+drawable
+draw/ASG
+drawback/MS
+drawbridge/SM
+drawer/SM
+drawing/SM
+drawler/M
+drawling/Y
+drawl/RDSG
+drawly
+drawn/AI
+drawnly
+drawnness
+drawstring/MS
+dray/SMDG
+dreadfulness/SM
+dreadful/YPS
+dreadlocks
+dreadnought/SM
+dread/SRDG
+dreamboat/SM
+dreamed/U
+dreamer/M
+dreamily
+dreaminess/SM
+dreaming/Y
+dreamland/SM
+dreamlessness/M
+dreamless/PY
+dreamlike
+dream/SMRDZG
+dreamworld/S
+dreamy/PTR
+drearily
+dreariness/SM
+drear/S
+dreary/TRSP
+Dreddy/M
+dredge/MZGSRD
+dredger/M
+Dredi/M
+dreg/MS
+Dreiser/M
+Dre/M
+drencher/M
+drench/GDRS
+Dresden/M
+dress/ADRSG
+dressage/MS
+dressed/U
+dresser/MS
+dresser's/A
+dresses/U
+dressiness/SM
+dressing/MS
+dressmaker/MS
+dressmaking/SM
+dressy/PTR
+drew/A
+Drew/M
+Drexel/M
+Dreyfus/M
+Dreyfuss
+dribble/DRSGZ
+dribbler/M
+driblet/SM
+drib/SM
+dried/U
+drier/M
+drifter/M
+drifting/Y
+drift/RDZSG
+driftwood/SM
+driller/M
+drilling/M
+drillmaster/SM
+drill/MRDZGS
+drinkable/S
+drink/BRSZG
+drinker/M
+dripped
+dripping/MS
+drippy/RT
+drip/SM
+driveler/M
+drivel/GZDRS
+driven/P
+driver/M
+drive/SRBGZJ
+driveway/MS
+drizzle/DSGM
+drizzling/Y
+drizzly/TR
+Dr/M
+drogue/MS
+drollery/SM
+drollness/MS
+droll/RDSPTG
+drolly
+dromedary/MS
+Drona/M
+drone/SRDGM
+droning/Y
+drool/GSRD
+droopiness/MS
+drooping/Y
+droop/SGD
+droopy/PRT
+drophead
+dropkick/S
+droplet/SM
+dropout/MS
+dropped
+dropper/SM
+dropping/MS
+dropsical
+drop/SM
+dropsy/MS
+drosophila/M
+dross/SM
+drought/SM
+drover/M
+drove/SRDGZ
+drowner/M
+drown/RDSJG
+drowse/SDG
+drowsily
+drowsiness/SM
+drowsy/PTR
+drubbed
+drubber/MS
+drubbing/SM
+drub/S
+Drucie/M
+Drucill/M
+Druci/M
+Drucy/M
+drudge/MGSRD
+drudger/M
+drudgery/SM
+drudging/Y
+Drud/M
+drugged
+druggie/SRT
+drugging
+druggist/SM
+Drugi/M
+drugless
+drug/SM
+drugstore/SM
+druidism/MS
+druid/MS
+Druid's
+Dru/M
+drumbeat/SGM
+drumhead/M
+drumlin/MS
+drummed
+drummer/SM
+drumming
+Drummond/M
+drum/SM
+drumstick/SM
+drunkard/SM
+drunkenness/SM
+drunken/YP
+drunk/SRNYMT
+drupe/SM
+Drury/M
+Drusie/M
+Drusilla/M
+Drusi/M
+Drusy/M
+druthers
+dryad/MS
+Dryden/M
+dryer/MS
+dry/GYDRSTZ
+dryish
+dryness/SM
+drys
+drystone
+drywall/GSD
+D's
+d's/A
+Dshubba/M
+DST
+DTP
+dualism/MS
+dualistic
+dualist/M
+duality/MS
+dual/YS
+Duane/M
+Dubai/M
+dubbed
+dubber/S
+dubbing/M
+dubbin/MS
+Dubcek/M
+Dubhe/M
+dubiety/MS
+dubiousness/SM
+dubious/YP
+Dublin/M
+Dubrovnik/M
+dub/S
+Dubuque/M
+ducal
+ducat/SM
+duce/CAIKF
+duce's
+Duchamp/M
+duchess/MS
+duchy/SM
+duckbill/SM
+ducker/M
+duck/GSRDM
+duckling/SM
+duckpins
+duckpond
+duckweed/MS
+ducky/RSMT
+ducted/CFI
+ductile/I
+ductility/SM
+ducting/F
+duct/KMSF
+ductless
+duct's/A
+ducts/CI
+ductwork/M
+dudder
+dude/MS
+dudgeon/SM
+dud/GMDS
+Dudley/M
+Dud/M
+duelist/MS
+duel/MRDGZSJ
+dueness/M
+duenna/MS
+due/PMS
+duet/MS
+duetted
+duetting
+duffel/M
+duffer/M
+duff/GZSRDM
+Duffie/M
+Duff/M
+Duffy/M
+Dugald/M
+dugout/SM
+dug/S
+duh
+DUI
+Duisburg/M
+dukedom/SM
+duke/DSMG
+Duke/M
+Dukey/M
+Dukie/M
+Duky/M
+Dulcea/M
+Dulce/M
+dulcet/SY
+Dulcia/M
+Dulciana/M
+Dulcie/M
+dulcify
+Dulci/M
+dulcimer/MS
+Dulcinea/M
+Dulcine/M
+Dulcy/M
+dullard/MS
+Dulles/M
+dullness/MS
+dull/SRDPGT
+dully
+dulness's
+Dulsea/M
+Duluth/M
+duly/U
+Du/M
+Dumas
+dumbbell/MS
+dumbfound/GSDR
+dumbness/MS
+Dumbo/M
+dumb/PSGTYRD
+dumbstruck
+dumbwaiter/SM
+dumdum/MS
+dummy/SDMG
+Dumont/M
+dumper/UM
+dumpiness/MS
+dumpling/MS
+dump/SGZRD
+dumpster/S
+Dumpster/S
+Dumpty/M
+dumpy/PRST
+Dunant/M
+Dunbar/M
+Duncan/M
+dunce/MS
+Dunc/M
+Dundee/M
+dunderhead/MS
+Dunedin/M
+dune/SM
+dungaree/SM
+dungeon/GSMD
+dunghill/MS
+dung/SGDM
+Dunham/M
+dunker/M
+dunk/GSRD
+Dunkirk/M
+Dunlap/M
+Dun/M
+dunned
+Dunne/M
+dunner
+dunnest
+dunning
+Dunn/M
+dunno/M
+dun/S
+Dunstan/M
+duodecimal/S
+duodena
+duodenal
+duodenum/M
+duologue/M
+duo/MS
+duopolist
+duopoly/M
+dupe/NGDRSMZ
+duper/M
+dupion/M
+duple
+duplexer/M
+duplex/MSRDG
+duplicability/M
+duplicable
+duplicate/ADSGNX
+duplication/AM
+duplicative
+duplicator/MS
+duplicitous
+duplicity/SM
+Dupont/MS
+DuPont/MS
+durability/MS
+durableness/M
+durable/PS
+durably
+Duracell/M
+durance/SM
+Durand/M
+Duran/M
+Durante/M
+Durant/M
+durational
+duration/MS
+Durban/M
+Dürer/M
+duress/SM
+Durex/M
+Durham/MS
+during
+Durkee/M
+Durkheim/M
+Dur/M
+Durocher/M
+durst
+durum/MS
+Durward/M
+Duse/M
+Dusenberg/M
+Dusenbury/M
+Dushanbe/M
+dusk/GDMS
+duskiness/MS
+dusky/RPT
+Düsseldorf
+dustbin/MS
+dustcart/M
+dustcover
+duster/M
+dustily
+dustiness/MS
+dusting/M
+Dustin/M
+dustless
+dustman/M
+dustmen
+dust/MRDGZS
+dustpan/SM
+Dusty/M
+dusty/RPT
+Dutch/M
+Dutchman/M
+Dutchmen
+dutch/MS
+Dutchwoman
+Dutchwomen
+duteous/Y
+dutiable
+dutifulness/S
+dutiful/UPY
+duty/SM
+Duvalier/M
+duvet/SM
+duxes
+Dvina/M
+Dvorák/M
+Dwain/M
+dwarfish
+dwarfism/MS
+dwarf/MTGSPRD
+Dwayne/M
+dweeb/S
+dweller/SM
+dwell/IGS
+dwelling/MS
+dwelt/I
+DWI
+Dwight/M
+dwindle/GSD
+dyadic
+dyad/MS
+Dyana/M
+Dyane/M
+Dyan/M
+Dyanna/M
+Dyanne/M
+Dyann/M
+dybbukim
+dybbuk/SM
+dyed/A
+dyeing/M
+dye/JDRSMZG
+dyer/M
+Dyer/M
+dyes/A
+dyestuff/SM
+dying/UA
+Dyke/M
+dyke's
+Dylan/M
+Dy/M
+Dynah/M
+Dyna/M
+dynamical/Y
+dynamic/S
+dynamics/M
+dynamism/SM
+dynamiter/M
+dynamite/RSDZMG
+dynamized
+dynamo/MS
+dynastic
+dynasty/MS
+dyne/M
+dysentery/SM
+dysfunctional
+dysfunction/MS
+dyslectic/S
+dyslexia/MS
+dyslexically
+dyslexic/S
+dyspepsia/MS
+dyspeptic/S
+dysprosium/MS
+dystopia/M
+dystrophy/M
+dz
+Dzerzhinsky/M
+E
+ea
+each
+Eachelle/M
+Eada/M
+Eadie/M
+Eadith/M
+Eadmund/M
+eagerness/MS
+eager/TSPRYM
+eagle/SDGM
+eaglet/SM
+Eakins/M
+Ealasaid/M
+Eal/M
+Eamon/M
+earache/SM
+eardrum/SM
+earful/MS
+ear/GSMDYH
+Earhart/M
+earing/M
+earldom/MS
+Earle/M
+Earlene/M
+Earlie/M
+Earline/M
+earliness/SM
+Earl/M
+earl/MS
+earlobe/S
+Early/M
+early/PRST
+earmark/DGSJ
+earmuff/SM
+earned/U
+earner/M
+Earnestine/M
+Earnest/M
+earnestness/MS
+earnest/PYS
+earn/GRDZTSJ
+earning/M
+earphone/MS
+earpieces
+earplug/MS
+Earp/M
+earring/MS
+earshot/MS
+earsplitting
+Eartha/M
+earthbound
+earthed/U
+earthenware/MS
+earthiness/SM
+earthliness/M
+earthling/MS
+earthly/TPR
+earth/MDNYG
+earthmen
+earthmover/M
+earthmoving
+earthquake/SDGM
+earthshaking
+earths/U
+earthward/S
+earthwork/MS
+earthworm/MS
+earthy/PTR
+Earvin/M
+earwax/MS
+earwigged
+earwigging
+earwig/MS
+eased/E
+ease/LDRSMG
+easel/MS
+easement/MS
+easer/M
+ease's/EU
+eases/UE
+easies
+easily/U
+easiness/MSU
+easing/M
+eastbound
+easterly/S
+Easter/M
+easterner/M
+Easterner/M
+easternmost
+Eastern/RZ
+eastern/ZR
+easter/Y
+east/GSMR
+Easthampton/M
+easting/M
+Eastland/M
+Eastman/M
+eastward/S
+Eastwick/M
+Eastwood/M
+East/ZSMR
+easygoingness/M
+easygoing/P
+easy/PUTR
+eatables
+eatable/U
+eaten/U
+eater/M
+eatery/MS
+eating/M
+Eaton/M
+eat/SJZGNRB
+eavesdropped
+eavesdropper/MS
+eavesdropping
+eavesdrop/S
+eave/SM
+Eba/M
+Ebba/M
+ebb/DSG
+EBCDIC
+Ebeneezer/M
+Ebeneser/M
+Ebenezer/M
+Eben/M
+Eberhard/M
+Eberto/M
+Eb/MN
+Ebola
+Ebonee/M
+Ebonics
+Ebony/M
+ebony/SM
+Ebro/M
+ebullience/SM
+ebullient/Y
+ebullition/SM
+EC
+eccentrically
+eccentricity/SM
+eccentric/MS
+eccl
+Eccles
+Ecclesiastes/M
+ecclesiastical/Y
+ecclesiastic/MS
+ECG
+echelon/SGDM
+echinoderm/SM
+echo/DMG
+echoed/A
+echoes/A
+echoic
+echolocation/SM
+éclair/MS
+éclat/MS
+eclectically
+eclecticism/MS
+eclectic/S
+eclipse/MGSD
+ecliptic/MS
+eclogue/MS
+ecocide/SM
+ecol
+Ecole/M
+ecologic
+ecological/Y
+ecologist/MS
+ecology/MS
+Eco/M
+econ
+Econometrica/M
+econometricians
+econometric/S
+econometrics/M
+economical/YU
+economic/S
+economics/M
+economist/MS
+economization
+economize/GZSRD
+economizer/M
+economizing/U
+economy/MS
+ecosystem/MS
+ecru/SM
+ecstasy/MS
+Ecstasy/S
+ecstatically
+ecstatic/S
+ectoplasm/M
+Ecuadoran/S
+Ecuadorean/S
+Ecuadorian/S
+Ecuador/M
+ecumenical/Y
+ecumenicism/SM
+ecumenicist/MS
+ecumenic/MS
+ecumenics/M
+ecumenism/SM
+ecumenist/MS
+eczema/MS
+Eda/M
+Edam/SM
+Edan/M
+ed/ASC
+Edda/M
+Eddie/M
+Eddi/M
+Edd/M
+Eddy/M
+eddy/SDMG
+Edee/M
+Edeline/M
+edelweiss/MS
+Ede/M
+edema/SM
+edematous
+eden
+Eden/M
+Edgard/M
+Edgardo/M
+Edgar/M
+edge/DRSMZGJ
+edgeless
+edger/M
+Edgerton/M
+Edgewater/M
+edgewise
+Edgewood/M
+edgily
+edginess/MS
+edging/M
+edgy/TRP
+edibility/MS
+edibleness/SM
+edible/SP
+edict/SM
+Edie/M
+edification/M
+edifice/SM
+edifier/M
+edifying/U
+edify/ZNXGRSD
+Edik/M
+Edi/MH
+Edinburgh/M
+Edin/M
+Edison/M
+editable
+Edita/M
+edited/IU
+Editha/M
+Edithe/M
+Edith/M
+edition/SM
+editorialist/M
+editorialize/DRSG
+editorializer/M
+editorial/YS
+editor/MS
+editorship/MS
+edit/SADG
+Ediva/M
+Edlin/M
+Edmond/M
+Edmon/M
+Edmonton/M
+Edmund/M
+Edna/M
+Edouard/M
+EDP
+eds
+Edsel/M
+Edsger/M
+EDT
+Eduard/M
+Eduardo/M
+educability/SM
+educable/S
+educated/YP
+educate/XASDGN
+educationalists
+educational/Y
+education/AM
+educationists
+educative
+educator/MS
+educ/DBG
+educe/S
+eduction/M
+Eduino/M
+edutainment/S
+Edvard/M
+Edwardian
+Edwardo/M
+Edward/SM
+Edwina/M
+Edwin/M
+Ed/XMN
+Edy/M
+Edythe/M
+Edyth/M
+EEC
+EEG
+eek/S
+eelgrass/M
+eel/MS
+e'en
+EEO
+EEOC
+e'er
+eerie/RT
+eerily
+eeriness/MS
+Eeyore/M
+effaceable/I
+effacement/MS
+effacer/M
+efface/SRDLG
+effectiveness/ISM
+effectives
+effective/YIP
+effector/MS
+effect/SMDGV
+effectual/IYP
+effectualness/MI
+effectuate/SDGN
+effectuation/M
+effeminacy/MS
+effeminate/SY
+effendi/MS
+efferent/SY
+effervesce/GSD
+effervescence/SM
+effervescent/Y
+effeteness/SM
+effete/YP
+efficacious/IPY
+efficaciousness/MI
+efficacy/IMS
+efficiency/MIS
+efficient/ISY
+Effie/M
+effigy/SM
+effloresce
+efflorescence/SM
+efflorescent
+effluence/SM
+effluent/MS
+effluvia
+effluvium/M
+effluxion
+efflux/M
+effortlessness/SM
+effortless/PY
+effort/MS
+effrontery/MS
+effulgence/SM
+effulgent
+effuse/XSDVGN
+effusion/M
+effusiveness/MS
+effusive/YP
+EFL
+e/FMDS
+Efrain/M
+Efrem/M
+Efren/M
+EFT
+egad
+egalitarian/I
+egalitarianism/MS
+egalitarians
+EGA/M
+Egan/M
+Egbert/M
+Egerton/M
+eggbeater/SM
+eggcup/MS
+egger/M
+egg/GMDRS
+eggheaded/P
+egghead/SDM
+eggnog/SM
+eggplant/MS
+eggshell/SM
+egis's
+eglantine/MS
+egocentrically
+egocentricity/SM
+egocentric/S
+egoism/SM
+egoistic
+egoistical/Y
+egoist/SM
+egomaniac/MS
+egomania/MS
+Egon/M
+Egor/M
+ego/SM
+egotism/SM
+egotistic
+egotistical/Y
+egotist/MS
+egregiousness/MS
+egregious/PY
+egress/SDMG
+egret/SM
+Egyptian/S
+Egypt/M
+Egyptology/M
+eh
+Ehrlich/M
+Eichmann/M
+eiderdown/SM
+eider/SM
+eidetic
+Eiffel/M
+eigenfunction/MS
+eigenstate/S
+eigenvalue/SM
+eigenvector/MS
+eighteen/MHS
+eighteenths
+eightfold
+eighth/MS
+eighths
+eightieths
+eightpence
+eight/SM
+eighty/SHM
+Eileen/M
+Eilis/M
+Eimile/M
+Einsteinian
+einsteinium/MS
+Einstein/SM
+Eire/M
+Eirena/M
+Eisenhower/M
+Eisenstein/M
+Eisner/M
+eisteddfod/M
+either
+ejaculate/SDXNG
+ejaculation/M
+ejaculatory
+ejecta
+ejection/SM
+ejector/SM
+eject/VGSD
+Ekaterina/M
+Ekberg/M
+eked/A
+eke/DSG
+EKG
+Ekstrom/M
+Ektachrome/M
+elaborateness/SM
+elaborate/SDYPVNGX
+elaboration/M
+elaborators
+Elaina/M
+Elaine/M
+Elana/M
+eland/SM
+Elane/M
+élan/M
+Elanor/M
+elans
+elapse/SDG
+el/AS
+elastically/I
+elasticated
+elasticity/SM
+elasticize/GDS
+elastic/S
+elastodynamics
+elastomer/M
+elatedness/M
+elated/PY
+elater/M
+elate/SRDXGN
+elation/M
+Elayne/M
+Elba/MS
+Elbe/M
+Elberta/M
+Elbertina/M
+Elbertine/M
+Elbert/M
+elbow/GDMS
+elbowroom/SM
+Elbrus/M
+Elden/M
+elderberry/MS
+elderflower
+elderliness/M
+elderly/PS
+elder/SY
+eldest
+Eldin/M
+Eldon/M
+Eldorado's
+Eldredge/M
+Eldridge/M
+Eleanora/M
+Eleanore/M
+Eleanor/M
+Eleazar/M
+electable/U
+elect/ASGD
+elected/U
+electioneer/GSD
+election/SAM
+electiveness/M
+elective/SPY
+electoral/Y
+electorate/SM
+elector/SM
+Electra/M
+electress/M
+electricalness/M
+electrical/PY
+electrician/SM
+electricity/SM
+electric/S
+electrification/M
+electrifier/M
+electrify/ZXGNDRS
+electrocardiogram/MS
+electrocardiograph/M
+electrocardiographs
+electrocardiography/MS
+electrochemical/Y
+electrocute/GNXSD
+electrocution/M
+electrode/SM
+electrodynamics/M
+electrodynamic/YS
+electroencephalogram/SM
+electroencephalographic
+electroencephalograph/M
+electroencephalographs
+electroencephalography/MS
+electrologist/MS
+electroluminescent
+electrolysis/M
+electrolyte/SM
+electrolytic
+electrolytically
+electrolyze/SDG
+electro/M
+electromagnetic
+electromagnetically
+electromagnetism/SM
+electromagnet/SM
+electromechanical
+electromechanics
+electromotive
+electromyograph
+electromyographic
+electromyographically
+electromyography/M
+electronegative
+electronically
+electronic/S
+electronics/M
+electron/MS
+electrophoresis/M
+electrophorus/M
+electroplate/DSG
+electroscope/MS
+electroscopic
+electroshock/GDMS
+electrostatic/S
+electrostatics/M
+electrotherapist/M
+electrotype/GSDZM
+electroweak
+eleemosynary
+Eleen/M
+elegance/ISM
+elegant/YI
+elegiacal
+elegiac/S
+elegy/SM
+elem
+elemental/YS
+elementarily
+elementariness/M
+elementary/P
+element/MS
+Elena/M
+Elene/M
+Eleni/M
+Elenore/M
+Eleonora/M
+Eleonore/M
+elephantiases
+elephantiasis/M
+elephantine
+elephant/SM
+elevated/S
+elevate/XDSNG
+elevation/M
+elevator/SM
+eleven/HM
+elevens/S
+elevenths
+elev/NX
+Elfie/M
+elfin/S
+elfish
+elf/M
+Elfreda/M
+Elfrida/M
+Elfrieda/M
+Elga/M
+Elgar/M
+Elianora/M
+Elianore/M
+Elia/SM
+Elicia/M
+elicitation/MS
+elicit/GSD
+elide/GSD
+Elie/M
+eligibility/ISM
+eligible/SI
+Elihu/M
+Elijah/M
+Eli/M
+eliminate/XSDYVGN
+elimination/M
+eliminator/SM
+Elinore/M
+Elinor/M
+Eliot/M
+Elisabeth/M
+Elisabet/M
+Elisabetta/M
+Elisa/M
+Elise/M
+Eliseo/M
+Elisha/M
+elision/SM
+Elissa/M
+Elita/M
+elite/MPS
+elitism/SM
+elitist/SM
+elixir/MS
+Elizabethan/S
+Elizabeth/M
+Elizabet/M
+Eliza/M
+Elka/M
+Elke/M
+Elkhart/M
+elk/MS
+Elladine/M
+Ella/M
+Ellary/M
+Elle/M
+Ellene/M
+Ellen/M
+Ellerey/M
+Ellery/M
+Ellesmere/M
+Ellette/M
+Ellie/M
+Ellington/M
+Elliot/M
+Elliott/M
+ellipse/MS
+ellipsis/M
+ellipsoidal
+ellipsoid/MS
+ellipsometer/MS
+ellipsometry
+elliptic
+elliptical/YS
+ellipticity/M
+Elli/SM
+Ellison/M
+Ellissa/M
+ell/MS
+Ellswerth/M
+Ellsworth/M
+Ellwood/M
+Elly/M
+Ellyn/M
+Ellynn/M
+Elma/M
+Elmer/M
+Elmhurst/M
+Elmira/M
+elm/MRS
+Elmo/M
+Elmore/M
+Elmsford/M
+El/MY
+Elna/MH
+Elnar/M
+Elnath/M
+Elnora/M
+Elnore/M
+elocutionary
+elocutionist/MS
+elocution/SM
+elodea/S
+Elohim/M
+Eloisa/M
+Eloise/M
+elongate/NGXSD
+elongation/M
+Elonore/M
+elopement/MS
+eloper/M
+elope/SRDLG
+eloquence/SM
+eloquent/IY
+Elora/M
+Eloy/M
+Elroy/M
+els
+Elsa/M
+Elsbeth/M
+else/M
+Else/M
+Elset/M
+elsewhere
+Elsey/M
+Elsie/M
+Elsi/M
+Elsinore/M
+Elspeth/M
+Elston/M
+Elsworth/M
+Elsy/M
+Eltanin/M
+Elton/M
+eluate/SM
+elucidate/SDVNGX
+elucidation/M
+elude/GSD
+elusiveness/SM
+elusive/YP
+elute/DGN
+elution/M
+Elva/M
+elven
+Elvera/M
+elver/SM
+elves/M
+Elvia/M
+Elvina/M
+Elvin/M
+Elvira/M
+elvish
+Elvis/M
+Elvyn/M
+Elwin/M
+Elwira/M
+Elwood/M
+Elwyn/M
+Ely/M
+Elyn/M
+Elysée/M
+Elysees
+Elyse/M
+Elysha/M
+Elysia/M
+elysian
+Elysian
+Elysium/SM
+Elyssa/M
+EM
+emaciate/NGXDS
+emaciation/M
+emacs/M
+Emacs/M
+email/SMDG
+Emalee/M
+Emalia/M
+Ema/M
+emanate/XSDVNG
+emanation/M
+emancipate/DSXGN
+emancipation/M
+emancipator/MS
+Emanuele/M
+Emanuel/M
+emasculate/GNDSX
+emasculation/M
+embalmer/M
+embalm/ZGRDS
+embank/GLDS
+embankment/MS
+embarcadero
+embargoes
+embargo/GMD
+embark/ADESG
+embarkation/EMS
+embarrassedly
+embarrassed/U
+embarrassing/Y
+embarrassment/MS
+embarrass/SDLG
+embassy/MS
+embattle/DSG
+embeddable
+embedded
+embedder
+embedding/MS
+embed/S
+embellished/U
+embellisher/M
+embellish/LGRSD
+embellishment/MS
+ember/MS
+embezzle/LZGDRS
+embezzlement/MS
+embezzler/M
+embitter/LGDS
+embitterment/SM
+emblazon/DLGS
+emblazonment/SM
+emblematic
+emblem/GSMD
+embodier/M
+embodiment/ESM
+embody/ESDGA
+embolden/DSG
+embolism/SM
+embosom
+embosser/M
+emboss/ZGRSD
+embouchure/SM
+embower/GSD
+embraceable
+embracer/M
+embrace/RSDVG
+embracing/Y
+embrasure/MS
+embrittle
+embrocation/SM
+embroiderer/M
+embroider/SGZDR
+embroidery/MS
+embroilment/MS
+embroil/SLDG
+embryologist/SM
+embryology/MS
+embryonic
+embryo/SM
+emceeing
+emcee/SDM
+Emelda/M
+Emelen/M
+Emelia/M
+Emelina/M
+Emeline/M
+Emelita/M
+Emelyne/M
+emendation/MS
+emend/SRDGB
+emerald/SM
+Emera/M
+emerge/ADSG
+emergence/MAS
+emergency/SM
+emergent/S
+emerita
+emeritae
+emeriti
+emeritus
+Emerson/M
+Emery/M
+emery/MGSD
+emetic/S
+emf/S
+emigrant/MS
+emigrate/SDXNG
+emigration/M
+émigré/S
+Emilee/M
+Emile/M
+Emilia/M
+Emilie/M
+Emili/M
+Emiline/M
+Emilio/M
+Emil/M
+Emily/M
+eminence/MS
+Eminence/MS
+eminent/Y
+emirate/SM
+emir/SM
+emissary/SM
+emission/AMS
+emissivity/MS
+emit/S
+emittance/M
+emitted
+emitter/SM
+emitting
+Emlen/M
+Emlyn/M
+Emlynne/M
+Emlynn/M
+em/M
+Em/M
+Emmalee/M
+Emmaline/M
+Emmalyn/M
+Emmalynne/M
+Emmalynn/M
+Emma/M
+Emmanuel/M
+Emmeline/M
+Emmerich/M
+Emmery/M
+Emmet/M
+Emmett/M
+Emmey/M
+Emmie/M
+Emmi/M
+Emmit/M
+Emmott/M
+Emmye/M
+Emmy/SM
+Emogene/M
+emollient/S
+emolument/SM
+Emory/M
+emote/SDVGNX
+emotionalism/MS
+emotionality/M
+emotionalize/GDS
+emotional/UY
+emotionless
+emotion/M
+emotive/Y
+empaneled
+empaneling
+empath
+empathetic
+empathetical/Y
+empathic
+empathize/SDG
+empathy/MS
+emperor/MS
+emphases
+emphasis/M
+emphasize/ZGCRSDA
+emphatically/U
+emphatic/U
+emphysema/SM
+emphysematous
+empire/MS
+empirical/Y
+empiricism/SM
+empiricist/SM
+empiric/SM
+emplace/L
+emplacement/MS
+employability/UM
+employable/US
+employed/U
+employee/SM
+employer/SM
+employ/LAGDS
+employment/UMAS
+emporium/MS
+empower/GLSD
+empowerment/MS
+empress/MS
+emptier/M
+emptily
+emptiness/SM
+empty/GRSDPT
+empyrean/SM
+ems/C
+EMT
+emulate/SDVGNX
+emulation/M
+emulative/Y
+emulator/MS
+emulsification/M
+emulsifier/M
+emulsify/NZSRDXG
+emulsion/SM
+emu/SM
+Emylee/M
+Emyle/M
+enabler/M
+enable/SRDZG
+enactment/ASM
+enact/SGALD
+enameler/M
+enamelware/SM
+enamel/ZGJMDRS
+enamor/DSG
+en/BM
+enc
+encamp/LSDG
+encampment/MS
+encapsulate/SDGNX
+encapsulation/M
+encase/GSDL
+encasement/SM
+encephalitic
+encephalitides
+encephalitis/M
+encephalographic
+encephalopathy/M
+enchain/SGD
+enchanter/MS
+enchant/ESLDG
+enchanting/Y
+enchantment/MSE
+enchantress/MS
+enchilada/SM
+encipherer/M
+encipher/SRDG
+encircle/GLDS
+encirclement/SM
+encl
+enclave/MGDS
+enclosed/U
+enclose/GDS
+enclosure/SM
+encoder/M
+encode/ZJGSRD
+encomium/SM
+encompass/GDS
+encore/GSD
+encounter/GSD
+encouragement/SM
+encourager/M
+encourage/SRDGL
+encouraging/Y
+encroacher/M
+encroach/LGRSD
+encroachment/MS
+encrustation/MS
+encrust/DSG
+encrypt/DGS
+encrypted/U
+encryption/SM
+encumbered/U
+encumber/SEDG
+encumbrancer/M
+encumbrance/SRM
+ency
+encyclical/SM
+encyclopaedia's
+encyclopedia/SM
+encyclopedic
+encyst/GSLD
+encystment/MS
+endanger/DGSL
+endangerment/SM
+endear/GSLD
+endearing/Y
+endearment/MS
+endeavored/U
+endeavorer/M
+endeavor/GZSMRD
+endemically
+endemicity
+endemic/S
+ender/M
+endgame/M
+Endicott/M
+ending/M
+endive/SM
+endlessness/MS
+endless/PY
+endmost
+endnote/MS
+endocrine/S
+endocrinologist/SM
+endocrinology/SM
+endogamous
+endogamy/M
+endogenous/Y
+endomorphism/SM
+endorse/DRSZGL
+endorsement/MS
+endorser/M
+endoscope/MS
+endoscopic
+endoscopy/SM
+endosperm/M
+endothelial
+endothermic
+endow/GSDL
+endowment/SM
+endpoint/MS
+endue/SDG
+endungeoned
+endurable/U
+endurably/U
+endurance/SM
+endure/BSDG
+enduringness/M
+enduring/YP
+endways
+Endymion/M
+end/ZGVMDRSJ
+ENE
+enema/SM
+enemy/SM
+energetically
+energetic/S
+energetics/M
+energized/U
+energizer/M
+energize/ZGDRS
+energy/MS
+enervate/XNGVDS
+enervation/M
+enfeeble/GLDS
+enfeeblement/SM
+enfilade/MGDS
+enfold/SGD
+enforceability/M
+enforceable/U
+enforced/Y
+enforce/LDRSZG
+enforcement/SM
+enforcer/M
+enforcible/U
+enfranchise/ELDRSG
+enfranchisement/EMS
+enfranchiser/M
+engage/ADSGE
+engagement/SEM
+engaging/Y
+Engelbert/M
+Engel/MS
+engender/DGS
+engineer/GSMDJ
+engineering/MY
+engine/MGSD
+England/M
+england/ZR
+Englebert/M
+Englewood/M
+English/GDRSM
+Englishman/M
+Englishmen
+Englishwoman/M
+Englishwomen
+Eng/M
+engorge/LGDS
+engorgement/MS
+Engracia/M
+engram/MS
+engraver/M
+engrave/ZGDRSJ
+engraving/M
+engrossed/Y
+engrosser/M
+engross/GLDRS
+engrossing/Y
+engrossment/SM
+engulf/GDSL
+engulfment/SM
+enhanceable
+enhance/LZGDRS
+enhancement/MS
+enhancer/M
+enharmonic
+Enid/M
+Enif/M
+enigma/MS
+enigmatic
+enigmatically
+Eniwetok/M
+enjambement's
+enjambment/MS
+enjoinder
+enjoin/GSD
+enjoyability
+enjoyableness/M
+enjoyable/P
+enjoyably
+enjoy/GBDSL
+enjoyment/SM
+Enkidu/M
+enlargeable
+enlarge/LDRSZG
+enlargement/MS
+enlarger/M
+enlightened/U
+enlighten/GDSL
+enlightening/U
+enlightenment/SM
+enlistee/MS
+enlister/M
+enlistment/SAM
+enlist/SAGDL
+enliven/LDGS
+enlivenment/SM
+enmesh/DSLG
+enmeshment/SM
+enmity/MS
+Ennis/M
+ennoble/LDRSG
+ennoblement/SM
+ennobler/M
+ennui/SM
+Enoch/M
+enormity/SM
+enormousness/MS
+enormous/YP
+Enos
+enough
+enoughs
+enplane/DSG
+enqueue/DS
+enquirer/S
+enquiringly
+enrage/SDG
+enrapture/GSD
+Enrica/M
+enricher/M
+Enrichetta/M
+enrich/LDSRG
+enrichment/SM
+Enrico/M
+Enrika/M
+Enrique/M
+Enriqueta/M
+enrobed
+enrollee/SM
+enroll/LGSD
+enrollment/SM
+ens
+ensconce/DSG
+ensemble/MS
+enshrine/DSLG
+enshrinement/SM
+enshroud/DGS
+ensign/SM
+ensilage/DSMG
+enslavement/MS
+enslaver/M
+enslave/ZGLDSR
+ensnare/GLDS
+ensnarement/SM
+Ensolite/M
+ensue/SDG
+ensurer/M
+ensure/SRDZG
+entailer/M
+entailment/MS
+entail/SDRLG
+entangle/EGDRSL
+entanglement/ESM
+entangler/EM
+entente/MS
+enter/ASDG
+entered/U
+enterer/M
+enteritides
+enteritis/SM
+enterprise/GMSR
+Enterprise/M
+enterpriser/M
+enterprising/Y
+entertainer/M
+entertaining/Y
+entertainment/SM
+entertain/SGZRDL
+enthalpy/SM
+enthrall/GDSL
+enthrallment/SM
+enthrone/GDSL
+enthronement/MS
+enthuse/DSG
+enthusiasm/SM
+enthusiastically/U
+enthusiastic/U
+enthusiast/MS
+enticement/SM
+entice/SRDJLZG
+enticing/Y
+entire/SY
+entirety/SM
+entitle/GLDS
+entitlement/MS
+entity/SM
+entomb/GDSL
+entombment/MS
+entomological
+entomologist/S
+entomology/MS
+entourage/SM
+entr'acte/S
+entrails
+entrainer/M
+entrain/GSLDR
+entrancement/MS
+entrance/MGDSL
+entranceway/M
+entrancing/Y
+entrant/MS
+entrapment/SM
+entrapped
+entrapping
+entrap/SL
+entreating/Y
+entreat/SGD
+entreaty/SM
+entrée/S
+entrench/LSDG
+entrenchment/MS
+entrepreneurial
+entrepreneur/MS
+entrepreneurship/M
+entropic
+entropy/MS
+entrust/DSG
+entry/ASM
+entryway/SM
+entwine/DSG
+enumerable
+enumerate/AN
+enumerated/U
+enumerates
+enumerating
+enumeration's/A
+enumeration/SM
+enumerative
+enumerator/SM
+enunciable
+enunciated/U
+enunciate/XGNSD
+enunciation/M
+enureses
+enuresis/M
+envelope/MS
+enveloper/M
+envelopment/MS
+envelop/ZGLSDR
+envenom/SDG
+enviableness/M
+enviable/U
+enviably
+envied/U
+envier/M
+enviousness/SM
+envious/PY
+environ/LGSD
+environmentalism/SM
+environmentalist/SM
+environmental/Y
+environment/MS
+envisage/DSG
+envision/GSD
+envoy/SM
+envying/Y
+envy/SRDMG
+enzymatic
+enzymatically
+enzyme/SM
+enzymology/M
+Eocene
+EOE
+eohippus/M
+Eolanda/M
+Eolande/M
+eolian
+eon/SM
+EPA
+epaulet/SM
+épée/S
+ephedrine/MS
+ephemeral/SY
+ephemera/MS
+ephemerids
+ephemeris/M
+Ephesian/S
+Ephesians/M
+Ephesus/M
+Ephraim/M
+Ephrayim/M
+Ephrem/M
+epically
+epicenter/SM
+epic/SM
+Epictetus/M
+Epicurean
+epicurean/S
+epicure/SM
+Epicurus/M
+epicycle/MS
+epicyclic
+epicyclical/Y
+epicycloid/M
+epidemically
+epidemic/MS
+epidemiological/Y
+epidemiologist/MS
+epidemiology/MS
+epidermal
+epidermic
+epidermis/MS
+epidural
+epigenetic
+epiglottis/SM
+epigrammatic
+epigram/MS
+epigrapher/M
+epigraph/RM
+epigraphs
+epigraphy/MS
+epilepsy/SM
+epileptic/S
+epilogue/SDMG
+Epimethius/M
+epinephrine/SM
+epiphany/SM
+Epiphany/SM
+epiphenomena
+episcopacy/MS
+episcopalian
+Episcopalian/S
+Episcopal/S
+episcopal/Y
+episcopate/MS
+episode/SM
+episodic
+episodically
+epistemic
+epistemological/Y
+epistemology/M
+epistle/MRS
+Epistle/SM
+epistolary/S
+epistolatory
+epitaph/GMD
+epitaphs
+epitaxial/Y
+epitaxy/M
+epithelial
+epithelium/MS
+epithet/MS
+epitome/MS
+epitomized/U
+epitomizer/M
+epitomize/SRDZG
+epochal/Y
+epoch/M
+epochs
+eponymous
+epoxy/GSD
+epsilon/SM
+Epsom/M
+Epstein/M
+equability/MS
+equableness/M
+equable/P
+equably
+equaling
+equality/ISM
+equalization/MS
+equalize/DRSGJZ
+equalized/U
+equalizer/M
+equalizes/U
+equal/USDY
+equanimity/MS
+equate/NGXBSD
+equation/M
+equatorial/S
+equator/SM
+equerry/MS
+equestrianism/SM
+equestrian/S
+equestrienne/SM
+equiangular
+equidistant/Y
+equilateral/S
+equilibrate/GNSD
+equilibration/M
+equilibrium/MSE
+equine/S
+equinoctial/S
+equinox/MS
+equipage/SM
+equipartition/M
+equip/AS
+equipment/SM
+equipoise/GMSD
+equipotent
+equipped/AU
+equipping/A
+equiproportional
+equiproportionality
+equiproportionate
+equitable/I
+equitableness/M
+equitably/I
+equitation/SM
+equity/IMS
+equiv
+equivalence/DSMG
+equivalent/SY
+equivocalness/MS
+equivocal/UY
+equivocate/NGSDX
+equivocation/M
+equivocator/SM
+Equuleus/M
+ER
+ERA
+eradicable/I
+eradicate/SDXVGN
+eradication/M
+eradicator/SM
+era/MS
+Eran/M
+erase/N
+eraser/M
+erasion/M
+Erasmus/M
+eras/SRDBGZ
+Erastus/M
+erasure/MS
+Erato/M
+Eratosthenes/M
+erbium/SM
+Erda/M
+ere
+Erebus/M
+erect/GPSRDY
+erectile
+erection/SM
+erectness/MS
+erector/SM
+Erek/M
+erelong
+eremite/MS
+Erena/M
+ergo
+ergodic
+ergodicity/M
+ergonomically
+ergonomics/M
+ergonomic/U
+ergophobia
+ergosterol/SM
+ergot/SM
+erg/SM
+Erhard/M
+Erhart/M
+Erica/M
+Ericha/M
+Erich/M
+Ericka/M
+Erick/M
+Erickson/M
+Eric/M
+Ericson's
+Ericsson's
+Eridanus/M
+Erie/SM
+Erika/M
+Erik/M
+Erikson/M
+Erina/M
+Erin/M
+Erinna/M
+Erinn/M
+eris
+Eris
+Eritrea/M
+Erlang/M
+Erlenmeyer/M
+Erl/M
+Er/M
+Erma/M
+Ermanno/M
+Ermengarde/M
+Ermentrude/M
+Ermina/M
+ermine/MSD
+Erminia/M
+Erminie/M
+Ermin/M
+Ernaline/M
+Erna/M
+Ernesta/M
+Ernestine/M
+Ernest/M
+Ernesto/M
+Ernestus/M
+Ernie/M
+Ernst/M
+Erny/M
+erode/SDG
+erodible
+erogenous
+erosible
+erosional
+erosion/SM
+erosiveness/M
+erosive/P
+Eros/SM
+erotically
+erotica/M
+eroticism/MS
+erotic/S
+errancy/MS
+errand/MS
+errantry/M
+errant/YS
+errata/SM
+erratically
+erratic/S
+erratum/MS
+err/DGS
+Errick/M
+erring/UY
+Erroll/M
+Errol/M
+erroneousness/M
+erroneous/YP
+error/SM
+ersatz/S
+Erse/M
+Erskine/M
+erst
+erstwhile
+Ertha/M
+eructation/MS
+eruct/DGS
+erudite/NYX
+erudition/M
+erupt/DSVG
+eruption/SM
+eruptive/SY
+Ervin/M
+ErvIn/M
+Erv/M
+Erwin/M
+Eryn/M
+erysipelas/SM
+erythrocyte/SM
+es
+e's
+Es
+E's
+Esau/M
+escadrille/M
+escalate/CDSXGN
+escalation/MC
+escalator/SM
+escallop/SGDM
+escapable/I
+escapade/SM
+escapee/MS
+escape/LGSRDB
+escapement/MS
+escaper/M
+escapism/SM
+escapist/S
+escapology
+escarole/MS
+escarpment/MS
+eschatology/M
+Escherichia/M
+Escher/M
+eschew/SGD
+Escondido/M
+escort/SGMD
+escritoire/SM
+escrow/DMGS
+escudo/MS
+escutcheon/SM
+Esdras/M
+ESE
+Eskimo/SM
+ESL
+Esma/M
+Esmaria/M
+Esmark/M
+Esme/M
+Esmeralda/M
+esophageal
+esophagi
+esophagus/M
+esoteric
+esoterica
+esoterically
+esp
+ESP
+espadrille/MS
+Espagnol/M
+espalier/SMDG
+especial/Y
+Esperanto/M
+Esperanza/M
+Espinoza/M
+espionage/SM
+esplanade/SM
+Esp/M
+Esposito/M
+espousal/MS
+espouser/M
+espouse/SRDG
+espresso/SM
+esprit/SM
+espy/GSD
+Esq/M
+esquire/GMSD
+Esquire/S
+Esra/M
+Essa/M
+essayer/M
+essayist/SM
+essay/SZMGRD
+essence/MS
+Essene/SM
+Essen/M
+essentialist/M
+essentially
+essentialness/M
+essential/USI
+Essequibo/M
+Essex/M
+Essie/M
+Essy/M
+EST
+established/U
+establisher/M
+establish/LAEGSD
+establishment/EMAS
+Establishment/MS
+Esta/M
+estate/GSDM
+Esteban/M
+esteem/EGDS
+Estela/M
+Estele/M
+Estella/M
+Estelle/M
+Estell/M
+Estel/M
+Esterházy/M
+ester/M
+Ester/M
+Estes
+Estevan/M
+Esther/M
+esthete's
+esthetically
+esthetic's
+esthetics's
+estimable/I
+estimableness/M
+estimate/XDSNGV
+estimating/A
+estimation/M
+estimator/SM
+Estonia/M
+Estonian/S
+estoppal
+Estrada/M
+estrange/DRSLG
+estrangement/SM
+estranger/M
+Estrella/M
+Estrellita/M
+estrogen/SM
+estrous
+estrus/SM
+est/RZ
+estuarine
+estuary/SM
+et
+ET
+ETA
+Etan/M
+eta/SM
+etc
+etcetera/SM
+etcher/M
+etch/GZJSRD
+etching/M
+ETD
+eternalness/SM
+eternal/PSY
+eternity/SM
+ethane/SM
+Ethan/M
+ethanol/MS
+Ethelbert/M
+Ethelda/M
+Ethelind/M
+Etheline/M
+Ethelin/M
+Ethel/M
+Ethelred/M
+Ethelyn/M
+Ethe/M
+etherealness/M
+ethereal/PY
+etherized
+Ethernet/MS
+ether/SM
+ethically/U
+ethicalness/M
+ethical/PYS
+ethicist/S
+ethic/MS
+Ethiopia/M
+Ethiopian/S
+ethnically
+ethnicity/MS
+ethnic/S
+ethnocentric
+ethnocentrism/MS
+ethnographers
+ethnographic
+ethnography/M
+ethnological
+ethnologist/SM
+ethnology/SM
+ethnomethodology
+ethological
+ethologist/MS
+ethology/SM
+ethos/SM
+ethylene/MS
+Ethyl/M
+ethyl/SM
+Etienne/M
+etiologic
+etiological
+etiology/SM
+etiquette/SM
+Etna/M
+Etruria/M
+Etruscan/MS
+Etta/M
+Ettie/M
+Etti/M
+Ettore/M
+Etty/M
+étude/MS
+etymological/Y
+etymologist/SM
+etymology/MS
+EU
+eucalypti
+eucalyptus/SM
+Eucharistic
+Eucharist/SM
+euchre/MGSD
+euclidean
+Euclid/M
+Eudora/M
+Euell/M
+Eugene/M
+Eugenia/M
+eugenically
+eugenicist/SM
+eugenic/S
+eugenics/M
+Eugenie/M
+Eugenio/M
+Eugenius/M
+Eugen/M
+Eugine/M
+Eulalie/M
+Eula/M
+Eulerian/M
+Euler/M
+eulogistic
+eulogist/MS
+eulogized/U
+eulogize/GRSDZ
+eulogizer/M
+eulogy/MS
+Eu/M
+Eumenides
+Eunice/M
+eunuch/M
+eunuchs
+Euphemia/M
+euphemism/MS
+euphemistic
+euphemistically
+euphemist/M
+euphonious/Y
+euphonium/M
+euphony/SM
+euphoria/SM
+euphoric
+euphorically
+Euphrates/M
+Eurasia/M
+Eurasian/S
+eureka/S
+Euripides/M
+Eur/M
+Eurodollar/SM
+Europa/M
+Europeanization/SM
+Europeanized
+European/MS
+Europe/M
+europium/MS
+Eurydice/M
+Eustace/M
+Eustachian/M
+Eustacia/M
+eutectic
+Euterpe/M
+euthanasia/SM
+euthenics/M
+evacuate/DSXNGV
+evacuation/M
+evacuee/MS
+evader/M
+evade/SRDBGZ
+Evaleen/M
+evaluable
+evaluate/ADSGNX
+evaluated/U
+evaluational
+evaluation/MA
+evaluative
+evaluator/MS
+Eva/M
+evanescence/MS
+evanescent
+Evangelia/M
+evangelic
+evangelicalism/SM
+Evangelical/S
+evangelical/YS
+Evangelina/M
+Evangeline/M
+Evangelin/M
+evangelism/SM
+evangelistic
+evangelist/MS
+Evangelist/MS
+evangelize/GDS
+Evania/M
+Evan/MS
+Evanne/M
+Evanston/M
+Evansville/M
+evaporate/VNGSDX
+evaporation/M
+evaporative/Y
+evaporator/MS
+evasion/SM
+evasiveness/SM
+evasive/PY
+Eveleen/M
+Evelina/M
+Eveline/M
+Evelin/M
+Evelyn/M
+Eve/M
+evened
+evener/M
+evenhanded/YP
+evening/SM
+Evenki/M
+Even/M
+evenness/MSU
+even/PUYRT
+evens
+evensong/MS
+eventfulness/SM
+eventful/YU
+eventide/SM
+event/SGM
+eventuality/MS
+eventual/Y
+eventuate/GSD
+Everard/M
+Eveready/M
+Evered/M
+Everest/M
+Everette/M
+Everett/M
+everglade/MS
+Everglades
+evergreen/S
+Everhart/M
+everlastingness/M
+everlasting/PYS
+everliving
+evermore
+EverReady/M
+eve/RSM
+ever/T
+every
+everybody/M
+everydayness/M
+everyday/P
+everyman
+everyone/MS
+everyplace
+everything
+everywhere
+eve's/A
+eves/A
+Evey/M
+evict/DGS
+eviction/SM
+evidence/MGSD
+evidential/Y
+evident/YS
+Evie/M
+evildoer/SM
+evildoing/MS
+evilness/MS
+evil/YRPTS
+evince/SDG
+Evin/M
+eviscerate/GNXDS
+evisceration/M
+Evita/M
+Ev/MN
+evocable
+evocate/NVX
+evocation/M
+evocativeness/M
+evocative/YP
+evoke/SDG
+evolute/NMXS
+evolutionarily
+evolutionary
+evolutionist/MS
+evolution/M
+evolve/SDG
+Evonne/M
+Evvie/M
+Evvy/M
+Evy/M
+Evyn/M
+Ewan/M
+Eward/M
+Ewart/M
+Ewell/M
+ewe/MZRS
+Ewen/M
+ewer/M
+Ewing/M
+exacerbate/NGXDS
+exacerbation/M
+exacter/M
+exactingness/M
+exacting/YP
+exaction/SM
+exactitude/ISM
+exactly/I
+exactness/MSI
+exact/TGSPRDY
+exaggerate/DSXNGV
+exaggerated/YP
+exaggeration/M
+exaggerative/Y
+exaggerator/MS
+exaltation/SM
+exalted/Y
+exalter/M
+exalt/ZRDGS
+examen/M
+examination/AS
+examination's
+examine/BGZDRS
+examined/AU
+examinees
+examiner/M
+examines/A
+examining/A
+exam/MNS
+example/DSGM
+exampled/U
+exasperate/DSXGN
+exasperated/Y
+exasperating/Y
+exasperation/M
+Excalibur/M
+excavate/NGDSX
+excavation/M
+excavator/SM
+Excedrin/M
+exceeder/M
+exceeding/Y
+exceed/SGDR
+excelled
+excellence/SM
+excellency/MS
+Excellency/MS
+excellent/Y
+excelling
+excel/S
+excelsior/S
+except/DSGV
+exceptionable/U
+exceptionalness/M
+exceptional/YU
+exception/BMS
+excerpter/M
+excerpt/GMDRS
+excess/GVDSM
+excessiveness/M
+excessive/PY
+exchangeable
+exchange/GDRSZ
+exchanger/M
+exchequer/SM
+Exchequer/SM
+excise/XMSDNGB
+excision/M
+excitability/MS
+excitableness/M
+excitable/P
+excitably
+excitation/SM
+excitatory
+excited/Y
+excitement/MS
+exciter/M
+excite/RSDLBZG
+excitingly
+exciting/U
+exciton/M
+exclaimer/M
+exclaim/SZDRG
+exclamation/MS
+exclamatory
+exclude/DRSG
+excluder/M
+exclusionary
+exclusioner/M
+exclusion/SZMR
+exclusiveness/SM
+exclusive/SPY
+exclusivity/MS
+excommunicate/XVNGSD
+excommunication/M
+excoriate/GNXSD
+excoriation/M
+excremental
+excrement/SM
+excrescence/MS
+excrescent
+excreta
+excrete/NGDRSX
+excreter/M
+excretion/M
+excretory/S
+excruciate/NGDS
+excruciating/Y
+excruciation/M
+exculpate/XSDGN
+exculpation/M
+exculpatory
+excursionist/SM
+excursion/MS
+excursiveness/SM
+excursive/PY
+excursus/MS
+excusable/IP
+excusableness/IM
+excusably/I
+excuse/BGRSD
+excused/U
+excuser/M
+exec/MS
+execrableness/M
+execrable/P
+execrably
+execrate/DSXNGV
+execration/M
+executable/MS
+execute/NGVZBXDRS
+executer/M
+executional
+executioner/M
+execution/ZMR
+executive/SM
+executor/SM
+executrices
+executrix/M
+exegeses
+exegesis/M
+exegete/M
+exegetical
+exegetic/S
+exemplariness/M
+exemplar/MS
+exemplary/P
+exemplification/M
+exemplifier/M
+exemplify/ZXNSRDG
+exemption/MS
+exempt/SDG
+exerciser/M
+exercise/ZDRSGB
+exertion/MS
+exert/SGD
+Exeter/M
+exeunt
+exhalation/SM
+exhale/GSD
+exhausted/Y
+exhauster/M
+exhaustible/I
+exhausting/Y
+exhaustion/SM
+exhaustiveness/MS
+exhaustive/YP
+exhaust/VGRDS
+exhibitioner/M
+exhibitionism/MS
+exhibitionist/MS
+exhibition/ZMRS
+exhibitor/SM
+exhibit/VGSD
+exhilarate/XSDVNG
+exhilarating/Y
+exhilaration/M
+exhortation/SM
+exhort/DRSG
+exhorter/M
+exhumation/SM
+exhume/GRSD
+exhumer/M
+exigence/S
+exigency/SM
+exigent/SY
+exiguity/SM
+exiguous
+exile/SDGM
+existence/MS
+existent/I
+existentialism/MS
+existentialistic
+existentialist/MS
+existential/Y
+existents
+exist/SDG
+exit/MDSG
+exobiology/MS
+exocrine
+Exodus/M
+exodus/SM
+exogamous
+exogamy/M
+exogenous/Y
+exonerate/SDVGNX
+exoneration/M
+exorbitance/MS
+exorbitant/Y
+exorcise/SDG
+exorcism/SM
+exorcist/SM
+exorcizer/M
+exoskeleton/MS
+exosphere/SM
+exothermic
+exothermically
+exotica
+exotically
+exoticism/SM
+exoticness/M
+exotic/PS
+exp
+expandability/M
+expand/DRSGZB
+expanded/U
+expander/M
+expanse/DSXGNVM
+expansible
+expansionary
+expansionism/MS
+expansionist/MS
+expansion/M
+expansiveness/S
+expansive/YP
+expatiate/XSDNG
+expatiation/M
+expatriate/SDNGX
+expatriation/M
+expectancy/MS
+expectant/YS
+expectational
+expectation/MS
+expected/UPY
+expecting/Y
+expectorant/S
+expectorate/NGXDS
+expectoration/M
+expect/SBGD
+expedience/IS
+expediency/IMS
+expedients
+expedient/YI
+expediter/M
+expedite/ZDRSNGX
+expeditionary
+expedition/M
+expeditiousness/MS
+expeditious/YP
+expeditor's
+expellable
+expelled
+expelling
+expel/S
+expendable/S
+expended/U
+expender/M
+expenditure/SM
+expend/SDRGB
+expense/DSGVM
+expensive/IYP
+expensiveness/SMI
+experienced/U
+experience/ISDM
+experiencing
+experiential/Y
+experimentalism/M
+experimentalist/SM
+experimental/Y
+experimentation/SM
+experimenter/M
+experiment/GSMDRZ
+experted
+experting
+expertise/SM
+expertize/GD
+expertnesses
+expertness/IM
+expert/PISY
+expert's
+expiable/I
+expiate/XGNDS
+expiation/M
+expiatory
+expiration/MS
+expired/U
+expire/SDG
+expiry/MS
+explainable/UI
+explain/ADSG
+explained/U
+explainer/SM
+explanation/MS
+explanatory
+expletive/SM
+explicable/I
+explicate/VGNSDX
+explication/M
+explicative/Y
+explicitness/SM
+explicit/PSY
+explode/DSRGZ
+exploded/U
+exploder/M
+exploitation/MS
+exploitative
+exploited/U
+exploiter/M
+exploit/ZGVSMDRB
+exploration/MS
+exploratory
+explore/DSRBGZ
+explored/U
+explorer/M
+explosion/MS
+explosiveness/SM
+explosive/YPS
+expo/MS
+exponential/SY
+exponentiate/XSDNG
+exponentiation/M
+exponent/MS
+exportability
+exportable
+export/AGSD
+exportation/SM
+exporter/MS
+export's
+expose
+exposed/U
+exposer/M
+exposit/D
+exposition/SM
+expositor/MS
+expository
+expos/RSDZG
+expostulate/DSXNG
+expostulation/M
+exposure/SM
+expounder/M
+expound/ZGSDR
+expressed/U
+expresser/M
+express/GVDRSY
+expressibility/I
+expressible/I
+expressibly/I
+expressionism/SM
+expressionistic
+expressionist/S
+expressionless/YP
+expression/MS
+expressive/IYP
+expressiveness/MS
+expressiveness's/I
+expressway/SM
+expropriate/XDSGN
+expropriation/M
+expropriator/SM
+expulsion/MS
+expunge/GDSR
+expunger/M
+expurgated/U
+expurgate/SDGNX
+expurgation/M
+exquisiteness/SM
+exquisite/YPS
+ex/S
+ext
+extant
+extemporaneousness/MS
+extemporaneous/YP
+extempore/S
+extemporization/SM
+extemporizer/M
+extemporize/ZGSRD
+extendability/M
+extendedly
+extendedness/M
+extended/U
+extender/M
+extendibility/M
+extendibles
+extend/SGZDR
+extensibility/M
+extensible/I
+extensional/Y
+extension/SM
+extensiveness/SM
+extensive/PY
+extensor/MS
+extent/SM
+extenuate/XSDGN
+extenuation/M
+exterior/MYS
+exterminate/XNGDS
+extermination/M
+exterminator/SM
+externalities
+externalization/SM
+externalize/GDS
+external/YS
+extern/M
+extinct/DGVS
+extinction/MS
+extinguishable/I
+extinguish/BZGDRS
+extinguisher/M
+extirpate/XSDVNG
+extirpation/M
+extolled
+extoller/M
+extolling
+extol/S
+extort/DRSGV
+extorter/M
+extortionate/Y
+extortioner/M
+extortionist/SM
+extortion/ZSRM
+extracellular/Y
+extract/GVSBD
+extraction/SM
+extractive/Y
+extractor/SM
+extracurricular/S
+extradite/XNGSDB
+extradition/M
+extragalactic
+extralegal/Y
+extramarital
+extramural
+extraneousness/M
+extraneous/YP
+extraordinarily
+extraordinariness/M
+extraordinary/PS
+extrapolate/XVGNSD
+extrapolation/M
+extra/S
+extrasensory
+extraterrestrial/S
+extraterritorial
+extraterritoriality/MS
+extravagance/MS
+extravagant/Y
+extravaganza/SM
+extravehicular
+extravert's
+extrema
+extremal
+extreme/DSRYTP
+extremeness/MS
+extremism/SM
+extremist/MS
+extremity/SM
+extricable/I
+extricate/XSDNG
+extrication/M
+extrinsic
+extrinsically
+extroversion/SM
+extrovert/GMDS
+extrude/GDSR
+extruder/M
+extrusion/MS
+extrusive
+exuberance/MS
+exuberant/Y
+exudate/XNM
+exudation/M
+exude/GSD
+exultant/Y
+exultation/SM
+exult/DGS
+exulting/Y
+exurban
+exurbanite/SM
+exurbia/MS
+exurb/MS
+Exxon/M
+Eyck/M
+Eyde/M
+Eydie/M
+eyeball/GSMD
+eyebrow/MS
+eyed/P
+eyedropper/MS
+eyeful/MS
+eye/GDRSMZ
+eyeglass/MS
+eyelash/MS
+eyeless
+eyelet/GSMD
+eyelid/SM
+eyeliner/MS
+eyeopener/MS
+eyeopening
+eyepiece/SM
+eyer/M
+eyeshadow
+eyesight/MS
+eyesore/SM
+eyestrain/MS
+eyeteeth
+eyetooth/M
+eyewash/MS
+eyewitness/SM
+Eyre/M
+eyrie's
+Eysenck/M
+Ezechiel/M
+Ezekiel/M
+Ezequiel/M
+Eziechiele/M
+Ezmeralda/M
+Ezra/M
+Ezri/M
+F
+FAA
+Fabe/MR
+Fabergé/M
+Faber/M
+Fabiano/M
+Fabian/S
+Fabien/M
+Fabio/M
+fable/GMSRD
+fabler/M
+fabricate/SDXNG
+fabrication/M
+fabricator/MS
+fabric/MS
+fabulists
+fabulousness/M
+fabulous/YP
+facade/GMSD
+face/AGCSD
+facecloth
+facecloths
+faceless/P
+faceplate/M
+facer/CM
+face's
+facetiousness/MS
+facetious/YP
+facet/SGMD
+facial/YS
+facileness/M
+facile/YP
+facilitate/VNGXSD
+facilitation/M
+facilitator/SM
+facilitatory
+facility/MS
+facing/MS
+facsimileing
+facsimile/MSD
+factional
+factionalism/SM
+faction/SM
+factiousness/M
+factious/PY
+factitious
+fact/MS
+facto
+factoid/S
+factorial/MS
+factoring/A
+factoring's
+factorisable
+factorization/SM
+factorize/GSD
+factor/SDMJG
+factory/MS
+factotum/MS
+factuality/M
+factualness/M
+factual/PY
+faculty/MS
+faddish
+faddist/SM
+fadedly
+faded/U
+fadeout
+fader/M
+fade/S
+fading's
+fading/U
+fad/ZGSMDR
+Fae/M
+faerie/MS
+Faeroe/M
+faery's
+Fafnir/M
+fagged
+fagging
+faggoting's
+Fagin/M
+fag/MS
+fagoting/M
+fagot/MDSJG
+Fahd/M
+Fahrenheit/S
+faïence/S
+failing's
+failing/UY
+fail/JSGD
+faille/MS
+failsafe
+failure/SM
+Faina/M
+fain/GTSRD
+fainter/M
+fainthearted
+faintness/MS
+faint/YRDSGPT
+Fairbanks
+Fairchild/M
+faired
+Fairfax/M
+Fairfield/M
+fairgoer/S
+fairground/MS
+fairing/MS
+fairish
+Fairleigh/M
+fairless
+Fairlie/M
+Fair/M
+Fairmont/M
+fairness's
+fairness/US
+Fairport/M
+fairs
+fair/TURYP
+Fairview/M
+fairway/MS
+fairyland/MS
+fairy/MS
+fairytale
+Faisalabad
+Faisal/M
+faithed
+faithfulness/MSU
+faithfuls
+faithful/UYP
+faithing
+faithlessness/SM
+faithless/YP
+Faith/M
+faiths
+faith's
+faith/U
+fajitas
+faker/M
+fake/ZGDRS
+fakir/SM
+falafel
+falconer/M
+falconry/MS
+falcon/ZSRM
+Falito/M
+Falkland/MS
+Falk/M
+Falkner/M
+fallaciousness/M
+fallacious/PY
+fallacy/MS
+faller/M
+fallibility/MSI
+fallible/I
+fallibleness/MS
+fallibly/I
+falloff/S
+Fallon/M
+fallopian
+Fallopian/M
+fallout/MS
+fallowness/M
+fallow/PSGD
+fall/SGZMRN
+falsehood/SM
+falseness/SM
+false/PTYR
+falsetto/SM
+falsie/MS
+falsifiability/M
+falsifiable/U
+falsification/M
+falsifier/M
+falsify/ZRSDNXG
+falsity/MS
+Falstaff/M
+falterer/M
+faltering/UY
+falter/RDSGJ
+Falwell/M
+fa/M
+famed/C
+fame/DSMG
+fames/C
+familial
+familiarity/MUS
+familiarization/MS
+familiarized/U
+familiarizer/M
+familiarize/ZGRSD
+familiarizing/Y
+familiarly/U
+familiarness/M
+familiar/YPS
+family/MS
+famine/SM
+faming/C
+famish/GSD
+famously/I
+famousness/M
+famous/PY
+fanaticalness/M
+fanatical/YP
+fanaticism/MS
+fanatic/SM
+Fanchette/M
+Fanchon/M
+fancied
+Fancie/M
+fancier/SM
+fanciest
+fancifulness/MS
+fanciful/YP
+fancily
+fanciness/SM
+fancying
+fancy/IS
+Fancy/M
+fancywork/SM
+fandango/SM
+Fanechka/M
+fanfare/SM
+fanfold/M
+fang/DMS
+fangled
+Fania/M
+fanlight/SM
+Fan/M
+fanned
+Fannie/M
+Fanni/M
+fanning
+fanny/SM
+Fanny/SM
+fanout
+fan/SM
+fantail/SM
+fantasia/SM
+fantasist/M
+fantasize/SRDG
+fantastical/Y
+fantastic/S
+fantasy/GMSD
+Fanya/M
+fanzine/S
+FAQ/SM
+Faraday/M
+farad/SM
+Farah/M
+Fara/M
+Farand/M
+faraway
+Farber/M
+farce/SDGM
+farcical/Y
+fare/MS
+farer/M
+farewell/DGMS
+farfetchedness/M
+far/GDR
+Fargo/M
+Farica/M
+farinaceous
+farina/MS
+Farkas/M
+Farlay/M
+Farlee/M
+Farleigh/M
+Farley/M
+Farlie/M
+Farly/M
+farmer/M
+Farmer/M
+farmhand/S
+farmhouse/SM
+farming/M
+Farmington/M
+farmland/SM
+farm/MRDGZSJ
+farmstead/SM
+farmworker/S
+Far/MY
+farmyard/MS
+faro/MS
+farragoes
+farrago/M
+Farragut/M
+Farrah/M
+Farrakhan/M
+Farra/M
+Farrand/M
+Farrell/M
+Farrel/M
+farrier/SM
+Farris/M
+Farr/M
+farrow/DMGS
+farseeing
+farsightedness/SM
+farsighted/YP
+farther
+farthermost
+farthest
+farthing/SM
+fart/MDGS!
+fas
+fascia/SM
+fascicle/DSM
+fasciculate/DNX
+fasciculation/M
+fascinate/SDNGX
+fascinating/Y
+fascination/M
+fascism/MS
+Fascism's
+fascistic
+Fascist's
+fascist/SM
+fashionableness/M
+fashionable/PS
+fashionably/U
+fashion/ADSG
+fashioner/SM
+fashion's
+Fassbinder/M
+fastback/MS
+fastball/S
+fasten/AGUDS
+fastener/MS
+fastening/SM
+fast/GTXSPRND
+fastidiousness/MS
+fastidious/PY
+fastness/MS
+fatalism/MS
+fatalistic
+fatalistically
+fatalist/MS
+fatality/MS
+fatal/SY
+fatback/SM
+fatefulness/MS
+fateful/YP
+fate/MS
+Fates
+fatheaded/P
+fathead/SMD
+father/DYMGS
+fathered/U
+fatherhood/MS
+fatherland/SM
+fatherless
+fatherliness/M
+fatherly/P
+Father/SM
+fathomable/U
+fathomless
+fathom/MDSBG
+fatigued/U
+fatigue/MGSD
+fatiguing/Y
+Fatima/M
+fatness/SM
+fat/PSGMDY
+fatso/M
+fatted
+fattener/M
+fatten/JZGSRD
+fatter
+fattest/M
+fattiness/SM
+fatting
+fatty/RSPT
+fatuity/MS
+fatuousness/SM
+fatuous/YP
+fatwa/SM
+faucet/SM
+Faulknerian
+Faulkner/M
+fault/CGSMD
+faultfinder/MS
+faultfinding/MS
+faultily
+faultiness/MS
+faultlessness/SM
+faultless/PY
+faulty/RTP
+fauna/MS
+Faunie/M
+Faun/M
+faun/MS
+Fauntleroy/M
+Faustian
+Faustina/M
+Faustine/M
+Faustino/M
+Faust/M
+Faustus/M
+fauvism/S
+favorableness/MU
+favorable/UMPS
+favorably/U
+favoredness/M
+favored's/U
+favored/YPSM
+favorer/EM
+favor/ESMRDGZ
+favoring/MYS
+favorings/U
+favorite/SMU
+favoritism/MS
+favors/A
+Fawkes/M
+Fawne/M
+fawner/M
+fawn/GZRDMS
+Fawnia/M
+fawning/Y
+Fawn/M
+fax/GMDS
+Fax/M
+Faydra/M
+Faye/M
+Fayette/M
+Fayetteville/M
+Fayina/M
+Fay/M
+fay/MDRGS
+Fayre/M
+Faythe/M
+Fayth/M
+faze/DSG
+FBI
+FCC
+FD
+FDA
+FDIC
+FDR/M
+fealty/MS
+fearfuller
+fearfullest
+fearfulness/MS
+fearful/YP
+fearlessness/MS
+fearless/PY
+fear/RDMSG
+fearsomeness/M
+fearsome/PY
+feasibility/SM
+feasibleness/M
+feasible/UI
+feasibly/U
+feaster/M
+feast/GSMRD
+feater/C
+featherbed
+featherbedding/SM
+featherbrain/MD
+feathered/U
+feathering/M
+featherless
+featherlight
+Featherman/M
+feathertop
+featherweight/SM
+feathery/TR
+feather/ZMDRGS
+feat/MYRGTS
+feats/C
+featureless
+feature/MGSD
+Feb/M
+febrile
+February/MS
+fecal
+feces
+fecklessness/M
+feckless/PY
+fecundability
+fecundate/XSDGN
+fecundation/M
+fecund/I
+fecundity/SM
+federalism/SM
+Federalist
+federalist/MS
+federalization/MS
+federalize/GSD
+Federal/S
+federal/YS
+federated/U
+federate/FSDXVNG
+federation/FM
+federative/Y
+Federica/M
+Federico/M
+FedEx/M
+Fedora/M
+fedora/SM
+feds
+Fed/SM
+fed/U
+feebleness/SM
+feeble/TPR
+feebly
+feedback/SM
+feedbag/MS
+feeder/M
+feed/GRZJS
+feeding/M
+feedlot/SM
+feedstock
+feedstuffs
+feeing
+feeler/M
+feel/GZJRS
+feelingly/U
+feeling/MYP
+feelingness/M
+Fee/M
+fee/MDS
+feet/M
+feigned/U
+feigner/M
+feign/RDGS
+feint/MDSG
+feisty/RT
+Felder/M
+Feldman/M
+feldspar/MS
+Felecia/M
+Felicdad/M
+Felice/M
+Felicia/M
+Felicio/M
+felicitate/XGNSD
+felicitation/M
+felicitous/IY
+felicitousness/M
+felicity/IMS
+Felicity/M
+Felicle/M
+Felic/M
+Felike/M
+Feliks/M
+feline/SY
+Felipa/M
+Felipe/M
+Felisha/M
+Felita/M
+Felix/M
+Feliza/M
+Felizio/M
+fella/S
+fellatio/SM
+felled/A
+feller/M
+felling/A
+Fellini/M
+fellness/M
+fellowman
+fellowmen
+fellow/SGDYM
+fellowshipped
+fellowshipping
+fellowship/SM
+fell/PSGZTRD
+feloniousness/M
+felonious/PY
+felon/MS
+felony/MS
+felt/GSD
+felting/M
+Fe/M
+female/MPS
+femaleness/SM
+feminineness/M
+feminine/PYS
+femininity/MS
+feminism/MS
+feminist/MS
+femme/MS
+femoral
+fem/S
+femur/MS
+fenced/U
+fencepost/M
+fencer/M
+fence/SRDJGMZ
+fencing/M
+fender/CM
+fend/RDSCZG
+Fenelia/M
+fenestration/CSM
+Fenian/M
+fenland/M
+fen/MS
+fennel/SM
+Fenwick/M
+Feodora/M
+Feodor/M
+feral
+Ferber/M
+Ferdie/M
+Ferdinanda/M
+Ferdinande/M
+Ferdinand/M
+Ferdinando/M
+Ferd/M
+Ferdy/M
+fer/FLC
+Fergus/M
+Ferguson/M
+Ferlinghetti/M
+Fermat/M
+fermentation/MS
+fermented
+fermenter
+ferment/FSCM
+fermenting
+Fermi/M
+fermion/MS
+fermium/MS
+Fernanda/M
+Fernande/M
+Fernandez/M
+Fernandina/M
+Fernando/M
+Ferne/M
+fernery/M
+Fern/M
+fern/MS
+ferny/TR
+ferociousness/MS
+ferocious/YP
+ferocity/MS
+Ferrari/M
+Ferraro/M
+Ferreira/M
+Ferrell/M
+Ferrel/M
+Ferrer/M
+ferreter/M
+ferret/SMRDG
+ferric
+ferris
+Ferris
+ferrite/M
+ferro
+ferroelectric
+ferromagnetic
+ferromagnet/M
+ferrous
+ferrule/MGSD
+ferryboat/MS
+ferryman/M
+ferrymen
+ferry/SDMG
+fertileness/M
+fertile/YP
+fertility/IMS
+fertilization/ASM
+fertilized/U
+fertilizer/M
+fertilizes/A
+fertilize/SRDZG
+ferule/SDGM
+fervency/MS
+fervent/Y
+fervidness/M
+fervid/YP
+fervor/MS
+fess/KGFSD
+Fess/M
+fess's
+festal/S
+fester/GD
+festival/SM
+festiveness/SM
+festive/PY
+festivity/SM
+festoon/SMDG
+fest/RVZ
+fetal
+feta/MS
+fetcher/M
+fetching/Y
+fetch/RSDGZ
+feted
+fête/MS
+fetich's
+fetidness/SM
+fetid/YP
+feting
+fetishism/SM
+fetishistic
+fetishist/SM
+fetish/MS
+fetlock/MS
+fetter's
+fetter/UGSD
+fettle/GSD
+fettling/M
+fettuccine/S
+fetus/SM
+feudalism/MS
+feudalistic
+feudal/Y
+feudatory/M
+feud/MDSG
+feverishness/SM
+feverish/PY
+fever/SDMG
+fewness/MS
+few/PTRS
+Fey/M
+Feynman/M
+fey/RT
+fez/M
+Fez/M
+fezzes
+ff
+FHA
+fiancée/S
+fiancé/MS
+Fianna/M
+Fiann/M
+fiascoes
+fiasco/M
+Fiat/M
+fiat/MS
+fibbed
+fibber/MS
+fibbing
+fiberboard/MS
+fiber/DM
+fiberfill/S
+Fiberglas/M
+fiberglass/DSMG
+Fibonacci/M
+fibrillate/XGNDS
+fibrillation/M
+fibril/MS
+fibrin/MS
+fibroblast/MS
+fibroid/S
+fibroses
+fibrosis/M
+fibrousness/M
+fibrous/YP
+fib/SZMR
+fibulae
+fibula/M
+fibular
+FICA
+fices
+fiche/SM
+Fichte/M
+fichu/SM
+fickleness/MS
+fickle/RTP
+ficos
+fictionalization/MS
+fictionalize/DSG
+fictional/Y
+fiction/SM
+fictitiousness/M
+fictitious/PY
+fictive/Y
+ficus
+fiddle/GMZJRSD
+fiddler/M
+fiddlestick/SM
+fiddly
+fide/F
+Fidela/M
+Fidelia/M
+Fidelio/M
+fidelity/IMS
+Fidelity/M
+Fidel/M
+fidget/DSG
+fidgety
+Fidole/M
+Fido/M
+fiducial/Y
+fiduciary/MS
+fiefdom/S
+fief/MS
+fielded
+fielder/IM
+fielding
+Fielding/M
+Field/MGS
+fieldstone/M
+fieldworker/M
+fieldwork/ZMRS
+field/ZISMR
+fiendishness/M
+fiendish/YP
+fiend/MS
+fierceness/SM
+fierce/RPTY
+fierily
+fieriness/MS
+fiery/PTR
+fie/S
+fies/C
+fiesta/MS
+fife/DRSMZG
+fifer/M
+Fifi/M
+Fifine/M
+FIFO
+fifteen/HRMS
+fifteenths
+fifths
+fifth/Y
+fiftieths
+fifty/HSM
+Figaro/M
+figged
+figging
+fightback
+fighter/MIS
+fighting/IS
+fight/ZSJRG
+figment/MS
+fig/MLS
+Figueroa/M
+figural
+figuration/FSM
+figurativeness/M
+figurative/YP
+figure/GFESD
+figurehead/SM
+figurer/SM
+figure's
+figurine/SM
+figuring/S
+Fijian/SM
+Fiji/M
+filamentary
+filament/MS
+filamentous
+Filberte/M
+Filbert/M
+filbert/MS
+Filberto/M
+filch/SDG
+filed/AC
+file/KDRSGMZ
+filename/SM
+filer/KMCS
+files/AC
+filet's
+filial/UY
+Filia/M
+filibusterer/M
+filibuster/MDRSZG
+Filide/M
+filigreeing
+filigree/MSD
+filing/AC
+filings
+Filipino/SM
+Filip/M
+Filippa/M
+Filippo/M
+fill/BAJGSD
+filled/U
+filler/MS
+filleting/M
+fillet/MDSG
+filling/M
+fillip/MDGS
+Fillmore/M
+filly/SM
+filmdom/M
+Filmer/M
+filminess/SM
+filming/M
+filmmaker/S
+Filmore/M
+film/SGMD
+filmstrip/SM
+filmy/RTP
+Filofax/S
+filtered/U
+filterer/M
+filter/RDMSZGB
+filthily
+filthiness/SM
+filth/M
+filths
+filthy/TRSDGP
+filtrated/I
+filtrate/SDXMNG
+filtrates/I
+filtrating/I
+filtration/IMS
+finagler/M
+finagle/RSDZG
+finale/MS
+finalist/MS
+finality/MS
+finalization/SM
+finalize/GSD
+final/SY
+Fina/M
+financed/A
+finance/MGSDJ
+finances/A
+financial/Y
+financier/DMGS
+financing/A
+Finch/M
+finch/MS
+findable/U
+find/BRJSGZ
+finder/M
+finding/M
+Findlay/M
+Findley/M
+fine/FGSCRDA
+finely
+fineness/MS
+finery/MAS
+fine's
+finespun
+finesse/SDMG
+fingerboard/SM
+fingerer/M
+fingering/M
+fingerless
+fingerling/M
+fingernail/MS
+fingerprint/SGDM
+finger/SGRDMJ
+fingertip/MS
+finial/SM
+finical
+finickiness/S
+finicky/RPT
+fining/M
+finished/UA
+finisher/M
+finishes/A
+finish/JZGRSD
+finis/SM
+finite/ISPY
+finitely/C
+finiteness/MIC
+fink/GDMS
+Finland/M
+Finlay/M
+Finley/M
+Fin/M
+Finnbogadottir/M
+finned
+Finnegan/M
+finner
+finning
+Finnish
+Finn/MS
+finny/RT
+fin/TGMDRS
+Fiona/M
+Fionna/M
+Fionnula/M
+fiord's
+Fiorello/M
+Fiorenze/M
+Fiori/M
+f/IRAC
+firearm/SM
+fireball/SM
+fireboat/M
+firebomb/MDSG
+firebox/MS
+firebrand/MS
+firebreak/SM
+firebrick/SM
+firebug/SM
+firecracker/SM
+firedamp/SM
+fired/U
+firefight/JRGZS
+firefly/MS
+Firefox/M
+fireguard/M
+firehouse/MS
+firelight/GZSM
+fireman/M
+firemen
+fire/MS
+fireplace/MS
+fireplug/MS
+firepower/SM
+fireproof/SGD
+firer/M
+firesafe
+fireside/SM
+Firestone/M
+firestorm/SM
+firetrap/SM
+firetruck/S
+firewall/S
+firewater/SM
+firewood/MS
+firework/MS
+firing/M
+firkin/M
+firmament/MS
+firmer
+firmest
+firm/ISFDG
+firmly/I
+firmness/MS
+firm's
+firmware/MS
+firring
+firstborn/S
+firsthand
+first/SY
+firth/M
+firths
+fir/ZGJMDRHS
+fiscal/YS
+Fischbein/M
+Fischer/M
+fishbowl/MS
+fishcake/S
+fisher/M
+Fisher/M
+fisherman/M
+fishermen/M
+fishery/MS
+fishhook/MS
+fishily
+fishiness/MS
+fishing/M
+fish/JGZMSRD
+Fishkill/M
+fishmeal
+fishmonger/MS
+fishnet/SM
+fishpond/SM
+fishtail/DMGS
+fishtanks
+fishwife/M
+fishwives
+fishy/TPR
+Fiske/M
+Fisk/M
+fissile
+fissionable/S
+fission/BSDMG
+fissure/MGSD
+fistfight/SM
+fistful/MS
+fisticuff/SM
+fist/MDGS
+fistula/SM
+fistulous
+Fitchburg/M
+Fitch/M
+fitfulness/SM
+fitful/PY
+fitments
+fitness/USM
+fits/AK
+fit's/K
+fitted/UA
+fitter/SM
+fittest
+fitting/AU
+fittingly
+fittingness/M
+fittings
+fit/UYPS
+Fitzgerald/M
+Fitz/M
+Fitzpatrick/M
+Fitzroy/M
+fivefold
+five/MRS
+fiver/M
+fixable
+fixate/VNGXSD
+fixatifs
+fixation/M
+fixative/S
+fixedness/M
+fixed/YP
+fixer/SM
+fixes/I
+fixing/SM
+fixity/MS
+fixture/SM
+fix/USDG
+Fizeau/M
+fizzer/M
+fizzle/GSD
+fizz/SRDG
+fizzy/RT
+fjord/SM
+FL
+flabbergast/GSD
+flabbergasting/Y
+flabbily
+flabbiness/SM
+flabby/TPR
+flab/MS
+flaccidity/MS
+flaccid/Y
+flack/SGDM
+flagella/M
+flagellate/DSNGX
+flagellation/M
+flagellum/M
+flagged
+flaggingly/U
+flagging/SMY
+flagman/M
+flagmen
+flag/MS
+flagon/SM
+flagpole/SM
+flagrance/MS
+flagrancy/SM
+flagrant/Y
+flagship/MS
+flagstaff/MS
+flagstone/SM
+flail/SGMD
+flair/SM
+flaker/M
+flake/SM
+flakiness/MS
+flak/RDMGS
+flaky/PRT
+Fla/M
+flambé/D
+flambeing
+flambes
+flamboyance/MS
+flamboyancy/MS
+flamboyant/YS
+flamenco/SM
+flamen/M
+flameproof/DGS
+flamer/IM
+flame's
+flame/SIGDR
+flamethrower/SM
+flamingo/SM
+flaming/Y
+flammability/ISM
+flammable/SI
+flam/MRNDJGZ
+Flanagan/M
+Flanders/M
+flange/GMSD
+flanker/M
+flank/SGZRDM
+flan/MS
+flannel/DMGS
+flannelet/MS
+flannelette's
+flapjack/SM
+flap/MS
+flapped
+flapper/SM
+flapping
+flaps/M
+flare/SDG
+flareup/S
+flaring/Y
+flashback/SM
+flashbulb/SM
+flashcard/S
+flashcube/MS
+flasher/M
+flashgun/S
+flashily
+flashiness/SM
+flashing/M
+flash/JMRSDGZ
+flashlight/MS
+flashy/TPR
+flask/SM
+flatbed/S
+flatboat/MS
+flatcar/MS
+flatfeet
+flatfish/SM
+flatfoot/SGDM
+flathead/M
+flatiron/SM
+flatland/RS
+flatmate/M
+flat/MYPS
+flatness/MS
+flatted
+flattener/M
+flatten/SDRG
+flatter/DRSZG
+flatterer/M
+flattering/YU
+flattery/SM
+flattest/M
+flatting
+flattish
+Flatt/M
+flattop/MS
+flatulence/SM
+flatulent/Y
+flatus/SM
+flatware/MS
+flatworm/SM
+Flaubert/M
+flaunting/Y
+flaunt/SDG
+flautist/SM
+flavored/U
+flavorer/M
+flavorful
+flavoring/M
+flavorless
+flavor/SJDRMZG
+flavorsome
+flaw/GDMS
+flawlessness/MS
+flawless/PY
+flax/MSN
+flaxseed/M
+flayer/M
+flay/RDGZS
+fleabag/MS
+fleabites
+flea/SM
+fleawort/M
+fleck/GRDMS
+Fledermaus/M
+fledged/U
+fledge/GSD
+fledgling/SM
+fleecer/M
+fleece/RSDGMZ
+fleeciness/SM
+fleecy/RTP
+fleeing
+flee/RS
+fleetingly/M
+fleetingness/SM
+fleeting/YP
+fleet/MYRDGTPS
+fleetness/MS
+Fleischer/M
+Fleischman/M
+Fleisher/M
+Fleming/M
+Flemished/M
+Flemish/GDSM
+Flemishing/M
+Flem/JGM
+Flemming/M
+flesher/M
+fleshiness/M
+flesh/JMYRSDG
+fleshless
+fleshly/TR
+fleshpot/SM
+fleshy/TPR
+fletch/DRSGJ
+fletcher/M
+Fletcher/M
+fletching/M
+Fletch/MR
+Fleurette/M
+Fleur/M
+flew/S
+flews/M
+flexed/I
+flexibility/MSI
+flexible/I
+flexibly/I
+flexitime's
+flex/MSDAG
+flextime/S
+flexural
+flexure/M
+fl/GJD
+flibbertigibbet/MS
+flicker/GD
+flickering/Y
+flickery
+flick/GZSRD
+flier/M
+flight/GMDS
+flightiness/SM
+flightless
+flightpath
+flighty/RTP
+flimflammed
+flimflamming
+flimflam/MS
+flimsily
+flimsiness/MS
+flimsy/PTRS
+flincher/M
+flinch/GDRS
+flinching/U
+flinger/M
+fling/RMG
+Flin/M
+Flinn/M
+flintiness/M
+flintless
+flintlock/MS
+Flint/M
+flint/MDSG
+Flintstones
+flinty/TRP
+flipflop
+flippable
+flippancy/MS
+flippant/Y
+flipped
+flipper/SM
+flippest
+flipping
+flip/S
+flirtation/SM
+flirtatiousness/MS
+flirtatious/PY
+flirt/GRDS
+flit/S
+flitted
+flitting
+floater/M
+float/SRDGJZ
+floaty
+flocculate/GNDS
+flocculation/M
+flock/SJDMG
+floe/MS
+flogged
+flogger/SM
+flogging/SM
+flog/S
+Flo/M
+floodgate/MS
+floodlight/DGMS
+floodlit
+floodplain/S
+flood/SMRDG
+floodwater/SM
+floorboard/MS
+floorer/M
+flooring/M
+floor/SJRDMG
+floorspace
+floorwalker/SM
+floozy/SM
+flophouse/SM
+flop/MS
+flopped
+flopper/M
+floppily
+floppiness/SM
+flopping
+floppy/TMRSP
+floral/SY
+Flora/M
+Florance/M
+flora/SM
+Florella/M
+Florence/M
+Florencia/M
+Florentia/M
+Florentine/S
+Florenza/M
+florescence/MIS
+florescent/I
+Flore/SM
+floret/MS
+Florette/M
+Floria/M
+Florian/M
+Florida/M
+Floridan/S
+Floridian/S
+floridness/SM
+florid/YP
+Florie/M
+Florina/M
+Florinda/M
+Florine/M
+florin/MS
+Flori/SM
+florist/MS
+Flor/M
+Florrie/M
+Florri/M
+Florry/M
+Flory/M
+floss/GSDM
+Flossie/M
+Flossi/M
+Flossy/M
+flossy/RST
+flotation/SM
+flotilla/SM
+flotsam/SM
+flounce/GDS
+flouncing/M
+flouncy/RT
+flounder/SDG
+flourisher/M
+flourish/GSRD
+flourishing/Y
+flour/SGDM
+floury/TR
+flouter/M
+flout/GZSRD
+flowchart/SG
+flowed
+flowerbed/SM
+flower/CSGD
+flowerer/M
+floweriness/SM
+flowerless
+flowerpot/MS
+flower's
+Flowers
+flowery/TRP
+flowing/Y
+flow/ISG
+flown
+flowstone
+Floyd/M
+Flss/M
+flt
+flubbed
+flubbing
+flub/S
+fluctuate/XSDNG
+fluctuation/M
+fluency/MS
+fluently
+fluent/SF
+flue/SM
+fluffiness/SM
+fluff/SGDM
+fluffy/PRT
+fluidity/SM
+fluidized
+fluid/MYSP
+fluidness/M
+fluke/SDGM
+fluky/RT
+flume/SDGM
+flummox/DSG
+flu/MS
+flung
+flunkey's
+flunk/SRDG
+flunky/MS
+fluoresce/GSRD
+fluorescence/MS
+fluorescent/S
+fluoridate/XDSGN
+fluoridation/M
+fluoride/SM
+fluorimetric
+fluorinated
+fluorine/SM
+fluorite/MS
+fluorocarbon/MS
+fluoroscope/MGDS
+fluoroscopic
+flurry/GMDS
+flushness/M
+flush/TRSDPBG
+fluster/DSG
+fluter/M
+flute/SRDGMJ
+fluting/M
+flutist/MS
+flutter/DRSG
+flutterer/M
+fluttery
+fluxed/A
+fluxes/A
+flux/IMS
+fluxing
+flyaway
+flyblown
+flyby/M
+flybys
+flycatcher/MS
+flyer's
+fly/JGBDRSTZ
+flyleaf/M
+flyleaves
+Flynn/M
+flyover/MS
+flypaper/MS
+flysheet/S
+flyspeck/MDGS
+flyswatter/S
+flyway/MS
+flyweight/MS
+flywheel/MS
+FM
+Fm/M
+FNMA/M
+foal/MDSG
+foaminess/MS
+foam/MRDSG
+foamy/RPT
+fobbed
+fobbing
+fob/SM
+focal/F
+focally
+Foch/M
+foci's
+focused/AU
+focuser/M
+focuses/A
+focus/SRDMBG
+fodder/GDMS
+foe/SM
+foetid
+FOFL
+fogbound
+fogged/C
+foggily
+fogginess/MS
+fogging/C
+foggy/RPT
+foghorn/SM
+fogs/C
+fog/SM
+fogyish
+fogy/SM
+foible/MS
+foil/GSD
+foist/GDS
+Fokker/M
+foldaway/S
+folded/AU
+folder/M
+foldout/MS
+fold/RDJSGZ
+folds/UA
+Foley/M
+foliage/MSD
+foliate/CSDXGN
+foliation/CM
+folio/SDMG
+folklike
+folklore/MS
+folkloric
+folklorist/SM
+folk/MS
+folksiness/MS
+folksinger/S
+folksinging/S
+folksong/S
+folksy/TPR
+folktale/S
+folkway/S
+foll
+follicle/SM
+follicular
+follower/M
+follow/JSZBGRD
+followup's
+folly/SM
+Folsom
+fol/Y
+Fomalhaut/M
+fomentation/SM
+fomenter/M
+foment/RDSG
+Fonda/M
+fondant/SM
+fondle/GSRD
+fondler/M
+fondness/MS
+fond/PMYRDGTS
+fondue/MS
+Fons
+Fonsie/M
+Fontainebleau/M
+Fontaine/M
+Fontana/M
+fontanelle's
+fontanel/MS
+font/MS
+Fonzie/M
+Fonz/M
+foodie/S
+food/MS
+foodstuff/MS
+foolery/MS
+foolhardily
+foolhardiness/SM
+foolhardy/PTR
+foolishness/SM
+foolish/PRYT
+fool/MDGS
+foolproof
+foolscap/MS
+footage/SM
+football/SRDMGZ
+footbridge/SM
+Foote/M
+footer/M
+footfall/SM
+foothill/SM
+foothold/MS
+footing/M
+footless
+footlights
+footling
+footlocker/SM
+footloose
+footman/M
+footmarks
+footmen
+footnote/MSDG
+footpad/SM
+footpath/M
+footpaths
+footplate/M
+footprint/MS
+footrace/S
+footrest/MS
+footsie/SM
+foot/SMRDGZJ
+footsore
+footstep/SM
+footstool/SM
+footwear/M
+footwork/SM
+fop/MS
+fopped
+foppery/MS
+fopping
+foppishness/SM
+foppish/YP
+forage/GSRDMZ
+forager/M
+forayer/M
+foray/SGMRD
+forbade
+forbearance/SM
+forbearer/M
+forbear/MRSG
+Forbes/M
+forbidden
+forbiddingness/M
+forbidding/YPS
+forbid/S
+forbore
+forborne
+forced/Y
+forcefield/MS
+forcefulness/MS
+forceful/PY
+forceps/M
+forcer/M
+force/SRDGM
+forcibleness/M
+forcible/P
+forcibly
+fordable/U
+Fordham/M
+Ford/M
+ford/SMDBG
+forearm/GSDM
+forebear/MS
+forebode/GJDS
+forebodingness/M
+foreboding/PYM
+forecaster/M
+forecastle/MS
+forecast/SZGR
+foreclose/GSD
+foreclosure/MS
+forecourt/SM
+foredoom/SDG
+forefather/SM
+forefeet
+forefinger/MS
+forefoot/M
+forefront/SM
+foregoer/M
+foregoing/S
+foregone
+foregos
+foreground/MGDS
+forehand/S
+forehead/MS
+foreigner/M
+foreignness/SM
+foreign/PRYZS
+foreknew
+foreknow/GS
+foreknowledge/MS
+foreknown
+foreleg/MS
+forelimb/MS
+forelock/MDSG
+foreman/M
+Foreman/M
+foremast/SM
+foremen
+foremost
+forename/DSM
+forenoon/SM
+forensically
+forensic/S
+forensics/M
+foreordain/DSG
+forepart/MS
+forepaws
+forepeople
+foreperson/S
+foreplay/MS
+forequarter/SM
+forerunner/MS
+fore/S
+foresail/SM
+foresaw
+foreseeable/U
+foreseeing
+foreseen/U
+foreseer/M
+foresee/ZSRB
+foreshadow/SGD
+foreshore/M
+foreshorten/DSG
+foresightedness/SM
+foresighted/PY
+foresight/SMD
+foreskin/SM
+forestaller/M
+forestall/LGSRD
+forestallment/M
+forestation/MCS
+forestations/A
+forest/CSAGD
+Forester/M
+forester/SM
+forestland/S
+Forest/MR
+forestry/MS
+forest's
+foretaste/MGSD
+foreteller/M
+foretell/RGS
+forethought/MS
+foretold
+forevermore
+forever/PS
+forewarner/M
+forewarn/GSJRD
+forewent
+forewoman/M
+forewomen
+foreword/SM
+forfeiter/M
+forfeiture/MS
+forfeit/ZGDRMS
+forfend/GSD
+forgather/GSD
+forgave
+forged/A
+forge/JVGMZSRD
+forger/M
+forgery/MS
+forges/A
+forgetfulness/SM
+forgetful/PY
+forget/SV
+forgettable/U
+forgettably/U
+forgetting
+forging/M
+forgivable/U
+forgivably/U
+forgiven
+forgiveness/SM
+forgiver/M
+forgive/SRPBZG
+forgivingly
+forgivingness/M
+forgiving/UP
+forgoer/M
+forgoes
+forgone
+forgo/RSGZ
+forgot
+forgotten/U
+for/HT
+forkful/S
+fork/GSRDM
+forklift/DMSG
+forlornness/M
+forlorn/PTRY
+formability/AM
+formaldehyde/SM
+formalin/M
+formalism/SM
+formalistic
+formalist/SM
+formality/SMI
+formal/IY
+formalization/SM
+formalized/U
+formalizer/M
+formalizes/I
+formalize/ZGSRD
+formalness/M
+formals
+formant/MIS
+format/AVS
+formate/MXGNSD
+formation/AFSCIM
+formatively/I
+formativeness/IM
+formative/SYP
+format's
+formatted/UA
+formatter/A
+formatters
+formatter's
+formatting/A
+form/CGSAFDI
+formed/U
+former/FSAI
+formerly
+formfitting
+formic
+Formica/MS
+formidableness/M
+formidable/P
+formidably
+formlessness/MS
+formless/PY
+Formosa/M
+Formosan
+form's
+formulaic
+formula/SM
+formulate/AGNSDX
+formulated/U
+formulation/AM
+formulator/SM
+fornicate/GNXSD
+fornication/M
+fornicator/SM
+Forrester/M
+Forrest/RM
+forsaken
+forsake/SG
+forsook
+forsooth
+Forster/M
+forswear/SG
+forswore
+forsworn
+forsythia/MS
+Fortaleza/M
+forte/MS
+forthcome/JG
+forthcoming/U
+FORTH/M
+forthrightness/SM
+forthright/PYS
+forthwith
+fortieths
+fortification/MS
+fortified/U
+fortifier/SM
+fortify/ADSG
+fortiori
+fortissimo/S
+fortitude/SM
+fortnightly/S
+fortnight/MYS
+FORTRAN
+Fortran/M
+fortress/GMSD
+fort/SM
+fortuitousness/SM
+fortuitous/YP
+fortuity/MS
+fortunateness/M
+fortunate/YUS
+fortune/MGSD
+fortuneteller/SM
+fortunetelling/SM
+forty/SRMH
+forum/MS
+forwarder/M
+forwarding/M
+forwardness/MS
+forward/PTZSGDRY
+forwent
+fossiliferous
+fossilization/MS
+fossilized/U
+fossilize/GSD
+fossil/MS
+Foss/M
+fosterer/M
+Foster/M
+foster/SRDG
+Foucault/M
+fought
+foulard/SM
+foulmouth/D
+foulness/MS
+fouls/M
+foul/SYRDGTP
+foundational
+foundation/SM
+founded/UF
+founder/MDG
+founder's/F
+founding/F
+foundling/MS
+found/RDGZS
+foundry/MS
+founds/KF
+fountainhead/SM
+fountain/SMDG
+fount/MS
+fourfold
+Fourier/M
+fourpence/M
+fourpenny
+fourposter/SM
+fourscore/S
+four/SHM
+foursome/SM
+foursquare
+fourteener/M
+fourteen/SMRH
+fourteenths
+Fourth
+fourths
+Fourths
+fourth/Y
+fovea/M
+fowler/M
+Fowler/M
+fowling/M
+fowl/SGMRD
+foxfire/SM
+foxglove/SM
+Foxhall/M
+foxhole/SM
+foxhound/SM
+foxily
+foxiness/MS
+foxing/M
+fox/MDSG
+Fox/MS
+foxtail/M
+foxtrot/MS
+foxtrotted
+foxtrotting
+foxy/TRP
+foyer/SM
+FPO
+fps
+fr
+fracas/SM
+fractal/SM
+fractional/Y
+fractionate/DNG
+fractionation/M
+fractioned
+fractioning
+fraction/ISMA
+fractiousness/SM
+fractious/PY
+fracture/MGDS
+fragile/Y
+fragility/MS
+fragmentarily
+fragmentariness/M
+fragmentary/P
+fragmentation/MS
+fragment/SDMG
+Fragonard/M
+fragrance/SM
+fragrant/Y
+frailness/MS
+frail/STPYR
+frailty/MS
+framed/U
+framer/M
+frame/SRDJGMZ
+framework/SM
+framing/M
+Francaise/M
+France/MS
+Francene/M
+Francesca/M
+Francesco/M
+franchisee/S
+franchise/ESDG
+franchiser/SM
+franchise's
+Franchot/M
+Francie/M
+Francine/M
+Francis
+Francisca/M
+Franciscan/MS
+Francisco/M
+Franciska/M
+Franciskus/M
+francium/MS
+Francklin/M
+Francklyn/M
+Franck/M
+Francoise/M
+Francois/M
+Franco/M
+francophone/M
+franc/SM
+Francyne/M
+frangibility/SM
+frangible
+Frankel/M
+Frankenstein/MS
+franker/M
+Frankford/M
+Frankfort/M
+Frankfurter/M
+frankfurter/MS
+Frankfurt/RM
+Frankie/M
+frankincense/MS
+Frankish/M
+franklin/M
+Franklin/M
+Franklyn/M
+frankness/MS
+frank/SGTYRDP
+Frank/SM
+Franky/M
+Fran/MS
+Frannie/M
+Franni/M
+Franny/M
+Fransisco/M
+frantically
+franticness/M
+frantic/PY
+Frants/M
+Franzen/M
+Franz/NM
+frappé
+frappeed
+frappeing
+frappes
+Frasco/M
+Fraser/M
+Frasier/M
+Frasquito/M
+fraternal/Y
+fraternity/MSF
+fraternization/SM
+fraternize/GZRSD
+fraternizer/M
+fraternizing/U
+frat/MS
+fratricidal
+fratricide/MS
+fraud/CS
+fraud's
+fraudsters
+fraudulence/S
+fraudulent/YP
+fraught/SGD
+Fraulein/S
+Frau/MN
+fray/CSDG
+Frayda/M
+Frayne/M
+fray's
+Fraze/MR
+Frazer/M
+Frazier/M
+frazzle/GDS
+freakishness/SM
+freakish/YP
+freak/SGDM
+freaky/RT
+freckle/GMDS
+freckly/RT
+Freda/M
+Freddie/M
+Freddi/M
+Freddy/M
+Fredek/M
+Fredelia/M
+Frederica/M
+Frederich/M
+Fredericka/M
+Frederick/MS
+Frederic/M
+Frederico/M
+Fredericton/M
+Frederigo/M
+Frederik/M
+Frederique/M
+Fredholm/M
+Fredia/M
+Fredi/M
+Fred/M
+Fredra/M
+Fredrick/M
+Fredrickson/M
+Fredric/M
+Fredrika/M
+freebase/GDS
+freebie/MS
+freebooter/M
+freeboot/ZR
+freeborn
+freedman/M
+Freedman/M
+freedmen
+freedom/MS
+freehand/D
+freehanded/Y
+freeholder/M
+freehold/ZSRM
+freeing/S
+freelance/SRDGZM
+Freeland/M
+freeloader/M
+freeload/SRDGZ
+Free/M
+freeman/M
+Freeman/M
+freemasonry/M
+Freemasonry/MS
+Freemason/SM
+freemen
+Freemon/M
+freeness/M
+Freeport/M
+freestanding
+freestone/SM
+freestyle/SM
+freethinker/MS
+freethinking/S
+Freetown/M
+freeway/MS
+freewheeler/M
+freewheeling/P
+freewheel/SRDMGZ
+freewill
+free/YTDRSP
+freezable
+freezer/SM
+freeze/UGSA
+freezing/S
+Freida/M
+freighter/M
+freight/ZGMDRS
+Fremont/M
+Frenchman/M
+French/MDSG
+Frenchmen
+Frenchwoman/M
+Frenchwomen
+frenetically
+frenetic/S
+frenzied/Y
+frenzy/MDSG
+freon/S
+Freon/SM
+freq
+frequency/ISM
+frequented/U
+frequenter/MS
+frequentest
+frequenting
+frequent/IY
+frequentness/M
+frequents
+fresco/DMG
+frescoes
+fresh/AZSRNDG
+freshener/M
+freshen/SZGDR
+fresher/MA
+freshest
+freshet/SM
+freshly
+freshman/M
+freshmen
+freshness/MS
+freshwater/SM
+Fresnel/M
+Fresno/M
+fretboard
+fretfulness/MS
+fretful/PY
+fret/S
+fretsaw/S
+fretted
+fretting
+fretwork/MS
+Freudian/S
+Freud/M
+Freya/M
+Frey/M
+friableness/M
+friable/P
+friary/MS
+friar/YMS
+fricasseeing
+fricassee/MSD
+frication/M
+fricative/MS
+Frick/M
+frictional/Y
+frictionless/Y
+friction/MS
+Friday/SM
+fridge/SM
+fried/A
+Frieda/M
+Friedan/M
+friedcake/SM
+Friederike/M
+Friedman/M
+Friedrich/M
+Friedrick/M
+friendlessness/M
+friendless/P
+friendlies
+friendlily
+friendliness/USM
+friendly/PUTR
+friend/SGMYD
+friendship/MS
+frier's
+fries/M
+frieze/SDGM
+frigate/SM
+Frigga/M
+frigged
+frigging/S
+frighten/DG
+frightening/Y
+frightfulness/MS
+frightful/PY
+fright/GXMDNS
+Frigidaire/M
+frigidity/MS
+frigidness/SM
+frigid/YP
+frig/S
+frill/MDGS
+frilly/RST
+Fri/M
+fringe/IGSD
+fringe's
+frippery/SM
+Frisbee/MS
+Frisco/M
+Frisian/SM
+frisker/M
+friskily
+friskiness/SM
+frisk/RDGS
+frisky/RTP
+frisson/M
+Frito/M
+fritterer/M
+fritter/RDSG
+Fritz/M
+fritz/SM
+frivolity/MS
+frivolousness/SM
+frivolous/PY
+frizz/GYSD
+frizzle/DSG
+frizzly/RT
+frizzy/RT
+Fr/MD
+Frobisher/M
+frocking/M
+frock's
+frock/SUDGC
+frogged
+frogging
+frogman/M
+frogmarched
+frogmen
+frog/MS
+fro/HS
+Froissart/M
+frolicked
+frolicker/SM
+frolicking
+frolic/SM
+frolicsome
+from
+Fromm/M
+frond/SM
+frontage/MS
+frontal/SY
+Frontenac/M
+front/GSFRD
+frontier/SM
+frontiersman/M
+frontiersmen
+frontispiece/SM
+frontrunner's
+front's
+frontward/S
+frosh/M
+Frostbelt/M
+frostbite/MS
+frostbit/G
+frostbiting/M
+frostbitten
+frost/CDSG
+frosteds
+frosted/U
+frostily
+frostiness/SM
+frosting/MS
+Frost/M
+frost's
+frosty/PTR
+froth/GMD
+frothiness/SM
+froths
+frothy/TRP
+froufrou/MS
+frowardness/MS
+froward/P
+frowner/M
+frowning/Y
+frown/RDSG
+frowzily
+frowziness/SM
+frowzy/RPT
+frozenness/M
+frozen/YP
+froze/UA
+fructify/GSD
+fructose/MS
+Fruehauf/M
+frugality/SM
+frugal/Y
+fruitcake/SM
+fruiterer/M
+fruiter/RM
+fruitfuller
+fruitfullest
+fruitfulness/MS
+fruitful/UYP
+fruit/GMRDS
+fruitiness/MS
+fruition/SM
+fruitlessness/MS
+fruitless/YP
+fruity/RPT
+frumpish
+frump/MS
+frumpy/TR
+Frunze/M
+frustrater/M
+frustrate/RSDXNG
+frustrating/Y
+frustration/M
+frustum/SM
+Frye/M
+fryer/MS
+Fry/M
+fry/NGDS
+F's
+f's/KA
+FSLIC
+ft/C
+FTC
+FTP
+fuchsia/MS
+Fuchs/M
+fucker/M!
+fuck/GZJRDMS!
+FUD
+fuddle/GSD
+fudge/GMSD
+fuel/ASDG
+fueler/SM
+fuel's
+Fuentes/M
+fugal
+Fugger/M
+fugitiveness/M
+fugitive/SYMP
+fugue/GMSD
+fuhrer/S
+Fuji/M
+Fujitsu/M
+Fujiyama
+Fukuoka/M
+Fulani/M
+Fulbright/M
+fulcrum/SM
+fulfilled/U
+fulfiller/M
+fulfill/GLSRD
+fulfillment/MS
+fullback/SMG
+fuller/DMG
+Fuller/M
+Fullerton/M
+fullish
+fullness/MS
+full/RDPSGZT
+fullstops
+fullword/SM
+fully
+fulminate/XSDGN
+fulmination/M
+fulness's
+fulsomeness/SM
+fulsome/PY
+Fulton/M
+Fulvia/M
+fumble/GZRSD
+fumbler/M
+fumbling/Y
+fume/DSG
+fumigant/MS
+fumigate/NGSDX
+fumigation/M
+fumigator/SM
+fuming/Y
+fumy/TR
+Funafuti
+functionalism/M
+functionalist/SM
+functionality/S
+functional/YS
+functionary/MS
+function/GSMD
+functor/SM
+fundamentalism/SM
+fundamentalist/SM
+fundamental/SY
+fund/ASMRDZG
+funded/U
+fundholders
+fundholding
+funding/S
+Fundy/M
+funeral/MS
+funerary
+funereal/Y
+funfair/M
+fungal/S
+fungible/M
+fungicidal
+fungicide/SM
+fungi/M
+fungoid/S
+fungous
+fungus/M
+funicular/SM
+funk/GSDM
+funkiness/S
+funky/RTP
+fun/MS
+funned
+funnel/SGMD
+funner
+funnest
+funnily/U
+funniness/SM
+funning
+funny/RSPT
+furbelow/MDSG
+furbisher/M
+furbish/GDRSA
+furiousness/M
+furious/RYP
+furlong/MS
+furlough/DGM
+furloughs
+furl/UDGS
+furn
+furnace/GMSD
+furnished/U
+furnisher/MS
+furnish/GASD
+furnishing/SM
+furniture/SM
+furore/MS
+furor/MS
+fur/PMS
+furred
+furrier/M
+furriness/SM
+furring/SM
+furrow/DMGS
+furry/RTZP
+furtherance/MS
+furtherer/M
+furthermore
+furthermost
+further/TGDRS
+furthest
+furtiveness/SM
+furtive/PY
+fury/SM
+furze/SM
+fusebox/S
+fusee/SM
+fuse/FSDAGCI
+fuselage/SM
+fuse's/A
+Fushun/M
+fusibility/SM
+fusible/I
+fusiform
+fusilier/MS
+fusillade/SDMG
+fusion/KMFSI
+fussbudget/MS
+fusser/M
+fussily
+fussiness/MS
+fusspot/SM
+fuss/SRDMG
+fussy/PTR
+fustian/MS
+fustiness/MS
+fusty/RPT
+fut
+futileness/M
+futile/PY
+futility/MS
+futon/S
+future/SM
+futurism/SM
+futuristic/S
+futurist/S
+futurity/MS
+futurologist/S
+futurology/MS
+futz/GSD
+fuze's
+Fuzhou/M
+Fuzzbuster/M
+fuzzily
+fuzziness/SM
+fuzz/SDMG
+fuzzy/PRT
+fwd
+FWD
+fwy
+FY
+FYI
+GA
+gabardine/SM
+gabbed
+Gabbey/M
+Gabbie/M
+Gabbi/M
+gabbiness/S
+gabbing
+gabble/SDG
+Gabby/M
+gabby/TRP
+Gabe/M
+gaberdine's
+Gabey/M
+gabfest/MS
+Gabie/M
+Gabi/M
+gable/GMSRD
+Gable/M
+Gabonese
+Gabon/M
+Gaborone/M
+Gabriela/M
+Gabriele/M
+Gabriella/M
+Gabrielle/M
+Gabriellia/M
+Gabriell/M
+Gabriello/M
+Gabriel/M
+Gabrila/M
+gab/S
+Gaby/M
+Gacrux/M
+gadabout/MS
+gadded
+gadder/MS
+gadding
+gadfly/MS
+gadgetry/MS
+gadget/SM
+gadolinium/MS
+gad/S
+Gadsden/M
+Gaea/M
+Gaelan/M
+Gaelic/M
+Gael/SM
+Gae/M
+gaffe/MS
+gaffer/M
+gaff/SGZRDM
+gaga
+Gagarin/M
+gag/DRSG
+Gage/M
+gager/M
+gage/SM
+gagged
+gagging
+gaggle/SDG
+gagwriter/S
+gaiety/MS
+Gaile/M
+Gail/M
+gaily
+gain/ADGS
+gainer/SM
+Gaines/M
+Gainesville/M
+gainfulness/M
+gainful/YP
+gaining/S
+gainly/U
+gainsaid
+gainsayer/M
+gainsay/RSZG
+Gainsborough/M
+gaiter/M
+gait/GSZMRD
+Gaithersburg/M
+galactic
+Galahad/MS
+Galapagos/M
+gal/AS
+gala/SM
+Galatea/M
+Galatia/M
+Galatians/M
+Galaxy/M
+galaxy/MS
+Galbraith/M
+Galbreath/M
+gale/AS
+Gale/M
+galen
+galena/MS
+galenite/M
+Galen/M
+gale's
+Galibi/M
+Galilean/MS
+Galilee/M
+Galileo/M
+Galina/M
+Gallagher/M
+gallanted
+gallanting
+gallantry/MS
+gallants
+gallant/UY
+Gallard/M
+gallbladder/MS
+Gallegos/M
+galleon/SM
+galleria/S
+gallery/MSDG
+galley/MS
+Gallic
+Gallicism/SM
+gallimaufry/MS
+galling/Y
+gallium/SM
+gallivant/GDS
+Gall/M
+gallonage/M
+gallon/SM
+galloper/M
+gallop/GSRDZ
+Galloway/M
+gallows/M
+gall/SGMD
+gallstone/MS
+Gallup/M
+Gal/MN
+Galois/M
+galoot/MS
+galore/S
+galosh/GMSD
+gal's
+Galsworthy/M
+galumph/GD
+galumphs
+galvanic
+Galvani/M
+galvanism/MS
+galvanization/SM
+galvanize/SDG
+Galvan/M
+galvanometer/SM
+galvanometric
+Galven/M
+Galveston/M
+Galvin/M
+Ga/M
+Gamaliel/M
+Gama/M
+Gambia/M
+Gambian/S
+gambit/MS
+gamble/GZRSD
+Gamble/M
+gambler/M
+gambol/SGD
+gamecock/SM
+gamekeeper/MS
+gameness/MS
+game/PJDRSMYTZG
+gamesmanship/SM
+gamesmen
+gamester/M
+gamest/RZ
+gamete/MS
+gametic
+gamine/SM
+gaminess/MS
+gaming/M
+gamin/MS
+gamma/MS
+gammon/DMSG
+Gamow/M
+gamut/MS
+gamy/TRP
+gander/DMGS
+Gandhian
+Gandhi/M
+gangbusters
+ganger/M
+Ganges/M
+gang/GRDMS
+gangland/SM
+ganglia/M
+gangling
+ganglionic
+ganglion/M
+gangplank/SM
+gangrene/SDMG
+gangrenous
+gangster/SM
+Gangtok/M
+gangway/MS
+Gan/M
+gannet/SM
+Gannie/M
+Gannon/M
+Ganny/M
+gantlet/GMDS
+Gantry/M
+gantry/MS
+Ganymede/M
+GAO
+gaoler/M
+gaol/MRDGZS
+gaper/M
+gape/S
+gaping/Y
+gapped
+gapping
+gap/SJMDRG
+garage/GMSD
+Garald/M
+garbageman/M
+garbage/SDMG
+garbanzo/MS
+garb/DMGS
+garbler/M
+garble/RSDG
+Garbo/M
+Garcia/M
+garçon/SM
+gardener/M
+Gardener/M
+gardenia/SM
+gardening/M
+garden/ZGRDMS
+Gardie/M
+Gardiner/M
+Gard/M
+Gardner/M
+Gardy/M
+Garek/M
+Gare/MH
+Gareth/M
+Garey/M
+Garfield/M
+garfish/MS
+Garfunkel/M
+Gargantua/M
+gargantuan
+gargle/SDG
+gargoyle/DSM
+Garibaldi/M
+Garik/M
+garishness/MS
+garish/YP
+Garland/M
+garland/SMDG
+garlicked
+garlicking
+garlicky
+garlic/SM
+garment/MDGS
+Gar/MH
+Garner/M
+garner/SGD
+Garnet/M
+garnet/SM
+Garnette/M
+Garnett/M
+garnish/DSLG
+garnisheeing
+garnishee/SDM
+garnishment/MS
+Garold/M
+garote's
+garotte's
+Garrard/M
+garred
+Garrek/M
+Garreth/M
+Garret/M
+garret/SM
+Garrett/M
+Garrick/M
+Garrik/M
+garring
+Garrison/M
+garrison/SGMD
+garroter/M
+garrote/SRDMZG
+Garrot/M
+garrotte's
+Garrott/M
+garrulity/SM
+garrulousness/MS
+garrulous/PY
+Garry/M
+gar/SLM
+garter/SGDM
+Garth/M
+Garvey/M
+Garvin/M
+Garv/M
+Garvy/M
+Garwin/M
+Garwood/M
+Gary/M
+Garza/M
+gasbag/MS
+Gascony/M
+gaseousness/M
+gaseous/YP
+gases/C
+gas/FC
+gash/GTMSRD
+gasification/M
+gasifier/M
+gasify/SRDGXZN
+gasket/SM
+gaslight/DMS
+gasohol/S
+gasoline/MS
+gasometer/M
+Gaspard/M
+Gaspar/M
+Gasparo/M
+gasper/M
+Gasper/M
+gasp/GZSRD
+gasping/Y
+gas's
+gassed/C
+Gasser/M
+gasser/MS
+Gasset/M
+gassiness/M
+gassing/SM
+gassy/PTR
+Gaston/M
+gastric
+gastritides
+gastritis/MS
+gastroenteritides
+gastroenteritis/M
+gastrointestinal
+gastronome/SM
+gastronomic
+gastronomical/Y
+gastronomy/MS
+gastropod/SM
+gasworks/M
+gateau/MS
+gateaux
+gatecrash/GZSRD
+gatehouse/MS
+gatekeeper/SM
+gate/MGDS
+gatepost/SM
+Gates
+gateway/MS
+gathered/IA
+gatherer/M
+gathering/M
+gather/JRDZGS
+gathers/A
+Gatlinburg/M
+Gatling/M
+Gatorade/M
+gator/MS
+Gatsby/M
+Gatun/M
+gaucheness/SM
+gaucherie/SM
+gauche/TYPR
+gaucho/SM
+gaudily
+gaudiness/MS
+gaudy/PRST
+gaugeable
+gauger/M
+Gauguin/M
+Gaulish/M
+Gaulle/M
+Gaul/MS
+Gaultiero/M
+gauntlet/GSDM
+Gauntley/M
+gauntness/MS
+gaunt/PYRDSGT
+gauss/C
+gausses
+Gaussian
+Gauss/M
+gauss's
+Gautama/M
+Gauthier/M
+Gautier/M
+gauze/SDGM
+gauziness/MS
+gauzy/TRP
+Gavan/M
+gave
+gavel/GMDS
+Gaven/M
+Gavin/M
+Gav/MN
+gavotte/MSDG
+Gavra/M
+Gavrielle/M
+Gawain/M
+Gawen/M
+gawkily
+gawkiness/MS
+gawk/SGRDM
+gawky/RSPT
+Gayel/M
+Gayelord/M
+Gaye/M
+gayety's
+Gayla/M
+Gayleen/M
+Gaylene/M
+Gayler/M
+Gayle/RM
+Gaylord/M
+Gaylor/M
+Gay/M
+gayness/SM
+Gaynor/M
+gay/RTPS
+Gaza/M
+gazebo/SM
+gaze/DRSZG
+gazelle/MS
+gazer/M
+gazetteer/SGDM
+gazette/MGSD
+Gaziantep/M
+gazillion/S
+gazpacho/MS
+GB
+G/B
+Gdansk/M
+Gd/M
+GDP
+Gearalt/M
+Gearard/M
+gearbox/SM
+gear/DMJSG
+gearing/M
+gearshift/MS
+gearstick
+gearwheel/SM
+Geary/M
+gecko/MS
+GED
+geegaw's
+geeing
+geek/SM
+geeky/RT
+geese/M
+geest/M
+gee/TDS
+geezer/MS
+Gehenna/M
+Gehrig/M
+Geiger/M
+Geigy/M
+geisha/M
+gelatinousness/M
+gelatinous/PY
+gelatin/SM
+gelcap
+gelding/M
+geld/JSGD
+gelid
+gelignite/MS
+gelled
+gelling
+gel/MBS
+Gelya/M
+Ge/M
+GE/M
+Gemini/SM
+gemlike
+Gemma/M
+gemmed
+gemming
+gem/MS
+gemological
+gemologist/MS
+gemology/MS
+gemstone/SM
+gen
+Gena/M
+Genaro/M
+gendarme/MS
+gender/DMGS
+genderless
+genealogical/Y
+genealogist/SM
+genealogy/MS
+Gene/M
+gene/MS
+generalissimo/SM
+generalist/MS
+generality/MS
+generalizable/SM
+generalization/MS
+generalized/U
+generalize/GZBSRD
+generalizer/M
+general/MSPY
+generalness/M
+generalship/SM
+genera/M
+generate/CXAVNGSD
+generational
+generation/MCA
+generative/AY
+generators/A
+generator/SM
+generically
+generic/PS
+generosity/MS
+generously/U
+generousness/SM
+generous/PY
+Genesco/M
+genesis/M
+Genesis/M
+genes/S
+genetically
+geneticist/MS
+genetic/S
+genetics/M
+Genet/M
+Geneva/M
+Genevieve/M
+Genevra/M
+Genghis/M
+geniality/FMS
+genially/F
+genialness/M
+genial/PY
+Genia/M
+genies/K
+genie/SM
+genii/M
+genitalia
+genitals
+genital/YF
+genitive/SM
+genitourinary
+genius/SM
+Gen/M
+Genna/M
+Gennie/M
+Gennifer/M
+Genni/M
+Genny/M
+Genoa/SM
+genocidal
+genocide/SM
+Geno/M
+genome/SM
+genotype/MS
+Genovera/M
+genre/MS
+gent/AMS
+genteelness/MS
+genteel/PRYT
+gentian/SM
+gentile/S
+Gentile's
+gentility/MS
+gentlefolk/S
+gentlemanliness/M
+gentlemanly/U
+gentleman/YM
+gentlemen
+gentleness/SM
+gentle/PRSDGT
+gentlewoman/M
+gentlewomen/M
+gently
+gentrification/M
+gentrify/NSDGX
+Gentry/M
+gentry/MS
+genuflect/GDS
+genuflection/MS
+genuineness/SM
+genuine/PY
+genus
+Genvieve/M
+geocentric
+geocentrically
+geocentricism
+geochemical/Y
+geochemistry/MS
+geochronology/M
+geodesic/S
+geode/SM
+geodesy/MS
+geodetic/S
+Geoff/M
+Geoffrey/M
+Geoffry/M
+geog
+geographer/MS
+geographic
+geographical/Y
+geography/MS
+geologic
+geological/Y
+geologist/MS
+geology/MS
+geom
+Geo/M
+geomagnetic
+geomagnetically
+geomagnetism/SM
+geometer/MS
+geometrical/Y
+geometrician/M
+geometric/S
+geometry/MS
+geomorphological
+geomorphology/M
+geophysical/Y
+geophysicist/MS
+geophysics/M
+geopolitical/Y
+geopolitic/S
+geopolitics/M
+Georas/M
+Geordie/M
+Georgeanna/M
+Georgeanne/M
+Georgena/M
+George/SM
+Georgeta/M
+Georgetown/M
+Georgetta/M
+Georgette/M
+Georgia/M
+Georgiana/M
+Georgianna/M
+Georgianne/M
+Georgian/S
+Georgie/M
+Georgi/M
+Georgina/M
+Georgine/M
+Georg/M
+Georgy/M
+geostationary
+geosynchronous
+geosyncline/SM
+geothermal
+geothermic
+Geralda/M
+Geraldine/M
+Gerald/M
+geranium/SM
+Gerard/M
+Gerardo/M
+Gerber/M
+gerbil/MS
+Gerda/M
+Gerek/M
+Gerhardine/M
+Gerhard/M
+Gerhardt/M
+Gerianna/M
+Gerianne/M
+geriatric/S
+geriatrics/M
+Gerick/M
+Gerik/M
+Geri/M
+Geritol/M
+Gerladina/M
+Ger/M
+Germaine/M
+Germain/M
+Germana/M
+germane
+Germania/M
+Germanic/M
+germanium/SM
+germanized
+German/SM
+Germantown/M
+Germany/M
+Germayne/M
+germen/M
+germicidal
+germicide/MS
+germinal/Y
+germinated/U
+germinate/XVGNSD
+germination/M
+germinative/Y
+germ/MNS
+Gerome/M
+Geronimo/M
+gerontocracy/M
+gerontological
+gerontologist/SM
+gerontology/SM
+Gerrard/M
+Gerrie/M
+Gerrilee/M
+Gerri/M
+Gerry/M
+gerrymander/SGD
+Gershwin/MS
+Gerta/M
+Gertie/M
+Gerti/M
+Gert/M
+Gertruda/M
+Gertrude/M
+Gertrudis/M
+Gertrud/M
+Gerty/M
+gerundive/M
+gerund/SVM
+Gery/M
+gestalt/M
+gestapo/S
+Gestapo/SM
+gestate/SDGNX
+gestational
+gestation/M
+gesticulate/XSDVGN
+gesticulation/M
+gesticulative/Y
+gestural
+gesture/SDMG
+gesundheit
+getaway/SM
+Gethsemane/M
+get/S
+getter/SDM
+getting
+Getty/M
+Gettysburg/M
+getup/MS
+gewgaw/MS
+Gewürztraminer
+geyser/GDMS
+Ghanaian/MS
+Ghana/M
+Ghanian's
+ghastliness/MS
+ghastly/TPR
+ghat/MS
+Ghats/M
+Ghent/M
+Gherardo/M
+gherkin/SM
+ghetto/DGMS
+ghettoize/SDG
+Ghibelline/M
+ghostlike
+ghostliness/MS
+ghostly/TRP
+ghost/SMYDG
+ghostwrite/RSGZ
+ghostwritten
+ghostwrote
+ghoulishness/SM
+ghoulish/PY
+ghoul/SM
+GHQ
+GI
+Giacinta/M
+Giacobo/M
+Giacometti/M
+Giacomo/M
+Giacopo/M
+Giana/M
+Gianina/M
+Gian/M
+Gianna/M
+Gianni/M
+Giannini/M
+giantess/MS
+giantkiller
+giant/SM
+Giauque/M
+Giavani/M
+gibber/DGS
+gibberish/MS
+gibbet/MDSG
+Gibbie/M
+Gibb/MS
+Gibbon/M
+gibbon/MS
+gibbousness/M
+gibbous/YP
+Gibby/M
+gibe/GDRS
+giber/M
+giblet/MS
+Gib/M
+Gibraltar/MS
+Gibson/M
+giddap
+giddily
+giddiness/SM
+Giddings/M
+giddy/GPRSDT
+Gide/M
+Gideon/MS
+Gielgud/M
+Gienah/M
+Giffard/M
+Giffer/M
+Giffie/M
+Gifford/M
+Giff/RM
+Giffy/M
+giftedness/M
+gifted/PY
+gift/SGMD
+gigabyte/S
+gigacycle/MS
+gigahertz/M
+gigantically
+giganticness/M
+gigantic/P
+gigavolt
+gigawatt/M
+gigged
+gigging
+giggler/M
+giggle/RSDGZ
+giggling/Y
+giggly/TR
+Gigi/M
+gig/MS
+GIGO
+gigolo/MS
+gila
+Gila/M
+Gilberta/M
+Gilberte/M
+Gilbertina/M
+Gilbertine/M
+gilbert/M
+Gilbert/M
+Gilberto/M
+Gilbertson/M
+Gilburt/M
+Gilchrist/M
+Gilda/M
+gilder/M
+gilding/M
+gild/JSGZRD
+Gilead/M
+Gilemette/M
+Giles
+Gilgamesh/M
+Gilkson/M
+Gillan/M
+Gilles
+Gillespie/M
+Gillette/M
+Gilliam/M
+Gillian/M
+Gillie/M
+Gilligan/M
+Gilli/M
+Gill/M
+gill/SGMRD
+Gilly/M
+Gilmore/M
+Gil/MY
+gilt/S
+gimbaled
+gimbals
+Gimbel/M
+gimcrackery/SM
+gimcrack/S
+gimlet/MDSG
+gimme/S
+gimmick/GDMS
+gimmickry/MS
+gimmicky
+gimp/GSMD
+gimpy/RT
+Gina/M
+Ginelle/M
+Ginevra/M
+gingerbread/SM
+gingerliness/M
+gingerly/P
+Ginger/M
+ginger/SGDYM
+gingersnap/SM
+gingery
+gingham/SM
+gingivitis/SM
+Gingrich/M
+ginkgoes
+ginkgo/M
+ginmill
+gin/MS
+ginned
+Ginnie/M
+Ginnifer/M
+Ginni/M
+ginning
+Ginny/M
+Gino/M
+Ginsberg/M
+Ginsburg/M
+ginseng/SM
+Gioconda/M
+Giordano/M
+Giorgia/M
+Giorgi/M
+Giorgio/M
+Giorgione/M
+Giotto/M
+Giovanna/M
+Giovanni/M
+Gipsy's
+giraffe/MS
+Giralda/M
+Giraldo/M
+Giraud/M
+Giraudoux/M
+girded/U
+girder/M
+girdle/GMRSD
+girdler/M
+gird/RDSGZ
+girlfriend/MS
+girlhood/SM
+girlie/M
+girlishness/SM
+girlish/YP
+girl/MS
+giro/M
+girt/GDS
+girth/MDG
+girths
+Gisela/M
+Giselbert/M
+Gisele/M
+Gisella/M
+Giselle/M
+Gish/M
+gist/MS
+git/M
+Giuditta/M
+Giulia/M
+Giuliano/M
+Giulietta/M
+Giulio/M
+Giuseppe/M
+Giustina/M
+Giustino/M
+Giusto/M
+giveaway/SM
+giveback/S
+give/HZGRS
+given/SP
+giver/M
+giving/Y
+Giza/M
+Gizela/M
+gizmo's
+gizzard/SM
+Gk/M
+glacé/DGS
+glacial/Y
+glaciate/XNGDS
+glaciation/M
+glacier/SM
+glaciological
+glaciologist/M
+glaciology/M
+gladded
+gladden/GDS
+gladder
+gladdest
+gladding
+gladdy
+glade/SM
+gladiatorial
+gladiator/SM
+Gladi/M
+gladiola/MS
+gladioli
+gladiolus/M
+gladly/RT
+Glad/M
+gladness/MS
+gladsome/RT
+Gladstone/MS
+Gladys
+glad/YSP
+glamor/DMGS
+glamorization/MS
+glamorizer/M
+glamorize/SRDZG
+glamorousness/M
+glamorous/PY
+glance/GJSD
+glancing/Y
+glanders/M
+glandes
+glandular/Y
+gland/ZSM
+glans/M
+glare/SDG
+glaringness/M
+glaring/YP
+Glaser/M
+Glasgow/M
+glasnost/S
+glassblower/S
+glassblowing/MS
+glassful/MS
+glass/GSDM
+glasshouse/SM
+glassily
+glassiness/SM
+glassless
+Glass/M
+glassware/SM
+glasswort/M
+glassy/PRST
+Glastonbury/M
+Glaswegian/S
+glaucoma/SM
+glaucous
+glazed/U
+glazer/M
+glaze/SRDGZJ
+glazier/SM
+glazing/M
+gleam/MDGS
+gleaner/M
+gleaning/M
+glean/RDGZJS
+Gleason/M
+Gleda/M
+gleed/M
+glee/DSM
+gleefulness/MS
+gleeful/YP
+gleeing
+Glendale/M
+Glenda/M
+Glenden/M
+Glendon/M
+Glenine/M
+Glen/M
+Glenna/M
+Glennie/M
+Glennis/M
+Glenn/M
+glen/SM
+glibber
+glibbest
+glibness/MS
+glib/YP
+glide/JGZSRD
+glider/M
+glim/M
+glimmer/DSJG
+glimmering/M
+glimpse/DRSZMG
+glimpser/M
+glint/DSG
+glissandi
+glissando/M
+glisten/DSG
+glister/DGS
+glitch/MS
+glitter/GDSJ
+glittering/Y
+glittery
+glitz/GSD
+glitzy/TR
+gloaming/MS
+gloater/M
+gloating/Y
+gloat/SRDG
+globalism/S
+globalist/S
+global/SY
+globe/SM
+globetrotter/MS
+glob/GDMS
+globularity/M
+globularness/M
+globular/PY
+globule/MS
+globulin/MS
+glockenspiel/SM
+glommed
+gloom/GSMD
+gloomily
+gloominess/MS
+gloomy/RTP
+glop/MS
+glopped
+glopping
+gloppy/TR
+Gloria/M
+Gloriana/M
+Gloriane/M
+glorification/M
+glorifier/M
+glorify/XZRSDNG
+Glori/M
+glorious/IYP
+gloriousness/IM
+Glory/M
+glory/SDMG
+glossary/MS
+gloss/GSDM
+glossily
+glossiness/SM
+glossolalia/SM
+glossy/RSPT
+glottal
+glottalization/M
+glottis/MS
+Gloucester/M
+gloveless
+glover/M
+Glover/M
+glove/SRDGMZ
+glower/GD
+glow/GZRDMS
+glowing/Y
+glowworm/SM
+glucose/SM
+glue/DRSMZG
+glued/U
+gluer/M
+gluey
+gluier
+gluiest
+glummer
+glummest
+glumness/MS
+glum/SYP
+gluon/M
+glutamate/M
+gluten/M
+glutenous
+glutinousness/M
+glutinous/PY
+glut/SMNX
+glutted
+glutting
+glutton/MS
+gluttonous/Y
+gluttony/SM
+glyceride/M
+glycerinate/MD
+glycerine's
+glycerin/SM
+glycerolized/C
+glycerol/SM
+glycine/M
+glycogen/SM
+glycol/MS
+Glynda/M
+Glynis/M
+Glyn/M
+Glynnis/M
+Glynn/M
+glyph/M
+glyphs
+gm
+GM
+GMT
+gnarl/SMDG
+gnash/SDG
+gnat/MS
+gnawer/M
+gnaw/GRDSJ
+gnawing/M
+gneiss/SM
+Gnni/M
+gnomelike
+GNOME/M
+gnome/SM
+gnomic
+gnomish
+gnomonic
+gnosticism
+Gnosticism/M
+gnostic/K
+Gnostic/M
+GNP
+gnu/MS
+goad/MDSG
+goalie/SM
+goalkeeper/MS
+goalkeeping/M
+goalless
+goal/MDSG
+goalmouth/M
+goalpost/S
+goalscorer
+goalscoring
+goaltender/SM
+Goa/M
+goatee/SM
+goatherd/MS
+goat/MS
+goatskin/SM
+gobbed
+gobbet/MS
+gobbing
+gobbledegook's
+gobbledygook/S
+gobbler/M
+gobble/SRDGZ
+Gobi/M
+goblet/MS
+goblin/SM
+gob/SM
+Godard/M
+Godart/M
+godchild/M
+godchildren
+goddammit
+goddamn/GS
+Goddard/M
+Goddart/M
+goddaughter/SM
+godded
+goddess/MS
+godding
+Gödel/M
+godfather/GSDM
+godforsaken
+Godfree/M
+Godfrey/M
+Godfry/M
+godhead/S
+godhood/SM
+Godiva/M
+godlessness/MS
+godless/P
+godlikeness/M
+godlike/P
+godliness/UMS
+godly/UTPR
+God/M
+godmother/MS
+Godot/M
+godparent/SM
+godsend/MS
+god/SMY
+godson/MS
+Godspeed/S
+Godthaab/M
+Godunov/M
+Godwin/M
+Godzilla/M
+Goebbels/M
+Goering/M
+goer/MG
+goes
+Goethals/M
+Goethe/M
+gofer/SM
+Goff/M
+goggler/M
+goggle/SRDGZ
+Gogh/M
+Gog/M
+Gogol/M
+Goiania/M
+going/M
+goiter/SM
+Golan/M
+Golconda/M
+Golda/M
+Goldarina/M
+Goldberg/M
+goldbricker/M
+goldbrick/GZRDMS
+Golden/M
+goldenness/M
+goldenrod/SM
+goldenseal/M
+golden/TRYP
+goldfinch/MS
+goldfish/SM
+Goldia/M
+Goldie/M
+Goldilocks/M
+Goldi/M
+Goldina/M
+Golding/M
+Goldman/M
+goldmine/S
+gold/MRNGTS
+goldsmith/M
+Goldsmith/M
+goldsmiths
+Goldstein/M
+Goldwater/M
+Goldwyn/M
+Goldy/M
+Goleta/M
+golfer/M
+golf/RDMGZS
+Golgotha/M
+Goliath/M
+Goliaths
+golly/S
+Gomez/M
+Gomorrah/M
+Gompers/M
+go/MRHZGJ
+gonadal
+gonad/SM
+gondola/SM
+gondolier/MS
+Gondwanaland/M
+goner/M
+gone/RZN
+gong/SGDM
+gonion/M
+gonna
+gonorrheal
+gonorrhea/MS
+Gonzales/M
+Gonzalez/M
+Gonzalo/M
+Goober/M
+goober/MS
+goodbye/MS
+goodhearted
+goodie's
+goodish
+goodly/TR
+Good/M
+Goodman/M
+goodness/MS
+goodnight
+Goodrich/M
+good/SYP
+goodwill/MS
+Goodwin/M
+Goodyear/M
+goody/SM
+gooey
+goofiness/MS
+goof/SDMG
+goofy/RPT
+Google/M
+gooier
+gooiest
+gook/SM
+goo/MS
+goon/SM
+goop/SM
+gooseberry/MS
+goosebumps
+goose/M
+goos/SDG
+GOP
+Gopher
+gopher/SM
+Goran/M
+Goraud/M
+Gorbachev
+Gordan/M
+Gorden/M
+Gordian/M
+Gordie/M
+Gordimer/M
+Gordon/M
+Gordy/M
+gore/DSMG
+Gore/M
+Goren/M
+Gorey/M
+Gorgas
+gorged/E
+gorge/GMSRD
+gorgeousness/SM
+gorgeous/YP
+gorger/EM
+gorges/E
+gorging/E
+Gorgon/M
+gorgon/S
+Gorgonzola/M
+Gorham/M
+gorilla/MS
+gorily
+goriness/MS
+goring/M
+Gorky/M
+gormandizer/M
+gormandize/SRDGZ
+gormless
+gorp/S
+gorse/SM
+gory/PRT
+gos
+goshawk/MS
+gosh/S
+gosling/M
+gospeler/M
+gospel/MRSZ
+Gospel/SM
+gossamer/SM
+gossipy
+gossip/ZGMRDS
+gotcha/SM
+Göteborg/M
+Gotham/M
+Gothart/M
+Gothicism/M
+Gothic/S
+Goth/M
+Goths
+got/IU
+goto
+GOTO/MS
+gotta
+gotten/U
+Gottfried/M
+Goucher/M
+Gouda/SM
+gouge/GZSRD
+gouger/M
+goulash/SM
+Gould/M
+Gounod/M
+gourde/SM
+gourd/MS
+gourmand/MS
+gourmet/MS
+gout/SM
+gouty/RT
+governable/U
+governance/SM
+governed/U
+governess/SM
+govern/LBGSD
+governmental/Y
+government/MS
+Governor
+governor/MS
+governorship/SM
+gov/S
+govt
+gown/GSDM
+Goya/M
+GP
+GPA
+GPO
+GPSS
+gr
+grabbed
+grabber/SM
+grabbing/S
+grab/S
+Gracchus/M
+grace/ESDMG
+graceful/EYPU
+gracefuller
+gracefullest
+gracefulness/ESM
+Graceland/M
+gracelessness/MS
+graceless/PY
+Grace/M
+Gracia/M
+Graciela/M
+Gracie/M
+graciousness/SM
+gracious/UY
+grackle/SM
+gradate/DSNGX
+gradation/MCS
+grade/ACSDG
+graded/U
+Gradeigh/M
+gradely
+grader/MC
+grade's
+Gradey/M
+gradient/RMS
+grad/MRDGZJS
+gradualism/MS
+gradualist/MS
+gradualness/MS
+gradual/SYP
+graduand/SM
+graduate/MNGDSX
+graduation/M
+Grady/M
+Graehme/M
+Graeme/M
+Graffias/M
+graffiti
+graffito/M
+Graff/M
+grafter/M
+grafting/M
+graft/MRDSGZ
+Grafton/M
+Grahame/M
+Graham/M
+graham/SM
+Graig/M
+grail/S
+Grail/SM
+grainer/M
+grain/IGSD
+graininess/MS
+graining/M
+grain's
+grainy/RTP
+gram/KSM
+Gram/M
+grammarian/SM
+grammar/MS
+grammaticality/M
+grammaticalness/M
+grammatical/UY
+grammatic/K
+gramme/SM
+Grammy/S
+gramophone/SM
+Grampians
+grampus/SM
+Granada/M
+granary/MS
+grandam/SM
+grandaunt/MS
+grandchild/M
+grandchildren
+granddaddy/MS
+granddad/SM
+granddaughter/MS
+grandee/SM
+grandeur/MS
+grandfather/MYDSG
+grandiloquence/SM
+grandiloquent/Y
+grandiose/YP
+grandiosity/MS
+grandkid/SM
+grandma/MS
+grandmaster/MS
+grandmother/MYS
+grandnephew/MS
+grandness/MS
+grandniece/SM
+grandpa/MS
+grandparent/MS
+grandson/MS
+grandstander/M
+grandstand/SRDMG
+grand/TPSYR
+granduncle/MS
+Grange/MR
+grange/MSR
+Granger/M
+granite/MS
+granitic
+Gran/M
+Grannie/M
+Granny/M
+granny/MS
+granola/S
+grantee/MS
+granter/M
+Grantham/M
+Granthem/M
+Grantley/M
+Grant/M
+grantor's
+grant/SGZMRD
+grantsmanship/S
+granularity/SM
+granular/Y
+granulate/SDXVGN
+granulation/M
+granule/SM
+granulocytic
+Granville/M
+grapefruit/SM
+grape/SDGM
+grapeshot/M
+grapevine/MS
+grapheme/M
+graph/GMD
+graphical/Y
+graphicness/M
+graphic/PS
+graphics/M
+graphite/SM
+graphologist/SM
+graphology/MS
+graphs
+grapnel/SM
+grapple/DRSG
+grappler/M
+grappling/M
+grasper/M
+graspingness/M
+grasping/PY
+grasp/SRDBG
+grass/GZSDM
+grasshopper/SM
+grassland/MS
+Grass/M
+grassroots
+grassy/RT
+Grata/M
+gratefuller
+gratefullest
+gratefulness/USM
+grateful/YPU
+grater/M
+grates/I
+grate/SRDJGZ
+Gratia/M
+Gratiana/M
+graticule/M
+gratification/M
+gratified/U
+gratifying/Y
+gratify/NDSXG
+grating/YM
+gratis
+gratitude/IMS
+gratuitousness/MS
+gratuitous/PY
+gratuity/SM
+gravamen/SM
+gravedigger/SM
+gravel/SGMYD
+graven
+graveness/MS
+graver/M
+graveside/S
+Graves/M
+grave/SRDPGMZTY
+gravestone/SM
+graveyard/MS
+gravidness/M
+gravid/PY
+gravimeter/SM
+gravimetric
+gravitas
+gravitate/XVGNSD
+gravitational/Y
+gravitation/M
+graviton/SM
+gravity/MS
+gravy/SM
+graybeard/MS
+Grayce/M
+grayish
+Gray/M
+grayness/S
+gray/PYRDGTS
+Grayson/M
+graze/GZSRD
+grazer/M
+Grazia/M
+grazing/M
+grease/GMZSRD
+greasepaint/MS
+greaseproof
+greaser/M
+greasily
+greasiness/SM
+greasy/PRT
+greatcoat/DMS
+greaten/DG
+greathearted
+greatness/MS
+great/SPTYRN
+grebe/MS
+Grecian/S
+Greece/M
+greed/C
+greedily
+greediness/SM
+greeds
+greed's
+greedy/RTP
+Greek/SM
+Greeley/M
+greenback/MS
+greenbelt/S
+Greenberg/M
+Greenblatt/M
+Greenbriar/M
+Greene/M
+greenery/MS
+Greenfeld/M
+greenfield
+Greenfield/M
+greenfly/M
+greengage/SM
+greengrocer/SM
+greengrocery/M
+greenhorn/SM
+greenhouse/SM
+greening/M
+greenish/P
+Greenland/M
+Green/M
+greenmail/GDS
+greenness/MS
+Greenpeace/M
+greenroom/SM
+Greensboro/M
+Greensleeves/M
+Greensville/M
+greensward/SM
+green/SYRDMPGT
+Greentree/M
+Greenville/M
+Greenwich/M
+greenwood/MS
+Greer/M
+greeter/M
+greeting/M
+greets/A
+greet/SRDJGZ
+gregariousness/MS
+gregarious/PY
+Gregg/M
+Greggory/M
+Greg/M
+Gregoire/M
+Gregoor/M
+Gregorian
+Gregorio/M
+Gregorius/M
+Gregor/M
+Gregory/M
+gremlin/SM
+Grenada/M
+grenade/MS
+Grenadian/S
+grenadier/SM
+Grenadines
+grenadine/SM
+Grendel/M
+Grenier/M
+Grenoble/M
+Grenville/M
+Gresham/M
+Gretal/M
+Greta/M
+Gretchen/M
+Gretel/M
+Grete/M
+Grethel/M
+Gretna/M
+Gretta/M
+Gretzky/M
+grew/A
+greybeard/M
+greyhound/MS
+Grey/M
+greyness/M
+gridded
+griddlecake/SM
+griddle/DSGM
+gridiron/GSMD
+gridlock/DSG
+grids/A
+grid/SGM
+grief/MS
+Grieg/M
+Grier/M
+grievance/SM
+griever/M
+grieve/SRDGZ
+grieving/Y
+grievousness/SM
+grievous/PY
+Griffie/M
+Griffin/M
+griffin/SM
+Griffith/M
+Griff/M
+griffon's
+Griffy/M
+griller/M
+grille/SM
+grill/RDGS
+grillwork/M
+grimace/DRSGM
+grimacer/M
+Grimaldi/M
+grime/MS
+Grimes
+griminess/MS
+grimmer
+grimmest
+Grimm/M
+grimness/MS
+grim/PGYD
+grimy/TPR
+Grinch/M
+grind/ASG
+grinder/MS
+grinding/SY
+grindstone/SM
+gringo/SM
+grinned
+grinner/M
+grinning/Y
+grin/S
+griper/M
+gripe/S
+grippe/GMZSRD
+gripper/M
+gripping/Y
+grip/SGZMRD
+Griselda/M
+grisliness/SM
+grisly/RPT
+Gris/M
+Grissel/M
+gristle/SM
+gristliness/M
+gristly/TRP
+gristmill/MS
+grist/MYS
+Griswold/M
+grit/MS
+gritted
+gritter/MS
+grittiness/SM
+gritting
+gritty/PRT
+Griz/M
+grizzle/DSG
+grizzling/M
+grizzly/TRS
+Gr/M
+groaner/M
+groan/GZSRDM
+groat/SM
+grocer/MS
+grocery/MS
+groggily
+grogginess/SM
+groggy/RPT
+grog/MS
+groin/MGSD
+grokked
+grokking
+grok/S
+grommet/GMDS
+Gromyko/M
+groofs
+groomer/M
+groom/GZSMRD
+groomsman/M
+groomsmen
+Groot/M
+groover/M
+groove/SRDGM
+groovy/TR
+groper/M
+grope/SRDJGZ
+Gropius/M
+grosbeak/SM
+grosgrain/MS
+Gross
+Grosset/M
+gross/GTYSRDP
+Grossman/M
+grossness/MS
+Grosvenor/M
+Grosz/M
+grotesqueness/MS
+grotesque/PSY
+Grotius/M
+Groton/M
+grottoes
+grotto/M
+grouch/GDS
+grouchily
+grouchiness/MS
+grouchy/RPT
+groundbreaking/S
+grounded/U
+grounder/M
+groundhog/SM
+ground/JGZMDRS
+groundlessness/M
+groundless/YP
+groundnut/MS
+groundsheet/M
+groundskeepers
+groundsman/M
+groundswell/S
+groundwater/S
+groundwork/SM
+grouped/A
+grouper/M
+groupie/MS
+grouping/M
+groups/A
+group/ZJSMRDG
+grouse/GMZSRD
+grouser/M
+grouter/M
+grout/GSMRD
+groveler/M
+grovelike
+groveling/Y
+grovel/SDRGZ
+Grover/M
+Grove/RM
+grove/SRMZ
+grower/M
+grow/GZYRHS
+growing/I
+growingly
+growler/M
+growling/Y
+growl/RDGZS
+growly/RP
+grown/IA
+grownup/MS
+grows/A
+growth/IMA
+growths/IA
+grubbed
+grubber/SM
+grubbily
+grubbiness/SM
+grubbing
+grubby/RTP
+grub/MS
+grubstake/MSDG
+grudge/GMSRDJ
+grudger/M
+grudging/Y
+grueling/Y
+gruel/MDGJS
+gruesomeness/SM
+gruesome/RYTP
+gruffness/MS
+gruff/PSGTYRD
+grumble/GZJDSR
+grumbler/M
+grumbling/Y
+Grumman/M
+grumpily
+grumpiness/MS
+grump/MDGS
+grumpy/TPR
+Grundy/M
+Grünewald/M
+grunge/S
+grungy/RT
+grunion/SM
+grunter/M
+grunt/SGRD
+Grusky/M
+Grus/M
+Gruyère
+Gruyeres
+gryphon's
+g's
+G's
+gs/A
+GSA
+gt
+GU
+guacamole/MS
+Guadalajara/M
+Guadalcanal/M
+Guadalquivir/M
+Guadalupe/M
+Guadeloupe/M
+Guallatiri/M
+Gualterio/M
+Guamanian/SM
+Guam/M
+Guangzhou
+guanine/MS
+guano/MS
+Guantanamo/M
+Guarani/M
+guarani/SM
+guaranteeing
+guarantee/RSDZM
+guarantor/SM
+guaranty/MSDG
+guardedness/UM
+guarded/UYP
+guarder/M
+guardhouse/SM
+Guardia/M
+guardianship/MS
+guardian/SM
+guardrail/SM
+guard/RDSGZ
+guardroom/SM
+guardsman/M
+guardsmen
+Guarnieri/M
+Guatemala/M
+Guatemalan/S
+guava/SM
+Guayaquil/M
+gubernatorial
+Gucci/M
+gudgeon/M
+Guelph/M
+Guendolen/M
+Guenevere/M
+Guenna/M
+Guenther/M
+guernsey/S
+Guernsey/SM
+Guerra/M
+Guerrero/M
+guerrilla/MS
+guessable/U
+guess/BGZRSD
+guessed/U
+guesser/M
+guesstimate/DSMG
+guesswork/MS
+guest/SGMD
+Guevara/M
+guffaw/GSDM
+guff/SM
+Guggenheim/M
+Guglielma/M
+Guglielmo/M
+Guhleman/M
+GUI
+Guiana/M
+guidance/MS
+guidebook/SM
+guided/U
+guide/GZSRD
+guideline/SM
+guidepost/MS
+guider/M
+Guido/M
+Guilbert/M
+guilder/M
+guildhall/SM
+guild/SZMR
+guileful
+guilelessness/MS
+guileless/YP
+guile/SDGM
+Guillaume/M
+Guillema/M
+Guillemette/M
+guillemot/MS
+Guillermo/M
+guillotine/SDGM
+guiltily
+guiltiness/MS
+guiltlessness/M
+guiltless/YP
+guilt/SM
+guilty/PTR
+Gui/M
+Guinea/M
+Guinean/S
+guinea/SM
+Guinevere/M
+Guinna/M
+Guinness/M
+guise's
+guise/SDEG
+guitarist/SM
+guitar/SM
+Guiyang
+Guizot/M
+Gujarati/M
+Gujarat/M
+Gujranwala/M
+gulag/S
+gulch/MS
+gulden/MS
+gulf/DMGS
+Gullah/M
+gullet/MS
+gulley's
+gullibility/MS
+gullible
+Gulliver/M
+gull/MDSG
+gully/SDMG
+gulp/RDGZS
+gumboil/MS
+gumbo/MS
+gumboots
+gumdrop/SM
+gummed
+gumminess/M
+gumming/C
+gum/MS
+gummy/RTP
+gumption/SM
+gumshoeing
+gumshoe/SDM
+gumtree/MS
+Gunar/M
+gunboat/MS
+Gunderson/M
+gunfighter/M
+gunfight/SRMGZ
+gunfire/SM
+gunflint/M
+gunfought
+Gunilla/M
+gunk/SM
+gunky/RT
+Gun/M
+gunman/M
+gunmen
+gunmetal/MS
+gun/MS
+Gunnar/M
+gunned
+gunnel's
+Gunner/M
+gunner/SM
+gunnery/MS
+gunning/M
+gunnysack/SM
+gunny/SM
+gunpoint/MS
+gunpowder/SM
+gunrunner/MS
+gunrunning/MS
+gunship/S
+gunshot/SM
+gunslinger/M
+gunsling/GZR
+gunsmith/M
+gunsmiths
+Guntar/M
+Gunter/M
+Gunther/M
+gunwale/MS
+Guofeng/M
+guppy/SM
+Gupta/M
+gurgle/SDG
+Gurkha/M
+gurney/S
+guru/MS
+Gusella/M
+gusher/M
+gush/SRDGZ
+gushy/TR
+Gus/M
+Guss
+gusset/MDSG
+Gussie/M
+Gussi/M
+gussy/GSD
+Gussy/M
+Gustaf/M
+Gustafson/M
+Gusta/M
+gustatory
+Gustave/M
+Gustav/M
+Gustavo/M
+Gustavus/M
+gusted/E
+Gustie/M
+gustily
+Gusti/M
+gustiness/M
+gusting/E
+gust/MDGS
+gustoes
+gusto/M
+gusts/E
+Gusty/M
+gusty/RPT
+Gutenberg/M
+Guthrey/M
+Guthrie/M
+Guthry/M
+Gutierrez/M
+gutlessness/S
+gutless/P
+gutser/M
+gutsiness/M
+gut/SM
+guts/R
+gutsy/PTR
+gutted
+gutter/GSDM
+guttering/M
+guttersnipe/M
+gutting
+gutturalness/M
+guttural/SPY
+gutty/RSMT
+Guyana/M
+Guyanese
+Guy/M
+guy/MDRZGS
+Guzman/M
+guzzle/GZRSD
+guzzler/M
+g/VBX
+Gwalior/M
+Gwendolen/M
+Gwendoline/M
+Gwendolin/M
+Gwendolyn/M
+Gweneth/M
+Gwenette/M
+Gwen/M
+Gwenneth/M
+Gwennie/M
+Gwenni/M
+Gwenny/M
+Gwenora/M
+Gwenore/M
+Gwyneth/M
+Gwyn/M
+Gwynne/M
+gymkhana/SM
+gym/MS
+gymnasia's
+gymnasium/SM
+gymnastically
+gymnastic/S
+gymnastics/M
+gymnast/SM
+gymnosperm/SM
+gynecologic
+gynecological/MS
+gynecologist/SM
+gynecology/MS
+gypped
+gypper/S
+gypping
+gyp/S
+gypsite
+gypster/S
+gypsum/MS
+gypsy/SDMG
+Gypsy/SM
+gyrate/XNGSD
+gyration/M
+gyrator/MS
+gyrfalcon/SM
+gyrocompass/M
+gyro/MS
+gyroscope/SM
+gyroscopic
+gyve/GDS
+H
+Haag/M
+Haas/M
+Habakkuk/M
+habeas
+haberdasher/SM
+haberdashery/SM
+Haber/M
+Haberman/M
+Habib/M
+habiliment/SM
+habitability/MS
+habitableness/M
+habitable/P
+habitant/ISM
+habitation/MI
+habitations
+habitat/MS
+habit/IBDGS
+habit's
+habitualness/SM
+habitual/SYP
+habituate/SDNGX
+habituation/M
+habitué/MS
+hacienda/MS
+hacker/M
+Hackett/M
+hack/GZSDRBJ
+hackler/M
+hackle/RSDMG
+hackney/SMDG
+hacksaw/SDMG
+hackwork/S
+Hadamard/M
+Hadar/M
+Haddad/M
+haddock/MS
+hades
+Hades
+had/GD
+hadji's
+hadj's
+Hadlee/M
+Hadleigh/M
+Hadley/M
+Had/M
+hadn't
+Hadria/M
+Hadrian/M
+hadron/MS
+hadst
+haemoglobin's
+haemophilia's
+haemorrhage's
+Hafiz/M
+hafnium/MS
+haft/GSMD
+Hagan/M
+Hagar/M
+Hagen/M
+Hager/M
+Haggai/M
+haggardness/MS
+haggard/SYP
+hagged
+hagging
+haggish
+haggis/SM
+haggler/M
+haggle/RSDZG
+Hagiographa/M
+hagiographer/SM
+hagiography/MS
+hag/SMN
+Hagstrom/M
+Hague/M
+ha/H
+hahnium/S
+Hahn/M
+Haifa/M
+haiku/M
+Hailee/M
+hailer/M
+Hailey/M
+hail/SGMDR
+hailstone/SM
+hailstorm/SM
+Haily/M
+Haiphong/M
+hairball/SM
+hairbreadth/M
+hairbreadths
+hairbrush/SM
+haircare
+haircloth/M
+haircloths
+haircut/MS
+haircutting
+hairdo/SM
+hairdresser/SM
+hairdressing/SM
+hairdryer/S
+hairiness/MS
+hairlessness/M
+hairless/P
+hairlike
+hairline/SM
+hairnet/MS
+hairpiece/MS
+hairpin/MS
+hairsbreadth
+hairsbreadths
+hair/SDM
+hairsplitter/SM
+hairsplitting/MS
+hairspray
+hairspring/SM
+hairstyle/SMG
+hairstylist/S
+hairy/PTR
+Haitian/S
+Haiti/M
+hajjes
+hajji/MS
+hajj/M
+Hakeem/M
+hake/MS
+Hakim/M
+Hakka/M
+Hakluyt/M
+halalled
+halalling
+halal/S
+halberd/SM
+halcyon/S
+Haldane/M
+Haleakala/M
+Haleigh/M
+hale/ISRDG
+Hale/M
+haler/IM
+halest
+Halette/M
+Haley/M
+halfback/SM
+halfbreed
+halfheartedness/MS
+halfhearted/PY
+halfpence/S
+halfpenny/MS
+halfpennyworth
+half/PM
+halftime/S
+halftone/MS
+halfway
+halfword/MS
+halibut/SM
+halide/SM
+Halie/M
+Halifax/M
+Hali/M
+Halimeda/M
+halite/MS
+halitoses
+halitosis/M
+hallelujah
+hallelujahs
+Halley/M
+halliard's
+Hallie/M
+Halli/M
+Hallinan/M
+Hall/M
+Hallmark/M
+hallmark/SGMD
+hallo/GDS
+halloo's
+Halloween/MS
+hallowing
+hallows
+hallow/UD
+hall/SMR
+Hallsy/M
+hallucinate/VNGSDX
+hallucination/M
+hallucinatory
+hallucinogenic/S
+hallucinogen/SM
+hallway/SM
+Hally/M
+halocarbon
+halogenated
+halogen/SM
+halon
+halo/SDMG
+Halpern/M
+Halsey/M
+Hal/SMY
+Halsy/M
+halter/GDM
+halt/GZJSMDR
+halting/Y
+halve/GZDS
+halves/M
+halyard/MS
+Ha/M
+Hamal/M
+Haman/M
+hamburger/M
+Hamburg/MS
+hamburg/SZRM
+Hamel/M
+Hamey/M
+Hamhung/M
+Hamid/M
+Hamilcar/M
+Hamil/M
+Hamiltonian/MS
+Hamilton/M
+Hamish/M
+Hamitic/M
+Hamlen/M
+Hamlet/M
+hamlet/MS
+Hamlin/M
+Ham/M
+Hammad/M
+Hammarskjold/M
+hammed
+hammerer/M
+hammerhead/SM
+hammering/M
+hammerless
+hammerlock/MS
+Hammerstein/M
+hammertoe/SM
+hammer/ZGSRDM
+Hammett/M
+hamming
+hammock/MS
+Hammond/M
+Hammurabi/M
+hammy/RT
+Hamnet/M
+hampered/U
+hamper/GSD
+Hampshire/M
+Hampton/M
+ham/SM
+hamster/MS
+hamstring/MGS
+hamstrung
+Hamsun/M
+Hana/M
+Hanan/M
+Hancock/M
+handbagged
+handbagging
+handbag/MS
+handball/SM
+handbarrow/MS
+handbasin
+handbill/MS
+handbook/SM
+handbrake/M
+handcar/SM
+handcart/MS
+handclasp/MS
+handcraft/GMDS
+handcuff/GSD
+handcuffs/M
+handedness/M
+handed/PY
+Handel/M
+hander/S
+handful/SM
+handgun/SM
+handhold/M
+handicapped
+handicapper/SM
+handicapping
+handicap/SM
+handicraftsman/M
+handicraftsmen
+handicraft/SMR
+handily/U
+handiness/SM
+handiwork/MS
+handkerchief/MS
+handleable
+handlebar/SM
+handle/MZGRSD
+handler/M
+handless
+handling/M
+handmade
+handmaiden/M
+handmaid/NMSX
+handout/SM
+handover
+handpick/GDS
+handrail/SM
+hand's
+handsaw/SM
+handset/SM
+handshake/GMSR
+handshaker/M
+handshaking/M
+handsomely/U
+handsomeness/MS
+handsome/RPTY
+handspike/SM
+handspring/SM
+handstand/MS
+hand/UDSG
+handwork/SM
+handwoven
+handwrite/GSJ
+handwriting/M
+handwritten
+Handy/M
+handyman/M
+handymen
+handy/URT
+Haney/M
+hangar/SGDM
+hangdog/S
+hanged/A
+hanger/M
+hang/GDRZBSJ
+hanging/M
+hangman/M
+hangmen
+hangnail/MS
+hangout/MS
+hangover/SM
+hangs/A
+Hangul/M
+hangup/S
+Hangzhou
+Hankel/M
+hankerer/M
+hanker/GRDJ
+hankering/M
+hank/GZDRMS
+hankie/SM
+Hank/M
+hanky's
+Hannah/M
+Hanna/M
+Hannibal/M
+Hannie/M
+Hanni/MS
+Hanny/M
+Hanoi/M
+Hanoverian
+Hanover/M
+Hansel/M
+Hansen/M
+Hansiain/M
+Han/SM
+Hans/N
+hansom/MS
+Hanson/M
+Hanuka/S
+Hanukkah/M
+Hanukkahs
+Hapgood/M
+haphazardness/SM
+haphazard/SPY
+haplessness/MS
+hapless/YP
+haploid/S
+happed
+happening/M
+happen/JDGS
+happenstance/SM
+happily/U
+happiness/UMS
+happing
+Happy/M
+happy/UTPR
+Hapsburg/M
+hap/SMY
+Harald/M
+harangue/GDRS
+haranguer/M
+Harare
+harasser/M
+harass/LSRDZG
+harassment/SM
+Harbert/M
+harbinger/DMSG
+Harbin/M
+harborer/M
+harbor/ZGRDMS
+Harcourt/M
+hardback/SM
+hardball/SM
+hardboard/SM
+hardboiled
+hardbound
+hardcore/MS
+hardcover/SM
+hardened/U
+hardener/M
+hardening/M
+harden/ZGRD
+hardhat/S
+hardheadedness/SM
+hardheaded/YP
+hardheartedness/SM
+hardhearted/YP
+hardihood/MS
+hardily
+hardiness/SM
+Harding/M
+Hardin/M
+hardliner/S
+hardness/MS
+hardscrabble
+hardshell
+hardship/MS
+hardstand/S
+hardtack/MS
+hardtop/MS
+hardware/SM
+hardwire/DSG
+hardwood/MS
+hardworking
+Hardy/M
+hard/YNRPJGXTS
+hardy/PTRS
+harebell/MS
+harebrained
+harelip/MS
+harelipped
+hare/MGDS
+harem/SM
+Hargreaves/M
+hark/GDS
+Harland/M
+Harlan/M
+Harlem/M
+Harlene/M
+Harlen/M
+Harlequin
+harlequin/MS
+Harley/M
+Harlie/M
+Harli/M
+Harlin/M
+harlotry/MS
+harlot/SM
+Harlow/M
+Harman/M
+harmed/U
+harmer/M
+harmfulness/MS
+harmful/PY
+harmlessness/SM
+harmless/YP
+harm/MDRGS
+Harmonia/M
+harmonically
+harmonica/MS
+harmonic/S
+harmonics/M
+Harmonie/M
+harmonious/IPY
+harmoniousness/MS
+harmoniousness's/I
+harmonium/MS
+harmonization/A
+harmonizations
+harmonization's
+harmonized/U
+harmonizer/M
+harmonizes/UA
+harmonize/ZGSRD
+Harmon/M
+harmony/EMS
+Harmony/M
+harness/DRSMG
+harnessed/U
+harnesser/M
+harnesses/U
+Harold/M
+Haroun/M
+harper/M
+Harper/M
+harping/M
+harpist/SM
+harp/MDRJGZS
+Harp/MR
+harpooner/M
+harpoon/SZGDRM
+harpsichordist/MS
+harpsichord/SM
+harpy/SM
+Harpy/SM
+Harrell/M
+harridan/SM
+Harrie/M
+harrier/M
+Harriet/M
+Harrietta/M
+Harriette/M
+Harriett/M
+Harrington/M
+Harriot/M
+Harriott/M
+Harrisburg/M
+Harri/SM
+Harrisonburg/M
+Harrison/M
+harrower/M
+harrow/RDMGS
+harrumph/SDG
+Harry/M
+harry/RSDGZ
+harshen/GD
+harshness/SM
+harsh/TRNYP
+Harte/M
+Hartford/M
+Hartley/M
+Hartline/M
+Hart/M
+Hartman/M
+hart/MS
+Hartwell/M
+Harvard/M
+harvested/U
+harvester/M
+harvestman/M
+harvest/MDRZGS
+Harvey/MS
+Harv/M
+Harwell/M
+Harwilll/M
+has
+Hasbro/M
+hash/AGSD
+Hasheem/M
+hasher/M
+Hashim/M
+hashing/M
+hashish/MS
+hash's
+Hasidim
+Haskell/M
+Haskel/M
+Haskins/M
+Haslett/M
+hasn't
+hasp/GMDS
+hassle/MGRSD
+hassock/MS
+haste/MS
+hastener/M
+hasten/GRD
+hast/GXJDN
+Hastie/M
+hastily
+hastiness/MS
+Hastings/M
+Hasty/M
+hasty/RPT
+hatchback/SM
+hatcheck/S
+hatched/U
+hatcher/M
+hatchery/MS
+hatchet/MDSG
+hatching/M
+hatch/RSDJG
+Hatchure/M
+hatchway/MS
+hatefulness/MS
+hateful/YP
+hater/M
+hate/S
+Hatfield/M
+Hathaway/M
+hatless
+hat/MDRSZG
+hatred/SM
+hatstands
+hatted
+Hatteras/M
+hatter/SM
+Hattie/M
+Hatti/M
+hatting
+Hatty/M
+hauberk/SM
+Haugen/M
+haughtily
+haughtiness/SM
+haughty/TPR
+haulage/MS
+hauler/M
+haul/SDRGZ
+haunch/GMSD
+haunter/M
+haunting/Y
+haunt/JRDSZG
+Hauptmann/M
+Hausa/M
+Hausdorff/M
+Hauser/M
+hauteur/MS
+Havana/SM
+Havarti
+Havel/M
+haven/DMGS
+Haven/M
+haven't
+haver/G
+haversack/SM
+have/ZGSR
+havocked
+havocking
+havoc/SM
+Haw
+Hawaiian/S
+Hawaii/M
+hawker/M
+hawk/GZSDRM
+Hawking
+hawking/M
+Hawkins/M
+hawkishness/S
+hawkish/P
+Hawley/M
+haw/MDSG
+hawser/M
+haws/RZ
+Hawthorne/M
+hawthorn/MS
+haycock/SM
+Hayden/M
+Haydn/M
+Haydon/M
+Hayes
+hayfield/MS
+hay/GSMDR
+Hayley/M
+hayloft/MS
+haymow/MS
+Haynes
+hayrick/MS
+hayride/MS
+hayseed/MS
+Hay/SM
+haystack/SM
+haywain
+Hayward/M
+haywire/MS
+Haywood/M
+Hayyim/M
+hazard/MDGS
+hazardousness/M
+hazardous/PY
+haze/DSRJMZG
+Hazel/M
+hazel/MS
+hazelnut/SM
+Haze/M
+hazer/M
+hazily
+haziness/MS
+hazing/M
+Hazlett/M
+Hazlitt/M
+hazy/PTR
+HBO/M
+hdqrs
+HDTV
+headache/MS
+headband/SM
+headboard/MS
+headcount
+headdress/MS
+header/M
+headfirst
+headgear/SM
+headhunter/M
+headhunting/M
+headhunt/ZGSRDMJ
+headily
+headiness/S
+heading/M
+headlamp/S
+headland/MS
+headlessness/M
+headless/P
+headlight/MS
+headline/DRSZMG
+headliner/M
+headlock/MS
+headlong
+Head/M
+headman/M
+headmaster/MS
+headmastership/M
+headmen
+headmistress/MS
+headphone/SM
+headpiece/SM
+headpin/MS
+headquarter/GDS
+headrest/MS
+headroom/SM
+headscarf/M
+headset/SM
+headship/SM
+headshrinker/MS
+head/SJGZMDR
+headsman/M
+headsmen
+headstall/SM
+headstand/MS
+headstock/M
+headstone/MS
+headstrong
+headwaiter/SM
+headwall/S
+headwater/S
+headway/MS
+headwind/SM
+headword/MS
+heady/PTR
+heal/DRHSGZ
+healed/U
+healer/M
+Heall/M
+healthfully
+healthfulness/SM
+healthful/U
+healthily/U
+healthiness/MSU
+health/M
+healths
+healthy/URPT
+heap/SMDG
+heard/UA
+hearer/M
+hearing/AM
+hearken/SGD
+hearsay/SM
+hearse/M
+hears/SDAG
+Hearst/M
+heartache/SM
+heartbeat/MS
+heartbreak/GMS
+heartbreaking/Y
+heartbroke
+heartbroken
+heartburning/M
+heartburn/SGM
+hearted/Y
+hearten/EGDS
+heartening/EY
+heartfelt
+hearth/M
+hearthrug
+hearths
+hearthstone/MS
+heartily
+heartiness/SM
+heartland/SM
+heartlessness/SM
+heartless/YP
+heartrending/Y
+heartsickness/MS
+heartsick/P
+heart/SMDNXG
+heartstrings
+heartthrob/MS
+heartwarming
+Heartwood/M
+heartwood/SM
+hearty/TRSP
+hear/ZTSRHJG
+heatedly
+heated/UA
+heater/M
+heathendom/SM
+heathenish/Y
+heathenism/MS
+heathen/M
+heather/M
+Heather/M
+heathery
+Heathkit/M
+heathland
+Heathman/M
+Heath/MR
+heath/MRNZX
+heaths
+heatproof
+heats/A
+heat/SMDRGZBJ
+heatstroke/MS
+heatwave
+heave/DSRGZ
+heavenliness/M
+heavenly/PTR
+heaven/SYM
+heavenward/S
+heaver/M
+heaves/M
+heavily
+heaviness/MS
+Heaviside/M
+heavyhearted
+heavyset
+heavy/TPRS
+heavyweight/SM
+Hebe/M
+hebephrenic
+Hebert/M
+Heb/M
+Hebraic
+Hebraism/MS
+Hebrew/SM
+Hebrides/M
+Hecate/M
+hecatomb/M
+heckler/M
+heckle/RSDZG
+heck/S
+hectare/MS
+hectically
+hectic/S
+hectogram/MS
+hectometer/SM
+Hector/M
+hector/SGD
+Hecuba/M
+he'd
+Heda/M
+Hedda/M
+Heddie/M
+Heddi/M
+hedge/DSRGMZ
+hedgehog/MS
+hedgehopped
+hedgehopping
+hedgehop/S
+hedger/M
+hedgerow/SM
+hedging/Y
+Hedi/M
+hedonism/SM
+hedonistic
+hedonist/MS
+Hedvige/M
+Hedvig/M
+Hedwiga/M
+Hedwig/M
+Hedy/M
+heeded/U
+heedfulness/M
+heedful/PY
+heeding/U
+heedlessness/SM
+heedless/YP
+heed/SMGD
+heehaw/DGS
+heeler/M
+heeling/M
+heelless
+heel/SGZMDR
+Heep/M
+Hefner/M
+heft/GSD
+heftily
+heftiness/SM
+hefty/TRP
+Hegelian
+Hegel/M
+hegemonic
+hegemony/MS
+Hegira/M
+hegira/S
+Heida/M
+Heidegger/M
+Heidelberg/M
+Heidie/M
+Heidi/M
+heifer/MS
+Heifetz/M
+heighten/GD
+height/SMNX
+Heimlich/M
+Heindrick/M
+Heineken/M
+Heine/M
+Heinlein/M
+heinousness/SM
+heinous/PY
+Heinrich/M
+Heinrick/M
+Heinrik/M
+Heinze/M
+Heinz/M
+heiress/MS
+heirloom/MS
+heir/SDMG
+Heisenberg/M
+Heiser/M
+heister/M
+heist/GSMRD
+Hejira's
+Helaina/M
+Helaine/M
+held
+Helena/M
+Helene/M
+Helenka/M
+Helen/M
+Helga/M
+Helge/M
+helical/Y
+helices/M
+helicon/M
+Helicon/M
+helicopter/GSMD
+heliocentric
+heliography/M
+Heliopolis/M
+Helios/M
+heliosphere
+heliotrope/SM
+heliport/MS
+helium/MS
+helix/M
+he'll
+hellbender/M
+hellbent
+hellcat/SM
+hellebore/SM
+Hellene/SM
+Hellenic
+Hellenism/MS
+Hellenistic
+Hellenist/MS
+Hellenization/M
+Hellenize
+heller/M
+Heller/M
+Hellespont/M
+hellfire/M
+hell/GSMDR
+hellhole/SM
+Helli/M
+hellion/SM
+hellishness/SM
+hellish/PY
+Hellman/M
+hello/GMS
+Hell's
+helluva
+helmed
+helmet/GSMD
+Helmholtz/M
+helming
+helms
+helm's
+helmsman/M
+helmsmen
+helm/U
+Helmut/M
+Héloise/M
+helot/S
+helper/M
+helpfulness/MS
+helpful/UY
+help/GZSJDR
+helping/M
+helplessness/SM
+helpless/YP
+helpline/S
+helpmate/SM
+helpmeet's
+Helsa/M
+Helsinki/M
+helve/GMDS
+Helvetian/S
+Helvetius/M
+Helyn/M
+He/M
+hematite/MS
+hematologic
+hematological
+hematologist/SM
+hematology/MS
+heme/MS
+Hemingway/M
+hemisphere/MSD
+hemispheric
+hemispherical
+hemline/SM
+hemlock/MS
+hemmed
+hemmer/SM
+hemming
+hem/MS
+hemoglobin/MS
+hemolytic
+hemophiliac/SM
+hemophilia/SM
+hemorrhage/GMDS
+hemorrhagic
+hemorrhoid/MS
+hemostat/SM
+hemp/MNS
+h/EMS
+hemstitch/DSMG
+henceforth
+henceforward
+hence/S
+Hench/M
+henchman/M
+henchmen
+Henderson/M
+Hendrick/SM
+Hendrickson/M
+Hendrika/M
+Hendrik/M
+Hendrix/M
+henge/M
+Henka/M
+Henley/M
+hen/MS
+henna/MDSG
+Hennessey/M
+henning
+henpeck/GSD
+Henrie/M
+Henrieta/M
+Henrietta/M
+Henriette/M
+Henrik/M
+Henri/M
+Henryetta/M
+henry/M
+Henry/M
+Hensley/M
+Henson/M
+heparin/MS
+hepatic/S
+hepatitides
+hepatitis/M
+Hepburn/M
+Hephaestus/M
+Hephzibah/M
+hepper
+heppest
+Hepplewhite
+hep/S
+heptagonal
+heptagon/SM
+heptane/M
+heptathlon/S
+her
+Heracles/M
+Heraclitus/M
+heralded/U
+heraldic
+herald/MDSG
+heraldry/MS
+Hera/M
+herbaceous
+herbage/MS
+herbalism
+herbalist/MS
+herbal/S
+Herbart/M
+Herbert/M
+herbicidal
+herbicide/MS
+Herbie/M
+herbivore/SM
+herbivorous/Y
+Herb/M
+herb/MS
+Herby/M
+Herc/M
+Herculaneum/M
+herculean
+Herculean
+Hercule/MS
+Herculie/M
+herder/M
+Herder/M
+herd/MDRGZS
+herdsman/M
+herdsmen
+hereabout/S
+hereafter/S
+hereby
+hereditary
+heredity/MS
+Hereford/SM
+herein
+hereinafter
+here/IS
+hereof
+hereon
+here's
+heres/M
+heresy/SM
+heretical
+heretic/SM
+hereto
+heretofore
+hereunder
+hereunto
+hereupon
+herewith
+Heriberto/M
+heritable
+heritage/MS
+heritor/IM
+Herkimer/M
+Herman/M
+Hermann/M
+hermaphrodite/SM
+hermaphroditic
+Hermaphroditus/M
+hermeneutic/S
+hermeneutics/M
+Hermes
+hermetical/Y
+hermetic/S
+Hermia/M
+Hermie/M
+Hermina/M
+Hermine/M
+Herminia/M
+Hermione/M
+hermitage/SM
+Hermite/M
+hermitian
+hermit/MS
+Hermon/M
+Hermosa/M
+Hermosillo/M
+Hermy/M
+Hernandez/M
+Hernando/M
+hernial
+hernia/MS
+herniate/NGXDS
+Herod/M
+Herodotus/M
+heroes
+heroically
+heroics
+heroic/U
+heroine/SM
+heroin/MS
+heroism/SM
+Herold/M
+hero/M
+heron/SM
+herpes/M
+herpetologist/SM
+herpetology/MS
+Herrera/M
+Herrick/M
+herringbone/SDGM
+Herring/M
+herring/SM
+Herrington/M
+Herr/MG
+Herschel/M
+Hersch/M
+herself
+Hersey/M
+Hershel/M
+Hershey/M
+Hersh/M
+Herta/M
+Hertha/M
+hertz/M
+Hertz/M
+Hertzog/M
+Hertzsprung/M
+Herve/M
+Hervey/M
+Herzegovina/M
+Herzl/M
+hes
+Hesiod/M
+hesitance/S
+hesitancy/SM
+hesitantly
+hesitant/U
+hesitater/M
+hesitate/XDRSNG
+hesitating/UY
+hesitation/M
+Hesperus/M
+Hesse/M
+Hessian/MS
+Hess/M
+Hester/M
+Hesther/M
+Hestia/M
+Heston/M
+heterodox
+heterodoxy/MS
+heterodyne
+heterogamous
+heterogamy/M
+heterogeneity/SM
+heterogeneousness/M
+heterogeneous/PY
+heterosexuality/SM
+heterosexual/YMS
+heterostructure
+heterozygous
+Hettie/M
+Hetti/M
+Hetty/M
+Heublein/M
+heuristically
+heuristic/SM
+Heusen/M
+Heuser/M
+he/VMZ
+hew/DRZGS
+Hewe/M
+hewer/M
+Hewet/M
+Hewett/M
+Hewie/M
+Hewitt/M
+Hewlett/M
+Hew/M
+hexachloride/M
+hexadecimal/YS
+hexafluoride/M
+hexagonal/Y
+hexagon/SM
+hexagram/SM
+hexameter/SM
+hex/DSRG
+hexer/M
+hey
+heyday/MS
+Heyerdahl/M
+Heywood/M
+Hezekiah/M
+hf
+HF
+Hf/M
+Hg/M
+hgt
+hgwy
+HHS
+HI
+Hialeah/M
+hiatus/SM
+Hiawatha/M
+hibachi/MS
+hibernate/XGNSD
+hibernation/M
+hibernator/SM
+Hibernia/M
+Hibernian/S
+hibiscus/MS
+hiccup/MDGS
+hickey/SM
+Hickey/SM
+Hickman/M
+Hickok/M
+hickory/MS
+hick/SM
+Hicks/M
+hi/D
+hidden/U
+hideaway/SM
+hidebound
+hideousness/SM
+hideous/YP
+hideout/MS
+hider/M
+hide/S
+hiding/M
+hid/ZDRGJ
+hieing
+hierarchal
+hierarchic
+hierarchical/Y
+hierarchy/SM
+hieratic
+hieroglyph
+hieroglyphic/S
+hieroglyphics/M
+hieroglyphs
+Hieronymus/M
+hie/S
+hifalutin
+Higashiosaka
+Higgins/M
+highball/GSDM
+highborn
+highboy/MS
+highbrow/SM
+highchair/SM
+highfalutin
+Highfield/M
+highhandedness/SM
+highhanded/PY
+highish
+Highlander/SM
+Highlands
+highland/ZSRM
+highlight/GZRDMS
+Highness/M
+highness/MS
+highpoint
+high/PYRT
+highroad/MS
+highs
+hight
+hightail/DGS
+highwayman/M
+highwaymen
+highway/MS
+hijacker/M
+hijack/JZRDGS
+hiker/M
+hike/ZGDSR
+Hilario/M
+hilariousness/MS
+hilarious/YP
+hilarity/MS
+Hilarius/M
+Hilary/M
+Hilbert/M
+Hildagarde/M
+Hildagard/M
+Hilda/M
+Hildebrand/M
+Hildegaard/M
+Hildegarde/M
+Hilde/M
+Hildy/M
+Hillard/M
+Hillary/M
+hillbilly/MS
+Hillcrest/M
+Hillel/M
+hiller/M
+Hillery/M
+hill/GSMDR
+Hilliard/M
+Hilliary/M
+Hillie/M
+Hillier/M
+hilliness/SM
+Hill/M
+hillman
+hillmen
+hillock/SM
+Hillsboro/M
+Hillsdale/M
+hillside/SM
+hilltop/MS
+hillwalking
+Hillyer/M
+Hilly/RM
+hilly/TRP
+hilt/MDGS
+Hilton/M
+Hi/M
+Himalaya/MS
+Himalayan/S
+Himmler/M
+him/S
+himself
+Hinayana/M
+Hinda/M
+Hindemith/M
+Hindenburg/M
+hindered/U
+hinderer/M
+hinder/GRD
+Hindi/M
+hindmost
+hindquarter/SM
+hindrance/SM
+hind/RSZ
+hindsight/SM
+Hinduism/SM
+Hindu/MS
+Hindustani/MS
+Hindustan/M
+Hines/M
+hinger
+hinge's
+hinge/UDSG
+Hinkle/M
+Hinsdale/M
+hinterland/MS
+hinter/M
+hint/GZMDRS
+Hinton/M
+Hinze/M
+hipbone/SM
+hipness/S
+Hipparchus/M
+hipped
+hipper
+hippest
+hippie/MTRS
+hipping/M
+Hippocrates/M
+Hippocratic
+hippodrome/MS
+hippo/MS
+hippopotamus/SM
+hip/PSM
+hippy's
+hipster/MS
+hiragana
+Hiram/M
+hire/AGSD
+hireling/SM
+hirer/SM
+Hirey/M
+hiring/S
+Hirohito/M
+Hiroshi/M
+Hiroshima/M
+Hirsch/M
+hirsuteness/MS
+hirsute/P
+his
+Hispanic/SM
+Hispaniola/M
+hiss/DSRMJG
+hisser/M
+hissing/M
+Hiss/M
+histamine/SM
+histidine/SM
+histochemic
+histochemical
+histochemistry/M
+histogram/MS
+histological
+histologist/MS
+histology/SM
+historian/MS
+historic
+historicalness/M
+historical/PY
+historicism/M
+historicist/M
+historicity/MS
+historiographer/SM
+historiography/MS
+history/MS
+histrionically
+histrionic/S
+histrionics/M
+hist/SDG
+Hitachi/M
+Hitchcock/M
+hitcher/MS
+hitchhike/RSDGZ
+hitch/UGSD
+hither
+hitherto
+Hitler/SM
+hitless
+hit/MS
+hittable
+hitter/SM
+hitting
+Hittite/SM
+HIV
+hive/MGDS
+h'm
+HM
+HMO
+Hmong
+HMS
+hoarder/M
+hoarding/M
+hoard/RDJZSGM
+hoarfrost/SM
+hoariness/MS
+hoar/M
+hoarseness/SM
+hoarse/RTYP
+hoary/TPR
+hoaxer/M
+hoax/GZMDSR
+Hobard/M
+Hobart/M
+hobbed
+Hobbes/M
+hobbing
+hobbit
+hobbler/M
+hobble/ZSRDG
+Hobbs/M
+hobbyhorse/SM
+hobbyist/SM
+hobby/SM
+Hobday/M
+Hobey/M
+hobgoblin/MS
+Hobie/M
+hobnail/GDMS
+hobnobbed
+hobnobbing
+hobnob/S
+Hoboken/M
+hobo/SDMG
+hob/SM
+hoc
+hocker/M
+hockey/SM
+hock/GDRMS
+Hockney/M
+hockshop/SM
+hodge/MS
+Hodge/MS
+hodgepodge/SM
+Hodgkin/M
+ho/DRYZ
+hod/SM
+Hoebart/M
+hoecake/SM
+hoedown/MS
+hoeing
+hoer/M
+hoe/SM
+Hoffa/M
+Hoff/M
+Hoffman/M
+Hofstadter/M
+Hogan/M
+hogan/SM
+Hogarth/M
+hogback/MS
+hogged
+hogger
+hogging
+hoggish/Y
+hogshead/SM
+hog/SM
+hogtie/SD
+hogtying
+hogwash/SM
+Hohenlohe/M
+Hohenstaufen/M
+Hohenzollern/M
+Hohhot/M
+hoister/M
+hoist/GRDS
+hoke/DSG
+hokey/PRT
+hokier
+hokiest
+Hokkaido/M
+hokum/MS
+Hokusai/M
+Holbein/M
+Holbrook/M
+Holcomb/M
+holdall/MS
+Holden/M
+holder/M
+Holder/M
+holding/IS
+holding's
+hold/NRBSJGZ
+holdout/SM
+holdover/SM
+holdup/MS
+hole/MGDS
+holey
+holiday/GRDMS
+Holiday/M
+holidaymaker/S
+holier/U
+Holiness/MS
+holiness/MSU
+holistic
+holistically
+hollandaise
+Hollandaise/M
+Hollander/M
+Holland/RMSZ
+holler/GDS
+Hollerith/M
+Holley/M
+Hollie/M
+Holli/SM
+Hollister/M
+Holloway/M
+hollowness/MS
+hollow/RDYTGSP
+hollowware/M
+Hollyanne/M
+hollyhock/MS
+Holly/M
+holly/SM
+Hollywood/M
+Holman/M
+Holmes
+holmium/MS
+Holm/M
+Holocaust
+holocaust/MS
+Holocene
+hologram/SM
+holograph/GMD
+holographic
+holographs
+holography/MS
+Holstein/MS
+holster/MDSG
+Holst/M
+Holt/M
+Holyoke/M
+holy/SRTP
+holystone/MS
+Holzman/M
+Ho/M
+homage/MGSRD
+homager/M
+hombre/SM
+homburg/SM
+homebody/MS
+homebound
+homeboy/S
+homebuilder/S
+homebuilding
+homebuilt
+homecoming/MS
+home/DSRMYZG
+homegrown
+homeland/SM
+homelessness/SM
+homeless/P
+homelike
+homeliness/SM
+homely/RPT
+homemade
+homemake/JRZG
+homemaker/M
+homemaking/M
+homeomorphic
+homeomorphism/MS
+homeomorph/M
+homeopath
+homeopathic
+homeopaths
+homeopathy/MS
+homeostases
+homeostasis/M
+homeostatic
+homeowner/S
+homeownership
+homepage
+Homere/M
+homer/GDM
+Homeric
+homerists
+Homer/M
+homeroom/MS
+Homerus/M
+homeschooling/S
+homesickness/MS
+homesick/P
+homespun/S
+homesteader/M
+homestead/GZSRDM
+homestretch/SM
+hometown/SM
+homeward
+homeworker/M
+homework/ZSMR
+homeyness/MS
+homey/PS
+homicidal/Y
+homicide/SM
+homier
+homiest
+homiletic/S
+homily/SM
+hominess's
+homing/M
+hominid/MS
+hominy/SM
+Hom/MR
+homogamy/M
+homogenate/MS
+homogeneity/ISM
+homogeneous/PY
+homogenization/MS
+homogenize/DRSGZ
+homogenizer/M
+homograph/M
+homographs
+homological
+homologous
+homologue/M
+homology/MS
+homomorphic
+homomorphism/SM
+homonym/SM
+homophobia/S
+homophobic
+homophone/MS
+homopolymers
+homosexuality/SM
+homosexual/YMS
+homo/SM
+homotopy
+homozygous/Y
+honcho/DSG
+Honda/M
+Hondo/M
+Honduran/S
+Honduras/M
+Honecker/M
+hone/SM
+honestly/E
+honest/RYT
+honesty/ESM
+honeybee/SM
+honeycomb/SDMG
+honeydew/SM
+honey/GSMD
+honeylocust
+Honey/M
+honeymooner/M
+honeymoon/RDMGZS
+honeysuckle/MS
+Honeywell/M
+hong/M
+Honiara/M
+honker/M
+honk/GZSDRM
+honky/SM
+Hon/M
+hon/MDRSZTG
+Honolulu/M
+honorableness/SM
+honorable/PSM
+honorables/U
+honorablies/U
+honorably/UE
+honorarily
+honorarium/SM
+honorary/S
+honored/U
+honoree/S
+honor/ERDBZGS
+honorer/EM
+Honoria/M
+honorific/S
+Honor/M
+honor's
+honors/A
+Honshu/M
+hooch/MS
+hoodedness/M
+hooded/P
+hoodlum/SM
+Hood/M
+hood/MDSG
+hoodoo/DMGS
+hoodwinker/M
+hoodwink/SRDG
+hooey/SM
+hoof/DRMSG
+hoofer/M
+hoofmark/S
+hookah/M
+hookahs
+hookedness/M
+hooked/P
+Hooke/MR
+hooker/M
+Hooker/M
+hookey's
+hook/GZDRMS
+hooks/U
+hookup/SM
+hookworm/MS
+hooky/SRMT
+hooliganism/SM
+hooligan/SM
+hooper/M
+Hooper/M
+hoopla/SM
+hoop/MDRSG
+hooray/SMDG
+hoosegow/MS
+Hoosier/SM
+hootch's
+hootenanny/SM
+hooter/M
+hoot/MDRSGZ
+Hoover/MS
+hooves/M
+hoped/U
+hopefulness/MS
+hopeful/SPY
+hopelessness/SM
+hopeless/YP
+Hope/M
+hoper/M
+hope/SM
+Hopewell/M
+Hopi/SM
+Hopkinsian/M
+Hopkins/M
+hopped
+Hopper/M
+hopper/MS
+hopping/M
+hoppled
+hopples
+hopscotch/MDSG
+hop/SMDRG
+Horace/M
+Horacio/M
+Horatia/M
+Horatio/M
+Horatius/M
+horde/DSGM
+horehound/MS
+horizon/MS
+horizontal/YS
+Hormel/M
+hormonal/Y
+hormone/MS
+Hormuz/M
+hornbeam/M
+hornblende/MS
+Hornblower/M
+hornedness/M
+horned/P
+Horne/M
+hornet/MS
+horn/GDRMS
+horniness/M
+hornless
+hornlike
+Horn/M
+hornpipe/MS
+horny/TRP
+horologic
+horological
+horologist/MS
+horology/MS
+horoscope/MS
+Horowitz/M
+horrendous/Y
+horribleness/SM
+horrible/SP
+horribly
+horridness/M
+horrid/PY
+horrific
+horrifically
+horrify/DSG
+horrifying/Y
+horror/MS
+hors/DSGX
+horseback/MS
+horsedom
+horseflesh/M
+horsefly/MS
+horsehair/SM
+horsehide/SM
+horselaugh/M
+horselaughs
+horseless
+horselike
+horsely
+horseman/M
+horsemanship/MS
+horsemen
+horseplayer/M
+horseplay/SMR
+horsepower/SM
+horseradish/SM
+horse's
+horseshoeing
+horseshoe/MRSD
+horseshoer/M
+horsetail/SM
+horse/UGDS
+horsewhipped
+horsewhipping
+horsewhip/SM
+horsewoman/M
+horsewomen
+horsey
+horsier
+horsiest
+horsing/M
+Horst/M
+hortatory
+Horten/M
+Hortense/M
+Hortensia/M
+horticultural
+horticulture/SM
+horticulturist/SM
+Hort/MN
+Horton/M
+Horus/M
+hosanna/SDG
+Hosea/M
+hose/M
+hosepipe
+hos/GDS
+hosier/MS
+hosiery/SM
+hosp
+hospice/MS
+hospitable/I
+hospitably/I
+hospitality/MS
+hospitality's/I
+hospitalization/MS
+hospitalize/GSD
+hospital/MS
+hostage/MS
+hosteler/M
+hostelry/MS
+hostel/SZGMRD
+hostess/MDSG
+hostile/YS
+hostility/SM
+hostler/MS
+Host/MS
+host/MYDGS
+hotbed/MS
+hotblooded
+hotbox/MS
+hotcake/S
+hotchpotch/M
+hotelier/MS
+hotelman/M
+hotel/MS
+hotfoot/DGS
+hothead/DMS
+hotheadedness/SM
+hotheaded/PY
+hothouse/MGDS
+hotness/MS
+hotplate/SM
+hotpot/M
+hot/PSY
+hotrod
+hotshot/S
+hotted
+Hottentot/SM
+hotter
+hottest
+hotting
+Houdaille/M
+Houdini/M
+hough/M
+hounder/M
+hounding/M
+hound/MRDSG
+hourglass/MS
+houri/MS
+hourly/S
+hour/YMS
+house/ASDG
+houseboat/SM
+housebound
+houseboy/SM
+housebreaker/M
+housebreaking/M
+housebreak/JSRZG
+housebroke
+housebroken
+housebuilding
+housecleaning/M
+houseclean/JDSG
+housecoat/MS
+housefly/MS
+houseful/SM
+householder/M
+household/ZRMS
+househusband/S
+housekeeper/M
+housekeeping/M
+housekeep/JRGZ
+houselights
+House/M
+housemaid/MS
+houseman/M
+housemen
+housemother/MS
+housemoving
+houseparent/SM
+houseplant/S
+houser
+house's
+housetop/MS
+housewares
+housewarming/MS
+housewifeliness/M
+housewifely/P
+housewife/YM
+housewives
+houseworker/M
+housework/ZSMR
+housing/MS
+Housman/M
+Houston/M
+Houyhnhnm/M
+HOV
+hovel/GSMD
+hovercraft/M
+hoverer/M
+hover/GRD
+hove/ZR
+Howard/M
+howbeit
+howdah/M
+howdahs
+howdy/GSD
+Howell/MS
+Howe/M
+however
+Howey/M
+Howie/M
+howitzer/MS
+howler/M
+howl/GZSMDR
+Howrah/M
+how/SM
+howsoever
+hoyden/DMGS
+hoydenish
+Hoyle/SM
+hoy/M
+Hoyt/M
+hp
+HP
+HQ
+hr
+HR
+HRH
+Hrothgar/M
+hrs
+h's
+H's
+HS
+HST
+ht
+HTML
+Hts/M
+HTTP
+Huang/M
+huarache/SM
+hubba
+Hubbard/M
+Hubble/M
+hubbub/SM
+hubby/SM
+hubcap/SM
+Huber/M
+Hube/RM
+Hubert/M
+Huberto/M
+Hubey/M
+Hubie/M
+hub/MS
+hubris/SM
+huckleberry/SM
+Huck/M
+huckster/SGMD
+HUD
+Huddersfield/M
+huddler/M
+huddle/RSDMG
+Hudson/M
+hue/MDS
+Huerta/M
+Huey/M
+huffily
+huffiness/SM
+Huff/M
+Huffman/M
+huff/SGDM
+huffy/TRP
+hugeness/MS
+huge/YP
+hugged
+hugger
+hugging/S
+Huggins
+Hughie/M
+Hugh/MS
+Hugibert/M
+Hugo/M
+hug/RTS
+Huguenot/SM
+Hugues/M
+huh
+huhs
+Hui/M
+Huitzilopitchli/M
+hula/MDSG
+Hulda/M
+hulk/GDMS
+hullabaloo/SM
+huller/M
+hulling/M
+Hull/M
+hull/MDRGZS
+hullo/GSDM
+humane/IY
+humaneness/SM
+humaner
+humanest
+human/IPY
+humanism/SM
+humanistic
+humanist/SM
+humanitarianism/SM
+humanitarian/S
+humanity/ISM
+humanization/CSM
+humanized/C
+humanizer/M
+humanize/RSDZG
+humanizes/IAC
+humanizing/C
+humankind/M
+humannesses
+humanness/IM
+humanoid/S
+humans
+Humbert/M
+Humberto/M
+humbleness/SM
+humble/TZGPRSDJ
+humbly
+Humboldt/M
+humbugged
+humbugging
+humbug/MS
+humdinger/MS
+humdrum/S
+Hume/M
+humeral/S
+humeri
+humerus/M
+Humfrey/M
+Humfrid/M
+Humfried/M
+humidification/MC
+humidifier/CM
+humidify/RSDCXGNZ
+humidistat/M
+humidity/MS
+humidor/MS
+humid/Y
+humiliate/SDXNG
+humiliating/Y
+humiliation/M
+humility/MS
+hummed
+Hummel/M
+hummer/SM
+humming
+hummingbird/SM
+hummock/MDSG
+hummocky
+hummus/S
+humongous
+humored/U
+humorist/MS
+humorlessness/MS
+humorless/PY
+humorousness/MS
+humorous/YP
+humor/RDMZGS
+humpback/SMD
+hump/GSMD
+humph/DG
+Humphrey/SM
+humphs
+Humpty/M
+hum/S
+humus/SM
+Humvee
+hunchback/DSM
+hunch/GMSD
+hundredfold/S
+hundred/SHRM
+hundredths
+hundredweight/SM
+Hunfredo/M
+hung/A
+Hungarian/MS
+Hungary/M
+hunger/SDMG
+Hung/M
+hungover
+hungrily
+hungriness/SM
+hungry/RTP
+hunker/DG
+hunky/RST
+hunk/ZRMS
+Hun/MS
+hunter/M
+Hunter/M
+hunt/GZJDRS
+hunting/M
+Huntington/M
+Huntlee/M
+Huntley/M
+Hunt/MR
+huntress/MS
+huntsman/M
+huntsmen
+Huntsville/M
+hurdle/JMZGRSD
+hurdler/M
+hurl/DRGZJS
+Hurlee/M
+Hurleigh/M
+hurler/M
+Hurley/M
+hurling/M
+Huron/SM
+hurray/SDG
+hurricane/MS
+hurriedness/M
+hurried/UY
+hurry/RSDG
+Hurst/M
+hurter/M
+hurtfulness/MS
+hurtful/PY
+hurting/Y
+hurtle/SDG
+hurts
+hurt/U
+Hurwitz/M
+Hus
+Husain's
+husbander/M
+husband/GSDRYM
+husbandman/M
+husbandmen
+husbandry/SM
+Husein/M
+hush/DSG
+husker/M
+huskily
+huskiness/MS
+husking/M
+husk/SGZDRM
+husky/RSPT
+hussar/MS
+Hussein/M
+Husserl/M
+hussy/SM
+hustings/M
+hustler/M
+hustle/RSDZG
+Huston/M
+Hutchins/M
+Hutchinson/M
+Hutchison/M
+hutch/MSDG
+hut/MS
+hutted
+hutting
+Hutton/M
+Hutu/M
+Huxley/M
+Huygens/M
+huzzah/GD
+huzzahs
+hwy
+Hyacintha/M
+Hyacinthe/M
+Hyacinthia/M
+Hyacinthie/M
+hyacinth/M
+Hyacinth/M
+hyacinths
+Hyades
+hyaena's
+Hyannis/M
+Hyatt/M
+hybridism/SM
+hybridization/S
+hybridize/GSD
+hybrid/MS
+Hyde/M
+Hyderabad/M
+Hydra/M
+hydra/MS
+hydrangea/SM
+hydrant/SM
+hydrate/CSDNGX
+hydrate's
+hydration/MC
+hydraulically
+hydraulicked
+hydraulicking
+hydraulic/S
+hydraulics/M
+hydrazine/M
+hydride/MS
+hydrocarbon/SM
+hydrocephali
+hydrocephalus/MS
+hydrochemistry
+hydrochloric
+hydrochloride/M
+hydrodynamical
+hydrodynamic/S
+hydrodynamics/M
+hydroelectric
+hydroelectrically
+hydroelectricity/SM
+hydrofluoric
+hydrofoil/MS
+hydrogenate/CDSGN
+hydrogenate's
+hydrogenation/MC
+hydrogenations
+hydrogen/MS
+hydrogenous
+hydrological/Y
+hydrologist/MS
+hydrology/SM
+hydrolysis/M
+hydrolyzed/U
+hydrolyze/GSD
+hydromagnetic
+hydromechanics/M
+hydrometer/SM
+hydrometry/MS
+hydrophilic
+hydrophobia/SM
+hydrophobic
+hydrophone/SM
+hydroplane/DSGM
+hydroponic/S
+hydroponics/M
+hydro/SM
+hydrosphere/MS
+hydrostatic/S
+hydrostatics/M
+hydrotherapy/SM
+hydrothermal/Y
+hydrous
+hydroxide/MS
+hydroxy
+hydroxylate/N
+hydroxyl/SM
+hydroxyzine/M
+hyena/MS
+hygiene/MS
+hygienically
+hygienic/S
+hygienics/M
+hygienist/MS
+hygrometer/SM
+hygroscopic
+hying
+Hy/M
+Hyman/M
+hymeneal/S
+Hymen/M
+hymen/MS
+Hymie/M
+hymnal/SM
+hymnbook/S
+hymn/GSDM
+Hynda/M
+hype/MZGDSR
+hyperactive/S
+hyperactivity/SM
+hyperbola/MS
+hyperbole/MS
+hyperbolic
+hyperbolically
+hyperboloidal
+hyperboloid/SM
+hypercellularity
+hypercritical/Y
+hypercube/MS
+hyperemia/M
+hyperemic
+hyperfine
+hypergamous/Y
+hypergamy/M
+hyperglycemia/MS
+hyperinflation
+Hyperion/M
+hypermarket/SM
+hypermedia/S
+hyperplane/SM
+hyperplasia/M
+hypersensitiveness/MS
+hypersensitive/P
+hypersensitivity/MS
+hypersonic
+hyperspace/M
+hypersphere/M
+hypertension/MS
+hypertensive/S
+hypertext/SM
+hyperthyroid
+hyperthyroidism/MS
+hypertrophy/MSDG
+hypervelocity
+hyperventilate/XSDGN
+hyperventilation/M
+hyphenated/U
+hyphenate/NGXSD
+hyphenation/M
+hyphen/DMGS
+hypnoses
+hypnosis/M
+hypnotherapy/SM
+hypnotically
+hypnotic/S
+hypnotism/MS
+hypnotist/SM
+hypnotize/SDG
+hypoactive
+hypoallergenic
+hypocellularity
+hypochondriac/SM
+hypochondria/MS
+hypocrisy/SM
+hypocrite/MS
+hypocritical/Y
+hypodermic/S
+hypo/DMSG
+hypoglycemia/SM
+hypoglycemic/S
+hypophyseal
+hypophysectomized
+hypotenuse/MS
+hypothalami
+hypothalamic
+hypothalamically
+hypothalamus/M
+hypothermia/SM
+hypotheses
+hypothesis/M
+hypothesizer/M
+hypothesize/ZGRSD
+hypothetic
+hypothetical/Y
+hypothyroid
+hypothyroidism/SM
+hypoxia/M
+hyssop/MS
+hysterectomy/MS
+hysteresis/M
+hysteria/SM
+hysterical/YU
+hysteric/SM
+Hyundai/M
+Hz
+i
+I
+IA
+Iaccoca/M
+Iago/M
+Iain/M
+Ia/M
+iambi
+iambic/S
+iamb/MS
+iambus/SM
+Ian/M
+Ianthe/M
+Ibadan/M
+Ibbie/M
+Ibby/M
+Iberia/M
+Iberian/MS
+Ibero/M
+ibex/MS
+ibid
+ibidem
+ibis/SM
+IBM/M
+Ibo/M
+Ibrahim/M
+Ibsen/M
+ibuprofen/S
+Icarus/M
+ICBM/S
+ICC
+iceberg/SM
+iceboat/MS
+icebound
+icebox/MS
+icebreaker/SM
+icecap/SM
+ice/GDSC
+Icelander/M
+Icelandic
+Iceland/MRZ
+Ice/M
+iceman/M
+icemen
+icepack
+icepick/S
+ice's
+Ichabod/M
+ichneumon/M
+ichthyologist/MS
+ichthyology/MS
+icicle/SM
+icily
+iciness/SM
+icing/MS
+icky/RT
+iconic
+icon/MS
+iconoclasm/MS
+iconoclastic
+iconoclast/MS
+iconography/MS
+icosahedra
+icosahedral
+icosahedron/M
+ictus/SM
+ICU
+icy/RPT
+I'd
+ID
+Idahoan/S
+Idahoes
+Idaho/MS
+Idalia/M
+Idalina/M
+Idaline/M
+Ida/M
+idealism/MS
+idealistic
+idealistically
+idealist/MS
+idealization/MS
+idealized/U
+idealize/GDRSZ
+idealizer/M
+ideal/MYS
+idealogical
+idea/SM
+ideate/SN
+ideation/M
+Idelle/M
+Idell/M
+idem
+idempotent/S
+identicalness/M
+identical/YP
+identifiability
+identifiable/U
+identifiably
+identification/M
+identified/U
+identifier/M
+identify/XZNSRDG
+identity/SM
+ideogram/MS
+ideographic
+ideograph/M
+ideographs
+ideological/Y
+ideologist/SM
+ideologue/S
+ideology/SM
+ides
+Idette/M
+idiocy/MS
+idiolect/M
+idiomatically
+idiomatic/P
+idiom/MS
+idiopathic
+idiosyncrasy/SM
+idiosyncratic
+idiosyncratically
+idiotic
+idiotically
+idiot/MS
+idleness/MS
+idle/PZTGDSR
+idler/M
+id/MY
+idolater/MS
+idolatress/S
+idolatrous
+idolatry/SM
+idolization/SM
+idolized/U
+idolizer/M
+idolize/ZGDRS
+idol/MS
+ids
+IDs
+idyllic
+idyllically
+idyll/MS
+IE
+IEEE
+Ieyasu/M
+if
+iffiness/S
+iffy/TPR
+Ifni/M
+ifs
+Iggie/M
+Iggy/M
+igloo/MS
+Ignace/M
+Ignacio/M
+Ignacius/M
+Ignatius/M
+Ignazio/M
+Ignaz/M
+igneous
+ignitable
+ignite/ASDG
+igniter/M
+ignition/MS
+ignobleness/M
+ignoble/P
+ignobly
+ignominious/Y
+ignominy/MS
+ignoramus/SM
+ignorance/MS
+ignorantness/M
+ignorant/SPY
+ignorer/M
+ignore/SRDGB
+Igor/M
+iguana/MS
+Iguassu/M
+ii
+iii
+Ijsselmeer/M
+Ike/M
+Ikey/M
+Ikhnaton/M
+ikon's
+IL
+Ilaire/M
+Ila/M
+Ilario/M
+ilea
+Ileana/M
+Ileane/M
+ileitides
+ileitis/M
+Ilene/M
+ileum/M
+ilia
+iliac
+Iliad/MS
+Ilise/M
+ilium/M
+Ilka/M
+ilk/MS
+I'll
+Illa/M
+illegality/MS
+illegal/YS
+illegibility/MS
+illegible
+illegibly
+illegitimacy/SM
+illegitimate/SDGY
+illiberality/SM
+illiberal/Y
+illicitness/MS
+illicit/YP
+illimitableness/M
+illimitable/P
+Illinoisan/MS
+Illinois/M
+illiquid
+illiteracy/MS
+illiterateness/M
+illiterate/PSY
+Ill/M
+illness/MS
+illogicality/SM
+illogicalness/M
+illogical/PY
+illogic/M
+ill/PS
+illume/DG
+illuminate/XSDVNG
+Illuminati
+illuminatingly
+illuminating/U
+illumination/M
+illumine/BGSD
+illusionary
+illusion/ES
+illusionist/MS
+illusion's
+illusiveness/M
+illusive/PY
+illusoriness/M
+illusory/P
+illustrated/U
+illustrate/VGNSDX
+illustration/M
+illustrative/Y
+illustrator/SM
+illustriousness/SM
+illustrious/PY
+illus/V
+illy
+Ilona/M
+Ilsa/M
+Ilse/M
+Ilysa/M
+Ilyse/M
+Ilyssa/M
+Ilyushin/M
+I'm
+image/DSGM
+Imagen/M
+imagery/MS
+imaginableness
+imaginable/U
+imaginably/U
+imaginariness/M
+imaginary/PS
+imagination/MS
+imaginativeness/M
+imaginative/UY
+imagined/U
+imaginer/M
+imagine/RSDJBG
+imagoes
+imago/M
+imam/MS
+imbalance/SDM
+imbecile/YMS
+imbecilic
+imbecility/MS
+imbiber/M
+imbibe/ZRSDG
+imbrication/SM
+Imbrium/M
+imbroglio/MS
+imbruing
+imbue/GDS
+Imelda/M
+IMF
+IMHO
+imitable/I
+imitate/SDVNGX
+imitation/M
+imitativeness/MS
+imitative/YP
+imitator/SM
+immaculateness/SM
+immaculate/YP
+immanence/S
+immanency/MS
+immanent/Y
+Immanuel/M
+immateriality/MS
+immaterialness/MS
+immaterial/PY
+immatureness/M
+immature/SPY
+immaturity/MS
+immeasurableness/M
+immeasurable/P
+immeasurably
+immediacy/MS
+immediateness/SM
+immediate/YP
+immemorial/Y
+immenseness/M
+immense/PRTY
+immensity/MS
+immerse/RSDXNG
+immersible
+immersion/M
+immigrant/SM
+immigrate/NGSDX
+immigration/M
+imminence/SM
+imminentness/M
+imminent/YP
+immobile
+immobility/MS
+immobilization/MS
+immobilize/DSRG
+immoderateness/M
+immoderate/NYP
+immoderation/M
+immodest/Y
+immodesty/SM
+immolate/SDNGX
+immolation/M
+immorality/MS
+immoral/Y
+immortality/SM
+immortalized/U
+immortalize/GDS
+immortal/SY
+immovability/SM
+immovableness/M
+immovable/PS
+immovably
+immune/S
+immunity/SM
+immunization/MS
+immunize/GSD
+immunoassay/M
+immunodeficiency/S
+immunodeficient
+immunologic
+immunological/Y
+immunologist/SM
+immunology/MS
+immure/GSD
+immutability/MS
+immutableness/M
+immutable/P
+immutably
+IMNSHO
+IMO
+Imogene/M
+Imogen/M
+Imojean/M
+impaction/SM
+impactor/SM
+impact/VGMRDS
+impaired/U
+impairer/M
+impair/LGRDS
+impairment/SM
+impala/MS
+impale/GLRSD
+impalement/SM
+impaler/M
+impalpable
+impalpably
+impanel/DGS
+impartation/M
+impart/GDS
+impartiality/SM
+impartial/Y
+impassableness/M
+impassable/P
+impassably
+impasse/SXBMVN
+impassibility/SM
+impassible
+impassibly
+impassion/DG
+impassioned/U
+impassiveness/MS
+impassive/YP
+impassivity/MS
+impasto/SM
+impatience/SM
+impatiens/M
+impatient/Y
+impeachable/U
+impeach/DRSZGLB
+impeacher/M
+impeachment/MS
+impeccability/SM
+impeccable/S
+impeccably
+impecuniousness/MS
+impecunious/PY
+impedance/MS
+impeded/U
+impeder/M
+impede/S
+imped/GRD
+impedimenta
+impediment/SM
+impelled
+impeller/MS
+impelling
+impel/S
+impend/DGS
+impenetrability/MS
+impenetrableness/M
+impenetrable/P
+impenetrably
+impenitence/MS
+impenitent/YS
+imperativeness/M
+imperative/PSY
+imperceivable
+imperceptibility/MS
+imperceptible
+imperceptibly
+imperceptive
+imperf
+imperfectability
+imperfection/MS
+imperfectness/SM
+imperfect/YSVP
+imperialism/MS
+imperialistic
+imperialistically
+imperialist/SM
+imperial/YS
+imperil/GSLD
+imperilment/SM
+imperiousness/MS
+imperious/YP
+imperishableness/M
+imperishable/SP
+imperishably
+impermanence/MS
+impermanent/Y
+impermeability/SM
+impermeableness/M
+impermeable/P
+impermeably
+impermissible
+impersonality/M
+impersonalized
+impersonal/Y
+impersonate/XGNDS
+impersonation/M
+impersonator/SM
+impertinence/SM
+impertinent/YS
+imperturbability/SM
+imperturbable
+imperturbably
+imperviousness/M
+impervious/PY
+impetigo/MS
+impetuosity/MS
+impetuousness/MS
+impetuous/YP
+impetus/MS
+impiety/MS
+impinge/LS
+impingement/MS
+imping/GD
+impiousness/SM
+impious/PY
+impishness/MS
+impish/YP
+implacability/SM
+implacableness/M
+implacable/P
+implacably
+implantation/SM
+implant/BGSDR
+implanter/M
+implausibility/MS
+implausible
+implausibly
+implementability
+implementable/U
+implementation/A
+implementations
+implementation's
+implemented/AU
+implementer/M
+implementing/A
+implementor/MS
+implement/SMRDGZB
+implicant/SM
+implicate/VGSD
+implication/M
+implicative/PY
+implicitness/SM
+implicit/YP
+implied/Y
+implode/GSD
+implore/GSD
+imploring/Y
+implosion/SM
+implosive/S
+imply/GNSDX
+impoliteness/MS
+impolite/YP
+impoliticness/M
+impolitic/PY
+imponderableness/M
+imponderable/PS
+importance/SM
+important/Y
+importation/MS
+importer/M
+importing/A
+import/SZGBRD
+importunateness/M
+importunate/PYGDS
+importuner/M
+importune/SRDZYG
+importunity/SM
+imposable
+impose/ASDG
+imposer/SM
+imposingly
+imposing/U
+imposition/SM
+impossibility/SM
+impossibleness/M
+impossible/PS
+impossibly
+imposter's
+impostor/SM
+impost/SGMD
+imposture/SM
+impotence/MS
+impotency/S
+impotent/SY
+impound/GDS
+impoundments
+impoverisher/M
+impoverish/LGDRS
+impoverishment/SM
+impracticableness/M
+impracticable/P
+impracticably
+impracticality/SM
+impracticalness/M
+impractical/PY
+imprecate/NGXSD
+imprecation/M
+impreciseness/MS
+imprecise/PYXN
+imprecision/M
+impregnability/MS
+impregnableness/M
+impregnable/P
+impregnably
+impregnate/DSXNG
+impregnation/M
+impresario/SM
+impress/DRSGVL
+impressed/U
+impresser/M
+impressibility/MS
+impressible
+impressionability/SM
+impressionableness/M
+impressionable/P
+impression/BMS
+impressionism/SM
+impressionistic
+impressionist/MS
+impressiveness/MS
+impressive/YP
+impressment/M
+imprimatur/SM
+imprinter/M
+imprinting/M
+imprint/SZDRGM
+imprison/GLDS
+imprisonment/MS
+improbability/MS
+improbableness/M
+improbable/P
+improbably
+impromptu/S
+improperness/M
+improper/PY
+impropitious
+impropriety/SM
+improved/U
+improvement/MS
+improver/M
+improve/SRDGBL
+improvidence/SM
+improvident/Y
+improvisational
+improvisation/MS
+improvisatory
+improviser/M
+improvise/RSDZG
+imprudence/SM
+imprudent/Y
+imp/SGMDRY
+impudence/MS
+impudent/Y
+impugner/M
+impugn/SRDZGB
+impulse/XMVGNSD
+impulsion/M
+impulsiveness/MS
+impulsive/YP
+impunity/SM
+impureness/M
+impure/RPTY
+impurity/MS
+imputation/SM
+impute/SDBG
+Imus/M
+IN
+inaction
+inactive
+inadequate/S
+inadvertence/MS
+inadvertent/Y
+inalienability/MS
+inalienably
+inalterableness/M
+inalterable/P
+Ina/M
+inamorata/MS
+inane/SRPYT
+inanimateness/S
+inanimate/P
+inanity/MS
+inappeasable
+inappropriate/P
+inarticulate/P
+in/AS
+inasmuch
+inaugural/S
+inaugurate/XSDNG
+inauguration/M
+inauthenticity
+inbound/G
+inbred/S
+inbreed/JG
+incalculableness/M
+incalculably
+incandescence/SM
+incandescent/YS
+incant
+incantation/SM
+incantatory
+incapable/S
+incapacitate/GNSD
+incapacitation/M
+incarcerate/XGNDS
+incarceration/M
+incarnadine/GDS
+incarnate/AGSDNX
+incarnation/AM
+Inca/SM
+incendiary/S
+incense/MGDS
+incentive/ESM
+incentively
+incept/DGVS
+inception/MS
+inceptive/Y
+inceptor/M
+incessant/Y
+incest/SM
+incestuousness/MS
+incestuous/PY
+inch/GMDS
+inchoate/DSG
+Inchon/M
+inchworm/MS
+incidence/MS
+incidental/YS
+incident/SM
+incinerate/XNGSD
+incineration/M
+incinerator/SM
+incipience/SM
+incipiency/M
+incipient/Y
+incise/SDVGNX
+incision/M
+incisiveness/MS
+incisive/YP
+incisor/MS
+incitement/MS
+inciter/M
+incite/RZL
+incl
+inclination/ESM
+incline/EGSD
+incliner/M
+inclining/M
+include/GDS
+inclusion/MS
+inclusiveness/MS
+inclusive/PY
+Inc/M
+incognito/S
+incoherency/M
+income/M
+incommode/DG
+incommunicado
+incomparable
+incompetent/MS
+incomplete/P
+inconceivability/MS
+inconceivableness/M
+inconceivable/P
+incondensable
+incongruousness/S
+inconsiderableness/M
+inconsiderable/P
+inconsistence
+inconsolableness/M
+inconsolable/P
+inconsolably
+incontestability/SM
+incontestably
+incontrovertibly
+inconvenience/DG
+inconvertibility
+inconvertible
+incorporable
+incorporated/UE
+incorporate/GASDXN
+incorrect/P
+incorrigibility/MS
+incorrigibleness/M
+incorrigible/SP
+incorrigibly
+incorruptible/S
+incorruptibly
+increase/JB
+increaser/M
+increasing/Y
+incredibleness/M
+incredible/P
+incremental/Y
+incrementation
+increment/DMGS
+incriminate/XNGSD
+incrimination/M
+incriminatory
+incrustation/SM
+inc/T
+incubate/XNGVDS
+incubation/M
+incubator/MS
+incubus/MS
+inculcate/SDGNX
+inculcation/M
+inculpate/SDG
+incumbency/MS
+incumbent/S
+incunabula
+incunabulum
+incurable/S
+incurious
+incursion/SM
+ind
+indebtedness/SM
+indebted/P
+indefatigableness/M
+indefatigable/P
+indefatigably
+indefeasible
+indefeasibly
+indefinableness/M
+indefinable/PS
+indefinite/S
+indelible
+indelibly
+indemnification/M
+indemnify/NXSDG
+indemnity/SM
+indentation/SM
+indented/U
+indenter/M
+indention/SM
+indent/R
+indenture/DG
+Independence/M
+indescribableness/M
+indescribable/PS
+indescribably
+indestructibleness/M
+indestructible/P
+indestructibly
+indeterminably
+indeterminacy/MS
+indeterminism
+indexation/S
+indexer/M
+index/MRDZGB
+India/M
+Indiana/M
+Indianan/S
+Indianapolis/M
+Indianian/S
+Indian/SM
+indicant/MS
+indicate/DSNGVX
+indication/M
+indicative/SY
+indicator/MS
+indices's
+indicter/M
+indictment/SM
+indict/SGLBDR
+indifference
+indigence/MS
+indigenousness/M
+indigenous/YP
+indigent/SY
+indigestible/S
+indignant/Y
+indignation/MS
+indigo/SM
+Indira/M
+indirect/PG
+indiscreet/P
+indiscriminateness/M
+indiscriminate/PY
+indispensability/MS
+indispensableness/M
+indispensable/SP
+indispensably
+indisputableness/M
+indisputable/P
+indissolubleness/M
+indissoluble/P
+indissolubly
+indistinguishableness/M
+indistinguishable/P
+indite/SDG
+indium/SM
+individualism/MS
+individualistic
+individualistically
+individualist/MS
+individuality/MS
+individualization/SM
+individualize/DRSGZ
+individualized/U
+individualizer/M
+individualizes/U
+individualizing/Y
+individual/YMS
+individuate/DSXGN
+individuation/M
+indivisibleness/M
+indivisible/SP
+indivisibly
+Ind/M
+Indochina/M
+Indochinese
+indoctrinate/GNXSD
+indoctrination/M
+indoctrinator/SM
+indolence/SM
+indolent/Y
+indomitableness/M
+indomitable/P
+indomitably
+Indonesia/M
+Indonesian/S
+indoor
+Indore/M
+Indra/M
+indubitableness/M
+indubitable/P
+indubitably
+inducement/MS
+inducer/M
+induce/ZGLSRD
+inducible
+inductance/MS
+inductee/SM
+induct/GV
+induction/SM
+inductiveness/M
+inductive/PY
+inductor/MS
+indulge/GDRS
+indulgence/SDGM
+indulgent/Y
+indulger/M
+Indus/M
+industrialism/MS
+industrialist/MS
+industrialization/MS
+industrialized/U
+industrialize/SDG
+industrial/SY
+industriousness/SM
+industrious/YP
+industry/SM
+Indy/SM
+inebriate/NGSDX
+inebriation/M
+inedible
+ineducable
+ineffability/MS
+ineffableness/M
+ineffable/P
+ineffably
+inelastic
+ineligibly
+ineluctable
+ineluctably
+ineptitude/SM
+ineptness/MS
+inept/YP
+inequivalent
+inerrant
+inertial/Y
+inertia/SM
+inertness/MS
+inert/SPY
+Ines
+inescapably
+Inesita/M
+Inessa/M
+inestimably
+inevitability/MS
+inevitableness/M
+inevitable/P
+inevitably
+inexact/P
+inexhaustibleness/M
+inexhaustible/P
+inexhaustibly
+inexorability/M
+inexorableness/M
+inexorable/P
+inexorably
+inexpedience/M
+inexplicableness/M
+inexplicable/P
+inexplicably
+inexplicit
+inexpressibility/M
+inexpressibleness/M
+inexpressible/PS
+inextricably
+Inez/M
+infamous
+infamy/SM
+infancy/M
+infanticide/MS
+infantile
+infant/MS
+infantryman/M
+infantrymen
+infantry/SM
+infarction/SM
+infarct/SM
+infatuate/XNGSD
+infatuation/M
+infauna
+infected/U
+infecter
+infect/ESGDA
+infection/EASM
+infectiousness/MS
+infectious/PY
+infective
+infer/B
+inference/GMSR
+inferential/Y
+inferiority/MS
+inferior/SMY
+infernal/Y
+inferno/MS
+inferred
+inferring
+infertile
+infestation/MS
+infester/M
+infest/GSDR
+infidel/SM
+infighting/M
+infill/MG
+infiltrate/V
+infiltrator/MS
+infinitesimal/SY
+infinite/V
+infinitival
+infinitive/YMS
+infinitude/MS
+infinitum
+infinity/SM
+infirmary/SM
+infirmity/SM
+infix/M
+inflammableness/M
+inflammable/P
+inflammation/MS
+inflammatory
+inflatable/MS
+inflate/NGBDRSX
+inflater/M
+inflationary
+inflation/ESM
+inflect/GVDS
+inflectional/Y
+inflection/SM
+inflexibleness/M
+inflexible/P
+inflexion/SM
+inflict/DRSGV
+inflicter/M
+infliction/SM
+inflow/M
+influenced/U
+influencer/M
+influence/SRDGM
+influent
+influential/SY
+influenza/MS
+infomercial/S
+Informatica/M
+informatics
+informational
+information/ES
+informativeness/S
+informative/UY
+informatory
+informed/U
+informer/M
+info/SM
+infotainment/S
+infra
+infrared/SM
+infrasonic
+infrastructural
+infrastructure/MS
+infrequence/S
+infringe/LR
+infringement/SM
+infringer/M
+infuriate/GNYSD
+infuriating/Y
+infuriation/M
+infuser/M
+infuse/RZ
+infusibleness/M
+infusible/P
+inf/ZT
+Ingaberg/M
+Ingaborg/M
+Inga/M
+Ingamar/M
+Ingar/M
+Ingeberg/M
+Ingeborg/M
+Ingelbert/M
+Ingemar/M
+ingeniousness/MS
+ingenious/YP
+ingénue/S
+ingenuity/SM
+ingenuous/EY
+ingenuousness/MS
+Inger/M
+Inge/RM
+Ingersoll/M
+ingest/DGVS
+ingestible
+ingestion/SM
+Inglebert/M
+inglenook/MS
+Inglewood/M
+Inglis/M
+Ingmar/M
+ingoing
+ingot/SMDG
+ingrained/Y
+Ingra/M
+Ingram/M
+ingrate/M
+ingratiate/DSGNX
+ingratiating/Y
+ingratiation/M
+ingredient/SM
+Ingres/M
+ingression/M
+ingress/MS
+Ingrid/M
+Ingrim/M
+ingrown/P
+inguinal
+Ingunna/M
+inhabitable/U
+inhabitance
+inhabited/U
+inhabiter/M
+inhabit/R
+inhalant/S
+inhalation/SM
+inhalator/SM
+inhale/Z
+inhere/DG
+inherent/Y
+inheritableness/M
+inheritable/P
+inheritance/EMS
+inherit/BDSG
+inherited/E
+inheriting/E
+inheritor/S
+inheritress/MS
+inheritrix/MS
+inherits/E
+inhibit/DVGS
+inhibited/U
+inhibiter's
+inhibition/MS
+inhibitor/MS
+inhibitory
+inhomogeneous
+inhospitableness/M
+inhospitable/P
+inhospitality
+Inigo/M
+inimical/Y
+inimitableness/M
+inimitable/P
+inimitably
+inion
+iniquitousness/M
+iniquitous/PY
+iniquity/MS
+initialer/M
+initial/GSPRDY
+initialization/A
+initializations
+initialization's
+initialize/ASDG
+initialized/U
+initializer/S
+initiates
+initiate/UD
+initiating
+initiation/SM
+initiative/SM
+initiator/MS
+initiatory
+injectable/U
+inject/GVSDB
+injection/MS
+injector/SM
+injunctive
+injured/U
+injurer/M
+injure/SRDZG
+injuriousness/M
+injurious/YP
+inkblot/SM
+inker/M
+inkiness/MS
+inkling/SM
+inkstand/SM
+inkwell/SM
+inky/TP
+ink/ZDRJ
+inland
+inlander/M
+inlay/RG
+inletting
+inly/G
+inmost
+Inna/M
+innards
+innateness/SM
+innate/YP
+innermost/S
+innersole/S
+innerspring
+innervate/GNSDX
+innervation/M
+inner/Y
+inning/M
+Innis/M
+innkeeper/MS
+innocence/SM
+Innocent/M
+innocent/SYRT
+innocuousness/MS
+innocuous/PY
+innovate/SDVNGX
+innovation/M
+innovative/P
+innovator/MS
+innovatory
+Innsbruck/M
+innuendo/MDGS
+innumerability/M
+innumerableness/M
+innumerable/P
+innumerably
+innumerate
+inn/ZGDRSJ
+inoculate/ASDG
+inoculation/MS
+inoculative
+inoffensive/P
+Inonu/M
+inopportuneness/M
+inopportune/P
+inordinateness/M
+inordinate/PY
+inorganic
+inpatient
+In/PM
+input/MRDG
+inquirer/M
+inquire/ZR
+inquiring/Y
+inquiry/MS
+inquisitional
+inquisition/MS
+Inquisition/MS
+inquisitiveness/MS
+inquisitive/YP
+inquisitorial/Y
+inquisitor/MS
+INRI
+inrush/M
+ins
+INS
+insalubrious
+insanitary
+insatiability/MS
+insatiableness/M
+insatiable/P
+insatiably
+inscribe/Z
+inscription/SM
+inscrutability/SM
+inscrutableness/SM
+inscrutable/P
+inscrutably
+inseam
+insecticidal
+insecticide/MS
+insectivore/SM
+insectivorous
+insecureness/M
+insecure/P
+inseminate/NGXSD
+insemination/M
+insensateness/M
+insensate/P
+insensible/P
+insentient
+inseparable/S
+insert/ADSG
+inserter/M
+insertion/AMS
+insetting
+inshore
+insider/M
+inside/Z
+insidiousness/MS
+insidious/YP
+insightful/Y
+insigne's
+insignia/SM
+insignificant
+insinuate/VNGXSD
+insinuating/Y
+insinuation/M
+insinuator/SM
+insipidity/MS
+insipid/Y
+insistence/SM
+insistent/Y
+insisting/Y
+insist/SGD
+insociable
+insofar
+insole/M
+insolence/SM
+insolent/YS
+insolubleness/M
+insoluble/P
+insolubly
+insomniac/S
+insomnia/MS
+insomuch
+insouciance/SM
+insouciant/Y
+inspect/AGSD
+inspection/SM
+inspective
+inspectorate/MS
+inspector/SM
+inspirational/Y
+inspiration/MS
+inspired/U
+inspire/R
+inspirer/M
+inspiring/U
+inspirit/DG
+Inst
+installable
+install/ADRSG
+installation/SM
+installer/MS
+installment/MS
+instance/GD
+instantaneousness/M
+instantaneous/PY
+instantiated/U
+instantiate/SDXNG
+instantiation/M
+instant/SRYMP
+instate/AGSD
+inst/B
+instead
+instigate/XSDVGN
+instigation/M
+instigator/SM
+instillation/SM
+instinctive/Y
+instinctual
+instinct/VMS
+instituter/M
+institutes/M
+institute/ZXVGNSRD
+institutionalism/M
+institutionalist/M
+institutionalization/SM
+institutionalize/GDS
+institutional/Y
+institution/AM
+institutor's
+instr
+instruct/DSVG
+instructed/U
+instructional
+instruction/MS
+instructiveness/M
+instructive/PY
+instructor/MS
+instrumentalist/MS
+instrumentality/SM
+instrumental/SY
+instrumentation/SM
+instrument/GMDS
+insubordinate
+insubstantial
+insufferable
+insufferably
+insularity/MS
+insular/YS
+insulate/DSXNG
+insulated/U
+insulation/M
+insulator/MS
+insulin/MS
+insult/DRSG
+insulter/M
+insulting/Y
+insuperable
+insuperably
+insupportableness/M
+insupportable/P
+insurance/MS
+insurance's/A
+insure/BZGS
+insured/S
+insurer/M
+insurgence/SM
+insurgency/MS
+insurgent/MS
+insurmountably
+insurrectionist/SM
+insurrection/SM
+intactness/M
+intact/P
+intaglio/GMDS
+intake/M
+intangible/M
+integer/MS
+integrability/M
+integrable
+integral/SYM
+integrand/MS
+integrate/AGNXEDS
+integration/EMA
+integrative/E
+integrator/MS
+integrity/SM
+integument/SM
+intellective/Y
+intellect/MVS
+intellectualism/MS
+intellectuality/M
+intellectualize/GSD
+intellectualness/M
+intellectual/YPS
+intelligence/MSR
+intelligencer/M
+intelligentsia/MS
+intelligent/UY
+intelligibilities
+intelligibility/UM
+intelligibleness/MU
+intelligible/PU
+intelligibly/U
+Intel/M
+Intelsat/M
+intemperate/P
+intendant/MS
+intendedness/M
+intended/SYP
+intender/M
+intensification/M
+intensifier/M
+intensify/GXNZRSD
+intensional/Y
+intensiveness/MS
+intensive/PSY
+intentionality/M
+intentional/UY
+intention/SDM
+intentness/SM
+intent/YP
+interaction/MS
+interactive/PY
+interactivity
+interact/VGDS
+interaxial
+interbank
+interbred
+interbreed/GS
+intercalate/GNVDS
+intercalation/M
+intercase
+intercaste
+interceder/M
+intercede/SRDG
+intercensal
+intercept/DGS
+interception/MS
+interceptor/MS
+intercession/MS
+intercessor/SM
+intercessory
+interchangeability/M
+interchangeableness/M
+interchangeable/P
+interchangeably
+interchange/DSRGJ
+interchanger/M
+intercity
+interclass
+intercohort
+intercollegiate
+intercommunicate/SDXNG
+intercommunication/M
+intercom/SM
+interconnectedness/M
+interconnected/P
+interconnect/GDS
+interconnection/SM
+interconnectivity
+intercontinental
+interconversion/M
+intercorrelated
+intercourse/SM
+Interdata/M
+interdenominational
+interdepartmental/Y
+interdependence/MS
+interdependency/SM
+interdependent/Y
+interdiction/MS
+interdict/MDVGS
+interdisciplinary
+interested/UYE
+interest/GEMDS
+interestingly/U
+interestingness/M
+interesting/YP
+inter/ESTL
+interface/SRDGM
+interfacing/M
+interfaith
+interference/MS
+interferer/M
+interfere/SRDG
+interfering/Y
+interferometer/SM
+interferometric
+interferometry/M
+interferon/MS
+interfile/GSD
+intergalactic
+intergenerational
+intergeneration/M
+interglacial
+intergovernmental
+intergroup
+interim/S
+interindex
+interindustry
+interior/SMY
+interj
+interject/GDS
+interjectional
+interjection/MS
+interlace/GSD
+interlard/SGD
+interlayer/G
+interleave/SDG
+interleukin/S
+interlibrary
+interlinear/S
+interline/JGSD
+interlingual
+interlingua/M
+interlining/M
+interlink/GDS
+interlisp/M
+interlobular
+interlocker/M
+interlock/RDSG
+interlocutor/MS
+interlocutory
+interlope/GZSRD
+interloper/M
+interlude/MSDG
+intermarriage/MS
+intermarry/GDS
+intermediary/MS
+intermediateness/M
+intermediate/YMNGSDP
+intermediation/M
+interment/SME
+intermeshed
+intermetrics
+intermezzi
+intermezzo/SM
+interminably
+intermingle/DSG
+intermission/MS
+intermittent/Y
+intermix/GSRD
+intermodule
+intermolecular/Y
+internalization/SM
+internalize/GDS
+internal/SY
+Internationale/M
+internationalism/SM
+internationalist/SM
+internationality/M
+internationalization/MS
+internationalize/DSG
+international/YS
+internecine
+internee/SM
+interne's
+Internet/M
+INTERNET/M
+internetwork
+internist/SM
+intern/L
+internment/SM
+internship/MS
+internuclear
+interocular
+interoffice
+interoperability
+interpenetrates
+interpersonal/Y
+interplanetary
+interplay/GSMD
+interpol
+interpolate/XGNVBDS
+interpolation/M
+Interpol/M
+interpose/GSRD
+interposer/M
+interposition/MS
+interpretable/U
+interpret/AGSD
+interpretation/MSA
+interpretative/Y
+interpreted/U
+interpreter/SM
+interpretive/Y
+interpretor/S
+interprocess
+interprocessor
+interquartile
+interracial
+interred/E
+interregional
+interregnum/MS
+interrelatedness/M
+interrelated/PY
+interrelate/GNDSX
+interrelation/M
+interrelationship/SM
+interring/E
+interrogate/DSXGNV
+interrogation/M
+interrogative/SY
+interrogator/SM
+interrogatory/S
+interrupted/U
+interrupter/M
+interruptibility
+interruptible
+interruption/MS
+interrupt/VGZRDS
+interscholastic
+intersect/GDS
+intersection/MS
+intersession/MS
+interspecies
+intersperse/GNDSX
+interspersion/M
+interstage
+interstate/S
+interstellar
+interstice/SM
+interstitial/SY
+intersurvey
+intertask
+intertwine/GSD
+interurban/S
+interval/MS
+intervene/GSRD
+intervener/M
+intervenor/M
+interventionism/MS
+interventionist/S
+intervention/MS
+interview/AMD
+interviewed/U
+interviewee/SM
+interviewer/SM
+interviewing
+interviews
+intervocalic
+interweave/GS
+interwove
+interwoven
+intestacy/SM
+intestinal/Y
+intestine/SM
+inti
+intifada
+intimacy/SM
+intimal
+intimateness/M
+intimater/M
+intimate/XYNGPDRS
+intimation/M
+intimidate/SDXNG
+intimidating/Y
+intimidation/M
+into
+intolerableness/M
+intolerable/P
+intolerant/PS
+intonate/NX
+intonation/M
+intoxicant/MS
+intoxicate/DSGNX
+intoxicated/Y
+intoxication/M
+intra
+intracellular
+intracity
+intraclass
+intracohort
+intractability/M
+intractableness/M
+intractable/P
+intradepartmental
+intrafamily
+intragenerational
+intraindustry
+intraline
+intrametropolitan
+intramural/Y
+intramuscular/Y
+intranasal
+intransigence/MS
+intransigent/YS
+intransitive/S
+intraoffice
+intraprocess
+intrapulmonary
+intraregional
+intrasectoral
+intrastate
+intratissue
+intrauterine
+intravenous/YS
+intrepidity/SM
+intrepidness/M
+intrepid/YP
+intricacy/SM
+intricateness/M
+intricate/PY
+intrigue/DRSZG
+intriguer/M
+intriguing/Y
+intrinsically
+intrinsic/S
+introduce/ADSG
+introducer/M
+introduction/ASM
+introductory
+introit/SM
+introject/SD
+intro/S
+introspection/MS
+introspectiveness/M
+introspective/YP
+introspect/SGVD
+introversion/SM
+introvert/SMDG
+intruder/M
+intrude/ZGDSR
+intrusion/SM
+intrusiveness/MS
+intrusive/SYP
+intubate/NGDS
+intubation/M
+intuit/GVDSB
+intuitionist/M
+intuitiveness/MS
+intuitive/YP
+int/ZR
+Inuit/MS
+inundate/SXNG
+inundation/M
+inure/GDS
+invader/M
+invade/ZSRDG
+invalid/GSDM
+invalidism/MS
+invariable/P
+invariant/M
+invasion/SM
+invasive/P
+invectiveness/M
+invective/PSMY
+inveigh/DRG
+inveigher/M
+inveighs
+inveigle/DRSZG
+inveigler/M
+invent/ADGS
+invented/U
+invention/ASM
+inventiveness/MS
+inventive/YP
+inventor/MS
+inventory/SDMG
+Inverness/M
+inverse/YV
+inverter/M
+invertible
+invert/ZSGDR
+invest/ADSLG
+investigate/XDSNGV
+investigation/MA
+investigator/MS
+investigatory
+investiture/SM
+investment/ESA
+investment's/A
+investor/SM
+inveteracy/MS
+inveterate/Y
+inviability
+invidiousness/MS
+invidious/YP
+invigilate/GD
+invigilator/SM
+invigorate/ANGSD
+invigorating/Y
+invigoration/AM
+invigorations
+invincibility/SM
+invincibleness/M
+invincible/P
+invincibly
+inviolability/MS
+inviolably
+inviolateness/M
+inviolate/YP
+inviscid
+invisibleness/M
+invisible/S
+invitational/S
+invitation/MS
+invited/U
+invitee/S
+inviter/M
+invite/SRDG
+inviting/Y
+invocable
+invocate
+invoked/A
+invoke/GSRDBZ
+invoker/M
+invokes/A
+involuntariness/S
+involuntary/P
+involute/XYN
+involution/M
+involutorial
+involvedly
+involved/U
+involve/GDSRL
+involvement/SM
+involver/M
+invulnerability/M
+invulnerableness/M
+inwardness/M
+inward/PY
+ioctl
+iodate/MGND
+iodation/M
+iodide/MS
+iodinate/DNG
+iodine/MS
+iodize/GSD
+Iolande/M
+Iolanthe/M
+Io/M
+Iona/M
+Ionesco/M
+Ionian/M
+ionic/S
+Ionic/S
+ionization's
+ionization/SU
+ionized/UC
+ionize/GNSRDJXZ
+ionizer's
+ionizer/US
+ionizes/U
+ionizing/U
+ionosphere/SM
+ionospheric
+ion's/I
+ion/SMU
+Iorgo/MS
+Iormina/M
+Iosep/M
+iota/SM
+IOU
+Iowan/S
+Iowa/SM
+IPA
+ipecac/MS
+Iphigenia/M
+ipso
+Ipswich/M
+IQ
+Iqbal/M
+Iquitos/M
+Ira/M
+Iranian/MS
+Iran/M
+Iraqi/SM
+Iraq/M
+IRA/S
+irascibility/SM
+irascible
+irascibly
+irateness/S
+irate/RPYT
+ireful
+Ireland/M
+ire/MGDS
+Irena/M
+Irene/M
+irenic/S
+iridescence/SM
+iridescent/Y
+irides/M
+iridium/MS
+irids
+Irina/M
+Iris
+iris/GDSM
+Irishman/M
+Irishmen
+Irish/R
+Irishwoman/M
+Irishwomen
+Irita/M
+irk/GDS
+irksomeness/SM
+irksome/YP
+Irkutsk/M
+Ir/M
+Irma/M
+ironclad/S
+iron/DRMPSGJ
+ironer/M
+ironic
+ironicalness/M
+ironical/YP
+ironing/M
+ironmonger/M
+ironmongery/M
+ironside/MS
+ironstone/MS
+ironware/SM
+ironwood/SM
+ironworker/M
+ironwork/MRS
+irony/SM
+Iroquoian/MS
+Iroquois/M
+irradiate/XSDVNG
+irradiation/M
+irrationality/MS
+irrationalness/M
+irrational/YSP
+Irrawaddy/M
+irreclaimable
+irreconcilability/MS
+irreconcilableness/M
+irreconcilable/PS
+irreconcilably
+irrecoverableness/M
+irrecoverable/P
+irrecoverably
+irredeemable/S
+irredeemably
+irredentism/M
+irredentist/M
+irreducibility/M
+irreducible
+irreducibly
+irreflexive
+irrefutable
+irrefutably
+irregardless
+irregularity/SM
+irregular/YS
+irrelevance/SM
+irrelevancy/MS
+irrelevant/Y
+irreligious
+irremediableness/M
+irremediable/P
+irremediably
+irremovable
+irreparableness/M
+irreparable/P
+irreparably
+irreplaceable/P
+irrepressible
+irrepressibly
+irreproachableness/M
+irreproachable/P
+irreproachably
+irreproducibility
+irreproducible
+irresistibility/M
+irresistibleness/M
+irresistible/P
+irresistibly
+irresoluteness/SM
+irresolute/PNXY
+irresolution/M
+irresolvable
+irrespective/Y
+irresponsibility/SM
+irresponsibleness/M
+irresponsible/PS
+irresponsibly
+irretrievable
+irretrievably
+irreverence/MS
+irreverent/Y
+irreversible
+irreversibly
+irrevocableness/M
+irrevocable/P
+irrevocably
+irrigable
+irrigate/DSXNG
+irrigation/M
+irritability/MS
+irritableness/M
+irritable/P
+irritably
+irritant/S
+irritate/DSXNGV
+irritated/Y
+irritating/Y
+irritation/M
+irrupt/GVSD
+irruption/SM
+IRS
+Irtish/M
+Irvine/M
+Irving/M
+Irvin/M
+Irv/MG
+Irwin/M
+Irwinn/M
+is
+i's
+Isaac/SM
+Isaak/M
+Isabelita/M
+Isabella/M
+Isabelle/M
+Isabel/M
+Isacco/M
+Isac/M
+Isadora/M
+Isadore/M
+Isador/M
+Isahella/M
+Isaiah/M
+Isak/M
+Isa/M
+ISBN
+Iscariot/M
+Iseabal/M
+Isfahan/M
+Isherwood/M
+Ishim/M
+Ishmael/M
+Ishtar/M
+Isiahi/M
+Isiah/M
+Isidora/M
+Isidore/M
+Isidor/M
+Isidoro/M
+Isidro/M
+isinglass/MS
+Isis/M
+Islamabad/M
+Islamic/S
+Islam/SM
+islander/M
+island/GZMRDS
+Islandia/M
+isle/MS
+islet/SM
+isl/GD
+Ismael/M
+ism/MCS
+isn't
+ISO
+isobaric
+isobar/MS
+Isobel/M
+isochronal/Y
+isochronous/Y
+isocline/M
+isocyanate/M
+isodine
+isolate/SDXNG
+isolationism/SM
+isolationistic
+isolationist/SM
+isolation/M
+isolator/MS
+Isolde/M
+isomeric
+isomerism/SM
+isomer/SM
+isometrically
+isometric/S
+isometrics/M
+isomorphic
+isomorphically
+isomorphism/MS
+isomorph/M
+isoperimetrical
+isopleth/M
+isopleths
+isosceles
+isostatic
+isothermal/Y
+isotherm/MS
+isotonic
+isotope/SM
+isotopic
+isotropic
+isotropically
+isotropy/M
+Ispahan's
+ispell/M
+Ispell/M
+Israeli/MS
+Israelite/SM
+Israel/MS
+Issac/M
+Issiah/M
+Issie/M
+Issi/M
+issuable
+issuance/MS
+issuant
+issued/A
+issue/GMZDSR
+issuer/AMS
+issues/A
+issuing/A
+Issy/M
+Istanbul/M
+isthmian/S
+isthmus/SM
+Istvan/M
+Isuzu/M
+It
+IT
+Itaipu/M
+ital
+Italianate/GSD
+Italian/MS
+italicization/MS
+italicized/U
+italicize/GSD
+italic/S
+Ital/M
+Italy/M
+Itasca/M
+itch/GMDS
+itchiness/MS
+Itch/M
+itchy/RTP
+ITcorp/M
+ITCorp/M
+it'd
+Itel/M
+itemization/SM
+itemized/U
+itemize/GZDRS
+itemizer/M
+itemizes/A
+item/MDSG
+iterate/ASDXVGN
+iteration/M
+iterative/YA
+iterator/MS
+Ithaca/M
+Ithacan
+itinerant/SY
+itinerary/MS
+it'll
+it/MUS
+Ito/M
+its
+itself
+ITT
+IUD/S
+IV
+Iva/M
+Ivanhoe/M
+Ivan/M
+Ivar/M
+I've
+Ive/MRS
+Iver/M
+Ivette/M
+Ivett/M
+Ivie/M
+iv/M
+Ivonne/M
+Ivor/M
+Ivory/M
+ivory/SM
+IVs
+Ivy/M
+ivy/MDS
+ix
+Izaak/M
+Izabel/M
+Izak/M
+Izanagi/M
+Izanami/M
+Izhevsk/M
+Izmir/M
+Izvestia/M
+Izzy/M
+jabbed
+jabberer/M
+jabber/JRDSZG
+jabbing
+Jabez/M
+Jablonsky/M
+jabot/MS
+jab/SM
+jacaranda/MS
+Jacenta/M
+Jacinda/M
+Jacinta/M
+Jacintha/M
+Jacinthe/M
+jackal/SM
+jackass/SM
+jackboot/DMS
+jackdaw/SM
+Jackelyn/M
+jacketed/U
+jacket/GSMD
+jack/GDRMS
+jackhammer/MDGS
+Jackie/M
+Jacki/M
+jackknife/MGSD
+jackknives
+Jacklin/M
+Jacklyn/M
+Jack/M
+Jackman/M
+jackpot/MS
+Jackqueline/M
+Jackquelin/M
+jackrabbit/DGS
+Jacksonian
+Jackson/SM
+Jacksonville/M
+jackstraw/MS
+Jacky/M
+Jaclin/M
+Jaclyn/M
+Jacobean
+Jacobian/M
+Jacobi/M
+Jacobin/M
+Jacobite/M
+Jacobo/M
+Jacobsen/M
+Jacob/SM
+Jacobs/N
+Jacobson/M
+Jacobus
+Jacoby/M
+jacquard/MS
+Jacquard/SM
+Jacqueline/M
+Jacquelin/M
+Jacquelyn/M
+Jacquelynn/M
+Jacquenetta/M
+Jacquenette/M
+Jacques/M
+Jacquetta/M
+Jacquette/M
+Jacquie/M
+Jacqui/M
+jacuzzi
+Jacuzzi/S
+Jacynth/M
+Jada/M
+jadedness/SM
+jaded/PY
+jadeite/SM
+Jade/M
+jade/MGDS
+Jaeger/M
+Jae/M
+jaggedness/SM
+jagged/RYTP
+Jagger/M
+jaggers
+jagging
+jag/S
+jaguar/MS
+jailbird/MS
+jailbreak/SM
+jailer/M
+jail/GZSMDR
+Jaime/M
+Jaimie/M
+Jaine/M
+Jainism/M
+Jain/M
+Jaipur/M
+Jakarta/M
+Jake/MS
+Jakie/M
+Jakob/M
+jalapeño/S
+jalopy/SM
+jalousie/MS
+Jamaal/M
+Jamaica/M
+Jamaican/S
+Jamal/M
+Jamar/M
+jambalaya/MS
+jamb/DMGS
+jamboree/MS
+Jamel/M
+Jame/MS
+Jameson/M
+Jamestown/M
+Jamesy/M
+Jamey/M
+Jamie/M
+Jamill/M
+Jamil/M
+Jami/M
+Jamima/M
+Jamison/M
+Jammal/M
+jammed/U
+Jammie/M
+jamming/U
+jam/SM
+Janacek/M
+Jana/M
+Janaya/M
+Janaye/M
+Jandy/M
+Janean/M
+Janeczka/M
+Janeen/M
+Janeiro/M
+Janek/M
+Janela/M
+Janella/M
+Janelle/M
+Janell/M
+Janel/M
+Jane/M
+Janene/M
+Janenna/M
+Janessa/M
+Janesville/M
+Janeta/M
+Janet/M
+Janetta/M
+Janette/M
+Janeva/M
+Janey/M
+jangler/M
+jangle/RSDGZ
+jangly
+Jania/M
+Janice/M
+Janie/M
+Janifer/M
+Janina/M
+Janine/M
+Janis/M
+janissary/MS
+Janith/M
+janitorial
+janitor/SM
+Janka/M
+Jan/M
+Janna/M
+Jannelle/M
+Jannel/M
+Jannie/M
+Janos/M
+Janot/M
+Jansenist/M
+Jansen/M
+January/MS
+Janus/M
+Jany/M
+Japanese/SM
+Japan/M
+japanned
+japanner
+japanning
+japan/SM
+jape/DSMG
+Japura/M
+Jaquelin/M
+Jaquelyn/M
+Jaquenetta/M
+Jaquenette/M
+Jaquith/M
+Jarad/M
+jardinière/MS
+Jard/M
+Jareb/M
+Jared/M
+jarful/S
+jargon/SGDM
+Jarib/M
+Jarid/M
+Jarlsberg
+jar/MS
+Jarrad/M
+jarred
+Jarred/M
+Jarret/M
+Jarrett/M
+Jarrid/M
+jarring/SY
+Jarrod/M
+Jarvis/M
+Jase/M
+Jasen/M
+Jasmina/M
+Jasmine/M
+jasmine/MS
+Jasmin/M
+Jason/M
+Jasper/M
+jasper/MS
+Jastrow/M
+Jasun/M
+jato/SM
+jaundice/DSMG
+jaundiced/U
+jauntily
+jauntiness/MS
+jaunt/MDGS
+jaunty/SRTP
+Javanese
+Java/SM
+javelin/SDMG
+Javier/M
+jawbone/SDMG
+jawbreaker/SM
+jawline
+jaw/SMDG
+Jaxartes/M
+Jayapura/M
+jaybird/SM
+Jaycee/SM
+Jaye/M
+Jay/M
+Jaymee/M
+Jayme/M
+Jaymie/M
+Jaynell/M
+Jayne/M
+jay/SM
+Jayson/M
+jaywalker/M
+jaywalk/JSRDZG
+Jazmin/M
+jazziness/M
+jazzmen
+jazz/MGDS
+jazzy/PTR
+JCS
+jct
+JD
+Jdavie/M
+jealousness/M
+jealous/PY
+jealousy/MS
+Jeana/M
+Jeanelle/M
+Jeane/M
+Jeanette/M
+Jeanie/M
+Jeanine/M
+Jean/M
+jean/MS
+Jeanna/M
+Jeanne/M
+Jeannette/M
+Jeannie/M
+Jeannine/M
+Jecho/M
+Jedd/M
+Jeddy/M
+Jedediah/M
+Jedidiah/M
+Jedi/M
+Jed/M
+jeep/GZSMD
+Jeep/S
+jeerer/M
+jeering/Y
+jeer/SJDRMG
+Jeeves/M
+jeez
+Jefferey/M
+Jeffersonian/S
+Jefferson/M
+Jeffery/M
+Jeffie/M
+Jeff/M
+Jeffrey/SM
+Jeffry/M
+Jeffy/M
+jehad's
+Jehanna/M
+Jehoshaphat/M
+Jehovah/M
+Jehu/M
+jejuna
+jejuneness/M
+jejune/PY
+jejunum/M
+Jekyll/M
+Jelene/M
+jell/GSD
+Jello/M
+jello's
+jellybean/SM
+jellyfish/MS
+jellying/M
+jellylike
+jellyroll/S
+jelly/SDMG
+Jemie/M
+Jemimah/M
+Jemima/M
+Jemmie/M
+jemmy/M
+Jemmy/M
+Jena/M
+Jenda/M
+Jenelle/M
+Jenica/M
+Jeniece/M
+Jenifer/M
+Jeniffer/M
+Jenilee/M
+Jeni/M
+Jenine/M
+Jenkins/M
+Jen/M
+Jenna/M
+Jennee/M
+Jenner/M
+jennet/SM
+Jennette/M
+Jennica/M
+Jennie/M
+Jennifer/M
+Jennilee/M
+Jenni/M
+Jennine/M
+Jennings/M
+Jenn/RMJ
+Jenny/M
+jenny/SM
+Jeno/M
+Jensen/M
+Jens/N
+jeopard
+jeopardize/GSD
+jeopardy/MS
+Jephthah/M
+Jerad/M
+Jerald/M
+Jeralee/M
+Jeramey/M
+Jeramie/M
+Jere/M
+Jereme/M
+jeremiad/SM
+Jeremiah/M
+Jeremiahs
+Jeremias/M
+Jeremie/M
+Jeremy/M
+Jericho/M
+Jeri/M
+jerker/M
+jerk/GSDRJ
+jerkily
+jerkiness/SM
+jerkin/SM
+jerkwater/S
+jerky/RSTP
+Jermaine/M
+Jermain/M
+Jermayne/M
+Jeroboam/M
+Jerold/M
+Jerome/M
+Jeromy/M
+Jerrie/M
+Jerrilee/M
+Jerrilyn/M
+Jerri/M
+Jerrine/M
+Jerrod/M
+Jerrold/M
+Jerrome/M
+jerrybuilt
+Jerrylee/M
+jerry/M
+Jerry/M
+jersey/MS
+Jersey/MS
+Jerusalem/M
+Jervis/M
+Jes
+Jessalin/M
+Jessalyn/M
+Jessa/M
+Jessamine/M
+jessamine's
+Jessamyn/M
+Jessee/M
+Jesselyn/M
+Jesse/M
+Jessey/M
+Jessica/M
+Jessie/M
+Jessika/M
+Jessi/M
+jess/M
+Jess/M
+Jessy/M
+jest/DRSGZM
+jester/M
+jesting/Y
+Jesuit/SM
+Jesus
+Jeth/M
+Jethro/M
+jetliner/MS
+jet/MS
+jetport/SM
+jetsam/MS
+jetted/M
+jetting/M
+jettison/DSG
+jetty/RSDGMT
+jeweler/M
+jewelery/S
+jewel/GZMRDS
+Jewelled/M
+Jewelle/M
+jewellery's
+Jewell/MD
+Jewel/M
+jewelry/MS
+Jewess/SM
+Jewishness/MS
+Jewish/P
+Jew/MS
+Jewry/MS
+Jezebel/MS
+j/F
+JFK/M
+jg/M
+jibbed
+jibbing
+jibe/S
+jib/MDSG
+Jidda/M
+jiff/S
+jiffy/SM
+jigged
+jigger/SDMG
+jigging/M
+jiggle/SDG
+jiggly/TR
+jig/MS
+jigsaw/GSDM
+jihad/SM
+Jilin
+Jillana/M
+Jillane/M
+Jillayne/M
+Jilleen/M
+Jillene/M
+Jillian/M
+Jillie/M
+Jilli/M
+Jill/M
+Jilly/M
+jilt/DRGS
+jilter/M
+Jimenez/M
+Jim/M
+Jimmie/M
+jimmy/GSDM
+Jimmy/M
+jimsonweed/S
+Jinan
+jingler/M
+jingle/RSDG
+jingly/TR
+jingoism/SM
+jingoistic
+jingoist/SM
+jingo/M
+Jinnah/M
+jinni's
+jinn/MS
+Jinny/M
+jinrikisha/SM
+jinx/GMDS
+jitney/MS
+jitterbugged
+jitterbugger
+jitterbugging
+jitterbug/SM
+jitter/S
+jittery/TR
+jiujitsu's
+Jivaro/M
+jive/MGDS
+Joachim/M
+Joana/M
+Joane/M
+Joanie/M
+Joan/M
+Joanna/M
+Joanne/SM
+Joann/M
+Joaquin/M
+jobbed
+jobber/MS
+jobbery/M
+jobbing/M
+Jobey/M
+jobholder/SM
+Jobie/M
+Jobi/M
+Jobina/M
+joblessness/MS
+jobless/P
+Jobrel/M
+job/SM
+Job/SM
+Jobye/M
+Joby/M
+Jobyna/M
+Jocasta/M
+Joceline/M
+Jocelin/M
+Jocelyne/M
+Jocelyn/M
+jockey/SGMD
+jock/GDMS
+Jock/M
+Jocko/M
+jockstrap/MS
+jocoseness/MS
+jocose/YP
+jocosity/SM
+jocularity/SM
+jocular/Y
+jocundity/SM
+jocund/Y
+Jodee/M
+jodhpurs
+Jodie/M
+Jodi/M
+Jody/M
+Joeann/M
+Joela/M
+Joelie/M
+Joella/M
+Joelle/M
+Joellen/M
+Joell/MN
+Joelly/M
+Joellyn/M
+Joel/MY
+Joelynn/M
+Joe/M
+Joesph/M
+Joete/M
+joey/M
+Joey/M
+jogged
+jogger/SM
+jogging/S
+joggler/M
+joggle/SRDG
+Jogjakarta/M
+jog/S
+Johan/M
+Johannah/M
+Johanna/M
+Johannes
+Johannesburg/M
+Johann/M
+Johansen/M
+Johanson/M
+Johna/MH
+Johnathan/M
+Johnath/M
+Johnathon/M
+Johnette/M
+Johnie/M
+Johnna/M
+Johnnie/M
+johnnycake/SM
+Johnny/M
+johnny/SM
+Johnsen/M
+john/SM
+John/SM
+Johns/N
+Johnson/M
+Johnston/M
+Johnstown/M
+Johny/M
+Joice/M
+join/ADGFS
+joined/U
+joiner/FSM
+joinery/MS
+jointed/EYP
+jointedness/ME
+joint/EGDYPS
+jointer/M
+jointly/F
+joint's
+jointures
+joist/GMDS
+Jojo/M
+joke/MZDSRG
+joker/M
+jokey
+jokier
+jokiest
+jokily
+joking/Y
+Jolee/M
+Joleen/M
+Jolene/M
+Joletta/M
+Jolie/M
+Joliet's
+Joli/M
+Joline/M
+Jolla/M
+jollification/MS
+jollily
+jolliness/SM
+jollity/MS
+jolly/TSRDGP
+Jolson/M
+jolt/DRGZS
+jolter/M
+Joly/M
+Jolyn/M
+Jolynn/M
+Jo/MY
+Jonah/M
+Jonahs
+Jonas
+Jonathan/M
+Jonathon/M
+Jonell/M
+Jone/MS
+Jones/S
+Jonie/M
+Joni/MS
+Jon/M
+jonquil/MS
+Jonson/M
+Joplin/M
+Jordain/M
+Jordana/M
+Jordanian/S
+Jordan/M
+Jordanna/M
+Jordon/M
+Jorey/M
+Jorgan/M
+Jorge/M
+Jorgensen/M
+Jorgenson/M
+Jorie/M
+Jori/M
+Jorrie/M
+Jorry/M
+Jory/M
+Joscelin/M
+Josee/M
+Josefa/M
+Josefina/M
+Josef/M
+Joseito/M
+Jose/M
+Josepha/M
+Josephina/M
+Josephine/M
+Joseph/M
+Josephs
+Josephson/M
+Josephus/M
+Josey/M
+josh/DSRGZ
+josher/M
+Joshia/M
+Josh/M
+Joshuah/M
+Joshua/M
+Josiah/M
+Josias/M
+Josie/M
+Josi/M
+Josselyn/M
+joss/M
+jostle/SDG
+Josue/M
+Josy/M
+jot/S
+jotted
+jotter/SM
+jotting/SM
+Joule/M
+joule/SM
+jounce/SDG
+jouncy/RT
+Jourdain/M
+Jourdan/M
+journalese/MS
+journal/GSDM
+journalism/SM
+journalistic
+journalist/SM
+journalize/DRSGZ
+journalized/U
+journalizer/M
+journey/DRMZSGJ
+journeyer/M
+journeyman/M
+journeymen
+jouster/M
+joust/ZSMRDG
+Jovanovich/M
+Jove/M
+joviality/SM
+jovial/Y
+Jovian
+jowl/SMD
+jowly/TR
+Joya/M
+Joyan/M
+Joyann/M
+Joycean
+Joycelin/M
+Joyce/M
+Joye/M
+joyfuller
+joyfullest
+joyfulness/SM
+joyful/PY
+joylessness/MS
+joyless/PY
+Joy/M
+joy/MDSG
+Joyner/M
+joyousness/MS
+joyous/YP
+joyridden
+joyride/SRZMGJ
+joyrode
+joystick/S
+Jozef/M
+JP
+Jpn
+Jr/M
+j's
+J's
+Jsandye/M
+Juana/M
+Juanita/M
+Juan/M
+Juarez
+Jubal/M
+jubilant/Y
+jubilate/XNGDS
+jubilation/M
+jubilee/SM
+Judah/M
+Judaic
+Judaical
+Judaism/SM
+Judas/S
+juddered
+juddering
+Judd/M
+Judea/M
+Jude/M
+judge/AGDS
+judger/M
+judge's
+judgeship/SM
+judgmental/Y
+judgment/MS
+judicable
+judicatory/S
+judicature/MS
+judicial/Y
+judiciary/S
+judicious/IYP
+judiciousness/SMI
+Judie/M
+Judi/MH
+Juditha/M
+Judith/M
+Jud/M
+judo/MS
+Judon/M
+Judson/M
+Judye/M
+Judy/M
+jugate/F
+jugful/SM
+jugged
+Juggernaut/M
+juggernaut/SM
+jugging
+juggler/M
+juggle/RSDGZ
+jugglery/MS
+jug/MS
+jugular/S
+juice/GMZDSR
+juicer/M
+juicily
+juiciness/MS
+juicy/TRP
+Juieta/M
+jujitsu/MS
+jujube/SM
+juju/M
+jujutsu's
+jukebox/SM
+juke/GS
+Julee/M
+Jule/MS
+julep/SM
+Julia/M
+Juliana/M
+Juliane/M
+Julian/M
+Julianna/M
+Julianne/M
+Juliann/M
+Julie/M
+julienne/GSD
+Julienne/M
+Julieta/M
+Juliet/M
+Julietta/M
+Juliette/M
+Juli/M
+Julina/M
+Juline/M
+Julio/M
+Julissa/M
+Julita/M
+Julius/M
+Jul/M
+Julys
+July/SM
+jumble/GSD
+jumbo/MS
+jumper/M
+jump/GZDRS
+jumpily
+jumpiness/MS
+jumpsuit/S
+jumpy/PTR
+jun
+junco/MS
+junction/IMESF
+juncture/SFM
+Juneau/M
+June/MS
+Junette/M
+Jungfrau/M
+Jungian
+jungle/SDM
+Jung/M
+Junia/M
+Junie/M
+Junina/M
+juniority/M
+junior/MS
+Junior/S
+juniper/SM
+junkerdom
+Junker/SM
+junketeer/SGDM
+junket/SMDG
+junk/GZDRMS
+junkie/RSMT
+junkyard/MS
+Jun/M
+Juno/M
+junta/MS
+Jupiter/M
+Jurassic
+juridic
+juridical/Y
+juried
+jurisdictional/Y
+jurisdiction/SM
+jurisprudence/SM
+jurisprudent
+jurisprudential/Y
+juristic
+jurist/MS
+juror/MS
+Jurua/M
+jury/IMS
+jurying
+juryman/M
+jurymen
+jurywoman/M
+jurywomen
+justed
+Justen/M
+juster/M
+justest
+Justice/M
+justice/MIS
+justiciable
+justifiability/M
+justifiable/U
+justifiably/U
+justification/M
+justified/UA
+justifier/M
+justify/GDRSXZN
+Justina/M
+Justine/M
+justing
+Justinian/M
+Justin/M
+Justinn/M
+Justino/M
+Justis/M
+justness/MS
+justness's/U
+justs
+just/UPY
+Justus/M
+jute/SM
+Jutish
+Jutland/M
+jut/S
+jutted
+jutting
+Juvenal/M
+juvenile/SM
+juxtapose/SDG
+juxtaposition/SM
+JV
+J/X
+Jyoti/M
+Kaaba/M
+kabob/SM
+kaboom
+Kabuki
+kabuki/SM
+Kabul/M
+Kacey/M
+Kacie/M
+Kacy/M
+Kaddish/M
+kaddish/S
+Kaela/M
+kaffeeklatch
+kaffeeklatsch/S
+Kafkaesque
+Kafka/M
+kaftan's
+Kagoshima/M
+Kahaleel/M
+Kahlil/M
+Kahlua/M
+Kahn/M
+Kaia/M
+Kaifeng/M
+Kaila/M
+Kaile/M
+Kailey/M
+Kai/M
+Kaine/M
+Kain/M
+kaiser/MS
+Kaiser/SM
+Kaitlin/M
+Kaitlyn/M
+Kaitlynn/M
+Kaja/M
+Kajar/M
+Kakalina/M
+Kalahari/M
+Kala/M
+Kalamazoo/M
+Kalashnikov/M
+Kalb/M
+Kaleb/M
+Kaleena/M
+kaleidescope
+kaleidoscope/SM
+kaleidoscopic
+kaleidoscopically
+Kale/M
+kale/MS
+Kalgoorlie/M
+Kalie/M
+Kalila/M
+Kalil/M
+Kali/M
+Kalina/M
+Kalinda/M
+Kalindi/M
+Kalle/M
+Kalli/M
+Kally/M
+Kalmyk
+Kalvin/M
+Kama/M
+Kamchatka/M
+Kamehameha/M
+Kameko/M
+Kamikaze/MS
+kamikaze/SM
+Kamilah/M
+Kamila/M
+Kamillah/M
+Kampala/M
+Kampuchea/M
+Kanchenjunga/M
+Kandace/M
+Kandahar/M
+Kandinsky/M
+Kandy/M
+Kane/M
+kangaroo/SGMD
+Kania/M
+Kankakee/M
+Kan/MS
+Kannada/M
+Kano/M
+Kanpur/M
+Kansan/S
+Kansas
+Kantian
+Kant/M
+Kanya/M
+Kaohsiung/M
+kaolinite/M
+kaolin/MS
+Kaplan/M
+kapok/SM
+Kaposi/M
+kappa/MS
+kaput/M
+Karachi/M
+Karaganda/M
+Karakorum/M
+karakul/MS
+Karalee/M
+Karalynn/M
+Kara/M
+Karamazov/M
+karaoke/S
+karate/MS
+karat/SM
+Karee/M
+Kareem/M
+Karel/M
+Kare/M
+Karena/M
+Karenina/M
+Karen/M
+Karia/M
+Karie/M
+Karil/M
+Karilynn/M
+Kari/M
+Karim/M
+Karina/M
+Karine/M
+Karin/M
+Kariotta/M
+Karisa/M
+Karissa/M
+Karita/M
+Karla/M
+Karlan/M
+Karlee/M
+Karleen/M
+Karlene/M
+Karlen/M
+Karlie/M
+Karlik/M
+Karlis
+Karl/MNX
+Karloff/M
+Karlotta/M
+Karlotte/M
+Karly/M
+Karlyn/M
+karma/SM
+Karmen/M
+karmic
+Karna/M
+Karney/M
+Karola/M
+Karole/M
+Karolina/M
+Karoline/M
+Karol/M
+Karoly/M
+Karon/M
+Karo/YM
+Karp/M
+Karrah/M
+Karrie/M
+Karroo/M
+Karry/M
+kart/MS
+Karylin/M
+Karyl/M
+Kary/M
+Karyn/M
+Kasai/M
+Kasey/M
+Kashmir/SM
+Kaspar/M
+Kasparov/M
+Kasper/M
+Kass
+Kassandra/M
+Kassey/M
+Kassia/M
+Kassie/M
+Kassi/M
+katakana
+Katalin/M
+Kata/M
+Katee/M
+Katelyn/M
+Kate/M
+Katerina/M
+Katerine/M
+Katey/M
+Katha/M
+Katharina/M
+Katharine/M
+Katharyn/M
+Kathe/M
+Katherina/M
+Katherine/M
+Katheryn/M
+Kathiawar/M
+Kathie/M
+Kathi/M
+Kathleen/M
+Kathlin/M
+Kath/M
+Kathmandu
+Kathrine/M
+Kathryne/M
+Kathryn/M
+Kathye/M
+Kathy/M
+Katie/M
+Kati/M
+Katina/M
+Katine/M
+Katinka/M
+Katleen/M
+Katlin/M
+Kat/M
+Katmai/M
+Katmandu's
+Katowice/M
+Katrina/M
+Katrine/M
+Katrinka/M
+Kattie/M
+Katti/M
+Katuscha/M
+Katusha/M
+Katya/M
+katydid/SM
+Katy/M
+Katz/M
+Kauai/M
+Kauffman/M
+Kaufman/M
+Kaunas/M
+Kaunda/M
+Kawabata/M
+Kawasaki/M
+kayak/SGDM
+Kaycee/M
+Kaye/M
+Kayla/M
+Kaylee/M
+Kayle/M
+Kayley/M
+Kaylil/M
+Kaylyn/M
+Kay/M
+Kayne/M
+kayo/DMSG
+Kazakh/M
+Kazakhstan
+Kazan/M
+Kazantzakis/M
+kazoo/SM
+Kb
+KB
+KC
+kcal/M
+kc/M
+KDE/M
+Keane/M
+Kean/M
+Kearney/M
+Keary/M
+Keaton/M
+Keats/M
+kebab/SM
+Keck/M
+Keefe/MR
+Keefer/M
+Keegan/M
+Keelby/M
+Keeley/M
+keel/GSMDR
+keelhaul/SGD
+Keelia/M
+Keely/M
+Keenan/M
+Keene/M
+keener/M
+keen/GTSPYDR
+keening/M
+Keen/M
+keenness/MS
+keeper/M
+keep/GZJSR
+keeping/M
+keepsake/SM
+Keewatin/M
+kegged
+kegging
+keg/MS
+Keillor/M
+Keir/M
+Keisha/M
+Keith/M
+Kelbee/M
+Kelby/M
+Kelcey/M
+Kelcie/M
+Kelci/M
+Kelcy/M
+Kele/M
+Kelila/M
+Kellby/M
+Kellen/M
+Keller/M
+Kelley/M
+Kellia/M
+Kellie/M
+Kelli/M
+Kellina/M
+Kellogg/M
+Kellsie/M
+Kellyann/M
+Kelly/M
+kelp/GZMDS
+Kelsey/M
+Kelsi/M
+Kelsy/M
+Kelt's
+Kelvin/M
+kelvin/MS
+Kelwin/M
+Kemerovo/M
+Kempis/M
+Kemp/M
+Kendall/M
+Kendal/M
+Kendell/M
+Kendra/M
+Kendre/M
+Kendrick/MS
+Kenilworth/M
+Ken/M
+Kenmore/M
+ken/MS
+Kenna/M
+Kennan/M
+Kennecott/M
+kenned
+Kennedy/M
+kennel/GSMD
+Kenneth/M
+Kennett/M
+Kennie/M
+kenning
+Kennith/M
+Kenn/M
+Kenny/M
+keno/M
+Kenon/M
+Kenosha/M
+Kensington/M
+Kent/M
+Kenton/M
+Kentuckian/S
+Kentucky/M
+Kenya/M
+Kenyan/S
+Kenyatta/M
+Kenyon/M
+Keogh/M
+Keokuk/M
+kepi/SM
+Kepler/M
+kept
+keratin/MS
+kerbside
+Kerby/M
+kerchief/MDSG
+Kerensky/M
+Kerianne/M
+Keriann/M
+Keri/M
+Kerk/M
+Ker/M
+Kermie/M
+Kermit/M
+Kermy/M
+kerned
+kernel/GSMD
+kerning
+Kern/M
+kerosene/MS
+Kerouac/M
+Kerrie/M
+Kerrill/M
+Kerri/M
+Kerrin/M
+Kerr/M
+Kerry/M
+Kerstin/M
+Kerwin/M
+Kerwinn/M
+Kesley/M
+Keslie/M
+Kessiah/M
+Kessia/M
+Kessler/M
+kestrel/SM
+ketch/MS
+ketchup/SM
+ketone/M
+ketosis/M
+Kettering/M
+Kettie/M
+Ketti/M
+kettledrum/SM
+kettleful
+kettle/SM
+Ketty/M
+Kevan/M
+Keven/M
+Kevina/M
+Kevin/M
+Kevlar
+Kev/MN
+Kevon/M
+Kevorkian/M
+Kevyn/M
+Kewaskum/M
+Kewaunee/M
+Kewpie/M
+keyboardist/S
+keyboard/RDMZGS
+keyclick/SM
+keyhole/MS
+Key/M
+Keynesian/M
+Keynes/M
+keynoter/M
+keynote/SRDZMG
+keypad/MS
+keypuncher/M
+keypunch/ZGRSD
+keyring
+key/SGMD
+keystone/SM
+keystroke/SDMG
+keyword/SM
+k/FGEIS
+kg
+K/G
+KGB
+Khabarovsk/M
+Khachaturian/M
+khaki/SM
+Khalid/M
+Khalil/M
+Khan/M
+khan/MS
+Kharkov/M
+Khartoum/M
+Khayyam/M
+Khmer/M
+Khoisan/M
+Khomeini/M
+Khorana/M
+Khrushchev/SM
+Khufu/M
+Khulna/M
+Khwarizmi/M
+Khyber/M
+kHz/M
+KIA
+Kiah/M
+Kial/M
+kibble/GMSD
+kibbutzim
+kibbutz/M
+kibitzer/M
+kibitz/GRSDZ
+kibosh/GMSD
+Kickapoo/M
+kickback/SM
+kickball/MS
+kicker/M
+kick/GZDRS
+kickoff/SM
+kickstand/MS
+kicky/RT
+kidded
+kidder/SM
+kiddie/SD
+kidding/YM
+kiddish
+Kidd/M
+kiddo/SM
+kiddying
+kiddy's
+kidless
+kid/MS
+kidnaper's
+kidnaping's
+kidnap/MSJ
+kidnapped
+kidnapper/SM
+kidnapping/S
+kidney/MS
+kidskin/SM
+Kieffer/M
+kielbasa/SM
+kielbasi
+Kiele/M
+Kiel/M
+Kienan/M
+kier/I
+Kierkegaard/M
+Kiersten/M
+Kieth/M
+Kiev/M
+Kigali/M
+Kikelia/M
+Kikuyu/M
+Kilauea/M
+Kile/M
+Kiley/M
+Kilian/M
+Kilimanjaro/M
+kill/BJGZSDR
+killdeer/SM
+Killebrew/M
+killer/M
+Killian/M
+Killie/M
+killing/Y
+killjoy/S
+Killy/M
+kiln/GDSM
+kilobaud/M
+kilobit/S
+kilobuck
+kilobyte/S
+kilocycle/MS
+kilogauss/M
+kilogram/MS
+kilohertz/M
+kilohm/M
+kilojoule/MS
+kiloliter/MS
+kilometer/SM
+kilo/SM
+kiloton/SM
+kilovolt/SM
+kilowatt/SM
+kiloword
+kilter/M
+kilt/MDRGZS
+Ki/M
+Kimball/M
+Kimbell/M
+Kimberlee/M
+Kimberley/M
+Kimberli/M
+Kimberly/M
+Kimberlyn/M
+Kimble/M
+Kimbra/M
+Kim/M
+Kimmie/M
+Kimmi/M
+Kimmy/M
+kimono/MS
+Kincaid/M
+kinda
+kindergarten/MS
+kindergärtner/SM
+kinder/U
+kindheartedness/MS
+kindhearted/YP
+kindle/AGRSD
+kindler/M
+kindliness/SM
+kindliness's/U
+kindling/M
+kindly/TUPR
+kindness's
+kindness/US
+kind/PSYRT
+kindred/S
+kinematic/S
+kinematics/M
+kinesics/M
+kine/SM
+kinesthesis
+kinesthetically
+kinesthetic/S
+kinetically
+kinetic/S
+kinetics/M
+kinfolk/S
+kingbird/M
+kingdom/SM
+kingfisher/MS
+kinglet/M
+kingliness/M
+kingly/TPR
+King/M
+kingpin/MS
+Kingsbury/M
+king/SGYDM
+kingship/SM
+Kingsley/M
+Kingsly/M
+Kingston/M
+Kingstown/M
+Kingwood/M
+kink/GSDM
+kinkily
+kinkiness/SM
+kinky/PRT
+Kin/M
+kin/MS
+Kinna/M
+Kinney/M
+Kinnickinnic/M
+Kinnie/M
+Kinny/M
+Kinsey/M
+kinsfolk/S
+Kinshasa/M
+Kinshasha/M
+kinship/SM
+Kinsley/M
+kinsman/M
+kinsmen/M
+kinswoman/M
+kinswomen
+kiosk/SM
+Kiowa/SM
+Kipling/M
+Kip/M
+kip/MS
+Kippar/M
+kipped
+kipper/DMSG
+Kipper/M
+Kippie/M
+kipping
+Kipp/MR
+Kippy/M
+Kira/M
+Kirbee/M
+Kirbie/M
+Kirby/M
+Kirchhoff/M
+Kirchner/M
+Kirchoff/M
+Kirghistan/M
+Kirghizia/M
+Kirghiz/M
+Kiribati
+Kiri/M
+Kirinyaga/M
+kirk/GDMS
+Kirkland/M
+Kirk/M
+Kirkpatrick/M
+Kirkwood/M
+Kirov/M
+kirsch/S
+Kirsteni/M
+Kirsten/M
+Kirsti/M
+Kirstin/M
+Kirstyn/M
+Kisangani/M
+Kishinev/M
+kismet/SM
+kiss/DSRBJGZ
+Kissee/M
+kisser/M
+Kissiah/M
+Kissie/M
+Kissinger/M
+Kitakyushu/M
+kitbag's
+kitchener/M
+Kitchener/M
+kitchenette/SM
+kitchen/GDRMS
+kitchenware/SM
+kiter/M
+kite/SM
+kith/MDG
+kiths
+Kit/M
+kit/MDRGS
+kitsch/MS
+kitschy
+kitted
+kittenishness/M
+kittenish/YP
+kitten/SGDM
+Kittie/M
+Kitti/M
+kitting
+kittiwakes
+Kitty/M
+kitty/SM
+Kiwanis/M
+kiwifruit/S
+kiwi/SM
+Kizzee/M
+Kizzie/M
+KKK
+kl
+Klan/M
+Klansman/M
+Klara/M
+Klarika/M
+Klarrisa/M
+Klaus/M
+klaxon/M
+Klee/M
+Kleenex/SM
+Klein/M
+Kleinrock/M
+Klemens/M
+Klement/M
+Kleon/M
+kleptomaniac/SM
+kleptomania/MS
+Kliment/M
+Kline/M
+Klingon/M
+Klondike/SDMG
+kludger/M
+kludge/RSDGMZ
+kludgey
+klutziness/S
+klutz/SM
+klutzy/TRP
+Klux/M
+klystron/MS
+km
+kn
+knacker/M
+knack/SGZRDM
+knackwurst/MS
+Knapp/M
+knapsack/MS
+Knauer/M
+knavery/MS
+knave/SM
+knavish/Y
+kneader/M
+knead/GZRDS
+kneecap/MS
+kneecapped
+kneecapping
+knee/DSM
+kneeing
+kneeler/M
+kneel/GRS
+kneepad/SM
+knell/SMDG
+knelt
+Knesset/M
+knew
+Kngwarreye/M
+Knickerbocker/MS
+knickerbocker/S
+knickknack/SM
+knick/ZR
+Knievel/M
+knife/DSGM
+knighthood/MS
+knightliness/MS
+knightly/P
+Knight/M
+knight/MDYSG
+knish/MS
+knit/AU
+knits
+knitted
+knitter/MS
+knitting/SM
+knitwear/M
+knives/M
+knobbly
+knobby/RT
+Knobeloch/M
+knob/MS
+knockabout/M
+knockdown/S
+knocker/M
+knock/GZSJRD
+knockoff/S
+knockout/MS
+knockwurst's
+knoll/MDSG
+Knopf/M
+Knossos/M
+knothole/SM
+knot/MS
+knotted
+knottiness/M
+knotting/M
+knotty/TPR
+knowable/U
+knower/M
+know/GRBSJ
+knowhow
+knowingly/U
+knowing/RYT
+knowings/U
+knowledgeableness/M
+knowledgeable/P
+knowledgeably
+knowledge/SM
+Knowles
+known/SU
+Knox/M
+Knoxville/M
+knuckleball/R
+knuckle/DSMG
+knuckleduster
+knucklehead/MS
+Knudsen/M
+Knudson/M
+knurl/DSG
+Knuth/M
+Knutsen/M
+Knutson/M
+KO
+koala/SM
+Kobayashi/M
+Kobe/M
+Kochab/M
+Koch/M
+Kodachrome/M
+Kodak/SM
+Kodaly/M
+Kodiak/M
+Koenig/M
+Koenigsberg/M
+Koenraad/M
+Koestler/M
+Kohinoor/M
+Kohler/M
+Kohl/MR
+kohlrabies
+kohlrabi/M
+kola/SM
+Kolyma/M
+Kommunizma/M
+Kong/M
+Kongo/M
+Konrad/M
+Konstance/M
+Konstantine/M
+Konstantin/M
+Konstanze/M
+kookaburra/SM
+kook/GDMS
+kookiness/S
+kooky/PRT
+Koo/M
+Koontz/M
+kopeck/MS
+Koppers/M
+Koralle/M
+Koral/M
+Kora/M
+Koranic
+Koran/SM
+Kordula/M
+Korea/M
+Korean/S
+Korella/M
+Kore/M
+Koren/M
+Koressa/M
+Korey/M
+Korie/M
+Kori/M
+Kornberg/M
+Korney/M
+Korrie/M
+Korry/M
+Kort/M
+Kory/M
+Korzybski/M
+Kosciusko/M
+kosher/DGS
+Kossuth/M
+Kosygin/M
+Kovacs/M
+Kowalewski/M
+Kowalski/M
+Kowloon/M
+kowtow/SGD
+KP
+kph
+kraal/SMDG
+Kraemer/M
+kraft/M
+Kraft/M
+Krakatau's
+Krakatoa/M
+Krakow/M
+Kramer/M
+Krasnodar/M
+Krasnoyarsk/M
+Krause/M
+kraut/S!
+Krebs/M
+Kremlin/M
+Kremlinologist/MS
+Kremlinology/MS
+Kresge/M
+Krieger/M
+kriegspiel/M
+krill/MS
+Kringle/M
+Krisha/M
+Krishnah/M
+Krishna/M
+Kris/M
+Krispin/M
+Krissie/M
+Krissy/M
+Kristal/M
+Krista/M
+Kristan/M
+Kristel/M
+Kriste/M
+Kristen/M
+Kristian/M
+Kristie/M
+Kristien/M
+Kristi/MN
+Kristina/M
+Kristine/M
+Kristin/M
+Kristofer/M
+Kristoffer/M
+Kristofor/M
+Kristoforo/M
+Kristo/MS
+Kristopher/M
+Kristy/M
+Kristyn/M
+Kr/M
+Kroc/M
+Kroger/M
+króna/M
+Kronecker/M
+krone/RM
+kronor
+krónur
+Kropotkin/M
+Krueger/M
+Kruger/M
+Krugerrand/S
+Krupp/M
+Kruse/M
+krypton/SM
+Krystalle/M
+Krystal/M
+Krysta/M
+Krystle/M
+Krystyna/M
+ks
+K's
+KS
+k's/IE
+kt
+Kublai/M
+Kubrick/M
+kuchen/MS
+kudos/M
+kudzu/SM
+Kuenning/M
+Kuhn/M
+Kuibyshev/M
+Ku/M
+Kumar/M
+kumquat/SM
+Kunming/M
+Kuomintang/M
+Kurdish/M
+Kurdistan/SM
+Kurd/SM
+Kurosawa/M
+Kurtis/M
+Kurt/M
+kurtosis/M
+Kusch/M
+Kuwaiti/SM
+Kuwait/M
+Kuznetsk/M
+Kuznets/M
+kvetch/DSG
+kw
+kW
+Kwakiutl/M
+Kwangchow's
+Kwangju/M
+Kwanzaa/S
+kWh
+KY
+Kyla/M
+kyle/M
+Kyle/M
+Kylen/M
+Kylie/M
+Kylila/M
+Kylynn/M
+Ky/MH
+Kym/M
+Kynthia/M
+Kyoto/M
+Kyrgyzstan
+Kyrstin/M
+Kyushu/M
+L
+LA
+Laban/M
+labeled/U
+labeler/M
+label/GAZRDS
+labellings/A
+label's
+labial/YS
+labia/M
+labile
+labiodental
+labium/M
+laboratory/MS
+laboredness/M
+labored/PMY
+labored's/U
+laborer/M
+laboring/MY
+laborings/U
+laboriousness/MS
+laborious/PY
+labor/RDMJSZG
+laborsaving
+Labradorean/S
+Labrador/SM
+lab/SM
+Lab/SM
+laburnum/SM
+labyrinthine
+labyrinth/M
+labyrinths
+laced/U
+Lacee/M
+lace/MS
+lacerate/NGVXDS
+laceration/M
+lacer/M
+laces/U
+lacewing/MS
+Lacey/M
+Lachesis/M
+lachrymal/S
+lachrymose
+Lacie/M
+lacing/M
+lackadaisic
+lackadaisical/Y
+Lackawanna/M
+lacker/M
+lackey/SMDG
+lack/GRDMS
+lackluster/S
+Lac/M
+laconic
+laconically
+lacquerer/M
+lacquer/ZGDRMS
+lacrosse/MS
+lac/SGMDR
+lactate/MNGSDX
+lactational/Y
+lactation/M
+lacteal
+lactic
+lactose/MS
+lacunae
+lacuna/M
+Lacy/M
+lacy/RT
+ladder/GDMS
+laddie/MS
+laded/U
+ladened
+ladening
+laden/U
+lade/S
+lading/M
+ladle/SDGM
+Ladoga/M
+Ladonna/M
+lad/XGSJMND
+ladybird/SM
+ladybug/MS
+ladyfinger/SM
+ladylike/U
+ladylove/MS
+Ladyship/MS
+ladyship/SM
+lady/SM
+Lady/SM
+Laetitia/M
+laetrile/S
+Lafayette/M
+Lafitte/M
+lager/DMG
+laggard/MYSP
+laggardness/M
+lagged
+lagging/MS
+lagniappe/SM
+lagoon/MS
+Lagos/M
+Lagrange/M
+Lagrangian/M
+Laguerre/M
+Laguna/M
+lag/ZSR
+Lahore/M
+laid/AI
+Laidlaw/M
+lain
+Laina/M
+Lainey/M
+Laird/M
+laird/MS
+lair/GDMS
+laissez
+laity/SM
+Laius/M
+lake/DSRMG
+Lakehurst/M
+Lakeisha/M
+laker/M
+lakeside
+Lakewood/M
+Lakisha/M
+Lakshmi/M
+lallygagged
+lallygagging
+lallygag/S
+Lalo/M
+La/M
+Lamaism/SM
+Lamarck/M
+Lamar/M
+lamasery/MS
+lama/SM
+Lamaze
+lambada/S
+lambaste/SDG
+lambda/SM
+lambency/MS
+lambent/Y
+Lambert/M
+lambkin/MS
+Lamb/M
+Lamborghini/M
+lambskin/MS
+lamb/SRDMG
+lambswool
+lamebrain/SM
+lamed/M
+lameness/MS
+lamentableness/M
+lamentable/P
+lamentably
+lamentation/SM
+lament/DGSB
+lamented/U
+lame/SPY
+la/MHLG
+laminae
+lamina/M
+laminar
+laminate/XNGSD
+lamination/M
+lam/MDRSTG
+lammed
+lammer
+lamming
+Lammond/M
+Lamond/M
+Lamont/M
+L'Amour
+lampblack/SM
+lamplighter/M
+lamplight/ZRMS
+lampooner/M
+lampoon/RDMGS
+Lamport/M
+lamppost/SM
+lamprey/MS
+lamp/SGMRD
+lampshade/MS
+LAN
+Lanae/M
+Lanai/M
+lanai/SM
+Lana/M
+Lancashire/M
+Lancaster/M
+Lancelot/M
+Lance/M
+lancer/M
+lance/SRDGMZ
+lancet/MS
+landau/MS
+lander/I
+landfall/SM
+landfill/DSG
+landforms
+landholder/M
+landhold/JGZR
+landing/M
+Landis/M
+landlady/MS
+landless
+landlines
+landlocked
+landlord/MS
+landlubber/SM
+Land/M
+landmark/GSMD
+landmass/MS
+Landon/M
+landowner/MS
+landownership/M
+landowning/SM
+Landry/M
+Landsat
+landscape/GMZSRD
+landscaper/M
+lands/I
+landslide/MS
+landslid/G
+landslip
+landsman/M
+landsmen
+land/SMRDJGZ
+Landsteiner/M
+landward/S
+Landwehr/M
+Lane/M
+lane/SM
+Lanette/M
+Laney/M
+Langeland/M
+Lange/M
+Langerhans/M
+Langford/M
+Langland/M
+Langley/M
+Lang/M
+Langmuir/M
+Langsdon/M
+Langston/M
+language/MS
+languidness/MS
+languid/PY
+languisher/M
+languishing/Y
+languish/SRDG
+languorous/Y
+languor/SM
+Lanie/M
+Lani/M
+Lanita/M
+lankiness/SM
+lankness/MS
+lank/PTYR
+lanky/PRT
+Lanna/M
+Lannie/M
+Lanni/M
+Lanny/M
+lanolin/MS
+Lansing/M
+lantern/GSDM
+lanthanide/M
+lanthanum/MS
+lanyard/MS
+Lanzhou
+Laocoon/M
+Lao/SM
+Laotian/MS
+lapboard/MS
+lapdog/S
+lapel/MS
+lapidary/MS
+lapin/MS
+Laplace/M
+Lapland/ZMR
+lapped
+lappet/MS
+lapping
+Lapp/SM
+lapsed/A
+lapse/KSDMG
+lapser/MA
+lapses/A
+lapsing/A
+lap/SM
+laps/SRDG
+laptop/SM
+lapwing/MS
+Laraine/M
+Lara/M
+Laramie/M
+larboard/MS
+larcenist/S
+larcenous
+larceny/MS
+larch/MS
+larder/M
+lard/MRDSGZ
+Lardner/M
+lardy/RT
+Laredo/M
+largehearted
+largemouth
+largeness/SM
+large/SRTYP
+largess/SM
+largish
+largo/S
+lariat/MDGS
+Lari/M
+Larina/M
+Larine/M
+Larisa/M
+Larissa/M
+larker/M
+lark/GRDMS
+Lark/M
+larkspur/MS
+Larousse/M
+Larry/M
+Larsen/M
+Lars/NM
+Larson/M
+larvae
+larval
+larva/M
+laryngeal/YS
+larynges
+laryngitides
+laryngitis/M
+larynx/M
+Laryssa/M
+lasagna/S
+lasagne's
+Lascaux/M
+lasciviousness/MS
+lascivious/YP
+lase
+laser/M
+lashed/U
+lasher/M
+lashing/M
+lash/JGMSRD
+Lassa/M
+Lassen/M
+Lassie/M
+lassie/SM
+lassitude/MS
+lassoer/M
+lasso/GRDMS
+las/SRZG
+lass/SM
+laster/M
+lastingness/M
+lasting/PY
+last/JGSYRD
+Laszlo/M
+Latasha/M
+Latashia/M
+latching/M
+latchkey/SM
+latch's
+latch/UGSD
+latecomer/SM
+lated/A
+late/KA
+lately
+latency/MS
+lateness/MS
+latent/YS
+later/A
+lateral/GDYS
+lateralization
+Lateran/M
+latest/S
+LaTeX/M
+latex/MS
+lathe/M
+latherer/M
+lather/RDMG
+lathery
+lathing/M
+lath/MSRDGZ
+Lathrop/M
+laths
+Latia/M
+latices/M
+Latina/SM
+Latinate
+Latino/S
+Latin/RMS
+latish
+Latisha/M
+latitude/SM
+latitudinal/Y
+latitudinarian/S
+latitudinary
+Lat/M
+Latonya/M
+Latoya/M
+Latrena/M
+Latrina/M
+latrine/MS
+Latrobe/M
+lat/SDRT
+latter/YM
+latte/SR
+lattice/SDMG
+latticework/MS
+latticing/M
+Lattimer/M
+Latvia/M
+Latvian/S
+laudably
+laudanum/MS
+laudatory
+Lauderdale/M
+lauder/M
+Lauder/M
+Laud/MR
+laud/RDSBG
+lauds/M
+Laue/M
+laughableness/M
+laughable/P
+laughably
+laugh/BRDZGJ
+laugher/M
+laughing/MY
+laughingstock/SM
+laughs
+laughter/MS
+Laughton/M
+Launce/M
+launch/AGSD
+launcher/MS
+launching/S
+launchpad/S
+laundered/U
+launderer/M
+launderette/MS
+launder/SDRZJG
+laundress/MS
+laundrette/S
+laundromat/S
+Laundromat/SM
+laundryman/M
+laundrymen
+laundry/MS
+laundrywoman/M
+laundrywomen
+Lauraine/M
+Lauralee/M
+Laural/M
+laura/M
+Laura/M
+Laurasia/M
+laureate/DSNG
+laureateship/SM
+Lauree/M
+Laureen/M
+Laurella/M
+Laurel/M
+laurel/SGMD
+Laure/M
+Laurena/M
+Laurence/M
+Laurene/M
+Lauren/SM
+Laurentian
+Laurent/M
+Lauretta/M
+Laurette/M
+Laurianne/M
+Laurice/M
+Laurie/M
+Lauri/M
+Lauritz/M
+Lauryn/M
+Lausanne/M
+lavage/MS
+lavaliere/MS
+Laval/M
+lava/SM
+lavatory/MS
+lave/GDS
+Lavena/M
+lavender/MDSG
+Laverna/M
+Laverne/M
+Lavern/M
+Lavina/M
+Lavinia/M
+Lavinie/M
+lavishness/MS
+lavish/SRDYPTG
+Lavoisier/M
+Lavonne/M
+Lawanda/M
+lawbreaker/SM
+lawbreaking/MS
+Lawford/M
+lawfulness/SMU
+lawful/PUY
+lawgiver/MS
+lawgiving/M
+lawlessness/MS
+lawless/PY
+Law/M
+lawmaker/MS
+lawmaking/SM
+lawman/M
+lawmen
+lawnmower/S
+lawn/SM
+Lawrence/M
+Lawrenceville/M
+lawrencium/SM
+Lawry/M
+law/SMDG
+Lawson/M
+lawsuit/MS
+Lawton/M
+lawyer/DYMGS
+laxativeness/M
+laxative/PSYM
+laxer/A
+laxes/A
+laxity/SM
+laxness/SM
+lax/PTSRY
+layabout/MS
+Layamon/M
+layaway/S
+lay/CZGSR
+layered/C
+layer/GJDM
+layering/M
+layer's/IC
+layette/SM
+Layla/M
+Lay/M
+layman/M
+laymen
+Layne/M
+Layney/M
+layoff/MS
+layout/SM
+layover/SM
+laypeople
+layperson/S
+lays/AI
+Layton/M
+layup/MS
+laywoman/M
+laywomen
+Lazare/M
+Lazar/M
+Lazaro/M
+Lazarus/M
+laze/DSG
+lazily
+laziness/MS
+lazuli/M
+lazybones/M
+lazy/PTSRDG
+lb
+LBJ/M
+lbs
+LC
+LCD
+LCM
+LDC
+leachate
+Leach/M
+leach/SDG
+Leadbelly/M
+leaded/U
+leadenness/M
+leaden/PGDY
+leaderless
+leader/M
+leadership/MS
+lead/SGZXJRDN
+leadsman/M
+leadsmen
+leafage/MS
+leaf/GSDM
+leafhopper/M
+leafiness/M
+leafless
+leaflet/SDMG
+leafstalk/SM
+leafy/PTR
+leaguer/M
+league/RSDMZG
+Leah/M
+leakage/SM
+leaker/M
+Leakey/M
+leak/GSRDM
+leakiness/MS
+leaky/PRT
+Lea/M
+lea/MS
+Leander/M
+Leandra/M
+leaner/M
+leaning/M
+Lean/M
+Leanna/M
+Leanne/M
+leanness/MS
+Leann/M
+Leanora/M
+Leanor/M
+lean/YRDGTJSP
+leaper/M
+leapfrogged
+leapfrogging
+leapfrog/SM
+leap/RDGZS
+Lear/M
+learnedly
+learnedness/M
+learned/UA
+learner/M
+learning/M
+learns/UA
+learn/SZGJRD
+Leary/M
+lease/ARSDG
+leaseback/MS
+leaseholder/M
+leasehold/SRMZ
+leaser/MA
+lease's
+leash's
+leash/UGSD
+leasing/M
+leas/SRDGZ
+least/S
+leastwise
+leatherette/S
+leather/MDSG
+leathern
+leatherneck/SM
+leathery
+leaven/DMJGS
+leavened/U
+leavening/M
+Leavenworth/M
+leaver/M
+leaves/M
+leave/SRDJGZ
+leaving/M
+Lebanese
+Lebanon/M
+Lebbie/M
+lebensraum
+Lebesgue/M
+Leblanc/M
+lecher/DMGS
+lecherousness/MS
+lecherous/YP
+lechery/MS
+lecithin/SM
+lectern/SM
+lecturer/M
+lecture/RSDZMG
+lectureship/SM
+led
+Leda/M
+Lederberg/M
+ledger/DMG
+ledge/SRMZ
+LED/SM
+Leeanne/M
+Leeann/M
+leech/MSDG
+Leeds/M
+leek/SM
+Leelah/M
+Leela/M
+Leeland/M
+Lee/M
+lee/MZRS
+Leena/M
+leer/DG
+leeriness/MS
+leering/Y
+leery/PTR
+Leesa/M
+Leese/M
+Leeuwenhoek/M
+Leeward/M
+leeward/S
+leeway/MS
+leftism/SM
+leftist/SM
+leftmost
+leftover/MS
+Left/S
+left/TRS
+leftward/S
+Lefty/M
+lefty/SM
+legacy/MS
+legalese/MS
+legalism/SM
+legalistic
+legality/MS
+legalization/MS
+legalize/DSG
+legalized/U
+legal/SY
+legate/AXCNGSD
+legatee/MS
+legate's/C
+legation/AMC
+legato/SM
+legendarily
+legendary/S
+Legendre/M
+legend/SM
+legerdemain/SM
+Leger/SM
+legged
+legginess/MS
+legging/MS
+leggy/PRT
+leghorn/SM
+Leghorn/SM
+legibility/MS
+legible
+legibly
+legionary/S
+legionnaire/SM
+legion/SM
+legislate/SDXVNG
+legislation/M
+legislative/SY
+legislator/SM
+legislature/MS
+legitimacy/MS
+legitimate/SDNGY
+legitimation/M
+legitimatize/SDG
+legitimization/MS
+legitimize/RSDG
+legit/S
+legless
+legman/M
+legmen
+leg/MS
+Lego/M
+Legra/M
+Legree/M
+legroom/MS
+legstraps
+legume/SM
+leguminous
+legwork/SM
+Lehigh/M
+Lehman/M
+Leia/M
+Leibniz/M
+Leicester/SM
+Leiden/M
+Leif/M
+Leigha/M
+Leigh/M
+Leighton/M
+Leilah/M
+Leila/M
+lei/MS
+Leipzig/M
+Leisha/M
+leisureliness/MS
+leisurely/P
+leisure/SDYM
+leisurewear
+leitmotif/SM
+leitmotiv/MS
+Lek/M
+Lelah/M
+Lela/M
+Leland/M
+Lelia/M
+Lemaitre/M
+Lemar/M
+Lemke/M
+Lem/M
+lemma/MS
+lemme/GJ
+Lemmie/M
+lemming/M
+Lemmy/M
+lemonade/SM
+lemon/GSDM
+lemony
+Lemuel/M
+Lemuria/M
+lemur/MS
+Lena/M
+Lenard/M
+Lenci/M
+lender/M
+lend/SRGZ
+Lenee/M
+Lenette/M
+lengthener/M
+lengthen/GRD
+lengthily
+lengthiness/MS
+length/MNYX
+lengths
+lengthwise
+lengthy/TRP
+lenience/S
+leniency/MS
+lenient/SY
+Leningrad/M
+Leninism/M
+Leninist
+Lenin/M
+lenitive/S
+Lenka/M
+Len/M
+Le/NM
+Lenna/M
+Lennard/M
+Lennie/M
+Lennon/M
+Lenny/M
+Lenoir/M
+Leno/M
+Lenora/M
+Lenore/M
+lens/SRDMJGZ
+lent/A
+lenticular
+lentil/SM
+lento/S
+Lent/SMN
+Leodora/M
+Leoine/M
+Leola/M
+Leoline/M
+Leo/MS
+Leona/M
+Leonanie/M
+Leonard/M
+Leonardo/M
+Leoncavallo/M
+Leonelle/M
+Leonel/M
+Leone/M
+Leonerd/M
+Leonhard/M
+Leonidas/M
+Leonid/M
+Leonie/M
+leonine
+Leon/M
+Leonora/M
+Leonore/M
+Leonor/M
+Leontine/M
+Leontyne/M
+leopardess/SM
+leopard/MS
+leopardskin
+Leopold/M
+Leopoldo/M
+Leopoldville/M
+Leora/M
+leotard/MS
+leper/SM
+Lepidus/M
+Lepke/M
+leprechaun/SM
+leprosy/MS
+leprous
+lepta
+lepton/SM
+Lepus/M
+Lerner/M
+Leroi/M
+Leroy/M
+Lesa/M
+lesbianism/MS
+lesbian/MS
+Leshia/M
+lesion/DMSG
+Lesley/M
+Leslie/M
+Lesli/M
+Lesly/M
+Lesotho/M
+lessee/MS
+lessen/GDS
+Lesseps/M
+lesser
+lesses
+Lessie/M
+lessing
+lesson/DMSG
+lessor/MS
+less/U
+Lester/M
+lest/R
+Les/Y
+Lesya/M
+Leta/M
+letdown/SM
+lethality/M
+lethal/YS
+Letha/M
+lethargic
+lethargically
+lethargy/MS
+Lethe/M
+Lethia/M
+Leticia/M
+Letisha/M
+let/ISM
+Letitia/M
+Letizia/M
+Letta/M
+letterbox/S
+lettered/U
+letterer/M
+letterhead/SM
+lettering/M
+letter/JSZGRDM
+letterman/M
+Letterman/M
+lettermen
+letterpress/MS
+Lettie/M
+Letti/M
+letting/S
+lettuce/SM
+Letty/M
+letup/MS
+leukemia/SM
+leukemic/S
+leukocyte/MS
+Leupold/M
+Levant/M
+leveeing
+levee/SDM
+leveled/U
+leveler/M
+levelheadedness/S
+levelheaded/P
+leveling/U
+levelness/SM
+level/STZGRDYP
+leverage/MGDS
+lever/SDMG
+Levesque/M
+Levey/M
+Leviathan
+leviathan/MS
+levier/M
+Levi/MS
+Levine/M
+Levin/M
+levitate/XNGDS
+levitation/M
+Leviticus/M
+Levitt/M
+levity/MS
+Lev/M
+Levon/M
+Levy/M
+levy/SRDZG
+lewdness/MS
+lewd/PYRT
+Lewellyn/M
+Lewes
+Lewie/M
+Lewinsky/M
+lewis/M
+Lewis/M
+Lewiss
+Lew/M
+lex
+lexeme/MS
+lexical/Y
+lexicographer/MS
+lexicographic
+lexicographical/Y
+lexicography/SM
+lexicon/SM
+Lexie/M
+Lexi/MS
+Lexine/M
+Lexington/M
+Lexus/M
+Lexy/M
+Leyden/M
+Leyla/M
+Lezley/M
+Lezlie/M
+lg
+Lhasa/SM
+Lhotse/M
+liability/SAM
+liable/AP
+liaise/GSD
+liaison/SM
+Lia/M
+Liam/M
+Liana/M
+Liane/M
+Lian/M
+Lianna/M
+Lianne/M
+liar/MS
+libation/SM
+libbed
+Libbey/M
+Libbie/M
+Libbi/M
+libbing
+Libby/M
+libeler/M
+libel/GMRDSZ
+libelous/Y
+Liberace/M
+liberalism/MS
+liberality/MS
+liberalization/SM
+liberalized/U
+liberalize/GZSRD
+liberalizer/M
+liberalness/MS
+liberal/YSP
+liberate/NGDSCX
+liberationists
+liberation/MC
+liberator/SCM
+Liberia/M
+Liberian/S
+libertarianism/M
+libertarian/MS
+libertine/MS
+liberty/MS
+libidinal
+libidinousness/M
+libidinous/PY
+libido/MS
+Lib/M
+lib/MS
+librarian/MS
+library/MS
+Libra/SM
+libretoes
+libretos
+librettist/MS
+libretto/MS
+Libreville/M
+Librium/M
+Libya/M
+Libyan/S
+lice/M
+licensed/AU
+licensee/SM
+license/MGBRSD
+licenser/M
+licenses/A
+licensing/A
+licensor/M
+licentiate/MS
+licentiousness/MS
+licentious/PY
+Licha/M
+lichee's
+lichen/DMGS
+Lichtenstein/M
+Lichter/M
+licit/Y
+licked/U
+lickerish
+licker/M
+lick/GRDSJ
+licking/M
+licorice/SM
+Lida/M
+lidded
+lidding
+Lidia/M
+lidless
+lid/MS
+lido/MS
+Lieberman/M
+Liebfraumilch/M
+Liechtenstein/RMZ
+lied/MR
+lie/DRS
+Lief/M
+liefs/A
+lief/TSR
+Liege/M
+liege/SR
+Lie/M
+lien/SM
+lier/IMA
+lies/A
+Liesa/M
+lieu/SM
+lieut
+lieutenancy/MS
+lieutenant/SM
+Lieut/M
+lifeblood/SM
+lifeboat/SM
+lifebuoy/S
+lifeforms
+lifeguard/MDSG
+lifelessness/SM
+lifeless/PY
+lifelikeness/M
+lifelike/P
+lifeline/SM
+lifelong
+life/MZR
+lifer/M
+lifesaver/SM
+lifesaving/S
+lifespan/S
+lifestyle/S
+lifetaking
+lifetime/MS
+lifework/MS
+LIFO
+lifter/M
+lift/GZMRDS
+liftoff/MS
+ligament/MS
+ligand/MS
+ligate/XSDNG
+ligation/M
+ligature/DSGM
+light/ADSCG
+lighted/U
+lightener/M
+lightening/M
+lighten/ZGDRS
+lighter/CM
+lightered
+lightering
+lighters
+lightest
+lightface/SDM
+lightheaded
+lightheartedness/MS
+lighthearted/PY
+lighthouse/MS
+lighting/MS
+lightly
+lightness/MS
+lightning/SMD
+lightproof
+light's
+lightship/SM
+lightweight/S
+ligneous
+lignite/MS
+lignum
+likability/MS
+likableness/MS
+likable/P
+likeability's
+liked/E
+likelihood/MSU
+likely/UPRT
+likeness/MSU
+liken/GSD
+liker/E
+liker's
+likes/E
+likest
+like/USPBY
+likewise
+liking/SM
+lilac/MS
+Lilah/M
+Lila/SM
+Lilia/MS
+Liliana/M
+Liliane/M
+Lilian/M
+Lilith/M
+Liliuokalani/M
+Lilla/M
+Lille/M
+Lillian/M
+Lillie/M
+Lilli/MS
+lilliputian/S
+Lilliputian/SM
+Lilliput/M
+Lilllie/M
+Lilly/M
+Lil/MY
+Lilongwe/M
+lilting/YP
+lilt/MDSG
+Lilyan/M
+Lily/M
+lily/MSD
+Lima/M
+Limbaugh/M
+limbered/U
+limberness/SM
+limber/RDYTGP
+limbers/U
+limbic
+limbless
+Limbo
+limbo/GDMS
+limb/SGZRDM
+Limburger/SM
+limeade/SM
+lime/DSMG
+limekiln/M
+limelight/DMGS
+limerick/SM
+limestone/SM
+limitability
+limitably
+limitation/MCS
+limit/CSZGRD
+limitedly/U
+limitedness/M
+limited/PSY
+limiter/M
+limiting/S
+limitlessness/SM
+limitless/PY
+limit's
+limn/GSD
+Limoges/M
+limo/S
+limousine/SM
+limper/M
+limpet/SM
+limpidity/MS
+limpidness/SM
+limpid/YP
+limpness/MS
+Limpopo/M
+limp/SGTPYRD
+Li/MY
+limy/TR
+linage/MS
+Lina/M
+linchpin/MS
+Linc/M
+Lincoln/SM
+Linda/M
+Lindbergh/M
+Lindberg/M
+linden/MS
+Lindholm/M
+Lindie/M
+Lindi/M
+Lind/M
+Lindon/M
+Lindquist/M
+Lindsay/M
+Lindsey/M
+Lindstrom/M
+Lindsy/M
+Lindy/M
+line/AGDS
+lineage/SM
+lineal/Y
+Linea/M
+lineament/MS
+linearity/MS
+linearize/SDGNB
+linear/Y
+linebacker/SM
+lined/U
+linefeed
+Linell/M
+lineman/M
+linemen
+linen/SM
+liner/SM
+line's
+linesman/M
+linesmen
+Linet/M
+Linette/M
+lineup/S
+lingerer/M
+lingerie/SM
+lingering/Y
+linger/ZGJRD
+lingoes
+lingo/M
+lingual/SY
+lingua/M
+linguine
+linguini's
+linguistically
+linguistic/S
+linguistics/M
+linguist/SM
+ling/ZR
+liniment/MS
+lining/SM
+linkable
+linkage/SM
+linked/A
+linker/S
+linking/S
+Link/M
+link's
+linkup/S
+link/USGD
+Lin/M
+Linnaeus/M
+Linnea/M
+Linnell/M
+Linnet/M
+linnet/SM
+Linnie/M
+Linn/M
+Linoel/M
+linoleum/SM
+lino/M
+Linotype/M
+linseed/SM
+lintel/SM
+linter/M
+Linton/M
+lint/SMR
+linty/RST
+Linus/M
+Linux/M
+Linwood/M
+Linzy/M
+Lionello/M
+Lionel/M
+lioness/SM
+lionhearted
+lionization/SM
+lionizer/M
+lionize/ZRSDG
+Lion/M
+lion/MS
+lipase/M
+lipid/MS
+lip/MS
+liposuction/S
+lipped
+lipper
+Lippi/M
+lipping
+Lippmann/M
+lippy/TR
+lipread/GSRJ
+Lipschitz/M
+Lipscomb/M
+lipstick/MDSG
+Lipton/M
+liq
+liquefaction/SM
+liquefier/M
+liquefy/DRSGZ
+liqueur/DMSG
+liquidate/GNXSD
+liquidation/M
+liquidator/SM
+liquidity/SM
+liquidizer/M
+liquidize/ZGSRD
+liquidness/M
+liquid/SPMY
+liquorice/SM
+liquorish
+liquor/SDMG
+lira/M
+Lira/M
+lire
+Lisabeth/M
+Lisa/M
+Lisbeth/M
+Lisbon/M
+Lise/M
+Lisetta/M
+Lisette/M
+Lisha/M
+Lishe/M
+Lisle/M
+lisle/SM
+lisper/M
+lisp/MRDGZS
+Lissajous/M
+Lissa/M
+Lissie/M
+Lissi/M
+Liss/M
+lissomeness/M
+lissome/P
+lissomness/M
+Lissy/M
+listed/U
+listener/M
+listen/ZGRD
+Listerine/M
+lister/M
+Lister/M
+listing/M
+list/JMRDNGZXS
+listlessness/SM
+listless/PY
+Liston/M
+Liszt/M
+Lita/M
+litany/MS
+litchi/SM
+literacy/MS
+literalism/M
+literalistic
+literalness/MS
+literal/PYS
+literariness/SM
+literary/P
+literate/YNSP
+literati
+literation/M
+literature/SM
+liter/M
+lite/S
+litheness/SM
+lithe/PRTY
+lithesome
+lithium/SM
+lithograph/DRMGZ
+lithographer/M
+lithographic
+lithographically
+lithographs
+lithography/MS
+lithology/M
+lithosphere/MS
+lithospheric
+Lithuania/M
+Lithuanian/S
+litigant/MS
+litigate/NGXDS
+litigation/M
+litigator/SM
+litigiousness/MS
+litigious/PY
+litmus/SM
+litotes/M
+lit/RZS
+littérateur/S
+litterbug/SM
+litter/SZGRDM
+Little/M
+littleneck/M
+littleness/SM
+little/RSPT
+Littleton/M
+Litton/M
+littoral/S
+liturgical/Y
+liturgic/S
+liturgics/M
+liturgist/MS
+liturgy/SM
+Liuka/M
+livability/MS
+livableness/M
+livable/U
+livably
+Liva/M
+lived/A
+livelihood/SM
+liveliness/SM
+livelong/S
+lively/RTP
+liveness/M
+liven/SDG
+liver/CSGD
+liveried
+liverish
+Livermore/M
+Liverpool/M
+Liverpudlian/MS
+liver's
+liverwort/SM
+liverwurst/SM
+livery/CMS
+liveryman/MC
+liverymen/C
+lives/A
+lives's
+livestock/SM
+live/YHZTGJDSRPB
+Livia/M
+lividness/M
+livid/YP
+livingness/M
+Livingstone/M
+Livingston/M
+living/YP
+Liv/M
+Livonia/M
+Livvie/M
+Livvy/M
+Livvyy/M
+Livy/M
+Lizabeth/M
+Liza/M
+lizard/MS
+Lizbeth/M
+Lizette/M
+Liz/M
+Lizzie/M
+Lizzy/M
+l/JGVXT
+Ljubljana/M
+LL
+llama/SM
+llano/SM
+LLB
+ll/C
+LLD
+Llewellyn/M
+Lloyd/M
+Llywellyn/M
+LNG
+lo
+loadable
+loaded/A
+loader/MU
+loading/MS
+load's/A
+loads/A
+loadstar's
+loadstone's
+load/SURDZG
+loafer/M
+Loafer/S
+loaf/SRDMGZ
+loam/SMDG
+loamy/RT
+loaner/M
+loaning/M
+loan/SGZRDMB
+loansharking/S
+loanword/S
+loathe
+loather/M
+loathing/M
+loath/JPSRDYZG
+loathness/M
+loathsomeness/MS
+loathsome/PY
+loaves/M
+Lobachevsky/M
+lobar
+lobbed
+lobber/MS
+lobbing
+lobby/GSDM
+lobbyist/MS
+lobe/SM
+lob/MDSG
+lobotomist
+lobotomize/GDS
+lobotomy/MS
+lobster/MDGS
+lobularity
+lobular/Y
+lobule/SM
+locale/MS
+localisms
+locality/MS
+localization/MS
+localized/U
+localizer/M
+localizes/U
+localize/ZGDRS
+local/SGDY
+locatable
+locate/AXESDGN
+locater/M
+locational/Y
+location/EMA
+locative/S
+locator's
+Lochinvar/M
+loch/M
+lochs
+loci/M
+lockable
+Lockean/M
+locked/A
+Locke/M
+locker/SM
+locket/SM
+Lockhart/M
+Lockheed/M
+Lockian/M
+locking/S
+lockjaw/SM
+Lock/M
+locknut/M
+lockout/MS
+lock's
+locksmithing/M
+locksmith/MG
+locksmiths
+lockstep/S
+lock/UGSD
+lockup/MS
+Lockwood/M
+locomotion/SM
+locomotive/YMS
+locomotor
+locomotory
+loco/SDMG
+locoweed/MS
+locus/M
+locust/SM
+locution/MS
+lode/SM
+lodestar/MS
+lodestone/MS
+lodged/E
+lodge/GMZSRDJ
+Lodge/M
+lodgepole
+lodger/M
+lodges/E
+lodging/M
+lodgment/M
+Lodovico/M
+Lodowick/M
+Lodz
+Loeb/M
+Loella/M
+Loewe/M
+Loewi/M
+lofter/M
+loftily
+loftiness/SM
+loft/SGMRD
+lofty/PTR
+loganberry/SM
+Logan/M
+logarithmic
+logarithmically
+logarithm/MS
+logbook/MS
+loge/SMNX
+logged/U
+loggerhead/SM
+logger/SM
+loggia/SM
+logging/MS
+logicality/MS
+logicalness/M
+logical/SPY
+logician/SM
+logic/SM
+login/S
+logion/M
+logistical/Y
+logistic/MS
+logjam/SM
+LOGO
+logo/SM
+logotype/MS
+logout
+logrolling/SM
+log's/K
+log/SM
+logy/RT
+Lohengrin/M
+loincloth/M
+loincloths
+loin/SM
+Loire/M
+Loise/M
+Lois/M
+loiterer/M
+loiter/RDJSZG
+Loki/M
+Lola/M
+Loleta/M
+Lolita/M
+loller/M
+lollipop/MS
+loll/RDGS
+Lolly/M
+lolly/SM
+Lombardi/M
+Lombard/M
+Lombardy/M
+Lomb/M
+Lome
+Lona/M
+Londonderry/M
+Londoner/M
+London/RMZ
+Lonee/M
+loneliness/SM
+lonely/TRP
+loneness/M
+lone/PYZR
+loner/M
+lonesomeness/MS
+lonesome/PSY
+longboat/MS
+longbow/SM
+longed/K
+longeing
+longer/K
+longevity/MS
+Longfellow/M
+longhair/SM
+longhand/SM
+longhorn/SM
+longing/MY
+longish
+longitude/MS
+longitudinal/Y
+long/JGTYRDPS
+Long/M
+longness/M
+longshoreman/M
+longshoremen
+longsighted
+longs/K
+longstanding
+Longstreet/M
+longsword
+longterm
+longtime
+Longueuil/M
+longueur/SM
+longways
+longword/SM
+Loni/M
+Lon/M
+Lonna/M
+Lonnard/M
+Lonnie/M
+Lonni/M
+Lonny/M
+loofah/M
+loofahs
+lookahead
+lookalike/S
+looker/M
+look/GZRDS
+lookout/MS
+lookup/SM
+looming/M
+Loomis/M
+loom/MDGS
+loon/MS
+loony/SRT
+looper/M
+loophole/MGSD
+loop/MRDGS
+loopy/TR
+loosed/U
+looseleaf
+loosener/M
+looseness/MS
+loosen/UDGS
+loose/SRDPGTY
+looses/U
+loosing/M
+looter/M
+loot/MRDGZS
+loper/M
+lope/S
+Lopez/M
+lopped
+lopper/MS
+lopping
+lop/SDRG
+lopsidedness/SM
+lopsided/YP
+loquaciousness/MS
+loquacious/YP
+loquacity/SM
+Loraine/M
+Lorain/M
+Loralee/M
+Loralie/M
+Loralyn/M
+Lora/M
+Lorant/M
+lording/M
+lordliness/SM
+lordly/PTR
+Lord/MS
+lord/MYDGS
+lordship/SM
+Lordship/SM
+Loree/M
+Loreen/M
+Lorelei/M
+Lorelle/M
+lore/MS
+Lorena/M
+Lorene/M
+Loren/SM
+Lorentzian/M
+Lorentz/M
+Lorenza/M
+Lorenz/M
+Lorenzo/M
+Loretta/M
+Lorette/M
+lorgnette/SM
+Loria/M
+Lorianna/M
+Lorianne/M
+Lorie/M
+Lorilee/M
+Lorilyn/M
+Lori/M
+Lorinda/M
+Lorine/M
+Lorin/M
+loris/SM
+Lorita/M
+lorn
+Lorna/M
+Lorne/M
+Lorraine/M
+Lorrayne/M
+Lorre/M
+Lorrie/M
+Lorri/M
+Lorrin/M
+lorryload/S
+Lorry/M
+lorry/SM
+Lory/M
+Los
+loser/M
+lose/ZGJBSR
+lossage
+lossless
+loss/SM
+lossy/RT
+lost/P
+Lothaire/M
+Lothario/MS
+lotion/MS
+Lot/M
+lot/MS
+Lotta/M
+lotted
+Lotte/M
+lotter
+lottery/MS
+Lottie/M
+Lotti/M
+lotting
+Lott/M
+lotto/MS
+Lotty/M
+lotus/SM
+louden/DG
+loudhailer/S
+loudly/RT
+loudmouth/DM
+loudmouths
+loudness/MS
+loudspeaker/SM
+loudspeaking
+loud/YRNPT
+Louella/M
+Louie/M
+Louisa/M
+Louise/M
+Louisette/M
+Louisiana/M
+Louisianan/S
+Louisianian/S
+Louis/M
+Louisville/M
+Lou/M
+lounger/M
+lounge/SRDZG
+Lourdes/M
+lour/GSD
+louse/CSDG
+louse's
+lousewort/M
+lousily
+lousiness/MS
+lousy/PRT
+loutishness/M
+loutish/YP
+Loutitia/M
+lout/SGMD
+louver/DMS
+L'Ouverture
+Louvre/M
+lovableness/MS
+lovable/U
+lovably
+lovebird/SM
+lovechild
+Lovecraft/M
+love/DSRMYZGJB
+loved/U
+Lovejoy/M
+Lovelace/M
+Loveland/M
+lovelessness/M
+loveless/YP
+lovelies
+lovelinesses
+loveliness/UM
+Lovell/M
+lovelornness/M
+lovelorn/P
+lovely/URPT
+Love/M
+lovemaking/SM
+lover/YMG
+lovesick
+lovestruck
+lovingly
+lovingness/M
+loving/U
+lowborn
+lowboy/SM
+lowbrow/MS
+lowdown/S
+Lowell/M
+Lowe/M
+lowercase/GSD
+lower/DG
+lowermost
+Lowery/M
+lowish
+lowland/RMZS
+Lowlands/M
+lowlife/SM
+lowlight/MS
+lowliness/MS
+lowly/PTR
+lowness/MS
+low/PDRYSZTG
+Lowrance/M
+lox/MDSG
+loyaler
+loyalest
+loyal/EY
+loyalism/SM
+loyalist/SM
+loyalty/EMS
+Loyang/M
+Loydie/M
+Loyd/M
+Loy/M
+Loyola/M
+lozenge/SDM
+LP
+LPG
+LPN/S
+Lr
+ls
+l's
+L's
+LSD
+ltd
+Ltd/M
+Lt/M
+Luanda/M
+Luann/M
+luau/MS
+lubber/YMS
+Lubbock/M
+lube/DSMG
+lubricant/SM
+lubricate/VNGSDX
+lubrication/M
+lubricator/MS
+lubricious/Y
+lubricity/SM
+Lubumbashi/M
+Lucais/M
+Luca/MS
+Luce/M
+lucent/Y
+Lucerne/M
+Lucho/M
+Lucia/MS
+Luciana/M
+Lucian/M
+Luciano/M
+lucidity/MS
+lucidness/MS
+lucid/YP
+Lucie/M
+Lucien/M
+Lucienne/M
+Lucifer/M
+Lucila/M
+Lucile/M
+Lucilia/M
+Lucille/M
+Luci/MN
+Lucina/M
+Lucinda/M
+Lucine/M
+Lucio/M
+Lucita/M
+Lucite/MS
+Lucius/M
+luck/GSDM
+luckier/U
+luckily/U
+luckiness/UMS
+luckless
+Lucknow/M
+Lucky/M
+lucky/RSPT
+lucrativeness/SM
+lucrative/YP
+lucre/MS
+Lucretia/M
+Lucretius/M
+lucubrate/GNSDX
+lucubration/M
+Lucy/M
+Luddite/SM
+Ludhiana/M
+ludicrousness/SM
+ludicrous/PY
+Ludlow/M
+Ludmilla/M
+ludo/M
+Ludovico/M
+Ludovika/M
+Ludvig/M
+Ludwig/M
+Luella/M
+Luelle/M
+luff/GSDM
+Lufthansa/M
+Luftwaffe/M
+luge/MC
+Luger/M
+luggage/SM
+lugged
+lugger/SM
+lugging
+Lugosi/M
+lug/RS
+lugsail/SM
+lugubriousness/MS
+lugubrious/YP
+Luigi/M
+Luisa/M
+Luise/M
+Luis/M
+Lukas/M
+Luke/M
+lukewarmness/SM
+lukewarm/PY
+Lula/M
+Lulita/M
+lullaby/GMSD
+lull/SDG
+lulu/M
+Lulu/M
+Lu/M
+lumbago/SM
+lumbar/S
+lumberer/M
+lumbering/M
+lumberjack/MS
+lumberman/M
+lumbermen
+lumber/RDMGZSJ
+lumberyard/MS
+lumen/M
+Lumière/M
+luminance/M
+luminary/MS
+luminescence/SM
+luminescent
+luminosity/MS
+luminousness/M
+luminous/YP
+lummox/MS
+lumper/M
+lumpiness/MS
+lumpishness/M
+lumpish/YP
+lump/SGMRDN
+lumpy/TPR
+lunacy/MS
+Luna/M
+lunar/S
+lunary
+lunate/YND
+lunatic/S
+lunation/M
+luncheonette/SM
+luncheon/SMDG
+luncher/M
+lunch/GMRSD
+lunchpack
+lunchroom/MS
+lunchtime/MS
+Lundberg/M
+Lund/M
+Lundquist/M
+lune/M
+lunge/MS
+lunger/M
+lungfish/SM
+lungful
+lung/SGRDM
+lunkhead/SM
+Lupe/M
+lupine/SM
+Lupus/M
+lupus/SM
+Lura/M
+lurcher/M
+lurch/RSDG
+lure/DSRG
+lurer/M
+Lurette/M
+lurex
+Luria/M
+luridness/SM
+lurid/YP
+lurker/M
+lurk/GZSRD
+Lurleen/M
+Lurlene/M
+Lurline/M
+Lusaka/M
+Lusa/M
+lusciousness/MS
+luscious/PY
+lushness/MS
+lush/YSRDGTP
+Lusitania/M
+luster/GDM
+lustering/M
+lusterless
+lustfulness/M
+lustful/PY
+lustily
+lustiness/MS
+lust/MRDGZS
+lustrousness/M
+lustrous/PY
+lusty/PRT
+lutanist/MS
+lute/DSMG
+lutenist/MS
+Lutero/M
+lutetium/MS
+Lutheranism/MS
+Lutheran/SM
+Luther/M
+luting/M
+Lutz
+Luxembourgian
+Luxembourg/RMZ
+Luxemburg's
+luxe/MS
+luxuriance/MS
+luxuriant/Y
+luxuriate/GNSDX
+luxuriation/M
+luxuriousness/SM
+luxurious/PY
+luxury/MS
+Luz/M
+Luzon/M
+L'vov
+Lyallpur/M
+lyceum/MS
+lychee's
+lycopodium/M
+Lycra/S
+Lycurgus/M
+Lyda/M
+Lydia/M
+Lydian/S
+Lydie/M
+Lydon/M
+lye/JSMG
+Lyell/M
+lying/Y
+Lyle/M
+Lyly/M
+Lyman/M
+Lyme/M
+lymphatic/S
+lymph/M
+lymphocyte/SM
+lymphoid
+lymphoma/MS
+lymphs
+Ly/MY
+Lynchburg/M
+lyncher/M
+lynching/M
+Lynch/M
+lynch/ZGRSDJ
+Lynda/M
+Lyndell/M
+Lyndel/M
+Lynde/M
+Lyndon/M
+Lyndsay/M
+Lyndsey/M
+Lyndsie/M
+Lyndy/M
+Lynea/M
+Lynelle/M
+Lynette/M
+Lynett/M
+Lyn/M
+Lynna/M
+Lynnea/M
+Lynnelle/M
+Lynnell/M
+Lynne/M
+Lynnet/M
+Lynnette/M
+Lynnett/M
+Lynn/M
+Lynsey/M
+lynx/MS
+Lyon/SM
+Lyra/M
+lyrebird/MS
+lyre/SM
+lyricalness/M
+lyrical/YP
+lyricism/SM
+lyricist/SM
+lyric/S
+Lysenko/M
+lysine/M
+Lysistrata/M
+Lysol/M
+Lyssa/M
+LyX/M
+MA
+Maalox/M
+ma'am
+Mabelle/M
+Mabel/M
+Mable/M
+Mab/M
+macabre/Y
+macadamize/SDG
+macadam/SM
+Macao/M
+macaque/SM
+macaroni/SM
+macaroon/MS
+Macarthur/M
+MacArthur/M
+Macaulay/M
+macaw/SM
+Macbeth/M
+Maccabees/M
+Maccabeus/M
+Macdonald/M
+MacDonald/M
+MacDraw/M
+Macedonia/M
+Macedonian/S
+Macedon/M
+mace/MS
+Mace/MS
+macerate/DSXNG
+maceration/M
+macer/M
+Macgregor/M
+MacGregor/M
+machete/SM
+Machiavellian/S
+Machiavelli/M
+machinate/SDXNG
+machination/M
+machinelike
+machine/MGSDB
+machinery/SM
+machinist/MS
+machismo/SM
+Mach/M
+macho/S
+Machs
+Macias/M
+Macintosh/M
+MacIntosh/M
+macintosh's
+Mackenzie/M
+MacKenzie/M
+mackerel/SM
+Mackinac/M
+Mackinaw
+mackinaw/SM
+mackintosh/SM
+mack/M
+Mack/M
+MacLeish/M
+Macmillan/M
+MacMillan/M
+Macon/SM
+MacPaint/M
+macramé/S
+macrobiotic/S
+macrobiotics/M
+macrocosm/MS
+macrodynamic
+macroeconomic/S
+macroeconomics/M
+macromolecular
+macromolecule/SM
+macron/MS
+macrophage/SM
+macroscopic
+macroscopically
+macrosimulation
+macro/SM
+macrosocioeconomic
+Mac/SGMD
+mac/SGMDR
+Macy/M
+Madagascan/SM
+Madagascar/M
+Madalena/M
+Madalyn/M
+Mada/M
+madame/M
+Madame/MS
+madam/SM
+madcap/S
+Maddalena/M
+madded
+madden/GSD
+maddening/Y
+Madden/M
+madder/MS
+maddest
+Maddie/M
+Maddi/M
+madding
+Maddox/M
+Maddy/M
+made/AU
+Madeira/SM
+Madelaine/M
+Madeleine/M
+Madelena/M
+Madelene/M
+Madelina/M
+Madeline/M
+Madelin/M
+Madella/M
+Madelle/M
+Madel/M
+Madelon/M
+Madelyn/M
+mademoiselle/MS
+Madge/M
+madhouse/SM
+Madhya/M
+Madison/M
+Madlen/M
+Madlin/M
+madman/M
+madmen
+madness/SM
+Madonna/MS
+mad/PSY
+Madras
+madras/SM
+Madrid/M
+madrigal/MSG
+Madsen/M
+Madurai/M
+madwoman/M
+madwomen
+Mady/M
+Maegan/M
+Maelstrom/M
+maelstrom/SM
+Mae/M
+maestro/MS
+Maeterlinck/M
+Mafia/MS
+mafia/S
+mafiosi
+mafioso/M
+Mafioso/S
+MAG
+magazine/DSMG
+Magdaia/M
+Magdalena/M
+Magdalene/M
+Magdalen/M
+Magda/M
+Magellanic
+Magellan/M
+magenta/MS
+magged
+Maggee/M
+Maggie/M
+Maggi/M
+magging
+maggot/MS
+maggoty/RT
+Maggy/M
+magi
+magical/Y
+magician/MS
+magicked
+magicking
+magic/SM
+Magill/M
+Magi/M
+Maginot/M
+magisterial/Y
+magistracy/MS
+magistrate/MS
+Mag/M
+magma/SM
+magnanimity/SM
+magnanimosity
+magnanimous/PY
+magnate/SM
+magnesia/MS
+magnesite/M
+magnesium/SM
+magnetically
+magnetic/S
+magnetics/M
+magnetism/SM
+magnetite/SM
+magnetizable
+magnetization/ASCM
+magnetize/CGDS
+magnetized/U
+magnetodynamics
+magnetohydrodynamical
+magnetohydrodynamics/M
+magnetometer/MS
+magneto/MS
+magnetosphere/M
+magnetron/M
+magnet/SM
+magnification/M
+magnificence/SM
+magnificent/Y
+magnified/U
+magnify/DRSGNXZ
+magniloquence/MS
+magniloquent
+Magnitogorsk/M
+magnitude/SM
+magnolia/SM
+Magnum
+magnum/SM
+Magnuson/M
+Magog/M
+Magoo/M
+magpie/SM
+Magritte/M
+Magruder/M
+mag/S
+Magsaysay/M
+Maguire/SM
+Magus/M
+Magyar/MS
+Mahabharata
+Mahala/M
+Mahalia/M
+maharajah/M
+maharajahs
+maharanee's
+maharani/MS
+Maharashtra/M
+maharishi/SM
+mahatma/SM
+Mahavira/M
+Mahayana/M
+Mahayanist
+Mahdi/M
+Mahfouz/M
+Mahican/SM
+mahjong's
+Mahler/M
+Mahmoud/M
+Mahmud/M
+mahogany/MS
+Mahomet's
+mahout/SM
+Maia/M
+Maible/M
+maidenhair/MS
+maidenhead/SM
+maidenhood/SM
+maidenly/P
+maiden/YM
+maidservant/MS
+maid/SMNX
+maier
+Maier/M
+Maiga/M
+Maighdiln/M
+Maigret/M
+mailbag/MS
+mailbox/MS
+mail/BSJGZMRD
+mailer/M
+Mailer/M
+Maillol/M
+maillot/SM
+mailman/M
+mailmen
+Maiman/M
+maimedness/M
+maimed/P
+maimer/M
+Maimonides/M
+Mai/MR
+maim/SGZRD
+mainbrace/M
+Maine/MZR
+Mainer/M
+mainframe/MS
+mainlander/M
+mainland/SRMZ
+mainliner/M
+mainline/RSDZG
+mainly
+mainmast/SM
+main/SA
+mainsail/SM
+mains/M
+mainspring/SM
+mainstay/MS
+mainstream/DRMSG
+maintainability
+maintainable/U
+maintain/BRDZGS
+maintained/U
+maintainer/M
+maintenance/SM
+maintop/SM
+maiolica's
+Maire/M
+Mair/M
+Maisey/M
+Maisie/M
+maisonette/MS
+Maison/M
+Maitilde/M
+maize/MS
+Maj
+Maje/M
+majestic
+majestically
+majesty/MS
+Majesty/MS
+majolica/SM
+Majorca/M
+major/DMGS
+majordomo/S
+majorette/SM
+majority/SM
+Major/M
+Majuro/M
+makable
+Makarios/M
+makefile/S
+makeover/S
+Maker/M
+maker/SM
+makeshift/S
+make/UGSA
+makeup/MS
+making/SM
+Malabar/M
+Malabo/M
+Malacca/M
+Malachi/M
+malachite/SM
+maladapt/DV
+maladjust/DLV
+maladjustment/MS
+maladministration
+maladroitness/MS
+maladroit/YP
+malady/MS
+Malagasy/M
+malaise/SM
+Mala/M
+Malamud/M
+malamute/SM
+Malanie/M
+malaprop
+malapropism/SM
+Malaprop/M
+malarial
+malaria/MS
+malarious
+malarkey/SM
+malathion/S
+Malawian/S
+Malawi/M
+Malayalam/M
+Malaya/M
+Malayan/MS
+Malaysia/M
+Malaysian/S
+Malay/SM
+Malchy/M
+Malcolm/M
+malcontentedness/M
+malcontented/PY
+malcontent/SMD
+Maldive/SM
+Maldivian/S
+Maldonado/M
+maledict
+malediction/MS
+malefaction/MS
+malefactor/MS
+malefic
+maleficence/MS
+maleficent
+Male/M
+Malena/M
+maleness/MS
+male/PSM
+malevolence/S
+malevolencies
+malevolent/Y
+malfeasance/SM
+malfeasant
+malformation/MS
+malformed
+malfunction/SDG
+Malia/M
+Malian/S
+Malibu/M
+malice/MGSD
+maliciousness/MS
+malicious/YU
+malignancy/SM
+malignant/YS
+malign/GSRDYZ
+malignity/MS
+Mali/M
+Malina/M
+Malinda/M
+Malinde/M
+malingerer/M
+malinger/GZRDS
+Malinowski/M
+Malissa/M
+Malissia/M
+mallard/SM
+Mallarmé/M
+malleability/SM
+malleableness/M
+malleable/P
+mallet/MS
+Mallissa/M
+Mallorie/M
+Mallory/M
+mallow/MS
+mall/SGMD
+Mal/M
+malnourished
+malnutrition/SM
+malocclusion/MS
+malodorous
+Malone/M
+Malorie/M
+Malory/M
+malposed
+malpractice/SM
+Malraux/M
+Malta/M
+malted/S
+Maltese
+Malthusian/S
+Malthus/M
+malting/M
+maltose/SM
+maltreat/GDSL
+maltreatment/S
+malt/SGMD
+malty/RT
+Malva/M
+Malvina/M
+Malvin/M
+Malynda/M
+mama/SM
+mamba/SM
+mambo/GSDM
+Mame/M
+Mamet/M
+ma/MH
+Mamie/M
+mammalian/SM
+mammal/SM
+mammary
+mamma's
+mammogram/S
+mammography/S
+Mammon's
+mammon/SM
+mammoth/M
+mammoths
+mammy/SM
+Mamore/M
+manacle/SDMG
+manageability/S
+manageableness
+manageable/U
+managed/U
+management/SM
+manageress/M
+managerial/Y
+manager/M
+managership/M
+manage/ZLGRSD
+Managua/M
+Manama/M
+mañana/M
+mananas
+Manasseh/M
+manatee/SM
+Manaus's
+Manchester/M
+Manchu/MS
+Manchuria/M
+Manchurian/S
+Mancini/M
+manciple/M
+Mancunian/MS
+mandala/SM
+Mandalay/M
+Manda/M
+mandamus/GMSD
+Mandarin
+mandarin/MS
+mandate/SDMG
+mandatory/S
+Mandela
+Mandelbrot/M
+Mandel/M
+mandible/MS
+mandibular
+Mandie/M
+Mandi/M
+Mandingo/M
+mandolin/MS
+mandrake/MS
+mandrel/SM
+mandrill/SM
+Mandy/M
+manège/GSD
+mane/MDS
+Manet/M
+maneuverability/MS
+maneuverer/M
+maneuver/MRDSGB
+Manfred/M
+manful/Y
+manganese/MS
+mange/GMSRDZ
+manger/M
+manginess/S
+mangler/M
+mangle/RSDG
+mangoes
+mango/M
+mangrove/MS
+mangy/PRT
+manhandle/GSD
+Manhattan/SM
+manhole/MS
+manhood/MS
+manhunt/SM
+maniacal/Y
+maniac/SM
+mania/SM
+manically
+Manichean/M
+manic/S
+manicure/MGSD
+manicurist/SM
+manifestation/SM
+manifesto/GSDM
+manifest/YDPGS
+manifolder/M
+manifold/GPYRDMS
+manifoldness/M
+manikin/MS
+Manila/MS
+manila/S
+manilla's
+Mani/M
+manioc/SM
+manipulability
+manipulable
+manipulate/SDXBVGN
+manipulative/PM
+manipulator/MS
+manipulatory
+Manitoba/M
+Manitoulin/M
+Manitowoc/M
+mankind/M
+Mankowski/M
+Manley/M
+manlike
+manliness/SM
+manliness's/U
+manly/URPT
+manna/MS
+manned/U
+mannequin/MS
+mannered/U
+mannerism/SM
+mannerist/M
+mannerliness/MU
+mannerly/UP
+manner/SDYM
+Mann/GM
+Mannheim/M
+Mannie/M
+mannikin's
+Manning/M
+manning/U
+mannishness/SM
+mannish/YP
+Manny/M
+Manolo/M
+Mano/M
+manometer/SM
+Manon/M
+manorial
+manor/MS
+manpower/SM
+manqué/M
+man's
+mansard/SM
+manservant/M
+manse/XNM
+Mansfield/M
+mansion/M
+manslaughter/SM
+Man/SM
+Manson/M
+mans/S
+manta/MS
+Mantegna/M
+mantelpiece/MS
+mantel/SM
+mantes
+mantilla/MS
+mantissa/SM
+mantis/SM
+mantle/ESDG
+Mantle/M
+mantle's
+mantling/M
+mantra/MS
+mantrap/SM
+manual/SMY
+Manuela/M
+Manuel/M
+manufacture/JZGDSR
+manufacturer/M
+manumission/MS
+manumit/S
+manumitted
+manumitting
+manure/RSDMZG
+manuscript/MS
+man/USY
+Manville/M
+Manx
+many
+Manya/M
+Maoism/MS
+Maoist/S
+Mao/M
+Maori/SM
+Maplecrest/M
+maple/MS
+mapmaker/S
+mappable
+mapped/UA
+mapper/S
+mapping/MS
+Mapplethorpe/M
+maps/AU
+map/SM
+Maputo/M
+Marabel/M
+marabou/MS
+marabout's
+Maracaibo/M
+maraca/MS
+Mara/M
+maraschino/SM
+Marathi
+marathoner/M
+Marathon/M
+marathon/MRSZ
+Marat/M
+marauder/M
+maraud/ZGRDS
+marbleize/GSD
+marble/JRSDMG
+marbler/M
+marbling/M
+Marceau/M
+Marcela/M
+Marcelia/M
+Marcelino/M
+Marcella/M
+Marcelle/M
+Marcellina/M
+Marcelline/M
+Marcello/M
+Marcellus/M
+Marcel/M
+Marcelo/M
+Marchall/M
+Marchelle/M
+marcher/M
+marchioness/SM
+March/MS
+march/RSDZG
+Marcia/M
+Marciano/M
+Marcie/M
+Marcile/M
+Marcille/M
+Marci/M
+Marc/M
+Marconi/M
+Marco/SM
+Marcotte/M
+Marcus/M
+Marcy/M
+Mardi/SM
+Marduk/M
+Mareah/M
+mare/MS
+Marena/M
+Maren/M
+Maressa/M
+Margalit/M
+Margalo/M
+Marga/M
+Margareta/M
+Margarete/M
+Margaretha/M
+Margarethe/M
+Margaret/M
+Margaretta/M
+Margarette/M
+margarine/MS
+Margarita/M
+margarita/SM
+Margarito/M
+Margaux/M
+Margeaux/M
+Marge/M
+Margery/M
+Marget/M
+Margette/M
+Margie/M
+Margi/M
+marginalia
+marginality
+marginalization
+marginalize/SDG
+marginal/YS
+margin/GSDM
+Margit/M
+Margo/M
+Margot/M
+Margrethe/M
+Margret/M
+Marguerite/M
+Margy/M
+mariachi/SM
+maria/M
+Maria/M
+Mariam/M
+Mariana/SM
+Marian/MS
+Marianna/M
+Marianne/M
+Mariann/M
+Mariano/M
+Maribelle/M
+Maribel/M
+Maribeth/M
+Maricela/M
+Marice/M
+Maridel/M
+Marieann/M
+Mariejeanne/M
+Mariele/M
+Marielle/M
+Mariellen/M
+Mariel/M
+Marie/M
+Marietta/M
+Mariette/M
+Marigold/M
+marigold/MS
+Marijn/M
+Marijo/M
+marijuana/SM
+Marika/M
+Marilee/M
+Marilin/M
+Marillin/M
+Marilyn/M
+marimba/SM
+Mari/MS
+marinade/MGDS
+Marina/M
+marina/MS
+marinara/SM
+marinate/NGXDS
+marination/M
+mariner/M
+Marine/S
+marine/ZRS
+Marin/M
+Marinna/M
+Marino/M
+Mario/M
+marionette/MS
+Marion/M
+Mariquilla/M
+Marisa/M
+Mariska/M
+Marisol/M
+Marissa/M
+Maritain/M
+marital/Y
+Marita/M
+maritime/R
+Maritsa/M
+Maritza/M
+Mariupol/M
+Marius/M
+Mariya/M
+Marja/M
+Marje/M
+Marjie/M
+Marji/M
+Marj/M
+marjoram/SM
+Marjorie/M
+Marjory/M
+Marjy/M
+Markab/M
+markdown/SM
+marked/AU
+markedly
+marker/M
+marketability/SM
+marketable/U
+Marketa/M
+marketeer/S
+marketer/M
+market/GSMRDJBZ
+marketing/M
+marketplace/MS
+mark/GZRDMBSJ
+Markham/M
+marking/M
+Markism/M
+markkaa
+markka/M
+Mark/MS
+Markos
+Markov
+Markovian
+Markovitz/M
+marks/A
+marksman/M
+marksmanship/S
+marksmen
+markup/SM
+Markus/M
+Marla/M
+Marlane/M
+Marlboro/M
+Marlborough/M
+Marleah/M
+Marlee/M
+Marleen/M
+Marlena/M
+Marlene/M
+Marley/M
+Marlie/M
+Marline/M
+marlinespike/SM
+Marlin/M
+marlin/SM
+marl/MDSG
+Marlo/M
+Marlon/M
+Marlowe/M
+Marlow/M
+Marlyn/M
+Marmaduke/M
+marmalade/MS
+Marmara/M
+marmoreal
+marmoset/MS
+marmot/SM
+Marna/M
+Marne/M
+Marney/M
+Marnia/M
+Marnie/M
+Marni/M
+maroon/GRDS
+marquee/MS
+Marquesas/M
+marque/SM
+marquess/MS
+marquetry/SM
+Marquette/M
+Marquez/M
+marquise/M
+marquisette/MS
+Marquis/M
+marquis/SM
+Marquita/M
+Marrakesh/M
+marred/U
+marriageability/SM
+marriageable
+marriage/ASM
+married/US
+Marrilee/M
+marring
+Marriott/M
+Marris/M
+Marrissa/M
+marrowbone/MS
+marrow/GDMS
+marry/SDGA
+mar/S
+Marseillaise/SM
+Marseilles
+Marseille's
+marshal/GMDRSZ
+Marshalled/M
+marshaller
+Marshall/GDM
+Marshalling/M
+marshallings
+Marshal/M
+Marsha/M
+marshiness/M
+marshland/MS
+Marsh/M
+marshmallow/SM
+marsh/MS
+marshy/PRT
+Marsiella/M
+Mar/SMN
+marsupial/MS
+Martainn/M
+Marta/M
+Martelle/M
+Martel/M
+marten/M
+Marten/M
+Martguerita/M
+Martha/M
+Marthe/M
+Marthena/M
+Martial
+martial/Y
+Martian/S
+Martica/M
+Martie/M
+Marti/M
+Martina/M
+martinet/SM
+Martinez/M
+martingale/MS
+martini/MS
+Martinique/M
+Martin/M
+Martino/M
+martin/SM
+Martinson/M
+Martita/M
+mart/MDNGXS
+Mart/MN
+Marty/M
+Martyn/M
+Martynne/M
+martyrdom/SM
+martyr/GDMS
+Marva/M
+marvel/DGS
+Marvell/M
+marvelous/PY
+Marve/M
+Marven/M
+Marvin/M
+Marv/NM
+Marwin/M
+Marxian/S
+Marxism/SM
+Marxist/SM
+Marx/M
+Marya/M
+Maryanna/M
+Maryanne/M
+Maryann/M
+Marybelle/M
+Marybeth/M
+Maryellen/M
+Maryjane/M
+Maryjo/M
+Maryland/MZR
+Marylee/M
+Marylinda/M
+Marylin/M
+Maryl/M
+Marylou/M
+Marylynne/M
+Mary/M
+Maryrose/M
+Marys
+Marysa/M
+marzipan/SM
+Masada/M
+Masai/M
+Masaryk/M
+masc
+Mascagni/M
+mascara/SGMD
+mascot/SM
+masculineness/M
+masculine/PYS
+masculinity/SM
+Masefield/M
+maser/M
+Maseru/M
+MASH
+Masha/M
+Mashhad/M
+mash/JGZMSRD
+m/ASK
+masked/U
+masker/M
+mask/GZSRDMJ
+masks/U
+masochism/MS
+masochistic
+masochistically
+masochist/MS
+masonic
+Masonic
+Masonite/M
+masonry/MS
+mason/SDMG
+Mason/SM
+masquerader/M
+masquerade/RSDGMZ
+masquer/M
+masque/RSMZ
+Massachusetts/M
+massacre/DRSMG
+massager/M
+massage/SRDMG
+Massasoit/M
+Massenet/M
+masseur/MS
+masseuse/SM
+Massey/M
+massif/SM
+Massimiliano/M
+Massimo/M
+massing/R
+massiveness/SM
+massive/YP
+massless
+mas/SRZ
+Mass/S
+mass/VGSD
+mastectomy/MS
+masterclass
+mastered/A
+masterfulness/M
+masterful/YP
+master/JGDYM
+masterliness/M
+masterly/P
+mastermind/GDS
+masterpiece/MS
+mastership/M
+Master/SM
+masterstroke/MS
+masterwork/S
+mastery/MS
+mast/GZSMRD
+masthead/SDMG
+masticate/SDXGN
+mastication/M
+mastic/SM
+mastiff/MS
+mastodon/MS
+mastoid/S
+masturbate/SDNGX
+masturbation/M
+masturbatory
+matador/SM
+Mata/M
+matchable/U
+match/BMRSDZGJ
+matchbook/SM
+matchbox/SM
+matched/UA
+matcher/M
+matches/A
+matchless/Y
+matchlock/MS
+matchmake/GZJR
+matchmaker/M
+matchmaking/M
+matchplay
+match's/A
+matchstick/MS
+matchwood/SM
+mated/U
+mate/IMS
+Matelda/M
+Mateo/M
+materialism/SM
+materialistic
+materialistically
+materialist/SM
+materiality/M
+materialization/SM
+materialize/CDS
+materialized/A
+materializer/SM
+materializes/A
+materializing
+materialness/M
+material/SPYM
+matériel/MS
+mater/M
+maternal/Y
+maternity/MS
+mates/U
+mathematical/Y
+Mathematica/M
+mathematician/SM
+mathematic/S
+mathematics/M
+Mathematik/M
+Mather/M
+Mathe/RM
+Mathew/MS
+Mathewson/M
+Mathian/M
+Mathias
+Mathieu/M
+Mathilda/M
+Mathilde/M
+Mathis
+math/M
+maths
+Matias/M
+Matilda/M
+Matilde/M
+matinée/S
+mating/M
+matins/M
+Matisse/SM
+matriarchal
+matriarch/M
+matriarchs
+matriarchy/MS
+matrices
+matricidal
+matricide/MS
+matriculate/XSDGN
+matriculation/M
+matrimonial/Y
+matrimony/SM
+matrix/M
+matron/YMS
+mat/SJGMDR
+Matsumoto/M
+matte/JGMZSRD
+Mattel/M
+Matteo/M
+matter/GDM
+Matterhorn/M
+Matthaeus/M
+Mattheus/M
+Matthew/MS
+Matthias
+Matthieu/M
+Matthiew/M
+Matthus/M
+Mattias/M
+Mattie/M
+Matti/M
+matting/M
+mattins's
+Matt/M
+mattock/MS
+mattress/MS
+matt's
+Matty/M
+maturate/DSNGVX
+maturational
+maturation/M
+matureness/M
+maturer/M
+mature/RSDTPYG
+maturity/MS
+matzo/SHM
+matzot
+Maude/M
+Maudie/M
+maudlin/Y
+Maud/M
+Maugham/M
+Maui/M
+mauler/M
+maul/RDGZS
+maunder/GDS
+Maupassant/M
+Maura/M
+Maureene/M
+Maureen/M
+Maure/M
+Maurene/M
+Mauriac/M
+Maurice/M
+Mauricio/M
+Maurie/M
+Maurine/M
+Maurise/M
+Maurita/M
+Mauritania/M
+Mauritanian/S
+Mauritian/S
+Mauritius/M
+Maurits/M
+Maurizia/M
+Maurizio/M
+Maurois/M
+Mauro/M
+Maury/M
+Mauser/M
+mausoleum/SM
+mauve/SM
+maven/S
+maverick/SMDG
+mavin's
+Mavis/M
+Mavra/M
+mawkishness/SM
+mawkish/PY
+Mawr/M
+maw/SGMD
+max/GDS
+Maxie/M
+maxillae
+maxilla/M
+maxillary/S
+Maxi/M
+maximality
+maximal/SY
+maxima's
+Maximilian/M
+Maximilianus/M
+Maximilien/M
+maximization/SM
+maximizer/M
+maximize/RSDZG
+Maxim/M
+Maximo/M
+maxim/SM
+maximum/MYS
+Maxine/M
+maxi/S
+Max/M
+Maxtor/M
+Maxwellian
+maxwell/M
+Maxwell/M
+Maxy/M
+Maya/MS
+Mayan/S
+Maybelle/M
+maybe/S
+mayday/S
+may/EGS
+Maye/M
+mayer
+Mayer/M
+mayest
+Mayfair/M
+Mayflower/M
+mayflower/SM
+mayfly/MS
+mayhap
+mayhem/MS
+Maynard/M
+Mayne/M
+Maynord/M
+mayn't
+Mayo/M
+mayonnaise/MS
+mayoral
+mayoralty/MS
+mayoress/MS
+Mayor/M
+mayor/MS
+mayorship/M
+mayo/S
+maypole/MS
+Maypole/SM
+Mayra/M
+May/SMR
+mayst
+Mazama/M
+Mazarin/M
+Mazatlan/M
+Mazda/M
+mazedness/SM
+mazed/YP
+maze/MGDSR
+mazurka/SM
+Mazzini/M
+Mb
+MB
+MBA
+Mbabane/M
+Mbini/M
+MC
+McAdam/MS
+McAllister/M
+McBride/M
+McCabe/M
+McCain/M
+McCall/M
+McCarthyism/M
+McCarthy/M
+McCartney/M
+McCarty/M
+McCauley/M
+McClain/M
+McClellan/M
+McClure/M
+McCluskey/M
+McConnell/M
+McCormick/M
+McCoy/SM
+McCracken/M
+McCray/M
+McCullough/M
+McDaniel/M
+McDermott/M
+McDonald/M
+McDonnell/M
+McDougall/M
+McDowell/M
+McElhaney/M
+McEnroe/M
+McFadden/M
+McFarland/M
+McGee/M
+McGill/M
+McGovern/M
+McGowan/M
+McGrath/M
+McGraw/M
+McGregor/M
+McGuffey/M
+McGuire/M
+MCI/M
+McIntosh/M
+McIntyre/M
+McKay/M
+McKee/M
+McKenzie/M
+McKesson/M
+McKinley/M
+McKinney/M
+McKnight/M
+McLanahan/M
+McLaughlin/M
+McLean/M
+McLeod/M
+McLuhan/M
+McMahon/M
+McMartin/M
+McMillan/M
+McNamara/M
+McNaughton/M
+McNeil/M
+McPherson/M
+MD
+Md/M
+mdse
+MDT
+ME
+Meade/M
+Mead/M
+meadowland
+meadowlark/SM
+meadow/MS
+Meadows
+meadowsweet/M
+mead/SM
+Meagan/M
+meagerness/SM
+meager/PY
+Meaghan/M
+meagres
+mealiness/MS
+meal/MDGS
+mealtime/MS
+mealybug/S
+mealymouthed
+mealy/PRST
+meander/JDSG
+meaneing
+meanie/MS
+meaningfulness/SM
+meaningful/YP
+meaninglessness/SM
+meaningless/PY
+meaning/M
+meanness/S
+means/M
+meantime/SM
+meant/U
+meanwhile/S
+Meany/M
+mean/YRGJTPS
+meany's
+Meara/M
+measle/SD
+measles/M
+measly/TR
+measurable/U
+measurably
+measure/BLMGRSD
+measured/Y
+measureless
+measurement/SM
+measurer/M
+measures/A
+measuring/A
+meas/Y
+meataxe
+meatball/MS
+meatiness/MS
+meatless
+meatloaf
+meatloaves
+meat/MS
+meatpacking/S
+meaty/RPT
+Mecca/MS
+mecca/S
+mechanical/YS
+mechanic/MS
+mechanism/SM
+mechanistic
+mechanistically
+mechanist/M
+mechanization/SM
+mechanized/U
+mechanizer/M
+mechanize/RSDZGB
+mechanizes/U
+mechanochemically
+Mechelle/M
+med
+medalist/MS
+medallion/MS
+medal/SGMD
+Medan/M
+meddle/GRSDZ
+meddlesome
+Medea/M
+Medellin
+Medfield/M
+mediaeval's
+medial/AY
+medials
+median/YMS
+media/SM
+mediateness/M
+mediate/PSDYVNGX
+mediation/ASM
+mediator/SM
+Medicaid/SM
+medical/YS
+medicament/MS
+Medicare/MS
+medicate/DSXNGV
+medication/M
+Medici/MS
+medicinal/SY
+medicine/DSMG
+medico/SM
+medic/SM
+medievalist/MS
+medieval/YMS
+Medina/M
+mediocre
+mediocrity/MS
+meditate/NGVXDS
+meditation/M
+meditativeness/M
+meditative/PY
+Mediterranean/MS
+mediumistic
+medium/SM
+medley/SM
+medulla/SM
+Medusa/M
+meed/MS
+meekness/MS
+meek/TPYR
+meerschaum/MS
+meeter/M
+meetinghouse/S
+meeting/M
+meet/JGSYR
+me/G
+mega
+megabit/MS
+megabuck/S
+megabyte/S
+megacycle/MS
+megadeath/M
+megadeaths
+megahertz/M
+megalithic
+megalith/M
+megaliths
+megalomaniac/SM
+megalomania/SM
+megalopolis/SM
+Megan/M
+megaphone/SDGM
+megaton/MS
+megavolt/M
+megawatt/SM
+megaword/S
+Megen/M
+Meggie/M
+Meggi/M
+Meggy/M
+Meghan/M
+Meghann/M
+Meg/MN
+megohm/MS
+Mehetabel/M
+Meier/M
+Meighen/M
+Meiji/M
+Mei/MR
+meioses
+meiosis/M
+meiotic
+Meir/M
+Meister/M
+Meistersinger/M
+Mejia/M
+Mekong/M
+Mela/M
+Melamie/M
+melamine/SM
+melancholia/SM
+melancholic/S
+melancholy/MS
+Melanesia/M
+Melanesian/S
+melange/S
+Melania/M
+Melanie/M
+melanin/MS
+melanoma/SM
+Melantha/M
+Melany/M
+Melba/M
+Melbourne/M
+Melcher/M
+Melchior/M
+meld/SGD
+mêlée/MS
+Melendez/M
+Melesa/M
+Melessa/M
+Melicent/M
+Melina/M
+Melinda/M
+Melinde/M
+meliorate/XSDVNG
+melioration/M
+Melisa/M
+Melisande/M
+Melisandra/M
+Melisenda/M
+Melisent/M
+Melissa/M
+Melisse/M
+Melita/M
+Melitta/M
+Mella/M
+Mellicent/M
+Mellie/M
+mellifluousness/SM
+mellifluous/YP
+Melli/M
+Mellisa/M
+Mellisent/M
+Melloney/M
+Mellon/M
+mellowness/MS
+mellow/TGRDYPS
+Melly/M
+Mel/MY
+Melodee/M
+melodically
+melodic/S
+Melodie/M
+melodiousness/S
+melodious/YP
+melodrama/SM
+melodramatically
+melodramatic/S
+Melody/M
+melody/MS
+Melonie/M
+melon/MS
+Melony/M
+Melosa/M
+Melpomene/M
+meltdown/S
+melter/M
+melting/Y
+Melton/M
+melt/SAGD
+Melva/M
+Melville/M
+Melvin/M
+Melvyn/M
+Me/M
+member/DMS
+membered/AE
+members/EA
+membership/SM
+membrane/MSD
+membranous
+memento/SM
+Memling/M
+memoir/MS
+memorabilia
+memorability/SM
+memorableness/M
+memorable/P
+memorably
+memorandum/SM
+memorialize/DSG
+memorialized/U
+memorial/SY
+memoriam
+memorization/MS
+memorized/U
+memorizer/M
+memorize/RSDZG
+memorizes/A
+memoryless
+memory/MS
+memo/SM
+Memphis/M
+menace/GSD
+menacing/Y
+menagerie/SM
+menage/S
+Menander/M
+menarche/MS
+Menard/M
+Mencius/M
+Mencken/M
+mendaciousness/M
+mendacious/PY
+mendacity/MS
+Mendeleev/M
+mendelevium/SM
+Mendelian
+Mendel/M
+Mendelssohn/M
+mender/M
+Mendez/M
+mendicancy/MS
+mendicant/S
+Mendie/M
+mending/M
+Mendocino/M
+Mendoza/M
+mend/RDSJGZ
+Mendy/M
+Menelaus/M
+Menes/M
+menfolk/S
+menhaden/M
+menial/YS
+meningeal
+meninges
+meningitides
+meningitis/M
+meninx
+menisci
+meniscus/M
+Menkalinan/M
+Menkar/M
+Menkent/M
+Menlo/M
+men/MS
+Mennonite/SM
+Menominee
+menopausal
+menopause/SM
+menorah/M
+menorahs
+Menotti/M
+Mensa/M
+Mensch/M
+mensch/S
+menservants/M
+mens/SDG
+menstrual
+menstruate/NGDSX
+menstruation/M
+mensurable/P
+mensuration/MS
+menswear/M
+mentalist/MS
+mentality/MS
+mental/Y
+mentholated
+menthol/SM
+mentionable/U
+mentioned/U
+mentioner/M
+mention/ZGBRDS
+mentor/DMSG
+Menuhin/M
+menu/SM
+Menzies/M
+meow/DSG
+Mephistopheles/M
+Merak/M
+Mercado/M
+mercantile
+Mercator/M
+Mercedes
+mercenariness/M
+mercenary/SMP
+mercerize/SDG
+Mercer/M
+mercer/SM
+merchandiser/M
+merchandise/SRDJMZG
+merchantability
+merchantman/M
+merchantmen
+merchant/SBDMG
+Mercie/M
+mercifully/U
+mercifulness/M
+merciful/YP
+mercilessness/SM
+merciless/YP
+Merci/M
+Merck/M
+mercurial/SPY
+mercuric
+Mercurochrome/M
+mercury/MS
+Mercury/MS
+Mercy/M
+mercy/SM
+Meredeth/M
+Meredithe/M
+Meredith/M
+Merell/M
+meretriciousness/SM
+meretricious/YP
+mere/YS
+merganser/MS
+merger/M
+merge/SRDGZ
+Meridel/M
+meridian/MS
+meridional
+Meridith/M
+Meriel/M
+Merilee/M
+Merill/M
+Merilyn/M
+meringue/MS
+merino/MS
+Meris
+Merissa/M
+merited/U
+meritocracy/MS
+meritocratic
+meritocrats
+meritoriousness/MS
+meritorious/PY
+merit/SCGMD
+Meriwether/M
+Merla/M
+Merle/M
+Merlina/M
+Merline/M
+merlin/M
+Merlin/M
+Merl/M
+mermaid/MS
+merman/M
+mermen
+Merna/M
+Merola/M
+meromorphic
+Merralee/M
+Merrel/M
+Merriam/M
+Merrick/M
+Merridie/M
+Merrielle/M
+Merrie/M
+Merrilee/M
+Merrile/M
+Merrili/M
+Merrill/M
+merrily
+Merrily/M
+Merrimack/M
+Merrimac/M
+merriment/MS
+merriness/S
+Merritt/M
+Merry/M
+merrymaker/MS
+merrymaking/SM
+merry/RPT
+Mersey/M
+mer/TGDR
+Merton/M
+Mervin/M
+Merv/M
+Merwin/M
+Merwyn/M
+Meryl/M
+Mesa
+Mesabi/M
+mesa/SM
+mescaline/SM
+mescal/SM
+mesdames/M
+mesdemoiselles/M
+Meshed's
+meshed/U
+mesh/GMSD
+mesmeric
+mesmerism/SM
+mesmerized/U
+mesmerizer/M
+mesmerize/SRDZG
+Mesolithic/M
+mesomorph/M
+mesomorphs
+meson/MS
+Mesopotamia/M
+Mesopotamian/S
+mesosphere/MS
+mesozoic
+Mesozoic
+mesquite/MS
+mes/S
+message/SDMG
+messeigneurs
+messenger/GSMD
+Messerschmidt/M
+mess/GSDM
+Messiaen/M
+messiah
+Messiah/M
+messiahs
+Messiahs
+messianic
+Messianic
+messieurs/M
+messily
+messiness/MS
+messmate/MS
+Messrs/M
+messy/PRT
+mestizo/MS
+meta
+metabolic
+metabolically
+metabolism/MS
+metabolite/SM
+metabolize/GSD
+metacarpal/S
+metacarpi
+metacarpus/M
+metacircular
+metacircularity
+metalanguage/MS
+metalization/SM
+metalized
+metallic/S
+metalliferous
+metallings
+metallography/M
+metalloid/M
+metallurgic
+metallurgical/Y
+metallurgist/S
+metallurgy/MS
+metal/SGMD
+metalsmith/MS
+metalworking/M
+metalwork/RMJGSZ
+Meta/M
+metamathematical
+metamorphic
+metamorphism/SM
+metamorphose/GDS
+metamorphosis/M
+metaphoric
+metaphorical/Y
+metaphor/MS
+metaphosphate/M
+metaphysical/Y
+metaphysic/SM
+metastability/M
+metastable
+metastases
+metastasis/M
+metastasize/DSG
+metastatic
+metatarsal/S
+metatarsi
+metatarsus/M
+metatheses
+metathesis/M
+metathesized
+metathesizes
+metathesizing
+metavariable
+metempsychoses
+metempsychosis/M
+meteoric
+meteorically
+meteorite/SM
+meteoritic/S
+meteoritics/M
+meteoroid/SM
+meteorologic
+meteorological
+meteorologist/S
+meteorology/MS
+meteor/SM
+meter/GDM
+mete/ZDGSR
+methadone/SM
+methane/MS
+methanol/SM
+methinks
+methionine/M
+methodicalness/SM
+methodical/YP
+methodism
+Methodism/SM
+methodist/MS
+Methodist/MS
+method/MS
+methodological/Y
+methodologists
+methodology/MS
+methought
+Methuen/M
+Methuselah/M
+Methuselahs
+methylated
+methylene/M
+methyl/SM
+meticulousness/MS
+meticulous/YP
+métier/S
+metonymy/M
+Metrecal/M
+metrical/Y
+metricate/SDNGX
+metricize/GSD
+metrics/M
+metric/SM
+metronome/MS
+metropolis/SM
+metropolitanization
+metropolitan/S
+metro/SM
+mets
+Metternich/M
+mettle/SDM
+mettlesome
+met/U
+Metzler/M
+Meuse/M
+mewl/GSD
+mew/SGD
+mews/SM
+Mex
+Mexicali/M
+Mexican/S
+Mexico/M
+Meyerbeer/M
+Meyer/SM
+mezzanine/MS
+mezzo/S
+MFA
+mfg
+mfr/S
+mg
+M/GB
+Mg/M
+MGM/M
+mgr
+Mgr
+MHz
+MI
+MIA
+Mia/M
+Miami/SM
+Miaplacidus/M
+miasmal
+miasma/SM
+Micaela/M
+Micah/M
+mica/MS
+micelles
+mice/M
+Michaela/M
+Michaelangelo/M
+Michaelina/M
+Michaeline/M
+Michaella/M
+Michaelmas/MS
+Michael/SM
+Michaelson/M
+Michail/M
+Michale/M
+Michal/M
+Micheal/M
+Micheil/M
+Michelangelo/M
+Michele/M
+Michelina/M
+Micheline/M
+Michelin/M
+Michelle/M
+Michell/M
+Michel/M
+Michelson/M
+Michigander/S
+Michiganite/S
+Michigan/M
+Mich/M
+Mickelson/M
+Mickey/M
+mickey/SM
+Mickie/M
+Micki/M
+Mick/M
+Micky/M
+Mic/M
+Micmac/M
+micra's
+microamp
+microanalysis/M
+microanalytic
+microbe/MS
+microbial
+microbicidal
+microbicide/M
+microbiological
+microbiologist/MS
+microbiology/SM
+microbrewery/S
+microchemistry/M
+microchip/S
+microcircuit/MS
+microcode/GSD
+microcomputer/MS
+microcosmic
+microcosm/MS
+microdensitometer
+microdot/MS
+microeconomic/S
+microeconomics/M
+microelectronic/S
+microelectronics/M
+microfiber/S
+microfiche/M
+microfilm/DRMSG
+microfossils
+micrography/M
+microgroove/MS
+microhydrodynamics
+microinstruction/SM
+microjoule
+microlevel
+microlight/S
+micromanage/GDSL
+micromanagement/S
+micrometeorite/MS
+micrometeoritic
+micrometer/SM
+Micronesia/M
+Micronesian/S
+micron/MS
+microorganism/SM
+microphone/SGM
+Microport/M
+microprocessing
+microprocessor/SM
+microprogrammed
+microprogramming
+microprogram/SM
+micro/S
+microscope/SM
+microscopic
+microscopical/Y
+microscopy/MS
+microsecond/MS
+microsimulation/S
+Microsystems
+micros/M
+Microsoft/M
+microsomal
+microstore
+microsurgery/SM
+MicroVAXes
+MicroVAX/M
+microvolt/SM
+microwaveable
+microwave/BMGSD
+microword/S
+midair/MS
+midas
+Midas/M
+midband/M
+midday/MS
+midden/SM
+middest
+middlebrow/SM
+Middlebury/M
+middle/GJRSD
+middleman/M
+middlemen
+middlemost
+Middlesex/M
+Middleton/M
+Middletown/M
+middleweight/SM
+middling/Y
+middy/SM
+Mideastern
+Mideast/M
+midfield/RM
+Midge/M
+midge/SM
+midget/MS
+midi/S
+midland/MRS
+Midland/MS
+midlife
+midlives
+midmorn/G
+midmost/S
+midnight/SYM
+midpoint/MS
+midrange
+midrib/MS
+midriff/MS
+mid/S
+midscale
+midsection/M
+midshipman/M
+midshipmen
+midship/S
+midspan
+midstream/MS
+midst/SM
+midsummer/MS
+midterm/MS
+midtown/MS
+Midway/M
+midway/S
+midweek/SYM
+Midwesterner/M
+Midwestern/ZR
+Midwest/M
+midwicket
+midwifery/SM
+midwife/SDMG
+midwinter/YMS
+midwives
+midyear/MS
+mien/M
+miff/GDS
+mightily
+mightiness/MS
+mightn't
+might/S
+mighty/TPR
+mignon
+mignonette/SM
+Mignon/M
+Mignonne/M
+migraine/SM
+migrant/MS
+migrate/ASDG
+migration/MS
+migrative
+migratory/S
+MIG/S
+Miguela/M
+Miguelita/M
+Miguel/M
+mikado/MS
+Mikaela/M
+Mikael/M
+mike/DSMG
+Mikel/M
+Mike/M
+Mikey/M
+Mikhail/M
+Mikkel/M
+Mikol/M
+Mikoyan/M
+milady/MS
+Milagros/M
+Milanese
+Milan/M
+milch/M
+mildew/DMGS
+mildness/MS
+Mildred/M
+Mildrid/M
+mild/STYRNP
+mileage/SM
+Milena/M
+milepost/SM
+miler/M
+mile/SM
+Mile/SM
+milestone/MS
+Milford/M
+Milicent/M
+milieu/SM
+Milissent/M
+militancy/MS
+militantness/M
+militant/YPS
+militarily
+militarism/SM
+militaristic
+militarist/MS
+militarization/SCM
+militarize/SDCG
+military
+militate/SDG
+militiaman/M
+militiamen
+militia/SM
+Milka/M
+Milken/M
+milker/M
+milk/GZSRDM
+milkiness/MS
+milkmaid/SM
+milkman/M
+milkmen
+milkshake/S
+milksop/SM
+milkweed/MS
+milky/RPT
+millage/S
+Millard/M
+Millay/M
+millenarian
+millenarianism/M
+millennial
+millennialism
+millennium/MS
+millepede's
+miller/M
+Miller/M
+Millet/M
+millet/MS
+milliamp
+milliampere/S
+milliard/MS
+millibar/MS
+Millicent/M
+millidegree/S
+Millie/M
+milligram/MS
+millijoule/S
+Millikan/M
+milliliter/MS
+Milli/M
+millimeter/SM
+milliner/SM
+millinery/MS
+milling/M
+millionaire/MS
+million/HDMS
+millionth/M
+millionths
+millipede/SM
+millisecond/MS
+Millisent/M
+millivoltmeter/SM
+millivolt/SM
+milliwatt/S
+millpond/MS
+millrace/SM
+mill/SGZMRD
+Mill/SMR
+millstone/SM
+millstream/SM
+millwright/MS
+Milly/M
+mil/MRSZ
+Mil/MY
+Milne/M
+Milo/M
+Milquetoast/S
+milquetoast/SM
+Miltiades/M
+Miltie/M
+Milt/M
+milt/MDSG
+Miltonic
+Milton/M
+Miltown/M
+Milty/M
+Milwaukee/M
+Milzie/M
+MIMD
+mime/DSRMG
+mimeograph/GMDS
+mimeographs
+mimer/M
+mimesis/M
+mimetic
+mimetically
+mimicked
+mimicker/SM
+mimicking
+mimicry/MS
+mimic/S
+Mimi/M
+mi/MNX
+Mimosa/M
+mimosa/SM
+Mina/M
+minaret/MS
+minatory
+mincemeat/MS
+mincer/M
+mince/SRDGZJ
+mincing/Y
+Minda/M
+Mindanao/M
+mind/ARDSZG
+mindbogglingly
+minded/P
+minder/M
+mindfully
+mindfulness/MS
+mindful/U
+mindlessness/SM
+mindless/YP
+Mindoro/M
+min/DRZGJ
+mind's
+mindset/S
+Mindy/M
+minefield/MS
+mineralization/C
+mineralized/U
+mineralogical
+mineralogist/SM
+mineralogy/MS
+mineral/SM
+miner/M
+Miner/M
+Minerva/M
+mineshaft
+mine/SNX
+minestrone/MS
+minesweeper/MS
+Minetta/M
+Minette/M
+mineworkers
+mingle/SDG
+Ming/M
+Mingus/M
+miniature/GMSD
+miniaturist/SM
+miniaturization/MS
+miniaturize/SDG
+minibike/S
+minibus/SM
+minicab/M
+minicam/MS
+minicomputer/SM
+minidress/SM
+minify/GSD
+minimalism/S
+minimalistic
+minimalist/MS
+minimality
+minimal/SY
+minima's
+minimax/M
+minimization/MS
+minimized/U
+minimizer/M
+minimize/RSDZG
+minim/SM
+minimum/MS
+mining/M
+minion/M
+mini/S
+miniseries
+miniskirt/MS
+ministerial/Y
+minister/MDGS
+ministrant/S
+ministration/SM
+ministry/MS
+minivan/S
+miniver/M
+minke
+mink/SM
+Min/MR
+Minna/M
+Minnaminnie/M
+Minneapolis/M
+Minne/M
+minnesinger/MS
+Minnesota/M
+Minnesotan/S
+Minnie/M
+Minni/M
+Minn/M
+Minnnie/M
+minnow/SM
+Minny/M
+Minoan/S
+Minolta/M
+minor/DMSG
+minority/MS
+Minor/M
+Minos
+Minotaur/M
+minotaur/S
+Minot/M
+minoxidil/S
+Minsk/M
+Minsky/M
+minster/SM
+minstrel/SM
+minstrelsy/MS
+mintage/SM
+Mintaka/M
+Minta/M
+minter/M
+mint/GZSMRD
+minty/RT
+minuend/SM
+minuet/SM
+Minuit/M
+minuscule/SM
+minus/S
+minuteman
+Minuteman/M
+minutemen
+minuteness/SM
+minute/RSDPMTYG
+minutiae
+minutia/M
+minx/MS
+Miocene
+MIPS
+Miquela/M
+Mirabeau/M
+Mirabella/M
+Mirabelle/M
+Mirabel/M
+Mirach/M
+miracle/MS
+miraculousness/M
+miraculous/PY
+mirage/GSDM
+Mira/M
+Miranda/M
+Miran/M
+Mireielle/M
+Mireille/M
+Mirella/M
+Mirelle/M
+mire/MGDS
+Mirfak/M
+Miriam/M
+Mirilla/M
+Mir/M
+Mirna/M
+Miro
+mirror/DMGS
+mirthfulness/SM
+mirthful/PY
+mirthlessness/M
+mirthless/YP
+mirth/M
+mirths
+MIRV/DSG
+miry/RT
+Mirzam/M
+misaddress/SDG
+misadventure/SM
+misalign/DSGL
+misalignment/MS
+misalliance/MS
+misanalysed
+misanthrope/MS
+misanthropic
+misanthropically
+misanthropist/S
+misanthropy/SM
+misapplier/M
+misapply/GNXRSD
+misapprehend/GDS
+misapprehension/MS
+misappropriate/GNXSD
+misbegotten
+misbehaver/M
+misbehave/RSDG
+misbehavior/SM
+misbrand/DSG
+misc
+miscalculate/XGNSD
+miscalculation/M
+miscall/SDG
+miscarriage/MS
+miscarry/SDG
+miscast/GS
+miscegenation/SM
+miscellanea
+miscellaneous/PY
+miscellany/MS
+Mischa/M
+mischance/MGSD
+mischief/MDGS
+mischievousness/MS
+mischievous/PY
+miscibility/S
+miscible/C
+misclassification/M
+misclassified
+misclassifying
+miscode/SDG
+miscommunicate/NDS
+miscomprehended
+misconceive/GDS
+misconception/MS
+misconduct/GSMD
+misconfiguration
+misconstruction/MS
+misconstrue/DSG
+miscopying
+miscount/DGS
+miscreant/MS
+miscue/MGSD
+misdeal/SG
+misdealt
+misdeed/MS
+misdemeanant/SM
+misdemeanor/SM
+misdiagnose/GSD
+misdid
+misdirect/GSD
+misdirection/MS
+misdirector/S
+misdoes
+misdo/JG
+misdone
+miserableness/SM
+miserable/SP
+miserably
+miser/KM
+miserliness/MS
+miserly/P
+misery/MS
+mises/KC
+misfeasance/MS
+misfeature/M
+misfield
+misfile/SDG
+misfire/SDG
+misfit/MS
+misfitted
+misfitting
+misfortune/SM
+misgauge/GDS
+misgiving/MYS
+misgovern/LDGS
+misgovernment/S
+misguidance/SM
+misguidedness/M
+misguided/PY
+misguide/DRSG
+misguider/M
+Misha/M
+mishandle/SDG
+mishap/MS
+mishapped
+mishapping
+misheard
+mishear/GS
+mishitting
+mishmash/SM
+misidentification/M
+misidentify/GNSD
+misinformation/SM
+misinform/GDS
+misinterpretation/MS
+misinterpreter/M
+misinterpret/RDSZG
+misjudge/DSG
+misjudging/Y
+misjudgment/MS
+Miskito
+mislabel/DSG
+mislaid
+mislay/GS
+misleader/M
+mislead/GRJS
+misleading/Y
+misled
+mismanage/LGSD
+mismanagement/MS
+mismatch/GSD
+misname/GSD
+misnomer/GSMD
+misogamist/MS
+misogamy/MS
+misogynistic
+misogynist/MS
+misogynous
+misogyny/MS
+misperceive/SD
+misplace/GLDS
+misplacement/MS
+misplay/GSD
+mispositioned
+misprint/SGDM
+misprision/SM
+mispronounce/DSG
+mispronunciation/MS
+misquotation/MS
+misquote/GDS
+misreader/M
+misread/RSGJ
+misrelated
+misremember/DG
+misreport/DGS
+misrepresentation/MS
+misrepresenter/M
+misrepresent/SDRG
+misroute/DS
+misrule/SDG
+missal/ESM
+misshape/DSG
+misshapenness/SM
+misshapen/PY
+Missie/M
+missile/MS
+missilery/SM
+mission/AMS
+missionary/MS
+missioned
+missioner/SM
+missioning
+missis's
+Mississauga/M
+Mississippian/S
+Mississippi/M
+missive/MS
+Missoula/M
+Missourian/S
+Missouri/M
+misspeak/SG
+misspecification
+misspecified
+misspelling/M
+misspell/SGJD
+misspend/GS
+misspent
+misspoke
+misspoken
+mis/SRZ
+miss/SDEGV
+Miss/SM
+misstate/GLDRS
+misstatement/MS
+misstater/M
+misstep/MS
+misstepped
+misstepping
+missus/SM
+Missy/M
+mistakable/U
+mistake/BMGSR
+mistaken/Y
+mistaker/M
+mistaking/Y
+Mistassini/M
+mister/GDM
+Mister/SM
+mistily
+Misti/M
+mistime/GSD
+mistiness/S
+mistletoe/MS
+mist/MRDGZS
+mistook
+mistral/MS
+mistranslated
+mistranslates
+mistranslating
+mistranslation/SM
+mistreat/DGSL
+mistreatment/SM
+Mistress/MS
+mistress/MSY
+mistrial/SM
+mistruster/M
+mistrustful/Y
+mistrust/SRDG
+Misty/M
+mistype/SDGJ
+misty/PRT
+misunderstander/M
+misunderstanding/M
+misunderstand/JSRZG
+misunderstood
+misuser/M
+misuse/RSDMG
+miswritten
+Mitchael/M
+Mitchell/M
+Mitchel/M
+Mitch/M
+miterer/M
+miter/GRDM
+mite/SRMZ
+Mitford/M
+Mithra/M
+Mithridates/M
+mitigated/U
+mitigate/XNGVDS
+mitigation/M
+MIT/M
+mitoses
+mitosis/M
+mitotic
+MITRE/SM
+Mitsubishi/M
+mitten/M
+Mitterrand/M
+mitt/XSMN
+Mitty/M
+Mitzi/M
+mitzvahs
+mixable
+mix/AGSD
+mixed/U
+mixer/SM
+mixture/SM
+Mizar/M
+mizzenmast/SM
+mizzen/MS
+Mk
+mks
+ml
+Mlle/M
+mm
+MM
+MMe
+Mme/SM
+MN
+mnemonically
+mnemonics/M
+mnemonic/SM
+Mnemosyne/M
+Mn/M
+MO
+moan/GSZRDM
+moat/SMDG
+mobbed
+mobber
+mobbing
+mobcap/SM
+Mobile/M
+mobile/S
+mobility/MS
+mobilizable
+mobilization/AMCS
+mobilize/CGDS
+mobilized/U
+mobilizer/MS
+mobilizes/A
+Mobil/M
+mob/MS
+mobster/MS
+Mobutu/M
+moccasin/SM
+mocha/SM
+mockers/M
+mockery/MS
+mock/GZSRD
+mockingbird/MS
+mocking/Y
+mo/CSK
+modality/MS
+modal/Y
+modeled/A
+modeler/M
+modeling/M
+models/A
+model/ZGSJMRD
+mode/MS
+modem/SM
+moderated/U
+moderateness/SM
+moderate/PNGDSXY
+moderation/M
+moderator/MS
+modernism/MS
+modernistic
+modernist/S
+modernity/SM
+modernization/MS
+modernized/U
+modernizer/M
+modernize/SRDGZ
+modernizes/U
+modernness/SM
+modern/PTRYS
+Modesta/M
+Modestia/M
+Modestine/M
+Modesto/M
+modest/TRY
+Modesty/M
+modesty/MS
+modicum/SM
+modifiability/M
+modifiableness/M
+modifiable/U
+modification/M
+modified/U
+modifier/M
+modify/NGZXRSD
+Modigliani/M
+modishness/MS
+modish/YP
+mod/TSR
+Modula/M
+modularity/SM
+modularization
+modularize/SDG
+modular/SY
+modulate/ADSNCG
+modulation/CMS
+modulator/ACSM
+module/SM
+moduli
+modulo
+modulus/M
+modus
+Moe/M
+Moen/M
+Mogadiscio's
+Mogadishu
+mogul/MS
+Mogul/MS
+mohair/SM
+Mohamed/M
+Mohammad/M
+Mohammedanism/MS
+Mohammedan/SM
+Mohammed's
+Mohandas/M
+Mohandis/M
+Mohawk/MS
+Mohegan/S
+Mohican's
+Moho/M
+Mohorovicic/M
+Mohr/M
+moiety/MS
+moil/SGD
+Moina/M
+Moines/M
+Moira/M
+moire/MS
+Moise/MS
+Moiseyev/M
+Moishe/M
+moistener/M
+moisten/ZGRD
+moistness/MS
+moist/TXPRNY
+moisture/MS
+moisturize/GZDRS
+Mojave/M
+molal
+molarity/SM
+molar/MS
+molasses/MS
+Moldavia/M
+Moldavian/S
+moldboard/SM
+molder/DG
+moldiness/SM
+molding/M
+mold/MRDJSGZ
+Moldova
+moldy/PTR
+molecularity/SM
+molecular/Y
+molecule/MS
+molehill/SM
+mole/MTS
+moleskin/MS
+molestation/SM
+molested/U
+molester/M
+molest/RDZGS
+Moliere
+Molina/M
+Moline/M
+Mollee/M
+Mollie/M
+mollification/M
+mollify/XSDGN
+Molli/M
+Moll/M
+moll/MS
+mollusc's
+mollusk/S
+mollycoddler/M
+mollycoddle/SRDG
+Molly/M
+molly/SM
+Molnar/M
+Moloch/M
+Molokai/M
+Molotov/M
+molter/M
+molt/RDNGZS
+Moluccas
+molybdenite/M
+molybdenum/MS
+Mombasa/M
+momenta
+momentarily
+momentariness/SM
+momentary/P
+moment/MYS
+momentousness/MS
+momentous/YP
+momentum/SM
+momma/S
+Mommy/M
+mommy/SM
+Mo/MN
+mom/SM
+Monaco/M
+monadic
+monad/SM
+Monah/M
+Mona/M
+monarchic
+monarchical
+monarchism/MS
+monarchistic
+monarchist/MS
+monarch/M
+monarchs
+monarchy/MS
+Monash/M
+monastery/MS
+monastical/Y
+monasticism/MS
+monastic/S
+monaural/Y
+Mondale/M
+Monday/MS
+Mondrian/M
+Monegasque/SM
+Monera/M
+monetarily
+monetarism/S
+monetarist/MS
+monetary
+monetization/CMA
+monetize/CGADS
+Monet/M
+moneybag/SM
+moneychangers
+moneyer/M
+moneylender/SM
+moneymaker/MS
+moneymaking/MS
+money/SMRD
+Monfort/M
+monger/SGDM
+Mongolia/M
+Mongolian/S
+Mongolic/M
+mongolism/SM
+mongoloid/S
+Mongoloid/S
+Mongol/SM
+mongoose/SM
+mongrel/SM
+Monica/M
+monies/M
+Monika/M
+moniker/MS
+Monique/M
+monism/MS
+monist/SM
+monition/SM
+monitored/U
+monitor/GSMD
+monitory/S
+monkeyshine/S
+monkey/SMDG
+monkish
+Monk/M
+monk/MS
+monkshood/SM
+Monmouth/M
+monochromatic
+monochromator
+monochrome/MS
+monocle/SDM
+monoclinic
+monoclonal/S
+monocotyledonous
+monocotyledon/SM
+monocular/SY
+monodic
+monodist/S
+monody/MS
+monogamist/MS
+monogamous/PY
+monogamy/MS
+monogrammed
+monogramming
+monogram/MS
+monograph/GMDS
+monographs
+monolingualism
+monolingual/S
+monolithic
+monolithically
+monolith/M
+monoliths
+monologist/S
+monologue/GMSD
+monomaniacal
+monomaniac/MS
+monomania/MS
+monomeric
+monomer/SM
+monomial/SM
+mono/MS
+Monongahela/M
+mononuclear
+mononucleoses
+mononucleosis/M
+monophonic
+monoplane/MS
+monopole/S
+monopolistic
+monopolist/MS
+monopolization/MS
+monopolized/U
+monopolize/GZDSR
+monopolizes/U
+monopoly/MS
+monorail/SM
+monostable
+monosyllabic
+monosyllable/MS
+monotheism/SM
+monotheistic
+monotheist/S
+monotone/SDMG
+monotonic
+monotonically
+monotonicity
+monotonousness/MS
+monotonous/YP
+monotony/MS
+monovalent
+monoxide/SM
+Monroe/M
+Monro/M
+Monrovia/M
+Monsanto/M
+monseigneur
+monsieur/M
+Monsignori
+Monsignor/MS
+monsignor/S
+Mon/SM
+monsoonal
+monsoon/MS
+monster/SM
+monstrance/ASM
+monstrosity/SM
+monstrousness/M
+monstrous/YP
+montage/SDMG
+Montague/M
+Montaigne/M
+Montana/M
+Montanan/MS
+Montcalm/M
+Montclair/M
+Monte/M
+Montenegrin
+Montenegro/M
+Monterey/M
+Monterrey/M
+Montesquieu/M
+Montessori/M
+Monteverdi/M
+Montevideo/M
+Montezuma
+Montgomery/M
+monthly/S
+month/MY
+months
+Monticello/M
+Monti/M
+Mont/M
+Montmartre/M
+Montoya/M
+Montpelier/M
+Montrachet/M
+Montreal/M
+Montserrat/M
+Monty/M
+monumentality/M
+monumental/Y
+monument/DMSG
+mooch/ZSRDG
+moodily
+moodiness/MS
+mood/MS
+Moody/M
+moody/PTR
+Moog
+moo/GSD
+moonbeam/SM
+Mooney/M
+moon/GDMS
+moonless
+moonlight/GZDRMS
+moonlighting/M
+moonlit
+Moon/M
+moonscape/MS
+moonshiner/M
+moonshine/SRZM
+moonshot/MS
+moonstone/SM
+moonstruck
+moonwalk/SDG
+Moore/M
+moor/GDMJS
+mooring/M
+Moorish
+moorland/MS
+Moor/MS
+moose/M
+moot/RDGS
+moped/MS
+moper/M
+mope/S
+mopey
+mopier
+mopiest
+mopish
+mopped
+moppet/MS
+mopping
+mop/SZGMDR
+moraine/MS
+morale/MS
+Morales/M
+moralistic
+moralistically
+moralist/MS
+morality/UMS
+moralization/CS
+moralize/CGDRSZ
+moralled
+moraller
+moralling
+moral/SMY
+Mora/M
+Moran/M
+morass/SM
+moratorium/SM
+Moravia/M
+Moravian
+moray/SM
+morbidity/SM
+morbidness/S
+morbid/YP
+mordancy/MS
+mordant/GDYS
+Mordecai/M
+Mord/M
+Mordred/M
+Mordy/M
+more/DSN
+Moreen/M
+Morehouse/M
+Moreland/M
+morel/SM
+More/M
+Morena/M
+Moreno/M
+moreover
+Morey/M
+Morgana/M
+Morganica/M
+Morgan/MS
+Morganne/M
+morgen/M
+Morgen/M
+morgue/SM
+Morgun/M
+Moria/M
+Moriarty/M
+moribundity/M
+moribund/Y
+Morie/M
+Morin/M
+morion/M
+Morison/M
+Morissa/M
+Morita/M
+Moritz/M
+Morlee/M
+Morley/M
+Morly/M
+Mormonism/MS
+Mormon/SM
+Morna/M
+morning/MY
+morn/SGJDM
+Moroccan/S
+Morocco/M
+morocco/SM
+Moro/M
+moronic
+moronically
+Moroni/M
+moron/SM
+moroseness/MS
+morose/YP
+morpheme/DSMG
+morphemic/S
+Morpheus/M
+morph/GDJ
+morphia/S
+morphine/MS
+morphism/MS
+morphologic
+morphological/Y
+morphology/MS
+morphophonemic/S
+morphophonemics/M
+morphs
+Morrie/M
+morris
+Morris/M
+Morrison/M
+Morristown/M
+Morrow/M
+morrow/MS
+Morry/M
+morsel/GMDS
+Morse/M
+mortality/SM
+mortal/SY
+mortarboard/SM
+mortar/GSDM
+Morten/M
+mortgageable
+mortgagee/SM
+mortgage/MGDS
+mortgagor/SM
+mortice's
+mortician/SM
+Mortie/M
+mortification/M
+mortified/Y
+mortifier/M
+mortify/DRSXGN
+Mortimer/M
+mortise/MGSD
+Mort/MN
+Morton/M
+mortuary/MS
+Morty/M
+Mosaic
+mosaicked
+mosaicking
+mosaic/MS
+Moscone/M
+Moscow/M
+Moseley/M
+Moselle/M
+Mose/MSR
+Moser/M
+mosey/SGD
+Moshe/M
+Moslem's
+Mosley/M
+mosque/SM
+mosquitoes
+mosquito/M
+mos/S
+mossback/MS
+Mossberg/M
+Moss/M
+moss/SDMG
+mossy/SRT
+most/SY
+Mosul/M
+mote/ASCNK
+motel/MS
+mote's
+motet/SM
+mothball/DMGS
+motherboard/MS
+motherfucker/MS!
+motherfucking/!
+motherhood/SM
+mothering/M
+motherland/SM
+motherless
+motherliness/MS
+motherly/P
+mother/RDYMZG
+moths
+moth/ZMR
+motif/MS
+motile/S
+motility/MS
+motional/K
+motioner/M
+motion/GRDMS
+motionlessness/S
+motionless/YP
+motion's/ACK
+motions/K
+motivated/U
+motivate/XDSNGV
+motivational/Y
+motivation/M
+motivator/S
+motiveless
+motive/MGSD
+motley/S
+motlier
+motliest
+mot/MSV
+motocross/SM
+motorbike/SDGM
+motorboat/MS
+motorcade/MSDG
+motorcar/MS
+motorcycle/GMDS
+motorcyclist/SM
+motor/DMSG
+motoring/M
+motorist/SM
+motorization/SM
+motorize/DSG
+motorized/U
+motorman/M
+motormen
+motormouth
+motormouths
+Motorola/M
+motorway/SM
+Motown/M
+mottle/GSRD
+mottler/M
+Mott/M
+mottoes
+motto/M
+moue/DSMG
+moulder/DSG
+moult/GSD
+mound/GMDS
+mountable
+mountaineering/M
+mountaineer/JMDSG
+mountainousness/M
+mountainous/PY
+mountainside/MS
+mountain/SM
+mountaintop/SM
+Mountbatten/M
+mountebank/SGMD
+mounted/U
+mount/EGACD
+mounter/SM
+mounties
+Mountie/SM
+mounting/MS
+Mount/M
+mounts/AE
+mourner/M
+mournfuller
+mournfullest
+mournfulness/S
+mournful/YP
+mourning/M
+mourn/ZGSJRD
+mouser/M
+mouse/SRDGMZ
+mousetrapped
+mousetrapping
+mousetrap/SM
+mousiness/MS
+mousing/M
+mousse/MGSD
+Moussorgsky/M
+mousy/PRT
+Mouthe/M
+mouthful/MS
+mouthiness/SM
+mouth/MSRDG
+mouthorgan
+mouthpiece/SM
+mouths
+mouthwash/SM
+mouthwatering
+mouthy/PTR
+Mouton/M
+mouton/SM
+movable/ASP
+movableness/AM
+move/ARSDGZB
+moved/U
+movement/SM
+mover/AM
+moviegoer/S
+movie/SM
+moving/YS
+mower/M
+Mowgli/M
+mowing/M
+mow/SDRZG
+moxie/MS
+Moyer/M
+Moyna/M
+Moyra/M
+Mozambican/S
+Mozambique/M
+Mozart/M
+Mozelle/M
+Mozes/M
+Mozilla/M
+mozzarella/MS
+mp
+MP
+mpg
+mph
+MPH
+MRI
+Mr/M
+Mrs
+ms
+M's
+MS
+MSG
+Msgr/M
+m's/K
+Ms/S
+MST
+MSW
+mt
+MT
+mtg
+mtge
+Mt/M
+MTS
+MTV
+Muawiya/M
+Mubarak/M
+muchness/M
+much/SP
+mucilage/MS
+mucilaginous
+mucker/M
+muck/GRDMS
+muckraker/M
+muckrake/ZMDRSG
+mucky/RT
+mucosa/M
+mucous
+mucus/SM
+mudded
+muddily
+muddiness/SM
+mudding
+muddle/GRSDZ
+muddleheaded/P
+muddlehead/SMD
+muddler/M
+muddy/TPGRSD
+mudflat/S
+mudguard/SM
+mudlarks
+mud/MS
+mudroom/S
+mudslide/S
+mudslinger/M
+mudslinging/M
+mudsling/JRGZ
+Mueller/M
+Muenster
+muenster/MS
+muesli/M
+muezzin/MS
+muff/GDMS
+Muffin/M
+muffin/SM
+muffler/M
+muffle/ZRSDG
+Mufi/M
+Mufinella/M
+mufti/MS
+Mugabe/M
+mugged
+mugger/SM
+mugginess/S
+mugging/S
+muggy/RPT
+mugshot/S
+mug/SM
+mugwump/MS
+Muhammadanism/S
+Muhammadan/SM
+Muhammad/M
+Muire/M
+Muir/M
+Mukden/M
+mukluk/SM
+mulattoes
+mulatto/M
+mulberry/MS
+mulch/GMSD
+mulct/SDG
+Mulder/M
+mule/MGDS
+muleskinner/S
+muleteer/MS
+mulishness/MS
+mulish/YP
+mullah/M
+mullahs
+mullein/MS
+Mullen/M
+muller/M
+Muller/M
+mullet/MS
+Mulligan/M
+mulligan/SM
+mulligatawny/SM
+Mullikan/M
+Mullins
+mullion/MDSG
+mull/RDSG
+Multan/M
+multi
+Multibus/M
+multicellular
+multichannel/M
+multicollinearity/M
+multicolor/SDM
+multicolumn
+multicomponent
+multicomputer/MS
+Multics/M
+MULTICS/M
+multicultural
+multiculturalism/S
+multidimensional
+multidimensionality
+multidisciplinary
+multifaceted
+multifamily
+multifariousness/SM
+multifarious/YP
+multifigure
+multiform
+multifunction/D
+multilateral/Y
+multilayer
+multilevel/D
+multilingual
+multilingualism/S
+multimedia/S
+multimegaton/M
+multimeter/M
+multimillionaire/SM
+multinational/S
+multinomial/M
+multiphase
+multiple/SM
+multiplet/SM
+multiplex/GZMSRD
+multiplexor's
+multipliable
+multiplicand/SM
+multiplication/M
+multiplicative/YS
+multiplicity/MS
+multiplier/M
+multiply/ZNSRDXG
+multiprocess/G
+multiprocessor/MS
+multiprogram
+multiprogrammed
+multiprogramming/MS
+multipurpose
+multiracial
+multistage
+multistory/S
+multisyllabic
+multitasking/S
+multitude/MS
+multitudinousness/M
+multitudinous/YP
+multiuser
+multivalent
+multivalued
+multivariate
+multiversity/M
+multivitamin/S
+mu/M
+mumbler/M
+mumbletypeg/S
+mumble/ZJGRSD
+Mumford/M
+mummed
+mummer/SM
+mummery/MS
+mummification/M
+mummify/XSDGN
+mumming
+mum/MS
+mummy/GSDM
+mumps/M
+muncher/M
+Münchhausen/M
+munchies
+Munch/M
+munch/ZRSDG
+Muncie/M
+mundane/YSP
+Mundt/M
+munge/JGZSRD
+Munich/M
+municipality/SM
+municipal/YS
+munificence/MS
+munificent/Y
+munition/SDG
+Munmro/M
+Munoz/M
+Munroe/M
+Munro/M
+mun/S
+Munsey/M
+Munson/M
+Munster/MS
+Muong/M
+muon/M
+Muppet/M
+muralist/SM
+mural/SM
+Murasaki/M
+Murat/M
+Murchison/M
+Murcia/M
+murderer/M
+murderess/S
+murder/GZRDMS
+murderousness/M
+murderous/YP
+Murdoch/M
+Murdock/M
+Mureil/M
+Murial/M
+muriatic
+Murielle/M
+Muriel/M
+Murillo/M
+murkily
+murkiness/S
+murk/TRMS
+murky/RPT
+Murmansk/M
+murmurer/M
+murmuring/U
+murmurous
+murmur/RDMGZSJ
+Murphy/M
+murrain/SM
+Murray/M
+Murrow/M
+Murrumbidgee/M
+Murry/M
+Murvyn/M
+muscatel/MS
+Muscat/M
+muscat/SM
+musclebound
+muscle/SDMG
+Muscovite/M
+muscovite/MS
+Muscovy/M
+muscularity/SM
+muscular/Y
+musculature/SM
+muse
+Muse/M
+muser/M
+musette/SM
+museum/MS
+mus/GJDSR
+musher/M
+mushiness/MS
+mush/MSRDG
+mushroom/DMSG
+mushy/PTR
+Musial/M
+musicale/SM
+musicality/SM
+musicals
+musical/YU
+musician/MYS
+musicianship/MS
+musicked
+musicking
+musicological
+musicologist/MS
+musicology/MS
+music/SM
+musing/Y
+Muskegon/M
+muskeg/SM
+muskellunge/SM
+musketeer/MS
+musketry/MS
+musket/SM
+musk/GDMS
+muskie/M
+muskiness/MS
+muskmelon/MS
+muskox/N
+muskrat/MS
+musky/RSPT
+Muslim/MS
+muslin/MS
+mussel/MS
+Mussolini/MS
+Mussorgsky/M
+muss/SDG
+mussy/RT
+mustache/DSM
+mustachio/MDS
+mustang/MS
+mustard/MS
+muster/GD
+mustily
+mustiness/MS
+mustn't
+must/RDGZS
+must've
+musty/RPT
+mutability/SM
+mutableness/M
+mutable/P
+mutably
+mutagen/SM
+mutant/MS
+mutate/XVNGSD
+mutational/Y
+mutation/M
+mutator/S
+muted/Y
+muteness/S
+mute/PDSRBYTG
+mutilate/XDSNG
+mutilation/M
+mutilator/MS
+mutineer/SMDG
+mutinous/Y
+mutiny/MGSD
+Mutsuhito/M
+mutterer/M
+mutter/GZRDJ
+muttonchops
+mutton/SM
+mutt/ZSMR
+mutuality/S
+mutual/SY
+muumuu/MS
+muzak
+Muzak/SM
+Muzo/M
+muzzled/U
+muzzle/MGRSD
+muzzler/M
+MVP
+MW
+Myanmar
+Mycah/M
+Myca/M
+Mycenaean
+Mycenae/M
+Mychal/M
+mycologist/MS
+mycology/MS
+myelitides
+myelitis/M
+Myer/MS
+myers
+mylar
+Mylar/S
+Myles/M
+Mylo/M
+My/M
+myna/SM
+Mynheer/M
+myocardial
+myocardium/M
+myopia/MS
+myopically
+myopic/S
+Myrah/M
+Myra/M
+Myranda/M
+Myrdal/M
+myriad/S
+Myriam/M
+Myrilla/M
+Myrle/M
+Myrlene/M
+myrmidon/S
+Myrna/M
+Myron/M
+myrrh/M
+myrrhs
+Myrta/M
+Myrtia/M
+Myrtice/M
+Myrtie/M
+Myrtle/M
+myrtle/SM
+Myrvyn/M
+Myrwyn/M
+mys
+my/S
+myself
+Mysore/M
+mysteriousness/MS
+mysterious/YP
+mystery/MDSG
+mystical/Y
+mysticism/MS
+mystic/SM
+mystification/M
+mystifier/M
+mystify/CSDGNX
+mystifying/Y
+mystique/MS
+Myst/M
+mythic
+mythical/Y
+myth/MS
+mythographer/SM
+mythography/M
+mythological/Y
+mythologist/MS
+mythologize/CSDG
+mythology/SM
+myths
+N
+NAACP
+nabbed
+nabbing
+Nabisco/M
+nabob/SM
+Nabokov/M
+nab/S
+nacelle/SM
+nacho/S
+NaCl/M
+nacre/MS
+nacreous
+Nada/M
+Nadean/M
+Nadeen/M
+Nader/M
+Nadia/M
+Nadine/M
+nadir/SM
+Nadiya/M
+Nadya/M
+Nady/M
+nae/VM
+Nagasaki/M
+nagged
+nagger/S
+nagging/Y
+nag/MS
+Nagoya/M
+Nagpur/M
+Nagy/M
+Nahuatl/SM
+Nahum/M
+naiad/SM
+naifs
+nailbrush/SM
+nailer/M
+nail/SGMRD
+Naipaul/M
+Nair/M
+Nairobi/M
+Naismith/M
+naive/SRTYP
+naiveté/SM
+naivety/MS
+Nakamura/M
+Nakayama/M
+nakedness/MS
+naked/TYRP
+Nakoma/M
+Nalani/M
+Na/M
+Namath/M
+nameable/U
+name/ADSG
+namedrop
+namedropping
+named's
+named/U
+nameless/PY
+namely
+nameplate/MS
+namer/SM
+name's
+namesake/SM
+Namibia/M
+Namibian/S
+naming/M
+Nam/M
+Nanak/M
+Nana/M
+Nananne/M
+Nancee/M
+Nance/M
+Nancey/M
+Nanchang/M
+Nancie/M
+Nanci/M
+Nancy/M
+Nanete/M
+Nanette/M
+Nanice/M
+Nani/M
+Nanine/M
+Nanjing
+Nanking's
+Nan/M
+Nannette/M
+Nannie/M
+Nanni/M
+Nanny/M
+nanny/SDMG
+nanometer/MS
+Nanon/M
+Nanook/M
+nanosecond/SM
+Nansen/M
+Nantes/M
+Nantucket/M
+Naoma/M
+Naomi/M
+napalm/MDGS
+nape/SM
+Naphtali/M
+naphthalene/MS
+naphtha/SM
+Napier/M
+napkin/SM
+Naples/M
+napless
+Nap/M
+Napoleonic
+napoleon/MS
+Napoleon/MS
+napped
+napper/MS
+Nappie/M
+napping
+Nappy/M
+nappy/TRSM
+nap/SM
+Nara/M
+Narbonne/M
+narc/DGS
+narcissism/MS
+narcissistic
+narcissist/MS
+narcissus/M
+Narcissus/M
+narcoleptic
+narcoses
+narcosis/M
+narcotic/SM
+narcotization/S
+narcotize/GSD
+Nariko/M
+Nari/M
+nark's
+Narmada/M
+Narragansett/M
+narrate/VGNSDX
+narration/M
+narrative/MYS
+narratology
+narrator/SM
+narrowing/P
+narrowness/SM
+narrow/RDYTGPS
+narwhal/MS
+nary
+nasality/MS
+nasalization/MS
+nasalize/GDS
+nasal/YS
+NASA/MS
+nascence/ASM
+nascent/A
+NASDAQ
+Nash/M
+Nashua/M
+Nashville/M
+Nassau/M
+Nasser/M
+nastily
+nastiness/MS
+nasturtium/SM
+nasty/TRSP
+natal
+Natala/M
+Natalee/M
+Natale/M
+Natalia/M
+Natalie/M
+Natalina/M
+Nataline/M
+natalist
+natality/M
+Natal/M
+Natalya/M
+Nata/M
+Nataniel/M
+Natasha/M
+Natassia/M
+Natchez
+natch/S
+Nate/XMN
+Nathalia/M
+Nathalie/M
+Nathanael/M
+Nathanial/M
+Nathaniel/M
+Nathanil/M
+Nathan/MS
+nationalism/SM
+nationalistic
+nationalistically
+nationalist/MS
+nationality/MS
+nationalization/MS
+nationalize/CSDG
+nationalized/AU
+nationalizer/SM
+national/YS
+nationhood/SM
+nation/MS
+nationwide
+nativeness/M
+native/PYS
+Natividad/M
+Nativity/M
+nativity/MS
+Natka/M
+natl
+Nat/M
+NATO/SM
+natter/SGD
+nattily
+nattiness/SM
+Natty/M
+natty/TRP
+naturalism/MS
+naturalistic
+naturalist/MS
+naturalization/SM
+naturalized/U
+naturalize/GSD
+naturalness/US
+natural/PUY
+naturals
+nature/ASDCG
+nature's
+naturist
+Naugahyde/S
+naughtily
+naughtiness/SM
+naught/MS
+naughty/TPRS
+Naur/M
+Nauru/M
+nausea/SM
+nauseate/DSG
+nauseating/Y
+nauseousness/SM
+nauseous/P
+nautical/Y
+nautilus/MS
+Navaho's
+Navajoes
+Navajo/S
+naval/Y
+Navarro/M
+navel/MS
+nave/SM
+navigability/SM
+navigableness/M
+navigable/P
+navigate/DSXNG
+navigational
+navigation/M
+navigator/MS
+Navona/M
+Navratilova/M
+navvy/M
+Navy/S
+navy/SM
+nay/MS
+naysayer/S
+Nazarene/MS
+Nazareth/M
+Nazi/SM
+Nazism/S
+NB
+NBA
+NBC
+Nb/M
+NBS
+NC
+NCAA
+NCC
+NCO
+NCR
+ND
+N'Djamena
+Ndjamena/M
+Nd/M
+Ne
+NE
+Neala/M
+Neale/M
+Neall/M
+Neal/M
+Nealon/M
+Nealson/M
+Nealy/M
+Neanderthal/S
+neap/DGS
+Neapolitan/SM
+nearby
+nearly/RT
+nearness/MS
+nearside/M
+nearsightedness/S
+nearsighted/YP
+near/TYRDPSG
+neaten/DG
+neath
+neatness/MS
+neat/YRNTXPS
+Neb/M
+Nebraska/M
+Nebraskan/MS
+Nebr/M
+Nebuchadnezzar/MS
+nebulae
+nebula/M
+nebular
+nebulousness/SM
+nebulous/PY
+necessaries
+necessarily/U
+necessary/U
+necessitate/DSNGX
+necessitation/M
+necessitous
+necessity/SM
+neckband/M
+neckerchief/MS
+neck/GRDMJS
+necking/M
+necklace/DSMG
+neckline/MS
+necktie/MS
+necrology/SM
+necromancer/MS
+necromancy/MS
+necromantic
+necrophiliac/S
+necrophilia/M
+necropolis/SM
+necropsy/M
+necroses
+necrosis/M
+necrotic
+nectarine/SM
+nectarous
+nectar/SM
+nectary/MS
+Neda/M
+Nedda/M
+Neddie/M
+Neddy/M
+Nedi/M
+Ned/M
+née
+needed/U
+needer/M
+needful/YSP
+Needham/M
+neediness/MS
+needlecraft/M
+needle/GMZRSD
+needlepoint/SM
+needlessness/S
+needless/YP
+needlewoman/M
+needlewomen
+needlework/RMS
+needn't
+need/YRDGS
+needy/TPR
+Neel/M
+Neely/M
+ne'er
+nefariousness/MS
+nefarious/YP
+Nefen/M
+Nefertiti/M
+negated/U
+negater/M
+negate/XRSDVNG
+negation/M
+negativeness/SM
+negative/PDSYG
+negativism/MS
+negativity/MS
+negator/MS
+Negev/M
+neglecter/M
+neglectfulness/SM
+neglectful/YP
+neglect/SDRG
+negligee/SM
+negligence/MS
+negligent/Y
+negligibility/M
+negligible
+negligibly
+negotiability/MS
+negotiable/A
+negotiant/M
+negotiate/ASDXGN
+negotiation/MA
+negotiator/MS
+Negress/MS
+negritude/MS
+Negritude/S
+Negroes
+negroid
+Negroid/S
+Negro/M
+neg/S
+Nehemiah/M
+Nehru/M
+neighbored/U
+neighborer/M
+neighborhood/SM
+neighborlinesses
+neighborliness/UM
+neighborly/UP
+neighbor/SMRDYZGJ
+neigh/MDG
+neighs
+Neila/M
+Neile/M
+Neilla/M
+Neille/M
+Neill/M
+Neil/SM
+neither
+Nelda/M
+Nelia/M
+Nelie/M
+Nelle/M
+Nellie/M
+Nelli/M
+Nell/M
+Nelly/M
+Nelsen/M
+Nels/N
+Nelson/M
+nelson/MS
+nematic
+nematode/SM
+Nembutal/M
+nemeses
+nemesis
+Nemesis/M
+neoclassical
+neoclassicism/MS
+neoclassic/M
+neocolonialism/MS
+neocortex/M
+neodymium/MS
+Neogene
+neolithic
+Neolithic/M
+neologism/SM
+neomycin/M
+neonatal/Y
+neonate/MS
+neon/DMS
+neophyte/MS
+neoplasm/SM
+neoplastic
+neoprene/SM
+Nepalese
+Nepali/MS
+Nepal/M
+nepenthe/MS
+nephew/MS
+nephrite/SM
+nephritic
+nephritides
+nephritis/M
+nepotism/MS
+nepotist/S
+Neptune/M
+neptunium/MS
+nerd/S
+nerdy/RT
+Nereid/M
+Nerf/M
+Nerissa/M
+Nerita/M
+Nero/M
+Neron/M
+Nerta/M
+Nerte/M
+Nertie/M
+Nerti/M
+Nert/M
+Nerty/M
+Neruda/M
+nervelessness/SM
+nerveless/YP
+nerve's
+nerve/UGSD
+nerviness/SM
+nerving/M
+nervousness/SM
+nervous/PY
+nervy/TPR
+Nessa/M
+Nessie/M
+Nessi/M
+Nessy/M
+Nesta/M
+nester/M
+Nester/M
+Nestle/M
+nestler/M
+nestle/RSDG
+nestling/M
+Nestorius/M
+Nestor/M
+nest/RDGSBM
+netball/M
+nether
+Netherlander/SM
+Netherlands/M
+nethermost
+netherworld/S
+Netscape/M
+net/SM
+Netta/M
+Nettie/M
+Netti/M
+netting/M
+nett/JGRDS
+Nettle/M
+nettle/MSDG
+nettlesome
+Netty/M
+network/SJMDG
+Netzahualcoyotl/M
+Neumann/M
+neuralgia/MS
+neuralgic
+neural/Y
+neurasthenia/MS
+neurasthenic/S
+neuritic/S
+neuritides
+neuritis/M
+neuroanatomy
+neurobiology/M
+neurological/Y
+neurologist/MS
+neurology/SM
+neuromuscular
+neuronal
+neurone/S
+neuron/MS
+neuropathology/M
+neurophysiology/M
+neuropsychiatric
+neuroses
+neurosis/M
+neurosurgeon/MS
+neurosurgery/SM
+neurotically
+neurotic/S
+neurotransmitter/S
+neuter/JZGRD
+neutralise's
+neutralism/MS
+neutralist/S
+neutrality/MS
+neutralization/MS
+neutralized/U
+neutralize/GZSRD
+neutral/PYS
+neutrino/MS
+neutron/MS
+neut/ZR
+Nevada/M
+Nevadan/S
+Nevadian/S
+Neva/M
+never
+nevermore
+nevertheless
+nevi
+Nevile/M
+Neville/M
+Nevil/M
+Nevin/SM
+Nevis/M
+Nev/M
+Nevsa/M
+Nevsky/M
+nevus/M
+Newark/M
+newbie/S
+newborn/S
+Newbury/M
+Newburyport/M
+Newcastle/M
+newcomer/MS
+newed/A
+Newell/M
+newel/MS
+newer/A
+newfangled
+newfound
+newfoundland
+Newfoundlander/M
+Newfoundland/SRMZ
+newish
+newline/SM
+newlywed/MS
+Newman/M
+newness/MS
+Newport/M
+news/A
+newsagent/MS
+newsboy/SM
+newscaster/M
+newscasting/M
+newscast/SRMGZ
+newsdealer/MS
+newsed
+newses
+newsflash/S
+newsgirl/S
+newsgroup/SM
+newsing
+newsletter/SM
+NeWS/M
+newsman/M
+newsmen
+newspaperman/M
+newspapermen
+newspaper/SMGD
+newspaperwoman/M
+newspaperwomen
+newsprint/MS
+new/SPTGDRY
+newsreader/MS
+newsreel/SM
+newsroom/S
+news's
+newsstand/MS
+Newsweekly/M
+newsweekly/S
+Newsweek/MY
+newswire
+newswoman/M
+newswomen
+newsworthiness/SM
+newsworthy/RPT
+newsy/TRS
+newt/MS
+Newtonian
+Newton/M
+newton/SM
+Nexis/M
+next
+nexus/SM
+Neysa/M
+NF
+NFC
+NFL
+NFS
+Ngaliema/M
+Nguyen/M
+NH
+NHL
+niacin/SM
+Niagara/M
+Niall/M
+Nial/M
+Niamey/M
+nibbed
+nibbing
+nibbler/M
+nibble/RSDGZ
+Nibelung/M
+nib/SM
+Nicaean
+Nicaragua/M
+Nicaraguan/S
+Niccolo/M
+Nice/M
+Nicene
+niceness/MS
+nicety/MS
+nice/YTPR
+niche/SDGM
+Nicholas
+Nichole/M
+Nicholle/M
+Nichol/MS
+Nicholson/M
+nichrome
+nickelodeon/SM
+nickel/SGMD
+nicker/GD
+Nickey/M
+nick/GZRDMS
+Nickie/M
+Nicki/M
+Nicklaus/M
+Nick/M
+nicknack's
+nickname/MGDRS
+nicknamer/M
+Nickolai/M
+Nickola/MS
+Nickolaus/M
+Nicko/M
+Nicky/M
+Nicobar/M
+Nicodemus/M
+Nicolai/MS
+Nicola/MS
+Nicolea/M
+Nicole/M
+Nicolette/M
+Nicoli/MS
+Nicolina/M
+Nicoline/M
+Nicolle/M
+Nicol/M
+Nico/M
+Nicosia/M
+nicotine/MS
+Niebuhr/M
+niece/MS
+Niel/MS
+Nielsen/M
+Niels/N
+Nielson/M
+Nietzsche/M
+Nieves/M
+nifty/TRS
+Nigel/M
+Nigeria/M
+Nigerian/S
+Nigerien
+Niger/M
+niggardliness/SM
+niggardly/P
+niggard/SGMDY
+nigger/SGDM!
+niggler/M
+niggle/RSDGZJ
+niggling/Y
+nigh/RDGT
+nighs
+nightcap/SM
+nightclothes
+nightclubbed
+nightclubbing
+nightclub/MS
+nightdress/MS
+nightfall/SM
+nightgown/MS
+nighthawk/MS
+nightie/MS
+Nightingale/M
+nightingale/SM
+nightlife/MS
+nightlong
+nightmare/MS
+nightmarish/Y
+nightshade/SM
+nightshirt/MS
+night/SMYDZ
+nightspot/MS
+nightstand/SM
+nightstick/S
+nighttime/S
+nightwear/M
+nighty's
+NIH
+nihilism/MS
+nihilistic
+nihilist/MS
+Nijinsky/M
+Nikaniki/M
+Nike/M
+Niki/M
+Nikita/M
+Nikkie/M
+Nikki/M
+Nikko/M
+Nikolai/M
+Nikola/MS
+Nikolaos/M
+Nikolaus/M
+Nikolayev's
+Nikoletta/M
+Nikolia/M
+Nikolos/M
+Niko/MS
+Nikon/M
+Nile/SM
+nilled
+nilling
+Nil/MS
+nil/MYS
+nilpotent
+Nilsen/M
+Nils/N
+Nilson/M
+Nilsson/M
+Ni/M
+nimbi
+nimbleness/SM
+nimble/TRP
+nimbly
+nimbus/DM
+NIMBY
+Nimitz/M
+Nimrod/MS
+Nina/M
+nincompoop/MS
+ninefold
+nine/MS
+ninepence/M
+ninepin/S
+ninepins/M
+nineteen/SMH
+nineteenths
+ninetieths
+Ninetta/M
+Ninette/M
+ninety/MHS
+Nineveh/M
+ninja/S
+Ninnetta/M
+Ninnette/M
+ninny/SM
+Ninon/M
+Nintendo/M
+ninth
+ninths
+Niobe/M
+niobium/MS
+nipped
+nipper/DMGS
+nippiness/S
+nipping/Y
+nipple/GMSD
+Nipponese
+Nippon/M
+nippy/TPR
+nip/S
+Nirenberg/M
+nirvana/MS
+Nirvana/S
+nisei
+Nisei/MS
+Nissa/M
+Nissan/M
+Nisse/M
+Nissie/M
+Nissy/M
+Nita/M
+niter/M
+nitpick/DRSJZG
+nitrate/MGNXSD
+nitration/M
+nitric
+nitride/MGS
+nitriding/M
+nitrification/SM
+nitrite/MS
+nitrocellulose/MS
+nitrogenous
+nitrogen/SM
+nitroglycerin/MS
+nitrous
+nitwit/MS
+nit/ZSMR
+Niven/M
+nixer/M
+nix/GDSR
+Nixie/M
+Nixon/M
+NJ
+Nkrumah/M
+NLRB
+nm
+NM
+no/A
+NOAA
+Noach/M
+Noah/M
+Noak/M
+Noami/M
+Noam/M
+Nobelist/SM
+nobelium/MS
+Nobel/M
+Nobe/M
+Nobie/M
+nobility/MS
+Noble/M
+nobleman/M
+noblemen
+nobleness/SM
+noblesse/M
+noble/TPSR
+noblewoman
+noblewomen
+nob/MY
+nobody/MS
+Noby/M
+nocturnal/SY
+nocturne/SM
+nodal/Y
+nodded
+nodding
+noddle/MSDG
+noddy/M
+node/MS
+NoDoz/M
+nod/SM
+nodular
+nodule/SM
+Noelani/M
+Noella/M
+Noelle/M
+Noell/M
+Noellyn/M
+Noel/MS
+noel/S
+Noelyn/M
+Noe/M
+Noemi/M
+noes/S
+noggin/SM
+nohow
+noise/GMSD
+noiselessness/SM
+noiseless/YP
+noisemaker/M
+noisemake/ZGR
+noisily
+noisiness/MS
+noisome
+noisy/TPR
+Nola/M
+Nolana/M
+Noland/M
+Nolan/M
+Nolie/M
+Nollie/M
+Noll/M
+Nolly/M
+No/M
+nomadic
+nomad/SM
+Nome/M
+nomenclature/MS
+Nomi/M
+nominalized
+nominal/K
+nominally
+nominals
+nominate/CDSAXNG
+nomination/MAC
+nominative/SY
+nominator/CSM
+nominee/MS
+non
+nonabrasive
+nonabsorbent/S
+nonacademic/S
+nonacceptance/MS
+nonacid/MS
+nonactive
+nonadaptive
+nonaddictive
+nonadhesive
+nonadjacent
+nonadjustable
+nonadministrative
+nonage/MS
+nonagenarian/MS
+nonaggression/SM
+nonagricultural
+Nonah/M
+nonalcoholic/S
+nonaligned
+nonalignment/SM
+nonallergic
+Nona/M
+nonappearance/MS
+nonassignable
+nonathletic
+nonattendance/SM
+nonautomotive
+nonavailability/SM
+nonbasic
+nonbeliever/SM
+nonbelligerent/S
+nonblocking
+nonbreakable
+nonburnable
+nonbusiness
+noncaloric
+noncancerous
+noncarbohydrate/M
+nonce/MS
+nonchalance/SM
+nonchalant/YP
+nonchargeable
+nonclerical/S
+nonclinical
+noncollectable
+noncombatant/MS
+noncombustible/S
+noncommercial/S
+noncommissioned
+noncommittal/Y
+noncom/MS
+noncommunicable
+noncompeting
+noncompetitive
+noncompliance/MS
+noncomplying/S
+noncomprehending
+nonconducting
+nonconductor/MS
+nonconforming
+nonconformist/SM
+nonconformity/SM
+nonconsecutive
+nonconservative
+nonconstructive
+noncontagious
+noncontiguous
+noncontinuous
+noncontributing
+noncontributory
+noncontroversial
+nonconvertible
+noncooperation/SM
+noncorroding/S
+noncorrosive
+noncredit
+noncriminal/S
+noncritical
+noncrystalline
+noncumulative
+noncustodial
+noncyclic
+nondairy
+nondecreasing
+nondeductible
+nondelivery/MS
+nondemocratic
+nondenominational
+nondepartmental
+nondepreciating
+nondescript/YS
+nondestructive/Y
+nondetachable
+nondeterminacy
+nondeterminate/Y
+nondeterminism
+nondeterministic
+nondeterministically
+nondisciplinary
+nondisclosure/SM
+nondiscrimination/SM
+nondiscriminatory
+nondramatic
+nondrinker/SM
+nondrying
+nondurable
+noneconomic
+noneducational
+noneffective/S
+nonelastic
+nonelectrical
+nonelectric/S
+nonemergency
+nonempty
+nonenforceable
+nonentity/MS
+nonequivalence/M
+nonequivalent/S
+none/S
+nones/M
+nonessential/S
+nonesuch/SM
+nonetheless
+nonevent/MS
+nonexchangeable
+nonexclusive
+nonexempt
+nonexistence/MS
+nonexistent
+nonexplosive/S
+nonextensible
+nonfactual
+nonfading
+nonfat
+nonfatal
+nonfattening
+nonferrous
+nonfictional
+nonfiction/SM
+nonflammable
+nonflowering
+nonfluctuating
+nonflying
+nonfood/M
+nonfreezing
+nonfunctional
+nongovernmental
+nongranular
+nonhazardous
+nonhereditary
+nonhuman
+nonidentical
+Nonie/M
+Noni/M
+noninclusive
+nonindependent
+nonindustrial
+noninfectious
+noninflammatory
+noninflationary
+noninflected
+nonintellectual/S
+noninteracting
+noninterchangeable
+noninterference/MS
+nonintervention/SM
+nonintoxicating
+nonintuitive
+noninvasive
+nonionic
+nonirritating
+nonjudgmental
+nonjudicial
+nonlegal
+nonlethal
+nonlinearity/MS
+nonlinear/Y
+nonlinguistic
+nonliterary
+nonliving
+nonlocal
+nonmagical
+nonmagnetic
+nonmalignant
+nonmember/SM
+nonmetallic
+nonmetal/MS
+nonmigratory
+nonmilitant/S
+nonmilitary
+Nonnah/M
+Nonna/M
+nonnarcotic/S
+nonnative/S
+nonnegative
+nonnegotiable
+nonnuclear
+nonnumerical/S
+nonobjective
+nonobligatory
+nonobservance/MS
+nonobservant
+nonoccupational
+nonoccurence
+nonofficial
+nonogenarian
+nonoperational
+nonoperative
+nonorthogonal
+nonorthogonality
+nonparallel/S
+nonparametric
+nonpareil/SM
+nonparticipant/SM
+nonparticipating
+nonpartisan/S
+nonpaying
+nonpayment/SM
+nonperformance/SM
+nonperforming
+nonperishable/S
+nonperson/S
+nonperturbing
+nonphysical/Y
+nonplus/S
+nonplussed
+nonplussing
+nonpoisonous
+nonpolitical
+nonpolluting
+nonporous
+nonpracticing
+nonprejudicial
+nonprescription
+nonprocedural/Y
+nonproductive
+nonprofessional/S
+nonprofit/SB
+nonprogrammable
+nonprogrammer
+nonproliferation/SM
+nonpublic
+nonpunishable
+nonracial
+nonradioactive
+nonrandom
+nonreactive
+nonreciprocal/S
+nonreciprocating
+nonrecognition/SM
+nonrecoverable
+nonrecurring
+nonredeemable
+nonreducing
+nonrefillable
+nonrefundable
+nonreligious
+nonrenewable
+nonrepresentational
+nonresidential
+nonresident/SM
+nonresidual
+nonresistance/SM
+nonresistant/S
+nonrespondent/S
+nonresponse
+nonrestrictive
+nonreturnable/S
+nonrhythmic
+nonrigid
+nonsalaried
+nonscheduled
+nonscientific
+nonscoring
+nonseasonal
+nonsectarian
+nonsecular
+nonsegregated
+nonsense/MS
+nonsensicalness/M
+nonsensical/PY
+nonsensitive
+nonsexist
+nonsexual
+nonsingular
+nonskid
+nonslip
+nonsmoker/SM
+nonsmoking
+nonsocial
+nonspeaking
+nonspecialist/MS
+nonspecializing
+nonspecific
+nonspiritual/S
+nonstaining
+nonstandard
+nonstarter/SM
+nonstick
+nonstop
+nonstrategic
+nonstriking
+nonstructural
+nonsuccessive
+nonsupervisory
+nonsupport/GS
+nonsurgical
+nonsustaining
+nonsympathizer/M
+nontarnishable
+nontaxable/S
+nontechnical/Y
+nontenured
+nonterminal/MS
+nonterminating
+nontermination/M
+nontheatrical
+nonthinking/S
+nonthreatening
+nontoxic
+nontraditional
+nontransferable
+nontransparent
+nontrivial
+nontropical
+nonuniform
+nonunion/S
+nonuser/SM
+nonvenomous
+nonverbal/Y
+nonveteran/MS
+nonviable
+nonviolence/SM
+nonviolent/Y
+nonvirulent
+nonvocal
+nonvocational
+nonvolatile
+nonvolunteer/S
+nonvoter/MS
+nonvoting
+nonwhite/SM
+nonworking
+nonyielding
+nonzero
+noodle/GMSD
+nook/MS
+noonday/MS
+noon/GDMS
+nooning/M
+noontide/MS
+noontime/MS
+noose/SDGM
+nope/S
+NORAD/M
+noradrenalin
+noradrenaline/M
+Norah/M
+Nora/M
+Norbert/M
+Norberto/M
+Norbie/M
+Norby/M
+Nordhoff/M
+Nordic/S
+Nordstrom/M
+Norean/M
+Noreen/M
+Norene/M
+Norfolk/M
+nor/H
+Norina/M
+Norine/M
+normalcy/MS
+normality/SM
+normalization/A
+normalizations
+normalization's
+normalized/AU
+normalizes/AU
+normalize/SRDZGB
+normal/SY
+Norma/M
+Normand/M
+Normandy/M
+Norman/SM
+normativeness/M
+normative/YP
+Normie/M
+norm/SMGD
+Normy/M
+Norplant
+Norrie/M
+Norri/SM
+Norristown/M
+Norry/M
+Norse
+Norseman/M
+Norsemen
+Northampton/M
+northbound
+northeastern
+northeaster/YM
+Northeast/SM
+northeastward/S
+northeast/ZSMR
+northerly/S
+norther/MY
+Northerner/M
+northernmost
+northern/RYZS
+Northfield/M
+northing/M
+northland
+North/M
+northmen
+north/MRGZ
+Northrop/M
+Northrup/M
+norths
+Norths
+Northumberland/M
+northward/S
+northwestern
+northwester/YM
+northwest/MRZS
+Northwest/MS
+northwestward/S
+Norton/M
+Norwalk/M
+Norway/M
+Norwegian/S
+Norwich/M
+Norw/M
+nosebag/M
+nosebleed/SM
+nosecone/S
+nosedive/DSG
+nosed/V
+nosegay/MS
+nose/M
+Nosferatu/M
+nos/GDS
+nosh/MSDG
+nosily
+nosiness/MS
+nosing/M
+nostalgia/SM
+nostalgically
+nostalgic/S
+Nostradamus/M
+Nostrand/M
+nostril/SM
+nostrum/SM
+nosy/SRPMT
+notability/SM
+notableness/M
+notable/PS
+notably
+notarial
+notarization/S
+notarize/DSG
+notary/MS
+notate/VGNXSD
+notational/CY
+notation/CMSF
+notative/CF
+notch/MSDG
+not/DRGB
+notebook/MS
+note/CSDFG
+notedness/M
+noted/YP
+notepad/S
+notepaper/MS
+note's
+noteworthiness/SM
+noteworthy/P
+nothingness/SM
+nothing/PS
+noticeable/U
+noticeably
+noticeboard/S
+noticed/U
+notice/MSDG
+notifiable
+notification/M
+notifier/M
+notify/NGXSRDZ
+notional/Y
+notion/MS
+notoriety/S
+notoriousness/M
+notorious/YP
+Notre/M
+Nottingham/M
+notwithstanding
+Nouakchott/M
+nougat/MS
+Noumea/M
+noun/SMK
+nourish/DRSGL
+nourished/U
+nourisher/M
+nourishment/SM
+nous/M
+nouveau
+nouvelle
+novae
+Novak/M
+Nova/M
+nova/MS
+novelette/SM
+Novelia/M
+novelist/SM
+novelization/S
+novelize/GDS
+Novell/SM
+novella/SM
+novel/SM
+novelty/MS
+November/SM
+novena/SM
+novene
+Novgorod/M
+novice/MS
+novitiate/MS
+Nov/M
+Novocaine/M
+Novocain/S
+Novokuznetsk/M
+Novosibirsk/M
+NOW
+nowadays
+noway/S
+Nowell/M
+nowhere/S
+nowise
+now/S
+noxiousness/M
+noxious/PY
+Noyce/M
+Noyes/M
+nozzle/MS
+Np
+NP
+NRA
+nroff/M
+N's
+NS
+n's/CI
+NSF
+n/T
+NT
+nth
+nuance/SDM
+nubbin/SM
+nubby/RT
+Nubia/M
+Nubian/M
+nubile
+nub/MS
+nuclear/K
+nuclease/M
+nucleated/A
+nucleate/DSXNG
+nucleation/M
+nucleic
+nuclei/M
+nucleoli
+nucleolus/M
+nucleon/MS
+nucleotide/MS
+nucleus/M
+nuclide/M
+nude/CRS
+nudely
+nudeness/M
+nudest
+nudge/GSRD
+nudger/M
+nudism/MS
+nudist/MS
+nudity/MS
+nugatory
+Nugent/M
+nugget/SM
+nuisance/MS
+nuke/DSMG
+Nukualofa
+null/DSG
+nullification/M
+nullifier/M
+nullify/RSDXGNZ
+nullity/SM
+nu/M
+numbered/UA
+numberer/M
+numberless
+numberplate/M
+number/RDMGJ
+numbers/A
+Numbers/M
+numbing/Y
+numbness/MS
+numb/SGZTYRDP
+numbskull's
+numerable/IC
+numeracy/SI
+numeral/YMS
+numerate/SDNGX
+numerates/I
+numeration/M
+numerator/MS
+numerical/Y
+numeric/S
+numerological
+numerologist/S
+numerology/MS
+numerousness/M
+numerous/YP
+numinous/S
+numismatic/S
+numismatics/M
+numismatist/MS
+numskull/SM
+Nunavut/M
+nuncio/SM
+Nunez/M
+Nunki/M
+nun/MS
+nunnery/MS
+nuptial/S
+Nuremberg/M
+Nureyev/M
+nursemaid/MS
+nurser/M
+nurseryman/M
+nurserymen
+nursery/MS
+nurse/SRDJGMZ
+nursling/M
+nurturer/M
+nurture/SRDGZM
+nus
+nutate/NGSD
+nutation/M
+nutcracker/M
+nutcrack/RZ
+nuthatch/SM
+nutmeat/SM
+nutmegged
+nutmegging
+nutmeg/MS
+nut/MS
+nutpick/MS
+Nutrasweet/M
+nutria/SM
+nutrient/MS
+nutriment/MS
+nutritional/Y
+nutritionist/MS
+nutrition/SM
+nutritiousness/MS
+nutritious/PY
+nutritive/Y
+nutshell/MS
+nutted
+nuttiness/SM
+nutting
+nutty/TRP
+nuzzle/GZRSD
+NV
+NW
+NWT
+NY
+Nyasa/M
+NYC
+Nydia/M
+Nye/M
+Nyerere/M
+nylon/SM
+nymphet/MS
+nymph/M
+nympholepsy/M
+nymphomaniac/S
+nymphomania/MS
+nymphs
+Nyquist/M
+NYSE
+Nyssa/M
+NZ
+o
+O
+oafishness/S
+oafish/PY
+oaf/MS
+Oahu/M
+Oakland/M
+Oakley/M
+Oakmont/M
+oak/SMN
+oakum/MS
+oakwood
+oar/GSMD
+oarlock/MS
+oarsman/M
+oarsmen
+oarswoman
+oarswomen
+OAS
+oases
+oasis/M
+oatcake/MS
+oater/M
+Oates/M
+oath/M
+oaths
+oatmeal/SM
+oat/SMNR
+Oaxaca/M
+ob
+OB
+Obadiah/M
+Obadias/M
+obbligato/S
+obduracy/S
+obdurateness/S
+obdurate/PDSYG
+Obediah/M
+obedience/EMS
+obedient/EY
+Obed/M
+obeisance/MS
+obeisant/Y
+obelisk/SM
+Oberlin/M
+Oberon/M
+obese
+obesity/MS
+obey/EDRGS
+obeyer/EM
+obfuscate/SRDXGN
+obfuscation/M
+obfuscatory
+Obidiah/M
+Obie/M
+obi/MDGS
+obit/SMR
+obituary/SM
+obj
+objectify/GSDXN
+objectionableness/M
+objectionable/U
+objectionably
+objection/SMB
+objectiveness/MS
+objective/PYS
+objectivity/MS
+objector/SM
+object/SGVMD
+objurgate/GNSDX
+objurgation/M
+oblate/NYPSX
+oblation/M
+obligate/NGSDXY
+obligational
+obligation/M
+obligatorily
+obligatory
+obliged/E
+obliger/M
+obliges/E
+oblige/SRDG
+obligingness/M
+obliging/PY
+oblique/DSYGP
+obliqueness/S
+obliquity/MS
+obliterate/VNGSDX
+obliteration/M
+obliterative/Y
+oblivion/MS
+obliviousness/MS
+oblivious/YP
+oblongness/M
+oblong/SYP
+obloquies
+obloquy/M
+Ob/MD
+obnoxiousness/MS
+obnoxious/YP
+oboe/SM
+oboist/S
+obos
+O'Brien/M
+obs
+obscene/RYT
+obscenity/MS
+obscurantism/MS
+obscurantist/MS
+obscuration
+obscureness/M
+obscure/YTPDSRGL
+obscurity/MS
+obsequies
+obsequiousness/S
+obsequious/YP
+obsequy
+observability/M
+observable/SU
+observably
+observance/MS
+observantly
+observants
+observant/U
+observational/Y
+observation/MS
+observatory/MS
+observed/U
+observer/M
+observe/ZGDSRB
+observing/Y
+obsess/GVDS
+obsessional
+obsession/MS
+obsessiveness/S
+obsessive/PYS
+obsidian/SM
+obsolesce/GSD
+obsolescence/S
+obsolescent/Y
+obsolete/GPDSY
+obsoleteness/M
+obstacle/SM
+obstetrical
+obstetrician/SM
+obstetric/S
+obstetrics/M
+obstinacy/SM
+obstinateness/M
+obstinate/PY
+obstreperousness/SM
+obstreperous/PY
+obstructed/U
+obstructer/M
+obstructionism/SM
+obstructionist/MS
+obstruction/SM
+obstructiveness/MS
+obstructive/PSY
+obstruct/RDVGS
+obtainable/U
+obtainably
+obtain/LSGDRB
+obtainment/S
+obtrude/DSRG
+obtruder/M
+obtrusion/S
+obtrusiveness/MSU
+obtrusive/UPY
+obtuseness/S
+obtuse/PRTY
+obverse/YS
+obviate/XGNDS
+obviousness/SM
+obvious/YP
+Oby/M
+ocarina/MS
+O'Casey
+Occam/M
+occasional/Y
+occasion/MDSJG
+Occidental/S
+occidental/SY
+occident/M
+Occident/SM
+occipital/Y
+occlude/GSD
+occlusion/MS
+occlusive/S
+occulter/M
+occultism/SM
+occult/SRDYG
+occupancy/SM
+occupant/MS
+occupational/Y
+occupation/SAM
+occupied/AU
+occupier/M
+occupies/A
+occupy/RSDZG
+occur/AS
+occurred/A
+occurrence/SM
+occurring/A
+oceanfront/MS
+oceangoing
+Oceania/M
+oceanic
+ocean/MS
+oceanographer/SM
+oceanographic
+oceanography/SM
+oceanology/MS
+oceanside
+Oceanside/M
+Oceanus/M
+ocelot/SM
+ocher/DMGS
+Ochoa/M
+o'clock
+O'Clock
+O'Connell/M
+O'Connor/M
+Oconomowoc/M
+OCR
+octagonal/Y
+octagon/SM
+octahedral
+octahedron/M
+octal/S
+octane/MS
+octant/M
+octave/MS
+Octavia/M
+Octavian/M
+Octavio/M
+Octavius/M
+octavo/MS
+octennial
+octet/SM
+octile
+octillion/M
+Oct/M
+October/MS
+octogenarian/MS
+octopus/SM
+octoroon/M
+ocular/S
+oculist/SM
+OD
+odalisque/SM
+oddball/SM
+oddity/MS
+oddment/MS
+oddness/MS
+odd/TRYSPL
+Odele/M
+Odelia/M
+Odelinda/M
+Odella/M
+Odelle/M
+Odell/M
+O'Dell/M
+ode/MDRS
+Ode/MR
+Oderberg/MS
+Oder/M
+Odessa/M
+Odets/M
+Odetta/M
+Odette/M
+Odey/M
+Odie/M
+Odilia/M
+Odille/M
+Odin/M
+odiousness/MS
+odious/PY
+Odis/M
+odium/MS
+Odo/M
+odometer/SM
+Odom/M
+O'Donnell/M
+odor/DMS
+odoriferous
+odorless
+odorous/YP
+ODs
+O'Dwyer/M
+Ody/M
+Odysseus/M
+Odyssey/M
+odyssey/S
+OE
+OED
+oedipal
+Oedipal/Y
+Oedipus/M
+OEM/M
+OEMS
+oenology/MS
+oenophile/S
+o'er
+O'Er
+Oersted/M
+oesophagi
+oeuvre/SM
+Ofelia/M
+Ofella/M
+offal/MS
+offbeat/MS
+offcuts
+Offenbach/M
+offender/M
+offend/SZGDR
+offense/MSV
+offensively/I
+offensiveness/MSI
+offensive/YSP
+offerer/M
+offering/M
+offer/RDJGZ
+offertory/SM
+offhand/D
+offhandedness/S
+offhanded/YP
+officeholder/SM
+officemate/S
+officer/GMD
+officership/S
+office/SRMZ
+officialdom/SM
+officialism/SM
+officially/U
+official/PSYM
+officiant/SM
+officiate/XSDNG
+officiation/M
+officiator/MS
+officio
+officiousness/MS
+officious/YP
+offing/M
+offish
+offload/GDS
+offprint/GSDM
+offramp
+offset/SM
+offsetting
+offshoot/MS
+offshore
+offside/RS
+offspring/M
+offstage/S
+off/SZGDRJ
+offtrack
+Ofilia/M
+of/K
+often/RT
+oftentimes
+oft/NRT
+ofttimes
+Ogbomosho/M
+Ogdan/M
+Ogden/M
+Ogdon/M
+Ogilvy/M
+ogive/M
+Oglethorpe/M
+ogle/ZGDSR
+ogreish
+ogre/MS
+ogress/S
+oh
+OH
+O'Hara
+O'Hare/M
+O'Higgins
+Ohioan/S
+Ohio/M
+ohmic
+ohmmeter/MS
+ohm/SM
+oho/S
+ohs
+OHSA/M
+oilcloth/M
+oilcloths
+oiler/M
+oilfield/MS
+oiliness/SM
+oilman/M
+oil/MDRSZG
+oilmen
+oilseed/SM
+oilskin/MS
+oily/TPR
+oink/GDS
+ointment/SM
+Oise/M
+OJ
+Ojibwa/SM
+Okamoto/M
+okapi/SM
+Okayama/M
+okay/M
+Okeechobee/M
+O'Keeffe
+Okefenokee
+Okhotsk/M
+Okinawa/M
+Okinawan/S
+Oklahoma/M
+Oklahoman/SM
+Okla/M
+OK/MDG
+okra/MS
+OKs
+Oktoberfest
+Olaf/M
+Olag/M
+Ola/M
+Olav/M
+Oldenburg/M
+olden/DG
+Oldfield/M
+oldie/MS
+oldish
+oldness/S
+Oldsmobile/M
+oldster/SM
+Olduvai/M
+old/XTNRPS
+olé
+oleaginous
+oleander/SM
+O'Leary/M
+olefin/M
+Oleg/M
+Ole/MV
+Olenek/M
+Olenka/M
+Olen/M
+Olenolin/M
+oleomargarine/SM
+oleo/S
+oles
+olfactory
+Olga/M
+Olia/M
+oligarchic
+oligarchical
+oligarch/M
+oligarchs
+oligarchy/SM
+Oligocene
+oligopolistic
+oligopoly/MS
+Olimpia/M
+Olin/M
+olive/MSR
+Olive/MZR
+Oliver/M
+Olivero/M
+Olivette/M
+Olivetti/M
+Olivia/M
+Olivier/M
+Olivie/RM
+Oliviero/M
+Oliy/M
+Ollie/M
+Olly/M
+Olmec
+Olmsted/M
+Olsen/M
+Olson/M
+Olva/M
+Olvan/M
+Olwen/M
+Olympe/M
+Olympiad/MS
+Olympian/S
+Olympia/SM
+Olympic/S
+Olympie/M
+Olympus/M
+Omaha/SM
+Oman/M
+Omar/M
+ombudsman/M
+ombudsmen
+Omdurman/M
+omega/MS
+omelet/SM
+omelette's
+omen/DMG
+Omero/M
+omicron/MS
+ominousness/SM
+ominous/YP
+omission/MS
+omit/S
+omitted
+omitting
+omnibus/MS
+omni/M
+omnipotence/SM
+Omnipotent
+omnipotent/SY
+omnipresence/MS
+omnipresent/Y
+omniscience/SM
+omniscient/YS
+omnivore/MS
+omnivorousness/MS
+omnivorous/PY
+oms
+Omsk/M
+om/XN
+ON
+onanism/M
+Onassis/M
+oncer/M
+once/SR
+oncogene/S
+oncologist/S
+oncology/SM
+oncoming/S
+Ondrea/M
+Oneal/M
+Onega/M
+Onegin/M
+Oneida/SM
+O'Neil
+O'Neill
+oneness/MS
+one/NPMSX
+oner/M
+onerousness/SM
+onerous/YP
+oneself
+onetime
+oneupmanship
+Onfre/M
+Onfroi/M
+ongoing/S
+Onida/M
+onion/GDM
+onionskin/MS
+onlooker/MS
+onlooking
+only/TP
+Onofredo/M
+Ono/M
+onomatopoeia/SM
+onomatopoeic
+onomatopoetic
+Onondaga/MS
+onrush/GMS
+on/RY
+ons
+Onsager/M
+onset/SM
+onsetting
+onshore
+onside
+onslaught/MS
+Ontarian/S
+Ontario/M
+Ont/M
+onto
+ontogeny/SM
+ontological/Y
+ontology/SM
+onus/SM
+onward/S
+onyx/MS
+oodles
+ooh/GD
+oohs
+oolitic
+Oona/M
+OOo/M
+oops/S
+Oort/M
+ooze/GDS
+oozy/RT
+opacity/SM
+opalescence/S
+opalescent/Y
+Opalina/M
+Opaline/M
+Opal/M
+opal/SM
+opaque/GTPYRSD
+opaqueness/SM
+opcode/MS
+OPEC
+Opel/M
+opencast
+opened/AU
+opener/M
+openhandedness/SM
+openhanded/P
+openhearted
+opening/M
+openness/S
+OpenOffice.org/M
+opens/A
+openwork/MS
+open/YRDJGZTP
+operable/I
+operandi
+operand/SM
+operant/YS
+opera/SM
+operate/XNGVDS
+operatically
+operatic/S
+operationalization/S
+operationalize/D
+operational/Y
+operation/M
+operative/IP
+operatively
+operativeness/MI
+operatives
+operator/SM
+operetta/MS
+ope/S
+Ophelia/M
+Ophelie/M
+Ophiuchus/M
+ophthalmic/S
+ophthalmologist/SM
+ophthalmology/MS
+opiate/GMSD
+opine/XGNSD
+opinionatedness/M
+opinionated/PY
+opinion/M
+opioid
+opium/MS
+opossum/SM
+opp
+Oppenheimer/M
+opponent/MS
+opportune/IY
+opportunism/SM
+opportunistic
+opportunistically
+opportunist/SM
+opportunity/MS
+oppose/BRSDG
+opposed/U
+opposer/M
+oppositeness/M
+opposite/SXYNP
+oppositional
+opposition/M
+oppress/DSGV
+oppression/MS
+oppressiveness/MS
+oppressive/YP
+oppressor/MS
+opprobrious/Y
+opprobrium/SM
+Oprah/M
+ops
+opt/DSG
+opthalmic
+opthalmologic
+opthalmology
+optical/Y
+optician/SM
+optic/S
+optics/M
+optima
+optimality
+optimal/Y
+optimise's
+optimism/SM
+optimistic
+optimistically
+optimist/SM
+optimization/SM
+optimize/DRSZG
+optimized/U
+optimizer/M
+optimizes/U
+optimum/SM
+optionality/M
+optional/YS
+option/GDMS
+optoelectronic
+optometric
+optometrist/MS
+optometry/SM
+opulence/SM
+opulent/Y
+opus/SM
+op/XGDN
+OR
+oracle/GMSD
+oracular
+Oralee/M
+Oralia/M
+Oralie/M
+Oralla/M
+Oralle/M
+oral/YS
+Ora/M
+orangeade/MS
+Orange/M
+orange/MS
+orangery/SM
+orangutan/MS
+Oranjestad/M
+Oran/M
+orate/SDGNX
+oration/M
+oratorical/Y
+oratorio/MS
+orator/MS
+oratory/MS
+Orazio/M
+Orbadiah/M
+orbicular
+orbiculares
+orbital/MYS
+orbit/MRDGZS
+orb/SMDG
+orchard/SM
+orchestral/Y
+orchestra/MS
+orchestrate/GNSDX
+orchestrater's
+orchestration/M
+orchestrator/M
+orchid/SM
+ordainer/M
+ordainment/MS
+ordain/SGLDR
+ordeal/SM
+order/AESGD
+ordered/U
+orderer
+ordering/S
+orderless
+orderliness/SE
+orderly/PS
+order's/E
+ordinal/S
+ordinance/MS
+ordinarily
+ordinariness/S
+ordinary/RSPT
+ordinated
+ordinate/I
+ordinates
+ordinate's
+ordinating
+ordination/SM
+ordnance/SM
+Ordovician
+ordure/MS
+oregano/SM
+Oreg/M
+Oregonian/S
+Oregon/M
+Orelee/M
+Orelia/M
+Orelie/M
+Orella/M
+Orelle/M
+Orel/M
+Oren/M
+Ore/NM
+ore/NSM
+Oreo
+Orestes
+organdie's
+organdy/MS
+organelle/MS
+organically/I
+organic/S
+organismic
+organism/MS
+organist/MS
+organizable/UMS
+organizational/MYS
+organization/MEAS
+organize/AGZDRS
+organized/UE
+organizer/MA
+organizes/E
+organizing/E
+organ/MS
+organometallic
+organza/SM
+orgasm/GSMD
+orgasmic
+orgiastic
+orgy/SM
+Oriana/M
+oriel/MS
+orientable
+Oriental/S
+oriental/SY
+orientated/A
+orientate/ESDXGN
+orientates/A
+orientation/AMES
+orienteering/M
+orienter
+orient/GADES
+orient's
+Orient/SM
+orifice/MS
+orig
+origami/MS
+originality/SM
+originally
+original/US
+originate/VGNXSD
+origination/M
+originative/Y
+originator/SM
+origin/MS
+Orin/M
+Orinoco/M
+oriole/SM
+Orion/M
+orison/SM
+Oriya/M
+Orizaba/M
+Orkney/M
+Orland/M
+Orlando/M
+Orlan/M
+Orleans
+Orlick/M
+Orlon/SM
+Orly/M
+ormolu/SM
+or/MY
+ornamental/SY
+ornamentation/SM
+ornament/GSDM
+ornateness/SM
+ornate/YP
+orneriness/SM
+ornery/PRT
+ornithological
+ornithologist/SM
+ornithology/MS
+orographic/M
+orography/M
+Orono/M
+orotund
+orotundity/MS
+orphanage/MS
+orphanhood/M
+orphan/SGDM
+Orpheus/M
+Orphic
+Orran/M
+Orren/M
+Orrin/M
+orris/SM
+Orr/MN
+ors
+Orsa/M
+Orsola/M
+Orson/M
+Ortega/M
+Ortensia/M
+orthodontia/S
+orthodontic/S
+orthodontics/M
+orthodontist/MS
+orthodoxies
+orthodoxly/U
+Orthodox/S
+orthodoxy's
+orthodox/YS
+orthodoxy/U
+orthogonality/M
+orthogonalization/M
+orthogonalized
+orthogonal/Y
+orthographic
+orthographically
+orthography/MS
+orthonormal
+orthopedic/S
+orthopedics/M
+orthopedist/SM
+orthophosphate/MS
+orthorhombic
+Ortiz/M
+Orton/M
+Orval/M
+Orville/M
+Orv/M
+Orwellian
+Orwell/M
+o's
+Osage/SM
+Osaka/M
+Osbert/M
+Osborne/M
+Osborn/M
+Osbourne/M
+Osbourn/M
+Oscar/SM
+Osceola/M
+oscillate/SDXNG
+oscillation/M
+oscillator/SM
+oscillatory
+oscilloscope/SM
+osculate/XDSNG
+osculation/M
+Osgood/M
+OSHA
+Oshawa/M
+O'Shea/M
+Oshkosh/M
+osier/MS
+Osiris/M
+Oslo/M
+Os/M
+OS/M
+Osman/M
+osmium/MS
+Osmond/M
+osmoses
+osmosis/M
+osmotic
+Osmund/M
+osprey/SM
+osseous/Y
+Ossie/M
+ossification/M
+ossify/NGSDX
+ostensible
+ostensibly
+ostentation/MS
+ostentatiousness/M
+ostentatious/PY
+osteoarthritides
+osteoarthritis/M
+osteology/M
+osteopathic
+osteopath/M
+osteopaths
+osteopathy/MS
+osteoporoses
+osteoporosis/M
+ostracise's
+ostracism/MS
+ostracize/GSD
+Ostrander/M
+ostrich/MS
+Ostrogoth/M
+Ostwald/M
+O'Sullivan/M
+Osvaldo/M
+Oswald/M
+Oswell/M
+OT
+OTB
+OTC
+Otes
+Otha/M
+Othelia/M
+Othella/M
+Othello/M
+otherness/M
+other/SMP
+otherwise
+otherworldly/P
+otherworld/Y
+Othilia/M
+Othilie/M
+Otho/M
+otiose
+Otis/M
+OTOH
+Ottawa/MS
+otter/DMGS
+Ottilie/M
+Otto/M
+Ottoman
+ottoman/MS
+Ouagadougou/M
+oubliette/SM
+ouch/SDG
+oughtn't
+ought/SGD
+Ouija/MS
+ounce/MS
+our/S
+ourself
+ourselves
+ouster/M
+oust/RDGZS
+outage/MS
+outargue/GDS
+outback/MRS
+outbalance/GDS
+outbidding
+outbid/S
+outboard/S
+outboast/GSD
+outbound/S
+outbreak/SMG
+outbroke
+outbroken
+outbuilding/SM
+outburst/MGS
+outcast/GSM
+outclass/SDG
+outcome/SM
+outcropped
+outcropping/S
+outcrop/SM
+outcry/MSDG
+outdated/P
+outdid
+outdistance/GSD
+outdoes
+outdo/G
+outdone
+outdoor/S
+outdoorsy
+outdraw/GS
+outdrawn
+outdrew
+outermost
+outerwear/M
+outface/SDG
+outfall/MS
+outfielder/M
+outfield/RMSZ
+outfight/SG
+outfit/MS
+outfitted
+outfitter/MS
+outfitting
+outflank/SGD
+outflow/SMDG
+outfought
+outfox/GSD
+outgeneraled
+outgoes
+outgo/GJ
+outgoing/P
+outgrew
+outgrip
+outgrow/GSH
+outgrown
+outgrowth/M
+outgrowths
+outguess/SDG
+outhit/S
+outhitting
+outhouse/SM
+outing/M
+outlaid
+outlander/M
+outlandishness/MS
+outlandish/PY
+outland/ZR
+outlast/GSD
+outlawry/M
+outlaw/SDMG
+outlay/GSM
+outlet/SM
+outliers
+outline/SDGM
+outlive/GSD
+outlook/MDGS
+outlying
+outmaneuver/GSD
+outmatch/SDG
+outmigration
+outmoded
+outness/M
+outnumber/GDS
+outpaced
+outpatient/SM
+outperform/DGS
+out/PJZGSDR
+outplacement/S
+outplay/GDS
+outpoint/GDS
+outpost/SM
+outpouring/M
+outpour/MJG
+outproduce/GSD
+output/SM
+outputted
+outputting
+outrace/GSD
+outrage/GSDM
+outrageousness/M
+outrageous/YP
+outran
+outrank/GSD
+outré
+outreach/SDG
+outrider/MS
+outrigger/SM
+outright/Y
+outrunning
+outrun/S
+outscore/GDS
+outsell/GS
+outset/MS
+outsetting
+outshine/SG
+outshone
+outshout/GDS
+outsider/PM
+outside/ZSR
+outsize/S
+outskirt/SM
+outsmart/SDG
+outsold
+outsource/SDJG
+outspend/SG
+outspent
+outspoke
+outspokenness/SM
+outspoken/YP
+outspread/SG
+outstanding/Y
+outstate/NX
+outstation/M
+outstay/SDG
+outstretch/GSD
+outstripped
+outstripping
+outstrip/S
+outtake/S
+outvote/GSD
+outwardness/M
+outward/SYP
+outwear/SG
+outweigh/GD
+outweighs
+outwit/S
+outwitted
+outwitting
+outwore
+outwork/SMDG
+outworn
+ouzo/SM
+oval/MYPS
+ovalness/M
+ova/M
+ovarian
+ovary/SM
+ovate/SDGNX
+ovation/GMD
+ovenbird/SM
+oven/MS
+overabundance/MS
+overabundant
+overachieve/SRDGZ
+overact/DGVS
+overage/S
+overaggressive
+overallocation
+overall/SM
+overambitious
+overanxious
+overarching
+overarm/GSD
+overate
+overattentive
+overawe/GDS
+overbalance/DSG
+overbear/GS
+overbearingness/M
+overbearing/YP
+overbidding
+overbid/S
+overbite/MS
+overblown
+overboard
+overbold
+overbook/SDG
+overbore
+overborne
+overbought
+overbuild/GS
+overbuilt
+overburdening/Y
+overburden/SDG
+overbuy/GS
+overcame
+overcapacity/M
+overcapitalize/DSG
+overcareful
+overcast/GS
+overcasting/M
+overcautious
+overcerebral
+overcharge/DSG
+overcloud/DSG
+overcoating/M
+overcoat/SMG
+overcomer/M
+overcome/RSG
+overcommitment/S
+overcompensate/XGNDS
+overcompensation/M
+overcomplexity/M
+overcomplicated
+overconfidence/MS
+overconfident/Y
+overconscientious
+overconsumption/M
+overcook/SDG
+overcooled
+overcorrection
+overcritical
+overcrowd/DGS
+overcurious
+overdecorate/SDG
+overdependent
+overdetermined
+overdevelop/SDG
+overdid
+overdoes
+overdo/G
+overdone
+overdose/DSMG
+overdraft/SM
+overdraw/GS
+overdrawn
+overdress/GDS
+overdrew
+overdrive/GSM
+overdriven
+overdrove
+overdubbed
+overdubbing
+overdub/S
+overdue
+overeagerness/M
+overeager/PY
+overeater/M
+overeat/GNRS
+overeducated
+overemotional
+overemphases
+overemphasis/M
+overemphasize/GZDSR
+overenthusiastic
+overestimate/DSXGN
+overestimation/M
+overexcite/DSG
+overexercise/SDG
+overexert/GDS
+overexertion/SM
+overexploitation
+overexploited
+overexpose/GDS
+overexposure/SM
+overextend/DSG
+overextension
+overfall/M
+overfed
+overfeed/GS
+overfill/GDS
+overfishing
+overflew
+overflight/SM
+overflow/DGS
+overflown
+overfly/GS
+overfond
+overfull
+overgeneralize/GDS
+overgenerous
+overgraze/SDG
+overgrew
+overground
+overgrow/GSH
+overgrown
+overgrowth/M
+overgrowths
+overhand/DGS
+overhang/GS
+overhasty
+overhaul/GRDJS
+overhead/S
+overheard
+overhearer/M
+overhear/SRG
+overheat/SGD
+overhung
+overincredulous
+overindulgence/SM
+overindulgent
+overindulge/SDG
+overinflated
+overjoy/SGD
+overkill/SDMG
+overladed
+overladen
+overlaid
+overlain
+overland/S
+overlap/MS
+overlapped
+overlapping
+overlarge
+overlay/GS
+overleaf
+overlie
+overload/SDG
+overlong
+overlook/DSG
+overlord/DMSG
+overloud
+overly/GRS
+overmanning
+overmaster/GSD
+overmatching
+overmodest
+overmuch/S
+overnice
+overnight/SDRGZ
+overoptimism/SM
+overoptimistic
+overpaid
+overparticular
+overpass/GMSD
+overpay/LSG
+overpayment/M
+overplay/SGD
+overpopulate/DSNGX
+overpopulation/M
+overpopulous
+overpower/GSD
+overpowering/Y
+overpraise/DSG
+overprecise
+overpressure
+overprice/SDG
+overprint/DGS
+overproduce/SDG
+overproduction/S
+overprotect/GVDS
+overprotection/M
+overqualified
+overran
+overrate/DSG
+overreach/DSRG
+overreaction/SM
+overreact/SGD
+overred
+overrefined
+overrepresented
+overridden
+overrider/M
+override/RSG
+overripe
+overrode
+overrule/GDS
+overrunning
+overrun/S
+oversample/DG
+oversaturate
+oversaw
+oversea/S
+overseeing
+overseen
+overseer/M
+oversee/ZRS
+oversell/SG
+oversensitiveness/S
+oversensitive/P
+oversensitivity
+oversexed
+overshadow/GSD
+overshoe/SM
+overshoot/SG
+overshot/S
+oversight/SM
+oversimple
+oversimplification/M
+oversimplify/GXNDS
+oversize/GS
+oversleep/GS
+overslept
+oversoftness/M
+oversoft/P
+oversold
+overspecialization/MS
+overspecialize/GSD
+overspend/SG
+overspent
+overspill/DMSG
+overspread/SG
+overstaffed
+overstatement/SM
+overstate/SDLG
+overstay/GSD
+overstepped
+overstepping
+overstep/S
+overstimulate/DSG
+overstock/SGD
+overstraining
+overstressed
+overstretch/D
+overstrict
+overstrike/GS
+overstrung
+overstuffed
+oversubscribe/SDG
+oversubtle
+oversupply/MDSG
+oversuspicious
+overtaken
+overtake/RSZG
+overtax/DSG
+overthrew
+overthrow/GS
+overthrown
+overtightened
+overtime/MGDS
+overtire/DSG
+overtone/MS
+overtook
+overt/PY
+overture/DSMG
+overturn/SDG
+overuse/DSG
+overvalue/GSD
+overview/MS
+overweening
+overweight/GSD
+overwhelm/GDS
+overwhelming/Y
+overwinter/SDG
+overwork/GSD
+overwrap
+overwrite/SG
+overwritten
+overwrote
+overwrought
+over/YGS
+overzealousness/M
+overzealous/P
+Ovid/M
+oviduct/SM
+oviform
+oviparous
+ovoid/S
+ovular
+ovulate/GNXDS
+ovulatory
+ovule/MS
+ovum/MS
+ow/DYG
+Owen/MS
+owe/S
+owlet/SM
+owl/GSMDR
+owlishness/M
+owlish/PY
+owned/U
+own/EGDS
+ownership/MS
+owner/SM
+oxalate/M
+oxalic
+oxaloacetic
+oxblood/S
+oxbow/SM
+oxcart/MS
+oxen/M
+oxford/MS
+Oxford/MS
+oxidant/SM
+oxidate/NVX
+oxidation/M
+oxidative/Y
+oxide/SM
+oxidization/MS
+oxidized/U
+oxidize/JDRSGZ
+oxidizer/M
+oxidizes/A
+ox/MNS
+Oxnard
+Oxonian
+oxtail/M
+Oxus/M
+oxyacetylene/MS
+oxygenate/XSDMGN
+oxygenation/M
+oxygen/MS
+oxyhydroxides
+oxymora
+oxymoron/M
+oyster/GSDM
+oystering/M
+oz
+Ozark/SM
+Oz/M
+ozone/SM
+Ozymandias/M
+Ozzie/M
+Ozzy/M
+P
+PA
+Pablo/M
+Pablum/M
+pablum/S
+Pabst/M
+pabulum/SM
+PAC
+pace/DRSMZG
+Pace/M
+pacemaker/SM
+pacer/M
+pacesetter/MS
+pacesetting
+Pacheco/M
+pachyderm/MS
+pachysandra/MS
+pacific
+pacifically
+pacification/M
+Pacific/M
+pacifier/M
+pacifism/MS
+pacifistic
+pacifist/MS
+pacify/NRSDGXZ
+package/ARSDG
+packaged/U
+packager/S
+package's
+packages/U
+packaging/SM
+Packard/SM
+packed/AU
+packer/MUS
+packet/MSDG
+pack/GZSJDRMB
+packhorse/M
+packinghouse/S
+packing/M
+packsaddle/SM
+Packston/M
+packs/UA
+Packwood/M
+Paco/M
+Pacorro/M
+pact/SM
+Padang/M
+padded/U
+Paddie/M
+padding/SM
+paddle/MZGRSD
+paddler/M
+paddock/SDMG
+Paddy/M
+paddy/SM
+Padget/M
+Padgett/M
+Padilla/M
+padlock/SGDM
+pad/MS
+Padraic/M
+Padraig/M
+padre/MS
+Padrewski/M
+Padriac/M
+paean/MS
+paediatrician/MS
+paediatrics/M
+paedophilia's
+paella/SM
+paeony/M
+Paganini/M
+paganism/MS
+pagan/SM
+pageantry/SM
+pageant/SM
+pageboy/SM
+paged/U
+pageful
+Page/M
+page/MZGDRS
+pager/M
+paginate/DSNGX
+Paglia/M
+pagoda/MS
+Pahlavi/M
+paid/AU
+Paige/M
+pailful/SM
+Pail/M
+pail/SM
+Paine/M
+painfuller
+painfullest
+painfulness/MS
+painful/YP
+pain/GSDM
+painkiller/MS
+painkilling
+painlessness/S
+painless/YP
+painstaking/SY
+paint/ADRZGS
+paintbox/M
+paintbrush/SM
+painted/U
+painterly/P
+painter/YM
+painting/SM
+paint's
+paintwork
+paired/UA
+pair/JSDMG
+pairs/A
+pairwise
+paisley/MS
+pajama/MDS
+Pakistani/S
+Pakistan/M
+palace/MS
+paladin/MS
+palaeolithic
+palaeontologists
+palaeontology/M
+palanquin/MS
+palatability/M
+palatableness/M
+palatable/P
+palatalization/MS
+palatalize/SDG
+palatal/YS
+palate/BMS
+palatial/Y
+palatinate/SM
+Palatine
+palatine/S
+palaver/GSDM
+paleface/SM
+Palembang/M
+paleness/S
+Paleocene
+Paleogene
+paleographer/SM
+paleography/SM
+paleolithic
+Paleolithic
+paleontologist/S
+paleontology/MS
+Paleozoic
+Palermo/M
+pale/SPY
+Palestine/M
+Palestinian/S
+Palestrina/M
+palette/MS
+Paley/M
+palfrey/MS
+palimony/S
+palimpsest/MS
+palindrome/MS
+palindromic
+paling/M
+palisade/MGSD
+Palisades/M
+palish
+Palladio/M
+palladium/SM
+pallbearer/SM
+palletized
+pallet/SMGD
+pall/GSMD
+palliate/SDVNGX
+palliation/M
+palliative/SY
+pallidness/MS
+pallid/PY
+Pall/M
+pallor/MS
+palmate
+palmer/M
+Palmer/M
+Palmerston/M
+palmetto/MS
+palm/GSMDR
+palmist/MS
+palmistry/MS
+Palm/MR
+Palmolive/M
+palmtop/S
+Palmyra/M
+palmy/RT
+Palo/M
+Paloma/M
+Palomar/M
+palomino/MS
+palpable
+palpably
+palpate/SDNGX
+palpation/M
+palpitate/NGXSD
+palpitation/M
+pal/SJMDRYTG
+palsy/GSDM
+paltriness/SM
+paltry/TRP
+paludal
+Pa/M
+Pamela/M
+Pamelina/M
+Pamella/M
+pa/MH
+Pamirs
+Pam/M
+Pammie/M
+Pammi/M
+Pammy/M
+pampas/M
+pamperer/M
+pamper/RDSG
+Pampers
+pamphleteer/DMSG
+pamphlet/SM
+panacea/MS
+panache/MS
+Panama/MS
+Panamanian/S
+panama/S
+pancake/MGSD
+Panchito/M
+Pancho/M
+panchromatic
+pancreas/MS
+pancreatic
+panda/SM
+pandemic/S
+pandemonium/SM
+pander/ZGRDS
+Pandora/M
+panegyric/SM
+pane/KMS
+paneling/M
+panelist/MS
+panelization
+panelized
+panel/JSGDM
+Pangaea/M
+pang/GDMS
+pangolin/M
+panhandle/RSDGMZ
+panicked
+panicking
+panicky/RT
+panic/SM
+panier's
+panjandrum/M
+Pankhurst/M
+Pan/M
+Panmunjom/M
+panned
+pannier/SM
+panning
+panoply/MSD
+panorama/MS
+panoramic
+panpipes
+Pansie/M
+pan/SMD
+Pansy/M
+pansy/SM
+Pantagruel/M
+Pantaloon/M
+pantaloons
+pant/GDS
+pantheism/MS
+pantheistic
+pantheist/S
+pantheon/MS
+panther/SM
+pantie/SM
+pantiled
+pantograph/M
+pantomime/SDGM
+pantomimic
+pantomimist/SM
+pantry/SM
+pantsuit/SM
+pantyhose
+pantyliner
+pantywaist/SM
+Panza/M
+Paola/M
+Paoli/M
+Paolina/M
+Paolo/M
+papacy/SM
+Papagena/M
+Papageno/M
+papal/Y
+papa/MS
+paparazzi
+papaw/SM
+papaya/MS
+paperback/GDMS
+paperboard/MS
+paperboy/SM
+paperer/M
+papergirl/SM
+paper/GJMRDZ
+paperhanger/SM
+paperhanging/SM
+paperiness/M
+paperless
+paperweight/MS
+paperwork/SM
+papery/P
+papillae
+papilla/M
+papillary
+papist/MS
+papoose/SM
+Pappas/M
+papped
+papping
+pappy/RST
+paprika/MS
+pap/SZMNR
+papyri
+papyrus/M
+Paquito/M
+parable/MGSD
+parabola/MS
+parabolic
+paraboloidal/M
+paraboloid/MS
+Paracelsus/M
+paracetamol/M
+parachuter/M
+parachute/RSDMG
+parachutist/MS
+Paraclete/M
+parader/M
+parade/RSDMZG
+paradigmatic
+paradigm/SM
+paradisaic
+paradisaical
+Paradise/M
+paradise/MS
+paradoxic
+paradoxicalness/M
+paradoxical/YP
+paradox/MS
+paraffin/GSMD
+paragon/SGDM
+paragrapher/M
+paragraph/MRDG
+paragraphs
+Paraguayan/S
+Paraguay/M
+parakeet/MS
+paralegal/S
+paralinguistic
+parallax/SM
+parallel/DSG
+paralleled/U
+parallelepiped/MS
+parallelism/SM
+parallelization/MS
+parallelize/ZGDSR
+parallelogram/MS
+paralysis/M
+paralytically
+paralytic/S
+paralyzedly/S
+paralyzed/Y
+paralyzer/M
+paralyze/ZGDRS
+paralyzingly/S
+paralyzing/Y
+paramagnetic
+paramagnet/M
+Paramaribo/M
+paramecia
+paramecium/M
+paramedical/S
+paramedic/MS
+parameterization/SM
+parameterize/BSDG
+parameterized/U
+parameterless
+parameter/SM
+parametric
+parametrically
+parametrization
+parametrize/DS
+paramilitary/S
+paramount/S
+paramour/MS
+para/MS
+Paramus/M
+Paraná
+paranoiac/S
+paranoia/SM
+paranoid/S
+paranormal/SY
+parapet/SMD
+paraphernalia
+paraphrase/GMSRD
+paraphraser/M
+paraplegia/MS
+paraplegic/S
+paraprofessional/SM
+parapsychologist/S
+parapsychology/MS
+paraquat/S
+parasite/SM
+parasitically
+parasitic/S
+parasitism/SM
+parasitologist/M
+parasitology/M
+parasol/SM
+parasympathetic/S
+parathion/SM
+parathyroid/S
+paratrooper/M
+paratroop/RSZ
+paratyphoid/S
+parboil/DSG
+parceled/U
+parceling/M
+parcel/SGMD
+Parcheesi/M
+parch/GSDL
+parchment/SM
+PARC/M
+pardonableness/M
+pardonable/U
+pardonably/U
+pardoner/M
+pardon/ZBGRDS
+paregoric/SM
+parentage/MS
+parental/Y
+parenteral
+parentheses
+parenthesis/M
+parenthesize/GSD
+parenthetic
+parenthetical/Y
+parenthood/MS
+parent/MDGJS
+pare/S
+paresis/M
+pares/S
+Pareto/M
+parfait/SM
+pariah/M
+pariahs
+parietal/S
+parimutuel/S
+paring/M
+parishioner/SM
+parish/MS
+Parisian/SM
+Paris/M
+parity/ESM
+parka/MS
+Parke/M
+Parker/M
+Parkersburg/M
+park/GJZDRMS
+Parkhouse/M
+parking/M
+Parkinson/M
+parkish
+parkland/M
+parklike
+Parkman
+Park/RMS
+parkway/MS
+parlance/SM
+parlay/DGS
+parley/MDSG
+parliamentarian/SM
+parliamentary/U
+parliament/MS
+Parliament/MS
+parlor/SM
+parlous
+Parmesan/S
+parmigiana
+Parnassus/SM
+Parnell/M
+parochialism/SM
+parochiality
+parochial/Y
+parodied/U
+parodist/SM
+parody/SDGM
+parolee/MS
+parole/MSDG
+paroxysmal
+paroxysm/MS
+parquetry/SM
+parquet/SMDG
+parrakeet's
+parred
+parricidal
+parricide/MS
+parring
+Parrish/M
+Parr/M
+Parrnell/M
+parrot/GMDS
+parrotlike
+parry/GSD
+Parry/M
+parse
+parsec/SM
+parsed/U
+Parsee's
+parser/M
+Parsifal/M
+parsimonious/Y
+parsimony/SM
+pars/JDSRGZ
+parsley/MS
+parsnip/MS
+parsonage/MS
+parson/MS
+Parsons/M
+partaken
+partaker/M
+partake/ZGSR
+part/CDGS
+parterre/MS
+parter/S
+parthenogeneses
+parthenogenesis/M
+Parthenon/M
+Parthia/M
+partiality/MS
+partial/SY
+participant/MS
+participate/NGVDSX
+participation/M
+participator/S
+participatory
+participial/Y
+participle/MS
+particleboard/S
+particle/MS
+particolored
+particularistic
+particularity/SM
+particularization/MS
+particularize/GSD
+particular/SY
+particulate/S
+parting/MS
+partisanship/SM
+partisan/SM
+partition/AMRDGS
+partitioned/U
+partitioner/M
+partitive/S
+partizan's
+partly
+partner/DMGS
+partnership/SM
+partook
+partridge/MS
+part's
+parturition/SM
+partway
+party/RSDMG
+parvenu/SM
+par/ZGSJBMDR
+Pasadena/M
+PASCAL
+Pascale/M
+Pascal/M
+pascal/SM
+paschal/S
+pasha/MS
+Paso/M
+Pasquale/M
+pas/S
+passably
+passage/MGSD
+passageway/MS
+Passaic/M
+passband
+passbook/MS
+passel/MS
+passé/M
+passenger/MYS
+passerby
+passer/M
+passersby
+passim
+passing/Y
+passionated
+passionate/EYP
+passionateness/EM
+passionates
+passionating
+passioned
+passionflower/MS
+passioning
+passionless
+passion/SEM
+Passion/SM
+passivated
+passiveness/S
+passive/SYP
+passivity/S
+pass/JGVBZDSR
+passkey/SM
+passmark
+passover
+Passover/MS
+passport/SM
+password/SDM
+pasta/MS
+pasteboard/SM
+pasted/UA
+pastel/MS
+paste/MS
+Pasternak/M
+pastern/SM
+pasteup
+pasteurization/MS
+pasteurized/U
+pasteurizer/M
+pasteurize/RSDGZ
+Pasteur/M
+pastiche/MS
+pastille/SM
+pastime/SM
+pastiness/SM
+pastoralization/M
+pastoral/SPY
+pastorate/MS
+pastor/GSDM
+past/PGMDRS
+pastrami/MS
+pastry/SM
+past's/A
+pasts/A
+pasturage/SM
+pasture/MGSRD
+pasturer/M
+pasty/PTRS
+Patagonia/M
+Patagonian/S
+patch/EGRSD
+patcher/EM
+patchily
+patchiness/S
+patch's
+patchwork/RMSZ
+patchy/PRT
+patellae
+patella/MS
+Patel/M
+Pate/M
+paten/M
+Paten/M
+patentee/SM
+patent/ZGMRDYSB
+paterfamilias/SM
+pater/M
+paternalism/MS
+paternalist
+paternalistic
+paternal/Y
+paternity/SM
+paternoster/SM
+Paterson/M
+pate/SM
+pathetic
+pathetically
+pathfinder/MS
+pathless/P
+path/M
+pathname/SM
+pathogenesis/M
+pathogenic
+pathogen/SM
+pathologic
+pathological/Y
+pathologist/MS
+pathology/SM
+pathos/SM
+paths
+pathway/MS
+Patience/M
+patience/SM
+patient/MRYTS
+patient's/I
+patients/I
+patina/SM
+patine
+Patin/M
+patio/MS
+Pat/MN
+pat/MNDRS
+Patna/M
+patois/M
+Paton/M
+patresfamilias
+patriarchal
+patriarchate/MS
+patriarch/M
+patriarchs
+patriarchy/MS
+Patrica/M
+Patrice/M
+Patricia/M
+patrician/MS
+patricide/MS
+Patricio/M
+Patrick/M
+Patric/M
+patrimonial
+patrimony/SM
+patriotically
+patriotic/U
+patriotism/SM
+patriot/SM
+patristic/S
+Patrizia/M
+Patrizio/M
+Patrizius/M
+patrolled
+patrolling
+patrolman/M
+patrolmen
+patrol/MS
+patrolwoman
+patrolwomen
+patronage/MS
+patroness/S
+patronization
+patronized/U
+patronize/GZRSDJ
+patronizer/M
+patronizes/A
+patronizing's/U
+patronizing/YM
+patronymically
+patronymic/S
+patron/YMS
+patroon/MS
+patsy/SM
+Patsy/SM
+patted
+Patten/M
+patten/MS
+patterer/M
+pattern/GSDM
+patternless
+patter/RDSGJ
+Patterson/M
+Pattie/M
+Patti/M
+patting
+Pattin/M
+Patton/M
+Patty/M
+patty/SM
+paucity/SM
+Paula/M
+Paule/M
+Pauletta/M
+Paulette/M
+Paulie/M
+Pauli/M
+Paulina/M
+Pauline
+Pauling/M
+Paulita/M
+Paul/MG
+Paulo/M
+Paulsen/M
+Paulson/M
+Paulus/M
+Pauly/M
+paunch/GMSD
+paunchiness/M
+paunchy/RTP
+pauperism/SM
+pauperize/SDG
+pauper/SGDM
+pause/DSG
+Pavarotti
+paved/UA
+pave/GDRSJL
+Pavel/M
+pavement/SGDM
+paver/M
+paves/A
+Pavia/M
+pavilion/SMDG
+paving/A
+paving's
+Pavla/M
+Pavlova/MS
+Pavlovian
+Pavlov/M
+pawl/SM
+paw/MDSG
+pawnbroker/SM
+pawnbroking/S
+Pawnee/SM
+pawner/M
+pawn/GSDRM
+pawnshop/MS
+pawpaw's
+Pawtucket/M
+paxes
+Paxon/M
+Paxton/M
+payable/S
+pay/AGSLB
+payback/S
+paycheck/SM
+payday/MS
+payed
+payee/SM
+payer/SM
+payload/SM
+paymaster/SM
+payment/ASM
+Payne/SM
+payoff/MS
+payola/MS
+payout/S
+payroll/MS
+payslip/S
+Payson/M
+Payton/M
+Paz/M
+Pb/M
+PBS
+PBX
+PCB
+PC/M
+PCP
+PCs
+pct
+pd
+PD
+Pd/M
+PDP
+PDQ
+PDT
+PE
+Peabody/M
+peaceableness/M
+peaceable/P
+peaceably
+peacefuller
+peacefullest
+peacefulness/S
+peaceful/PY
+peace/GMDS
+peacekeeping/S
+Peace/M
+peacemaker/MS
+peacemaking/MS
+peacetime/MS
+peach/GSDM
+Peachtree/M
+peachy/RT
+peacock/SGMD
+Peadar/M
+peafowl/SM
+peahen/MS
+peaked/P
+peakiness/M
+peak/SGDM
+peaky/P
+pealed/A
+Peale/M
+peal/MDSG
+peals/A
+pea/MS
+peanut/SM
+Pearce/M
+Pearla/M
+Pearle/M
+pearler/M
+Pearlie/M
+Pearline/M
+Pearl/M
+pearl/SGRDM
+pearly/TRS
+Pearson/M
+pear/SYM
+peartrees
+Peary/M
+peasanthood
+peasantry/SM
+peasant/SM
+peashooter/MS
+peats/A
+peat/SM
+peaty/TR
+pebble/MGSD
+pebbling/M
+pebbly/TR
+Pebrook/M
+pecan/SM
+peccadilloes
+peccadillo/M
+peccary/MS
+Pechora/M
+pecker/M
+peck/GZSDRM
+Peckinpah/M
+Peck/M
+Pecos/M
+pectic
+pectin/SM
+pectoral/S
+peculate/NGDSX
+peculator/S
+peculiarity/MS
+peculiar/SY
+pecuniary
+pedagogical/Y
+pedagogic/S
+pedagogics/M
+pedagogue/SDGM
+pedagogy/MS
+pedal/SGRDM
+pedantic
+pedantically
+pedantry/MS
+pedant/SM
+peddler/M
+peddle/ZGRSD
+pederast/SM
+pederasty/SM
+Peder/M
+pedestal/GDMS
+pedestrianization
+pedestrianize/GSD
+pedestrian/MS
+pediatrician/SM
+pediatric/S
+pedicab/SM
+pedicure/DSMG
+pedicurist/SM
+pedigree/DSM
+pediment/DMS
+pedlar's
+pedometer/MS
+pedophile/S
+pedophilia
+Pedro/M
+peduncle/MS
+peeing
+peekaboo/SM
+peek/GSD
+peeler/M
+peeling/M
+Peel/M
+peel/SJGZDR
+peen/GSDM
+peeper/M
+peephole/SM
+peep/SGZDR
+peepshow/MS
+peepy
+peerage/MS
+peer/DMG
+peeress/MS
+peerlessness/M
+peerless/PY
+peeve/GZMDS
+peevers/M
+peevishness/SM
+peevish/YP
+peewee/S
+pee/ZDRS
+Pegasus/MS
+pegboard/SM
+Pegeen/M
+pegged
+Peggie/M
+Peggi/M
+pegging
+Peggy/M
+Peg/M
+peg/MS
+peignoir/SM
+Pei/M
+Peiping/M
+Peirce/M
+pejoration/SM
+pejorative/SY
+peke/MS
+Pekinese's
+pekingese
+Pekingese/SM
+Peking/SM
+pekoe/SM
+pelagic
+Pelee/M
+Pele/M
+pelf/SM
+Pelham/M
+pelican/SM
+pellagra/SM
+pellet/SGMD
+pellucid
+Peloponnese/M
+pelter/M
+pelt/GSDR
+pelvic/S
+pelvis/SM
+Pembroke/M
+pemmican/SM
+penalization/SM
+penalized/U
+penalize/SDG
+penalty/MS
+penal/Y
+Pena/M
+penance/SDMG
+pence/M
+penchant/MS
+pencil/SGJMD
+pendant/SM
+pend/DCGS
+pendent/CS
+Penderecki/M
+Pendleton/M
+pendulous
+pendulum/MS
+Penelopa/M
+Penelope/M
+penetrability/SM
+penetrable
+penetrate/SDVGNX
+penetrating/Y
+penetration/M
+penetrativeness/M
+penetrative/PY
+penetrator/MS
+penguin/MS
+penicillin/SM
+penile
+peninsular
+peninsula/SM
+penis/MS
+penitence/MS
+penitential/YS
+penitentiary/MS
+penitent/SY
+penknife/M
+penknives
+penlight/MS
+pen/M
+Pen/M
+penman/M
+penmanship/MS
+penmen
+Penna
+pennant/SM
+penned
+Penney/M
+Pennie/M
+penniless
+Penni/M
+penning
+Pennington/M
+pennis
+Penn/M
+pennon/SM
+Pennsylvania/M
+Pennsylvanian/S
+Penny/M
+penny/SM
+pennyweight/SM
+pennyworth/M
+penologist/MS
+penology/MS
+Penrod/M
+Pensacola/M
+pensioner/M
+pension/ZGMRDBS
+pensiveness/S
+pensive/PY
+pens/V
+pentacle/MS
+pentagonal/SY
+Pentagon/M
+pentagon/SM
+pentagram/MS
+pentameter/SM
+pent/AS
+Pentateuch/M
+pentathlete/S
+pentathlon/MS
+pentatonic
+pentecostal
+Pentecostalism/S
+Pentecostal/S
+Pentecost/SM
+penthouse/SDGM
+Pentium/M
+penuche/SM
+penultimate/SY
+penumbrae
+penumbra/MS
+penuriousness/MS
+penurious/YP
+penury/SM
+peonage/MS
+peon/MS
+peony/SM
+people/SDMG
+Peoria/M
+Pepe/M
+Pepillo/M
+Pepi/M
+Pepin/M
+Pepita/M
+Pepito/M
+pepped
+peppercorn/MS
+pepperer/M
+peppergrass/M
+peppermint/MS
+pepperoni/S
+pepper/SGRDM
+peppery
+peppiness/SM
+pepping
+peppy/PRT
+Pepsico/M
+PepsiCo/M
+Pepsi/M
+pepsin/SM
+pep/SM
+peptic/S
+peptidase/SM
+peptide/SM
+peptizing
+Pepys/M
+Pequot/M
+peradventure/S
+perambulate/DSNGX
+perambulation/M
+perambulator/MS
+percale/MS
+perceivably
+perceive/DRSZGB
+perceived/U
+perceiver/M
+percentage/MS
+percentile/SM
+percent/MS
+perceptible
+perceptibly
+perceptional
+perception/MS
+perceptiveness/MS
+perceptive/YP
+perceptual/Y
+percept/VMS
+Perceval/M
+perchance
+perch/GSDM
+perchlorate/M
+perchlorination
+percipience/MS
+percipient/S
+Percival/M
+percolate/NGSDX
+percolation/M
+percolator/MS
+percuss/DSGV
+percussionist/MS
+percussion/SAM
+percussiveness/M
+percussive/PY
+percutaneous/Y
+Percy/M
+perdition/MS
+perdurable
+peregrinate/XSDNG
+peregrination/M
+peregrine/S
+Perelman/M
+peremptorily
+peremptory/P
+perennial/SY
+pères
+perestroika/S
+Perez/M
+perfecta/S
+perfect/DRYSTGVP
+perfecter/M
+perfectibility/MS
+perfectible
+perfectionism/MS
+perfectionist/MS
+perfection/MS
+perfectiveness/M
+perfective/PY
+perfectness/MS
+perfidiousness/M
+perfidious/YP
+perfidy/MS
+perforated/U
+perforate/XSDGN
+perforation/M
+perforce
+performance/MS
+performed/U
+performer/M
+perform/SDRZGB
+perfumer/M
+perfumery/SM
+perfume/ZMGSRD
+perfunctorily
+perfunctoriness/M
+perfunctory/P
+perfused
+perfusion/M
+Pergamon/M
+pergola/SM
+perhaps/S
+Peria/M
+pericardia
+pericardium/M
+Perice/M
+Periclean
+Pericles/M
+perigee/SM
+perihelia
+perihelion/M
+peril/GSDM
+Perilla/M
+perilousness/M
+perilous/PY
+Peri/M
+perimeter/MS
+perinatal
+perinea
+perineum/M
+periodic
+periodical/YMS
+periodicity/MS
+period/MS
+periodontal/Y
+periodontics/M
+periodontist/S
+peripatetic/S
+peripheral/SY
+periphery/SM
+periphrases
+periphrasis/M
+periphrastic
+periscope/SDMG
+perishable/SM
+perish/BZGSRD
+perishing/Y
+peristalses
+peristalsis/M
+peristaltic
+peristyle/MS
+peritoneal
+peritoneum/SM
+peritonitis/MS
+periwigged
+periwigging
+periwig/MS
+periwinkle/SM
+perjurer/M
+perjure/SRDZG
+perjury/MS
+per/K
+perk/GDS
+perkily
+perkiness/S
+Perkin/SM
+perky/TRP
+Perla/M
+Perle/M
+Perl/M
+permafrost/MS
+permalloy/M
+Permalloy/M
+permanence/SM
+permanency/MS
+permanentness/M
+permanent/YSP
+permeability/SM
+permeableness/M
+permeable/P
+permeate/NGVDSX
+Permian
+permissibility/M
+permissibleness/M
+permissible/P
+permissibly
+permission/SM
+permissiveness/MS
+permissive/YP
+permit/SM
+permitted
+permitting
+Perm/M
+perm/MDGS
+permutation/MS
+permute/SDG
+Pernell/M
+perniciousness/MS
+pernicious/PY
+Pernod/M
+Peron/M
+peroration/SM
+Perot/M
+peroxidase/M
+peroxide/MGDS
+perpend/DG
+perpendicularity/SM
+perpendicular/SY
+perpetrate/NGXSD
+perpetration/M
+perpetrator/SM
+perpetual/SY
+perpetuate/NGSDX
+perpetuation/M
+perpetuity/MS
+perplex/DSG
+perplexed/Y
+perplexity/MS
+perquisite/SM
+Perren/M
+Perri/M
+Perrine/M
+Perry/MR
+persecute/XVNGSD
+persecution/M
+persecutor/MS
+persecutory
+Perseid/M
+Persephone/M
+Perseus/M
+perseverance/MS
+persevere/GSD
+persevering/Y
+Pershing/M
+Persia/M
+Persian/S
+persiflage/MS
+persimmon/SM
+Persis/M
+persist/DRSG
+persistence/SM
+persistent/Y
+persnickety
+personableness/M
+personable/P
+personae
+personage/SM
+personality/SM
+personalization/CMS
+personalize/CSDG
+personalized/U
+personalty/MS
+personal/YS
+persona/M
+person/BMS
+personification/M
+personifier/M
+personify/XNGDRS
+personnel/SM
+person's/U
+persons/U
+perspective/YMS
+perspex
+perspicaciousness/M
+perspicacious/PY
+perspicacity/S
+perspicuity/SM
+perspicuousness/M
+perspicuous/YP
+perspiration/MS
+perspire/DSG
+persuaded/U
+persuader/M
+persuade/ZGDRSB
+persuasion/SM
+persuasively
+persuasiveness/MS
+persuasive/U
+pertain/GSD
+Perth/M
+pertinaciousness/M
+pertinacious/YP
+pertinacity/MS
+pertinence/S
+pertinent/YS
+pertness/MS
+perturbation/MS
+perturbed/U
+perturb/GDS
+pertussis/SM
+pert/YRTSP
+peruke/SM
+Peru/M
+perusal/SM
+peruser/M
+peruse/RSDZG
+Peruvian/S
+pervade/SDG
+pervasion/M
+pervasiveness/MS
+pervasive/PY
+perverseness/SM
+perverse/PXYNV
+perversion/M
+perversity/MS
+pervert/DRSG
+perverted/YP
+perverter/M
+perviousness
+peseta/SM
+Peshawar/M
+peskily
+peskiness/S
+pesky/RTP
+peso/MS
+pessimal/Y
+pessimism/SM
+pessimistic
+pessimistically
+pessimist/SM
+pester/DG
+pesticide/MS
+pestiferous
+pestilence/SM
+pestilential/Y
+pestilent/Y
+pestle/SDMG
+pesto/S
+pest/RZSM
+PET
+Pétain/M
+petal/SDM
+Peta/M
+petard/MS
+petcock/SM
+Pete/M
+peter/GD
+Peter/M
+Petersburg/M
+Petersen/M
+Peters/N
+Peterson/M
+Peterus/M
+Petey/M
+pethidine/M
+petiole/SM
+petiteness/M
+petite/XNPS
+petitioner/M
+petition/GZMRD
+petition's/A
+petitions/A
+petits
+Petkiewicz/M
+Pet/MRZ
+Petra/M
+Petrarch/M
+petrel/SM
+petri
+petrifaction/SM
+petrify/NDSG
+Petrina/M
+Petr/M
+petrochemical/SM
+petrodollar/MS
+petroglyph/M
+petrolatum/MS
+petroleum/MS
+petrolled
+petrolling
+petrol/MS
+petrologist/MS
+petrology/MS
+Petronella/M
+Petronia/M
+Petronilla/M
+Petronille/M
+pet/SMRZ
+petted
+petter/MS
+Pettibone/M
+petticoat/SMD
+pettifogged
+pettifogger/SM
+pettifogging
+pettifog/S
+pettily
+pettiness/S
+petting
+pettis
+pettishness/M
+pettish/YP
+Petty/M
+petty/PRST
+petulance/MS
+petulant/Y
+Petunia/M
+petunia/SM
+Peugeot/M
+Pewaukee/M
+pewee/MS
+pewit/MS
+pew/SM
+pewter/SRM
+peyote/SM
+Peyter/M
+Peyton/M
+pf
+Pfc
+PFC
+pfennig/SM
+Pfizer/M
+pg
+PG
+Phaedra/M
+Phaethon/M
+phaeton/MS
+phage/M
+phagocyte/SM
+Phaidra/M
+phalanger/MS
+phalanges
+phalanx/SM
+phalli
+phallic
+phallus/M
+Phanerozoic
+phantasmagoria/SM
+phantasmal
+phantasm/SM
+phantasy's
+phantom/MS
+pharaoh
+Pharaoh/M
+pharaohs
+Pharaohs
+pharisaic
+Pharisaic
+Pharisaical
+pharisee/S
+Pharisee/SM
+pharmaceutical/SY
+pharmaceutic/S
+pharmaceutics/M
+pharmacist/SM
+pharmacological/Y
+pharmacologist/SM
+pharmacology/SM
+pharmacopoeia/SM
+pharmacy/SM
+pharyngeal/S
+pharynges
+pharyngitides
+pharyngitis/M
+pharynx/M
+phase/DSRGZM
+phaseout/S
+PhD
+pheasant/SM
+Phebe/M
+Phedra/M
+Phekda/M
+Phelia/M
+Phelps/M
+phenacetin/MS
+phenobarbital/SM
+phenolic
+phenol/MS
+phenolphthalein/M
+phenomenal/Y
+phenomena/SM
+phenomenological/Y
+phenomenology/MS
+phenomenon/SM
+phenotype/MS
+phenylalanine/M
+phenyl/M
+pheromone/MS
+phew/S
+phialled
+phialling
+phial/MS
+Phidias/M
+Philadelphia/M
+philanderer/M
+philander/SRDGZ
+philanthropic
+philanthropically
+philanthropist/MS
+philanthropy/SM
+philatelic
+philatelist/MS
+philately/SM
+Philbert/M
+Philco/M
+philharmonic/S
+Philipa/M
+Philip/M
+Philippa/M
+Philippe/M
+Philippians/M
+philippic/SM
+Philippine/SM
+Philis/M
+philistine/S
+Philistine/SM
+philistinism/S
+Phillida/M
+Phillie/M
+Phillipa/M
+Phillipe/M
+Phillip/MS
+Phillipp/M
+Phillis/M
+Philly/SM
+Phil/MY
+philodendron/MS
+philological/Y
+philologist/MS
+philology/MS
+Philomena/M
+philosopher/MS
+philosophic
+philosophical/Y
+philosophized/U
+philosophizer/M
+philosophizes/U
+philosophize/ZDRSG
+philosophy/MS
+philter/SGDM
+philtre/DSMG
+Phineas/M
+Phip/M
+Phipps/M
+phi/SM
+phlebitides
+phlebitis/M
+phlegmatic
+phlegmatically
+phlegm/SM
+phloem/MS
+phlox/M
+pH/M
+Ph/M
+phobia/SM
+phobic/S
+Phobos/M
+Phoebe/M
+phoebe/SM
+Phoenicia/M
+Phoenician/SM
+Phoenix/M
+phoenix/MS
+phone/DSGM
+phoneme/SM
+phonemically
+phonemic/S
+phonemics/M
+phonetically
+phonetician/SM
+phonetic/S
+phonetics/M
+phonically
+phonic/S
+phonics/M
+phoniness/MS
+phonographer/M
+phonographic
+phonograph/RM
+phonographs
+phonologic
+phonological/Y
+phonologist/MS
+phonology/MS
+phonon/M
+phony/PTRSDG
+phooey/S
+phosphatase/M
+phosphate/MS
+phosphide/M
+phosphine/MS
+phosphoresce
+phosphorescence/SM
+phosphorescent/Y
+phosphoric
+phosphor/MS
+phosphorous
+phosphorus/SM
+photocell/MS
+photochemical/Y
+photochemistry/M
+photocopier/M
+photocopy/MRSDZG
+photoelectric
+photoelectrically
+photoelectronic
+photoelectrons
+photoengraver/M
+photoengrave/RSDJZG
+photoengraving/M
+photofinishing/MS
+photogenic
+photogenically
+photograph/AGD
+photographer/SM
+photographic
+photographically
+photograph's
+photographs/A
+photography/MS
+photojournalism/SM
+photojournalist/SM
+photoluminescence/M
+photolysis/M
+photolytic
+photometer/SM
+photometric
+photometrically
+photometry/M
+photomicrograph/M
+photomicrography/M
+photomultiplier/M
+photon/MS
+photorealism
+photosensitive
+photo/SGMD
+photosphere/M
+photostatic
+Photostat/MS
+Photostatted
+Photostatting
+photosyntheses
+photosynthesis/M
+photosynthesize/DSG
+photosynthetic
+phototypesetter
+phototypesetting/M
+phrasal
+phrase/AGDS
+phrasebook
+phrasemaking
+phraseology/MS
+phrase's
+phrasing/SM
+phrenological/Y
+phrenologist/MS
+phrenology/MS
+phylactery/MS
+phylae
+phyla/M
+Phylis/M
+Phyllida/M
+Phyllis/M
+Phyllys/M
+phylogeny/MS
+phylum/M
+Phylys/M
+phys
+physicality/M
+physical/PYS
+physician/SM
+physicist/MS
+physicked
+physicking
+physic/SM
+physiochemical
+physiognomy/SM
+physiography/MS
+physiologic
+physiological/Y
+physiologist/SM
+physiology/MS
+physiotherapist/MS
+physiotherapy/SM
+physique/MSD
+phytoplankton/M
+Piaf/M
+Piaget/M
+Pia/M
+pianism/M
+pianissimo/S
+pianistic
+pianist/SM
+pianoforte/MS
+pianola
+Pianola/M
+piano/SM
+piaster/MS
+piazza/SM
+pibroch/M
+pibrochs
+picador/MS
+picaresque/S
+pica/SM
+Picasso/M
+picayune/S
+Piccadilly/M
+piccalilli/MS
+piccolo/MS
+pickaback's
+pickaxe's
+pickax/GMSD
+pickerel/MS
+Pickering/M
+picker/MG
+picketer/M
+picket/MSRDZG
+Pickett/M
+Pickford/M
+pick/GZSJDR
+pickle/SDMG
+Pickman/M
+pickoff/S
+pickpocket/GSM
+pickup/SM
+Pickwick/M
+picky/RT
+picnicked
+picnicker/MS
+picnicking
+picnic/SM
+picofarad/MS
+picojoule
+picoseconds
+picot/DMGS
+Pict/M
+pictograph/M
+pictographs
+pictorialness/M
+pictorial/PYS
+picture/MGSD
+picturesqueness/SM
+picturesque/PY
+piddle/GSD
+piddly
+pidgin/SM
+piebald/S
+piece/GMDSR
+piecemeal
+piecer/M
+piecewise
+pieceworker/M
+piecework/ZSMR
+piedmont
+Piedmont/M
+pieing
+pie/MS
+Pierce/M
+piercer/M
+pierce/RSDZGJ
+piercing/Y
+Pierette/M
+pier/M
+Pier/M
+Pierre/M
+Pierrette/M
+Pierrot/M
+Pierson/M
+Pieter/M
+Pietra/M
+Pietrek/M
+Pietro/M
+piety/SM
+piezoelectric
+piezoelectricity/M
+piffle/MGSD
+pigeon/DMGS
+pigeonhole/SDGM
+pigged
+piggery/M
+pigging
+piggishness/SM
+piggish/YP
+piggyback/MSDG
+Piggy/M
+piggy/RSMT
+pigheadedness/S
+pigheaded/YP
+piglet/MS
+pigmentation/MS
+pigment/MDSG
+pig/MLS
+Pigmy's
+pigpen/SM
+pigroot
+pigskin/MS
+pigsty/SM
+pigswill/M
+pigtail/SMD
+Pike/M
+pike/MZGDRS
+piker/M
+pikestaff/MS
+pilaf/MS
+pilaster/SM
+Pilate/M
+pilau's
+pilchard/SM
+Pilcomayo/M
+pile/JDSMZG
+pileup/MS
+pilferage/SM
+pilferer/M
+pilfer/ZGSRD
+Pilgrim
+pilgrimage/DSGM
+pilgrim/MS
+piling/M
+pillage/RSDZG
+pillar/DMSG
+pillbox/MS
+pill/GSMD
+pillion/DMGS
+pillory/MSDG
+pillowcase/SM
+pillow/GDMS
+pillowslip/S
+Pillsbury/M
+pilot/DMGS
+pilothouse/SM
+piloting/M
+pimento/MS
+pimiento/SM
+pimpernel/SM
+pimp/GSMYD
+pimple/SDM
+pimplike
+pimply/TRM
+PIN
+pinafore/MS
+piñata/S
+Pinatubo/M
+pinball/MS
+Pincas/M
+pincer/GSD
+Pinchas/M
+pincher/M
+pinch/GRSD
+pincushion/SM
+Pincus/M
+Pindar/M
+pineapple/MS
+pined/A
+Pinehurst/M
+pine/MNGXDS
+pines/A
+pinfeather/SM
+ping/GDRM
+pinheaded/P
+pinhead/SMD
+pinhole/SM
+pining/A
+pinion/DMG
+Pinkerton/M
+pinkeye/MS
+pink/GTYDRMPS
+pinkie/SM
+pinkish/P
+pinkness/S
+pinko/MS
+pinky's
+pinnacle/MGSD
+pinnate
+pinned/U
+pinning/S
+Pinocchio/M
+Pinochet/M
+pinochle/SM
+piñon/S
+pinpoint/SDG
+pinprick/MDSG
+pin's
+pinsetter/SM
+Pinsky/M
+pinstripe/SDM
+pintail/SM
+Pinter/M
+pint/MRS
+pinto/S
+pinup/MS
+pin/US
+pinwheel/DMGS
+pinyin
+Pinyin
+piny/RT
+pioneer/SDMG
+pion/M
+Piotr/M
+piousness/MS
+pious/YP
+pipeline/DSMG
+pipe/MS
+piper/M
+Piper/M
+Pipestone/M
+pipet's
+pipette/MGSD
+pipework
+piping/YM
+pipit/MS
+pip/JSZMGDR
+Pip/MR
+Pippa/M
+pipped
+pipping
+pippin/SM
+Pippo/M
+Pippy/M
+pipsqueak/SM
+piquancy/MS
+piquantness/M
+piquant/PY
+pique/GMDS
+piracy/MS
+Piraeus/M
+Pirandello/M
+piranha/SM
+pirate/MGSD
+piratical/Y
+pirogi
+pirogies
+pirouette/MGSD
+pis
+Pisa/M
+piscatorial
+Pisces/M
+Pisistratus/M
+pismire/SM
+Pissaro/M
+piss/DSRG!
+pistachio/MS
+piste/SM
+pistillate
+pistil/MS
+pistoleers
+pistole/M
+pistol/SMGD
+piston/SM
+pitapat/S
+pitapatted
+pitapatting
+pita/SM
+Pitcairn/M
+pitchblende/SM
+pitcher/M
+pitchfork/GDMS
+pitching/M
+pitchman/M
+pitchmen
+pitch/RSDZG
+pitchstone/M
+piteousness/SM
+piteous/YP
+pitfall/SM
+pithily
+pithiness/SM
+pith/MGDS
+piths
+pithy/RTP
+pitiableness/M
+pitiable/P
+pitiably
+pitier/M
+pitifuller
+pitifullest
+pitifulness/M
+pitiful/PY
+pitilessness/SM
+pitiless/PY
+pitman/M
+pit/MS
+Pitney/M
+piton/SM
+pittance/SM
+pitted
+pitting
+Pittman/M
+Pittsburgh/ZM
+Pittsfield/M
+Pitt/SM
+Pittston/M
+pituitary/SM
+pitying/Y
+pity/ZDSRMG
+Pius/M
+pivotal/Y
+pivot/DMSG
+pivoting/M
+pix/DSG
+pixel/SM
+pixie/MS
+pixiness
+pixmap/SM
+Pizarro/M
+pizazz/S
+pi/ZGDRH
+pizza/SM
+pizzeria/SM
+pizzicati
+pizzicato
+pj's
+PJ's
+pk
+pkg
+pkt
+pkwy
+Pkwy
+pl
+placard/DSMG
+placate/NGVXDRS
+placatory
+placeable/A
+placebo/SM
+placed/EAU
+place/DSRJLGZM
+placeholder/S
+placekick/DGS
+placeless/Y
+placement/AMES
+placental/S
+placenta/SM
+placer/EM
+places/EA
+placidity/SM
+placidness/M
+placid/PY
+placing/AE
+placket/SM
+plagiarism/MS
+plagiarist/MS
+plagiarize/GZDSR
+plagiary/SM
+plagued/U
+plague/MGRSD
+plaguer/M
+plaice/M
+plaid/DMSG
+plainclothes
+plainclothesman
+plainclothesmen
+Plainfield/M
+plainness/MS
+plainsman/M
+plainsmen
+plainsong/SM
+plainspoken
+plain/SPTGRDY
+plaintiff/MS
+plaintiveness/M
+plaintive/YP
+plaint/VMS
+Plainview/M
+plaiting/M
+plait/SRDMG
+planar
+planarity
+Planck/M
+plan/DRMSGZ
+planeload
+planer/M
+plane's
+plane/SCGD
+planetarium/MS
+planetary
+planetesimal/M
+planet/MS
+planetoid/SM
+plangency/S
+plangent
+planking/M
+plank/SJMDG
+plankton/MS
+planned/U
+planner/SM
+planning
+Plano
+planoconcave
+planoconvex
+Plantagenet/M
+plantain/MS
+plantar
+plantation/MS
+planter/MS
+planting/S
+plantlike
+plant's
+plant/SADG
+plaque/MS
+plash/GSDM
+plasma/MS
+plasmid/S
+plasm/M
+plasterboard/MS
+plasterer/M
+plastering/M
+plaster/MDRSZG
+plasterwork/M
+plastically
+plasticine
+Plasticine/M
+plasticity/SM
+plasticize/GDS
+plastic/MYS
+plateau/GDMS
+plateful/S
+platelet/SM
+platen/M
+plater/M
+plate/SM
+platform/SGDM
+Plath/M
+plating/M
+platinize/GSD
+platinum/MS
+platitude/SM
+platitudinous/Y
+plat/JDNRSGXZ
+Plato/M
+platonic
+Platonic
+Platonism/M
+Platonist
+platoon/MDSG
+platted
+Platte/M
+platter/MS
+Platteville/M
+platting
+platypus/MS
+platys
+platy/TR
+plaudit/MS
+plausibility/S
+plausible/P
+plausibly
+Plautus/M
+playability/U
+playable/U
+playacting/M
+playact/SJDG
+playback/MS
+playbill/SM
+Playboy/M
+playboy/SM
+play/DRSEBG
+played/A
+player's/E
+player/SM
+playfellow/S
+playfulness/MS
+playful/PY
+playgirl/SM
+playgoer/MS
+playground/MS
+playgroup/S
+playhouse/SM
+playing/S
+playmate/MS
+playoff/S
+playpen/SM
+playroom/SM
+plays/A
+Playtex/M
+plaything/MS
+playtime/SM
+playwright/SM
+playwriting/M
+plaza/SM
+pleader/MA
+pleading/MY
+plead/ZGJRDS
+pleasanter
+pleasantest
+pleasantness/SMU
+pleasantry/MS
+pleasant/UYP
+pleased/EU
+pleaser/M
+pleases/E
+please/Y
+pleasingness/M
+pleasing/YP
+plea/SM
+pleas/RSDJG
+pleasurableness/M
+pleasurable/P
+pleasurably
+pleasureful
+pleasure/MGBDS
+pleasure's/E
+pleasures/E
+pleater/M
+pleat/RDMGS
+plebeian/SY
+plebe/MS
+plebiscite/SM
+plectra
+plectrum/SM
+pledger/M
+pledge/RSDMG
+Pleiads
+Pleistocene
+plenary/S
+plenipotentiary/S
+plenitude/MS
+plenteousness/M
+plenteous/PY
+plentifulness/M
+plentiful/YP
+plenty/SM
+plenum/M
+pleonasm/MS
+plethora/SM
+pleurae
+pleural
+pleura/M
+pleurisy/SM
+Plexiglas/MS
+plexus/SM
+pliability/MS
+pliableness/M
+pliable/P
+pliancy/MS
+pliantness/M
+pliant/YP
+plication/MA
+plier/MA
+plight/GMDRS
+plimsolls
+plinker/M
+plink/GRDS
+plinth/M
+plinths
+Pliny/M
+Pliocene/S
+PLO
+plodded
+plodder/SM
+plodding/SY
+plod/S
+plopped
+plopping
+plop/SM
+plosive
+plot/SM
+plotted/A
+plotter/MDSG
+plotting
+plover/MS
+plowed/U
+plower/M
+plowman/M
+plowmen
+plow/SGZDRM
+plowshare/MS
+ploy's
+ploy/SCDG
+plucker/M
+pluckily
+pluckiness/SM
+pluck/SGRD
+plucky/TPR
+pluggable
+plugged/UA
+plugging/AU
+plughole
+plug's
+plug/US
+plumage/DSM
+plumbago/M
+plumbed/U
+plumber/M
+plumbing/M
+plumb/JSZGMRD
+plume/SM
+plummer
+plummest
+plummet/DSG
+plummy
+plumper/M
+plumpness/S
+plump/RDNYSTGP
+plum/SMDG
+plumy/TR
+plunder/GDRSZ
+plunger/M
+plunge/RSDZG
+plunker/M
+plunk/ZGSRD
+pluperfect/S
+pluralism/MS
+pluralistic
+pluralist/S
+plurality/SM
+pluralization/MS
+pluralize/GZRSD
+pluralizer/M
+plural/SY
+plushness/MS
+plush/RSYMTP
+plushy/RPT
+plus/S
+plussed
+plussing
+Plutarch/M
+plutocracy/MS
+plutocratic
+plutocrat/SM
+Pluto/M
+plutonium/SM
+pluvial/S
+ply/AZNGRSD
+Plymouth/M
+plywood/MS
+pm
+PM
+Pm/M
+PMS
+pneumatically
+pneumatic/S
+pneumatics/M
+pneumonia/MS
+PO
+poacher/M
+poach/ZGSRD
+Pocahontas/M
+pocketbook/SM
+pocketful/SM
+pocketing/M
+pocketknife/M
+pocketknives
+pocket/MSRDG
+pock/GDMS
+pockmark/MDSG
+Pocono/MS
+podded
+podding
+podge/ZR
+Podgorica/M
+podiatrist/MS
+podiatry/MS
+podium/MS
+pod/SM
+Podunk/M
+Poe/M
+poem/MS
+poesy/GSDM
+poetaster/MS
+poetess/MS
+poetically
+poeticalness
+poetical/U
+poetic/S
+poetics/M
+poet/MS
+poetry/SM
+pogo
+Pogo/M
+pogrom/GMDS
+poignancy/MS
+poignant/Y
+Poincaré/M
+poinciana/SM
+Poindexter/M
+poinsettia/SM
+pointblank
+pointedness/M
+pointed/PY
+pointer/M
+pointillism/SM
+pointillist/SM
+pointing/M
+pointlessness/SM
+pointless/YP
+point/RDMZGS
+pointy/TR
+poise/M
+pois/GDS
+poi/SM
+poisoner/M
+poisoning/M
+poisonous/PY
+poison/RDMZGSJ
+Poisson/M
+poke/DRSZG
+Pokemon/M
+pokerface/D
+poker/M
+poky/SRT
+Poland/M
+Polanski/M
+polarimeter/SM
+polarimetry
+polariscope/M
+Polaris/M
+polarity/MS
+polarization/CMS
+polarized/UC
+polarize/RSDZG
+polarizes/C
+polarizing/C
+polarogram/SM
+polarograph
+polarography/M
+Polaroid/SM
+polar/S
+polecat/SM
+polemical/Y
+polemicist/S
+polemic/S
+polemics/M
+pole/MS
+Pole/MS
+poler/M
+polestar/S
+poleward/S
+pol/GMDRS
+policeman/M
+policemen/M
+police/MSDG
+policewoman/M
+policewomen
+policyholder/MS
+policymaker/S
+policymaking
+policy/SM
+poliomyelitides
+poliomyelitis/M
+polio/SM
+Polish
+polished/U
+polisher/M
+polish/RSDZGJ
+polis/M
+Politburo/M
+politburo/S
+politeness/MS
+polite/PRTY
+politesse/SM
+politically
+political/U
+politician/MS
+politicization/S
+politicize/CSDG
+politicked
+politicking/SM
+politico/SM
+politic/S
+politics/M
+polity/MS
+polka/SDMG
+Polk/M
+pollack/SM
+Pollard/M
+polled/U
+pollen/GDM
+pollinate/XSDGN
+pollination/M
+pollinator/MS
+polliwog/SM
+poll/MDNRSGX
+pollock's
+Pollock/SM
+pollster/MS
+pollutant/MS
+polluted/U
+polluter/M
+pollute/RSDXZVNG
+pollution/M
+Pollux/M
+Pollyanna/M
+Polly/M
+pollywog's
+Pol/MY
+Polo/M
+polo/MS
+polonaise/MS
+polonium/MS
+poltergeist/SM
+poltroon/MS
+polyandrous
+polyandry/MS
+polyatomic
+polybutene/MS
+polycarbonate
+polychemicals
+polychrome
+polyclinic/MS
+polycrystalline
+polyelectrolytes
+polyester/SM
+polyether/S
+polyethylene/SM
+polygamist/MS
+polygamous/Y
+polygamy/MS
+polyglot/S
+polygonal/Y
+polygon/MS
+polygraph/MDG
+polygraphs
+polygynous
+polyhedral
+polyhedron/MS
+Polyhymnia/M
+polyisobutylene
+polyisocyanates
+polymath/M
+polymaths
+polymerase/S
+polymeric
+polymerization/SM
+polymerize/SDG
+polymer/MS
+polymorphic
+polymorphism/MS
+polymorph/M
+polymyositis
+Polynesia/M
+Polynesian/S
+polynomial/YMS
+Polyphemus/M
+polyphonic
+polyphony/MS
+polyphosphate/S
+polyp/MS
+polypropylene/MS
+polystyrene/SM
+polysyllabic
+polysyllable/SM
+polytechnic/MS
+polytheism/SM
+polytheistic
+polytheist/SM
+polythene/M
+polytonal/Y
+polytopes
+polyunsaturated
+polyurethane/SM
+polyvinyl/MS
+Po/M
+pomade/MGSD
+pomander/MS
+pomegranate/SM
+Pomerania/M
+Pomeranian
+pommel/GSMD
+Pomona/M
+Pompadour/M
+pompadour/MDS
+pompano/SM
+Pompeian/S
+Pompeii/M
+Pompey/M
+pompom/SM
+pompon's
+pomposity/MS
+pompousness/S
+pompous/YP
+pomp/SM
+ponce/M
+Ponce/M
+Ponchartrain/M
+poncho/MS
+ponderer/M
+ponderousness/MS
+ponderous/PY
+ponder/ZGRD
+pond/SMDRGZ
+pone/SM
+pongee/MS
+poniard/GSDM
+pons/M
+Pontchartrain/M
+Pontiac/M
+Pontianak/M
+pontiff/MS
+pontifical/YS
+pontificate/XGNDS
+pontoon/SMDG
+pony/DSMG
+ponytail/SM
+pooch/GSDM
+poodle/MS
+poof/MS
+pooh/DG
+Pooh/M
+poohs
+Poole/M
+pool/MDSG
+poolroom/MS
+poolside
+Poona/M
+poop/MDSG
+poorboy
+poorhouse/MS
+poorness/MS
+poor/TYRP
+popcorn/MS
+Popek/MS
+pope/SM
+Pope/SM
+Popeye/M
+popgun/SM
+popinjay/MS
+poplar/SM
+poplin/MS
+Popocatepetl/M
+popover/SM
+poppa/MS
+popped
+Popper/M
+popper/SM
+poppet/M
+popping
+Poppins/M
+poppycock/MS
+Poppy/M
+poppy/SDM
+poppyseed
+Popsicle/MS
+pop/SM
+populace/MS
+popularism
+popularity/UMS
+popularization/SM
+popularize/A
+popularized
+popularizer/MS
+popularizes/U
+popularizing
+popular/YS
+populate/CXNGDS
+populated/UA
+populates/A
+populating/A
+population/MC
+populism/S
+populist/SM
+populousness/MS
+populous/YP
+porcelain/SM
+porch/SM
+porcine
+porcupine/MS
+pore/ZGDRS
+Porfirio/M
+porgy/SM
+poring/Y
+porker/M
+porky/TSR
+pork/ZRMS
+pornographer/SM
+pornographic
+pornographically
+pornography/SM
+porno/S
+porn/S
+porosity/SM
+porousness/MS
+porous/PY
+porphyritic
+porphyry/MS
+porpoise/DSGM
+porridge/MS
+Porrima/M
+porringer/MS
+Porsche/M
+portability/S
+portables
+portable/U
+portably
+port/ABSGZMRD
+portage/ASM
+portaged
+portaging
+portal/SM
+portamento/M
+portcullis/MS
+ported/CE
+Porte/M
+portend/SDG
+portentousness/M
+portentous/PY
+portent/SM
+porterage/M
+porter/DMG
+porterhouse/SM
+Porter/M
+porter's/A
+portfolio/MS
+porthole/SM
+Portia/M
+porticoes
+portico/M
+Portie/M
+portière/SM
+porting/E
+portion/KGSMD
+Portland/M
+portliness/SM
+portly/PTR
+portmanteau/SM
+Port/MR
+Pôrto/M
+portraitist/SM
+portrait/MS
+portraiture/MS
+portrayal/SM
+portrayer/M
+portray/GDRS
+ports/CE
+Portsmouth/M
+Portugal/M
+Portuguese/M
+portulaca/MS
+Porty/M
+posed/CA
+Poseidon/M
+poser/KME
+poses/CA
+poseur/MS
+pose/ZGKDRSE
+posh/DSRGT
+posing/CA
+positifs
+positionable
+positional/KY
+position/KGASMD
+position's/EC
+positions/EC
+positiveness/S
+positive/RSPYT
+positivism/M
+positivist/S
+positivity
+positron/SM
+posit/SCGD
+Posner/M
+posse/M
+possess/AGEDS
+possessed/PY
+possession/AEMS
+possessional
+possessiveness/MS
+possessive/PSMY
+possessor/MS
+possibility/SM
+possible/TRS
+possibly
+poss/S
+possum/MS
+postage/MS
+postal/S
+post/ASDRJG
+postbag/M
+postbox/SM
+postcard/SM
+postcode/SM
+postcondition/S
+postconsonantal
+postdate/DSG
+postdoctoral
+posteriori
+posterior/SY
+posterity/SM
+poster/MS
+postfix/GDS
+postgraduate/SM
+posthaste/S
+posthumousness/M
+posthumous/YP
+posthypnotic
+postilion/MS
+postindustrial
+posting/M
+postlude/MS
+Post/M
+postman/M
+postmarital
+postmark/GSMD
+postmaster/SM
+postmen
+postmeridian
+postmistress/MS
+postmodern
+postmodernist
+postmortem/S
+postnasal
+postnatal
+postoperative/Y
+postorder
+postpaid
+postpartum
+postpone/GLDRS
+postponement/S
+postpositions
+postprandial
+post's
+postscript/SM
+postsecondary
+postulate/XGNSD
+postulation/M
+postural
+posture/MGSRD
+posturer/M
+postvocalic
+postwar
+posy/SM
+potability/SM
+potableness/M
+potable/SP
+potage/M
+potash/MS
+potassium/MS
+potatoes
+potato/M
+potbelly/MSD
+potboiler/M
+potboil/ZR
+pot/CMS
+Potemkin/M
+potency/MS
+potentate/SM
+potentiality/MS
+potential/SY
+potentiating
+potentiometer/SM
+potent/YS
+potful/SM
+pothead/MS
+potherb/MS
+pother/GDMS
+potholder/MS
+pothole/SDMG
+potholing/M
+pothook/SM
+potion/SM
+potlatch/SM
+potluck/MS
+Potomac/M
+potpie/SM
+potpourri/SM
+Potsdam/M
+potsherd/MS
+potshot/S
+pottage/SM
+Pottawatomie/M
+potted
+Potter/M
+potter/RDMSG
+pottery/MS
+potting
+Potts/M
+potty/SRT
+pouch/SDMG
+Poughkeepsie/M
+Poul/M
+poulterer/MS
+poultice/DSMG
+poultry/MS
+pounce/SDG
+poundage/MS
+pounder/MS
+pound/KRDGS
+Pound/M
+pour/DSG
+pourer's
+Poussin/MS
+pouter/M
+pout/GZDRS
+poverty/MS
+POW
+powderpuff
+powder/RDGMS
+powdery
+Powell/M
+powerboat/MS
+powerfulness/M
+powerful/YP
+power/GMD
+powerhouse/MS
+powerlessness/SM
+powerless/YP
+Powers
+Powhatan/M
+pow/RZ
+powwow/GDMS
+pox/GMDS
+Poznan/M
+pp
+PP
+ppm
+ppr
+PPS
+pr
+PR
+practicability/S
+practicable/P
+practicably
+practicality/SM
+practicalness/M
+practical/YPS
+practice/BDRSMG
+practiced/U
+practicer/M
+practicum/SM
+practitioner/SM
+Pradesh/M
+Prado/M
+Praetorian
+praetorian/S
+praetor/MS
+pragmatical/Y
+pragmatic/S
+pragmatics/M
+pragmatism/MS
+pragmatist/MS
+Prague/M
+Praia
+prairie/MS
+praise/ESDG
+praiser/S
+praise's
+praiseworthiness/MS
+praiseworthy/P
+praising/Y
+Prakrit/M
+praline/MS
+pram/MS
+prancer/M
+prance/ZGSRD
+prancing/Y
+prank/SMDG
+prankster/SM
+praseodymium/SM
+Pratchett/M
+prate/DSRGZ
+prater/M
+pratfall/MS
+prating/Y
+prattle/DRSGZ
+prattler/M
+prattling/Y
+Pratt/M
+Prattville/M
+Pravda/M
+prawn/MDSG
+praxes
+praxis/M
+Praxiteles/M
+pray/DRGZS
+prayerbook
+prayerfulness/M
+prayerful/YP
+prayer/M
+PRC
+preach/DRSGLZJ
+preacher/M
+preaching/Y
+preachment/MS
+preachy/RT
+preadolescence/S
+Preakness/M
+preallocate/XGNDS
+preallocation/M
+preallocator/S
+preamble/MGDS
+preamp
+preamplifier/M
+prearrange/LSDG
+prearrangement/SM
+preassign/SDG
+preauthorize
+prebendary/M
+Precambrian
+precancel/DGS
+precancerous
+precariousness/MS
+precarious/PY
+precautionary
+precaution/SGDM
+precede/DSG
+precedence/SM
+precedented/U
+precedent/SDM
+preceptive/Y
+preceptor/MS
+precept/SMV
+precess/DSG
+precession/M
+precinct/MS
+preciosity/MS
+preciousness/S
+precious/PYS
+precipice/MS
+precipitable
+precipitant/S
+precipitateness/M
+precipitate/YNGVPDSX
+precipitation/M
+precipitousness/M
+precipitous/YP
+preciseness/SM
+precise/XYTRSPN
+precision/M
+précis/MDG
+preclude/GDS
+preclusion/S
+precociousness/MS
+precocious/YP
+precocity/SM
+precode/D
+precognition/SM
+precognitive
+precollege/M
+precolonial
+precomputed
+preconceive/GSD
+preconception/SM
+precondition/GMDS
+preconscious
+precook/GDS
+precursor/SM
+precursory
+precut
+predate/NGDSX
+predation/CMS
+predator/SM
+predatory
+predecease/SDG
+predecessor/MS
+predeclared
+predecline
+predefine/GSD
+predefinition/SM
+predesignate/GDS
+predestination/SM
+predestine/SDG
+predetermination/MS
+predeterminer/M
+predetermine/ZGSRD
+predicable/S
+predicament/SM
+predicate/VGNXSD
+predication/M
+predicator
+predictability/UMS
+predictable/U
+predictably/U
+predict/BSDGV
+predicted/U
+prediction/MS
+predictive/Y
+predictor/MS
+predigest/GDS
+predilect
+predilection/SM
+predispose/SDG
+predisposition/MS
+predoctoral
+predominance/SM
+predominant/Y
+predominate/YSDGN
+predomination/M
+preemie/MS
+preeminence/SM
+preeminent/Y
+preemployment/M
+preempt/GVSD
+preemption/SM
+preemptive/Y
+preemptor/M
+preener/M
+preen/SRDG
+preexist/DSG
+preexistence/SM
+preexistent
+prefabbed
+prefabbing
+prefab/MS
+prefabricate/XNGDS
+prefabrication/M
+preface/DRSGM
+prefacer/M
+prefatory
+prefect/MS
+prefecture/MS
+preferableness/M
+preferable/P
+preferably
+prefer/BL
+preference/MS
+preferential/Y
+preferment/SM
+preferred
+preferring
+prefiguration/M
+prefigure/SDG
+prefix/MDSG
+preflight/SGDM
+preform/DSG
+pref/RZ
+pregnancy/SM
+pregnant/Y
+preheat/GDS
+prehensile
+prehistoric
+prehistorical/Y
+prehistory/SM
+preindustrial
+preinitialize/SDG
+preinterview/M
+preisolated
+prejudge/DRSG
+prejudger/M
+prejudgment/SM
+prejudiced/U
+prejudice/MSDG
+prejudicial/PY
+prekindergarten/MS
+prelacy/MS
+prelate/SM
+preliminarily
+preliminary/S
+preliterate/S
+preloaded
+prelude/GMDRS
+preluder/M
+premarital/Y
+premarket
+prematureness/M
+premature/SPY
+prematurity/M
+premedical
+premeditated/Y
+premeditate/XDSGNV
+premeditation/M
+premed/S
+premenstrual
+premiere/MS
+premier/GSDM
+premiership/SM
+Preminger/M
+premise/GMDS
+premiss's
+premium/MS
+premix/GDS
+premolar/S
+premonition/SM
+premonitory
+prenatal/Y
+Pren/M
+Prenticed/M
+Prentice/MGD
+Prenticing/M
+Prentiss/M
+Prent/M
+prenuptial
+preoccupation/MS
+preoccupy/DSG
+preoperative
+preordain/DSLG
+prepackage/GSD
+prepaid
+preparation/SM
+preparative/SYM
+preparatory
+preparedly
+preparedness/USM
+prepared/UP
+prepare/ZDRSG
+prepay/GLS
+prepayment/SM
+prepender/S
+prepends
+preplanned
+preponderance/SM
+preponderant/Y
+preponderate/DSYGN
+prepositional/Y
+preposition/SDMG
+prepossess/GSD
+prepossessing/U
+prepossession/MS
+preposterousness/M
+preposterous/PY
+prepped
+prepping
+preppy/RST
+preprepared
+preprint/SGDM
+preprocessed
+preprocessing
+preprocessor/S
+preproduction
+preprogrammed
+prep/SM
+prepubescence/S
+prepubescent/S
+prepublication/M
+prepuce/SM
+prequel/S
+preradiation
+prerecord/DGS
+preregister/DSG
+preregistration/MS
+prerequisite/SM
+prerogative/SDM
+Pres
+presage/GMDRS
+presager/M
+presbyopia/MS
+presbyterian
+Presbyterianism/S
+Presbyterian/S
+presbyter/MS
+presbytery/MS
+preschool/RSZ
+prescience/SM
+prescient/Y
+Prescott/M
+prescribed/U
+prescriber/M
+prescribe/RSDG
+prescription/SM
+prescriptive/Y
+prescript/SVM
+preselect/SGD
+presence/SM
+presentableness/M
+presentable/P
+presentably/A
+presentational/A
+presentation/AMS
+presented/A
+presenter/A
+presentiment/MS
+presentment/SM
+presents/A
+present/SLBDRYZGP
+preservationist/S
+preservation/SM
+preservative/SM
+preserve/DRSBZG
+preserved/U
+preserver/M
+preset/S
+presetting
+preshrank
+preshrink/SG
+preshrunk
+preside/DRSG
+presidency/MS
+presidential/Y
+president/SM
+presider/M
+presidia
+presidium/M
+Presley/M
+presoaks
+presort/GDS
+pres/S
+press/ACDSG
+pressed/U
+presser/MS
+pressingly/C
+pressing/YS
+pressman/M
+pressmen
+pressure/DSMG
+pressurization/MS
+pressurize/DSRGZ
+pressurized/U
+prestidigitate/NX
+prestidigitation/M
+prestidigitatorial
+prestidigitator/M
+prestige/MS
+prestigious/PY
+Preston/M
+presto/S
+presumably
+presume/BGDRS
+presumer/M
+presuming/Y
+presumption/MS
+presumptive/Y
+presumptuousness/SM
+presumptuous/YP
+presuppose/GDS
+presupposition/S
+pretax
+preteen/S
+pretended/Y
+pretender/M
+pretending/U
+pretend/SDRZG
+pretense/MNVSX
+pretension/GDM
+pretentiousness/S
+pretentious/UYP
+preterite's
+preterit/SM
+preternatural/Y
+pretest/SDG
+pretext/SMDG
+Pretoria/M
+pretreated
+pretreatment/S
+pretrial
+prettify/SDG
+prettily
+prettiness/SM
+pretty/TGPDRS
+pretzel/SM
+prevailing/Y
+prevail/SGD
+prevalence/MS
+prevalent/SY
+prevaricate/DSXNG
+prevaricator/MS
+preventable/U
+preventably
+preventative/S
+prevent/BSDRGV
+preventer/M
+prevention/MS
+preventiveness/M
+preventive/SPY
+preview/ZGSDRM
+previous/Y
+prevision/SGMD
+prewar
+prexes
+preyer's
+prey/SMDG
+Priam/M
+priapic
+Pribilof/M
+price/AGSD
+priced/U
+priceless
+Price/M
+pricer/MS
+price's
+pricey
+pricier
+priciest
+pricker/M
+pricking/M
+prickle/GMDS
+prickliness/S
+prickly/RTP
+prick/RDSYZG
+prideful/Y
+pride/GMDS
+prier/M
+priestess/MS
+priesthood/SM
+Priestley/M
+priestliness/SM
+priestly/PTR
+priest/SMYDG
+prigged
+prigging
+priggishness/S
+priggish/PYM
+prig/SM
+primacy/MS
+primal
+primarily
+primary/MS
+primate/MS
+primed/U
+primely/M
+primeness/M
+prime/PYS
+primer/M
+Prime's
+primeval/Y
+priming/M
+primitiveness/SM
+primitive/YPS
+primitivism/M
+primmed
+primmer
+primmest
+primming
+primness/MS
+primogenitor/MS
+primogeniture/MS
+primordial/YS
+primp/DGS
+primrose/MGSD
+prim/SPJGZYDR
+princedom/MS
+princeliness/SM
+princely/PRT
+Prince/M
+prince/SMY
+princess/MS
+Princeton/M
+principality/MS
+principal/SY
+Principe/M
+Principia/M
+principled/U
+principle/SDMG
+printable/U
+printably
+print/AGDRS
+printed/U
+printer/AM
+printers
+printing/SM
+printmaker/M
+printmake/ZGR
+printmaking/M
+printout/S
+Prinz/M
+prioress/MS
+priori
+prioritize/DSRGZJ
+priority/MS
+prior/YS
+priory/SM
+Pris
+Prisca/M
+Priscella/M
+Priscilla/M
+prised
+prise/GMAS
+prismatic
+prism/MS
+prison/DRMSGZ
+prisoner/M
+Prissie/M
+prissily
+prissiness/SM
+prissy/RSPT
+pristine/Y
+prithee/S
+privacy/MS
+privateer/SMDG
+privateness/M
+private/NVYTRSXP
+privation/MCS
+privative/Y
+privatization/S
+privatize/GSD
+privet/SM
+privileged/U
+privilege/SDMG
+privily
+privy/SRMT
+prized/A
+prize/DSRGZM
+prizefighter/M
+prizefighting/M
+prizefight/SRMGJZ
+prizewinner/S
+prizewinning
+Pr/MN
+PRO
+proactive
+probabilist
+probabilistic
+probabilistically
+probability/SM
+probable/S
+probably
+probated/A
+probate/NVMX
+probates/A
+probating/A
+probational
+probationary/S
+probationer/M
+probation/MRZ
+probation's/A
+probative/A
+prober/M
+probity/SM
+problematical/UY
+problematic/S
+problem/SM
+proboscis/MS
+prob/RBJ
+procaine/MS
+procedural/SY
+procedure/MS
+proceeder/M
+proceeding/M
+proceed/JRDSG
+process/BSDMG
+processed/UA
+processes/A
+processional/YS
+procession/GD
+processor/MS
+proclamation/MS
+proclivity/MS
+proconsular
+procrastinate/XNGDS
+procrastination/M
+procrastinator/MS
+procreational
+procreatory
+procrustean
+Procrustean
+Procrustes/M
+proctor/GSDM
+proctorial
+procurable/U
+procure/L
+procurement/MS
+Procyon/M
+prodded
+prodding
+prodigality/S
+prodigal/SY
+prodigiousness/M
+prodigious/PY
+prodigy/MS
+prod/S
+produce/AZGDRS
+producer/AM
+producible/A
+production/ASM
+productively/UA
+productiveness/MS
+productive/PY
+productivities
+productivity/A
+productivity's
+productize/GZRSD
+product/V
+Prof
+profanation/S
+profaneness/MS
+profane/YPDRSG
+profanity/MS
+professed/Y
+professionalism/SM
+professionalize/GSD
+professional/USY
+profession/SM
+professorial/Y
+professorship/SM
+professor/SM
+proffer/GSD
+proficiency/SM
+proficient/YS
+profitability/MS
+profitableness/MU
+profitable/UP
+profitably/U
+profiteer/GSMD
+profiterole/MS
+profit/GZDRB
+profitless
+profligacy/S
+profligate/YS
+proforma/S
+profoundity
+profoundness/SM
+profound/PTYR
+prof/S
+profundity/MS
+profuseness/MS
+profuse/YP
+progenitor/SM
+progeny/M
+progesterone/SM
+prognathous
+prognoses
+prognosis/M
+prognosticate/NGVXDS
+prognostication/M
+prognosticator/S
+prognostic/S
+program/CSA
+programed
+programing
+programmability
+programmable/S
+programmed/CA
+programmer/ASM
+programming/CA
+programmings
+progression/SM
+progressiveness/SM
+progressive/SPY
+progressivism
+progress/MSDVG
+prohibiter/M
+prohibitionist/MS
+prohibition/MS
+Prohibition/MS
+prohibitiveness/M
+prohibitive/PY
+prohibitory
+prohibit/VGSRD
+projected/AU
+projectile/MS
+projectionist/MS
+projection/MS
+projective/Y
+project/MDVGS
+projector/SM
+Prokofieff/M
+Prokofiev/M
+prolegomena
+proletarianization/M
+proletarianized
+proletarian/S
+proletariat/SM
+proliferate/GNVDSX
+proliferation/M
+prolifically
+prolific/P
+prolixity/MS
+prolix/Y
+prologize
+prologue/MGSD
+prologuize
+prolongate/NGSDX
+prolongation/M
+prolonger/M
+prolong/G
+promenade/GZMSRD
+promenader/M
+Promethean
+Prometheus/M
+promethium/SM
+prominence/MS
+prominent/Y
+promiscuity/MS
+promiscuousness/M
+promiscuous/PY
+promise/GD
+promising/UY
+promissory
+promontory/MS
+promote/GVZBDR
+promoter/M
+promotiveness/M
+promotive/P
+prompted/U
+prompter/M
+promptitude/SM
+promptness/MS
+prompt/SGJTZPYDR
+pro/MS
+promulgate/NGSDX
+promulgation/M
+promulgator/MS
+pron
+proneness/MS
+prone/PY
+pronghorn/SM
+prong/SGMD
+pronominalization
+pronominalize
+pronounceable/U
+pronouncedly
+pronounced/U
+pronounce/GLSRD
+pronouncement/SM
+pronouncer/M
+pronto
+pronunciation/SM
+proofed/A
+proofer
+proofing/M
+proofreader/M
+proofread/GZSR
+proof/SEAM
+propaganda/SM
+propagandistic
+propagandist/SM
+propagandize/DSG
+propagated/U
+propagate/SDVNGX
+propagation/M
+propagator/MS
+propellant/MS
+propelled
+propeller/MS
+propelling
+propel/S
+propensity/MS
+properness/M
+proper/PYRT
+propertied/U
+property/SDM
+prophecy/SM
+prophesier/M
+prophesy/GRSDZ
+prophetess/S
+prophetic
+prophetical/Y
+prophet/SM
+prophylactic/S
+prophylaxes
+prophylaxis/M
+propinquity/MS
+propionate/M
+propitiate/GNXSD
+propitiatory
+propitiousness/M
+propitious/YP
+proponent/MS
+proportionality/M
+proportional/SY
+proportionate/YGESD
+proportioner/M
+proportion/ESGDM
+proportionment/M
+proposal/SM
+propped
+propping
+proprietary/S
+proprietorial
+proprietorship/SM
+proprietor/SM
+proprietress/MS
+propriety/MS
+proprioception
+proprioceptive
+prop/SZ
+propulsion/MS
+propulsive
+propylene/M
+prorogation/SM
+prorogue
+prosaic
+prosaically
+proscenium/MS
+prosciutti
+prosciutto/SM
+proscription/SM
+proscriptive
+pros/DSRG
+prosecute/SDBXNG
+prosecution/M
+prosecutor/MS
+proselyte/SDGM
+proselytism/MS
+proselytize/ZGDSR
+prose/M
+proser/M
+Proserpine/M
+prosodic/S
+prosody/MS
+prospect/DMSVG
+prospection/SM
+prospectiveness/M
+prospective/SYP
+prospector/MS
+prospectus/SM
+prosper/GSD
+prosperity/MS
+prosperousness/M
+prosperous/PY
+prostate
+prostheses
+prosthesis/M
+prosthetic/S
+prosthetics/M
+prostitute/DSXNGM
+prostitution/M
+prostrate/SDXNG
+prostration/M
+prosy/RT
+protactinium/MS
+protagonist/SM
+Protagoras/M
+protean/S
+protease/M
+protect/DVGS
+protected/UY
+protectionism/MS
+protectionist/MS
+protection/MS
+protectiveness/S
+protective/YPS
+protectorate/SM
+protector/MS
+protégées
+protégé/SM
+protein/MS
+proteolysis/M
+proteolytic
+Proterozoic/M
+protestantism
+Protestantism/MS
+protestant/S
+Protestant/SM
+protestation/MS
+protest/G
+protesting/Y
+Proteus/M
+protocol/DMGS
+protoplasmic
+protoplasm/MS
+prototype/SDGM
+prototypic
+prototypical/Y
+protozoa
+protozoan/MS
+protozoic
+protozoon's
+protract/DG
+protrude/SDG
+protrusile
+protrusion/MS
+protrusive/PY
+protuberance/S
+protuberant
+Proudhon/M
+proud/TRY
+Proust/M
+provabilities
+provability's
+provability/U
+provableness/M
+provable/P
+provably
+prov/DRGZB
+proved/U
+proven/U
+prove/ESDAG
+provenance/SM
+Provençal
+Provencals
+Provence/M
+provender/SDG
+provenience/SM
+provenly
+proverb/DG
+proverbial/Y
+Proverbs/M
+prover/M
+provide/DRSBGZ
+provided/U
+providence/SM
+Providence/SM
+providential/Y
+provident/Y
+provider/M
+province/SM
+provincialism/SM
+provincial/SY
+provisional/YS
+provisioner/M
+provision/R
+proviso/MS
+provocateur/S
+provocativeness/SM
+provocative/P
+provoked/U
+provoke/GZDRS
+provoking/Y
+provolone/SM
+Provo/M
+provost/MS
+prowess/SM
+prowler/M
+prowl/RDSZG
+prow/TRMS
+proximal/Y
+proximateness/M
+proximate/PY
+proximity/MS
+Proxmire/M
+proxy/SM
+Prozac
+prude/MS
+Prudence/M
+prudence/SM
+Prudential/M
+prudential/SY
+prudent/Y
+prudery/MS
+Prudi/M
+prudishness/SM
+prudish/YP
+Prudy/M
+Prue/M
+Pruitt/M
+Pru/M
+prune/DSRGZM
+pruner/M
+prurience/MS
+prurient/Y
+Prussia/M
+Prussian/S
+prussic
+Prut/M
+Pryce/M
+pry/DRSGTZ
+pryer's
+prying/Y
+P's
+PS
+p's/A
+psalmist/SM
+psalm/SGDM
+Psalms/M
+psalter
+Psalter/SM
+psaltery/MS
+psephologist/M
+pseudonymous
+pseudonym/SM
+pseudopod
+pseudo/S
+pseudoscience/S
+pshaw/SDG
+psi/S
+psittacoses
+psittacosis/M
+psoriases
+psoriasis/M
+psst/S
+PST
+psychedelically
+psychedelic/S
+psyche/M
+Psyche/M
+psychiatric
+psychiatrist/SM
+psychiatry/MS
+psychical/Y
+psychic/MS
+psychoacoustic/S
+psychoacoustics/M
+psychoactive
+psychoanalysis/M
+psychoanalyst/S
+psychoanalytic
+psychoanalytical
+psychoanalyze/SDG
+psychobabble/S
+psychobiology/M
+psychocultural
+psychodrama/MS
+psychogenic
+psychokinesis/M
+psycholinguistic/S
+psycholinguistics/M
+psycholinguists
+psychological/Y
+psychologist/MS
+psychology/MS
+psychometric/S
+psychometrics/M
+psychometry/M
+psychoneuroses
+psychoneurosis/M
+psychopathic/S
+psychopath/M
+psychopathology/M
+psychopaths
+psychopathy/SM
+psychophysical/Y
+psychophysic/S
+psychophysics/M
+psychophysiology/M
+psychosis/M
+psycho/SM
+psychosocial/Y
+psychosomatic/S
+psychosomatics/M
+psychos/S
+psychotherapeutic/S
+psychotherapist/MS
+psychotherapy/SM
+psychotically
+psychotic/S
+psychotropic/S
+psychs
+psych/SDG
+PT
+PTA
+Ptah/M
+ptarmigan/MS
+pt/C
+pterodactyl/SM
+Pt/M
+PTO
+Ptolemaic
+Ptolemaists
+Ptolemy/MS
+ptomaine/MS
+Pu
+pubbed
+pubbing
+pubertal
+puberty/MS
+pubes
+pubescence/S
+pubescent
+pubic
+pubis/M
+publican/AMS
+publication/AMS
+publicist/SM
+publicity/SM
+publicized/U
+publicize/SDG
+publicness/M
+publics/A
+public/YSP
+publishable/U
+published/UA
+publisher/ASM
+publishes/A
+publishing/M
+publish/JDRSBZG
+pub/MS
+Puccini/M
+puce/SM
+pucker/DG
+Puckett/M
+puck/GZSDRM
+puckishness/S
+puckish/YP
+Puck/M
+pudding/MS
+puddle/JMGRSD
+puddler/M
+puddling/M
+puddly
+pudenda
+pudendum/M
+pudginess/SM
+pudgy/PRT
+Puebla/M
+Pueblo/MS
+pueblo/SM
+puerile/Y
+puerility/SM
+puerperal
+puers
+Puerto/M
+puffball/SM
+puffer/M
+puffery/M
+puffiness/S
+puffin/SM
+Puff/M
+puff/SGZDRM
+puffy/PRT
+Puget/M
+pugged
+pugging
+Pugh/M
+pugilism/SM
+pugilistic
+pugilist/S
+pug/MS
+pugnaciousness/MS
+pugnacious/YP
+pugnacity/SM
+puissant/Y
+puke/GDS
+pukka
+Pulaski/SM
+pulchritude/SM
+pulchritudinous/M
+pule/GDS
+Pulitzer/SM
+pullback/S
+pull/DRGZSJ
+pullet/SM
+pulley/SM
+Pullman/MS
+pullout/S
+pullover/SM
+pulmonary
+pulpiness/S
+pulpit/MS
+pulp/MDRGS
+pulpwood/MS
+pulpy/PTR
+pulsar/MS
+pulsate/NGSDX
+pulsation/M
+pulse/ADSG
+pulser
+pulse's
+pulverable
+pulverization/MS
+pulverized/U
+pulverize/GZSRD
+pulverizer/M
+pulverizes/UA
+puma/SM
+pumice/SDMG
+pummel/SDG
+pumpernickel/SM
+pump/GZSMDR
+pumping/M
+pumpkin/MS
+punchbowl/M
+punched/U
+puncheon/MS
+puncher/M
+punch/GRSDJBZ
+punchline/S
+Punch/M
+punchy/RT
+punctilio/SM
+punctiliousness/SM
+punctilious/PY
+punctualities
+punctuality/UM
+punctualness/M
+punctual/PY
+punctuate/SDXNG
+punctuational
+punctuation/M
+puncture/SDMG
+punditry/S
+pundit/SM
+pungency/MS
+pungent/Y
+Punic
+puniness/MS
+punished/U
+punisher/M
+punishment/MS
+punish/RSDGBL
+punitiveness/M
+punitive/YP
+Punjabi/M
+Punjab/M
+punk/TRMS
+punky/PRS
+pun/MS
+punned
+punning
+punster/SM
+punter/M
+punt/GZMDRS
+puny/PTR
+pupae
+pupal
+pupa/M
+pupate/NGSD
+pupillage/M
+pupil/SM
+pup/MS
+pupped
+puppeteer/SM
+puppetry/MS
+puppet/SM
+pupping
+puppy/GSDM
+puppyish
+purblind
+Purcell/M
+purchasable
+purchase/GASD
+purchaser/MS
+purdah/M
+purdahs
+Purdue/M
+purebred/S
+puree/DSM
+pureeing
+pureness/MS
+pure/PYTGDR
+purgation/M
+purgative/MS
+purgatorial
+purgatory/SM
+purge/GZDSR
+purger/M
+purify/GSRDNXZ
+Purim/SM
+Purina/M
+purine/SM
+purism/MS
+puristic
+purist/MS
+puritanic
+puritanical/Y
+Puritanism/MS
+puritanism/S
+puritan/SM
+Puritan/SM
+purity/SM
+purlieu/SM
+purl/MDGS
+purloin/DRGS
+purloiner/M
+purple/MTGRSD
+purplish
+purport/DRSZG
+purported/Y
+purposefulness/S
+purposeful/YP
+purposelessness/M
+purposeless/PY
+purpose/SDVGYM
+purposiveness/M
+purposive/YP
+purr/DSG
+purring/Y
+purse/DSRGZM
+purser/M
+pursuance/MS
+pursuant
+pursuer/M
+pursue/ZGRSD
+pursuit/MS
+purulence/MS
+purulent
+Purus
+purveyance/MS
+purvey/DGS
+purveyor/MS
+purview/SM
+Pusan/M
+Pusey/M
+pushbutton/S
+pushcart/SM
+pushchair/SM
+pushdown
+push/DSRBGZ
+pusher/M
+pushily
+pushiness/MS
+Pushkin/M
+pushover/SM
+Pushtu/M
+pushy/PRT
+pusillanimity/MS
+pusillanimous/Y
+pus/SM
+puss/S
+pussycat/S
+pussyfoot/DSG
+pussy/TRSM
+pustular
+pustule/MS
+putative/Y
+Putin/M
+put/IS
+Putnam/M
+Putnem/M
+putout/S
+putrefaction/SM
+putrefactive
+putrefy/DSG
+putrescence/MS
+putrescent
+putridity/M
+putridness/M
+putrid/YP
+putsch/S
+putted/I
+puttee/MS
+putter/RDMGZ
+putting/I
+putt/SGZMDR
+puttying/M
+putty/SDMG
+puzzle/JRSDZLG
+puzzlement/MS
+puzzler/M
+PVC
+pvt
+Pvt/M
+PW
+PX
+p/XTGJ
+Pygmalion/M
+pygmy/SM
+Pygmy/SM
+Pyhrric/M
+pyknotic
+Pyle/M
+pylon/SM
+pylori
+pyloric
+pylorus/M
+Pym/M
+Pynchon/M
+Pyongyang/M
+pyorrhea/SM
+Pyotr/M
+pyramidal/Y
+pyramid/GMDS
+pyre/MS
+Pyrenees
+Pyrex/SM
+pyridine/M
+pyrimidine/SM
+pyrite/MS
+pyroelectric
+pyroelectricity/SM
+pyrolysis/M
+pyrolyze/RSM
+pyromaniac/SM
+pyromania/MS
+pyrometer/MS
+pyrometry/M
+pyrophosphate/M
+pyrotechnical
+pyrotechnic/S
+pyrotechnics/M
+pyroxene/M
+pyroxenite/M
+Pyrrhic
+Pythagoras/M
+Pythagorean/S
+Pythias
+Python/M
+python/MS
+pyx/MDSG
+q
+Q
+QA
+Qaddafi/M
+Qantas/M
+Qatar/M
+QB
+QC
+QED
+Qingdao
+Qiqihar/M
+QM
+Qom/M
+qr
+q's
+Q's
+qt
+qty
+qua
+Quaalude/M
+quackery/MS
+quackish
+quack/SDG
+quadded
+quadding
+quadrangle/MS
+quadrangular/M
+quadrant/MS
+quadraphonic/S
+quadrapole
+quadratical/Y
+quadratic/SM
+quadrature/MS
+quadrennial/SY
+quadrennium/MS
+quadric
+quadriceps/SM
+quadrilateral/S
+quadrille/XMGNSD
+quadrillion/MH
+quadripartite/NY
+quadriplegia/SM
+quadriplegic/SM
+quadrivia
+quadrivium/M
+quadrupedal
+quadruped/MS
+quadruple/GSD
+quadruplet/SM
+quadruplicate/GDS
+quadruply/NX
+quadrupole
+quad/SM
+quadword/MS
+quaffer/M
+quaff/SRDG
+quagmire/DSMG
+quahog/MS
+quail/GSDM
+quaintness/MS
+quaint/PTYR
+quake/GZDSR
+Quakeress/M
+Quakerism/S
+Quaker/SM
+quaky/RT
+qualification/ME
+qualified/UY
+qualifier/SM
+qualify/EGXSDN
+qualitative/Y
+quality/MS
+qualmish
+qualm/SM
+quandary/MS
+quangos
+quanta/M
+Quantico/M
+quantifiable/U
+quantified/U
+quantifier/M
+quantify/GNSRDZX
+quantile/S
+quantitativeness/M
+quantitative/PY
+quantity/MS
+quantization/MS
+quantizer/M
+quantize/ZGDRS
+quantum/M
+quarantine/DSGM
+quark/SM
+quarreler/M
+quarrellings
+quarrelsomeness/MS
+quarrelsome/PY
+quarrel/SZDRMG
+quarrier/M
+quarryman/M
+quarrymen
+quarry/RSDGM
+quarterback/SGMD
+quarterdeck/MS
+quarterer/M
+quarterfinal/MS
+quartering/M
+quarterly/S
+quartermaster/MS
+quarter/MDRYG
+quarterstaff/M
+quarterstaves
+quartet/SM
+quartic/S
+quartile/SM
+quarto/SM
+quart/RMSZ
+quartzite/M
+quartz/SM
+quasar/SM
+quash/GSD
+quasi
+quasilinear
+Quasimodo/M
+Quaternary
+quaternary/S
+quaternion/SM
+quatrain/SM
+quaver/GDS
+quavering/Y
+quavery
+Quayle/M
+quayside/M
+quay/SM
+queasily
+queasiness/SM
+queasy/TRP
+Quebec/M
+Quechua/M
+Queenie/M
+queenly/RT
+queen/SGMDY
+Queensland/M
+Queen/SM
+queerness/S
+queer/STGRDYP
+queller/M
+quell/SRDG
+Que/M
+quenchable/U
+quenched/U
+quencher/M
+quench/GZRSDB
+quenchless
+Quentin/M
+Quent/M
+Querida/M
+quern/M
+querulousness/S
+querulous/YP
+query/MGRSD
+quested/A
+quester/AS
+quester's
+quest/FSIM
+questing
+questionableness/M
+questionable/P
+questionably/U
+questioned/UA
+questioner/M
+questioning/UY
+questionnaire/MS
+question/SMRDGBZJ
+quests/A
+Quetzalcoatl/M
+queued/C
+queue/GZMDSR
+queuer/M
+queues/C
+queuing/C
+Quezon/M
+quibble/GZRSD
+quibbler/M
+quiche/SM
+quicken/RDG
+quickie/MS
+quicklime/SM
+quickness/MS
+quick/RNYTXPS
+quicksand/MS
+quicksilver/GDMS
+quickstep/SM
+quid/SM
+quiesce/D
+quiescence/MS
+quiescent/YP
+quieted/E
+quieten/SGD
+quieter/E
+quieter's
+quieting/E
+quietly/E
+quietness/MS
+quiets/E
+quietude/IEMS
+quietus/MS
+quiet/UTGPSDRY
+Quillan/M
+quill/GSDM
+Quill/M
+quilter/M
+quilting/M
+quilt/SZJGRDM
+quincentenary/M
+quince/SM
+Quincey/M
+quincy/M
+Quincy/M
+quinine/MS
+Quinlan/M
+Quinn/M
+quinquennial/Y
+quinsy/SM
+Quinta/M
+Quintana/M
+quintessence/SM
+quintessential/Y
+quintet/SM
+quintic
+quintile/SM
+Quintilian/M
+Quintilla/M
+quintillion/MH
+quintillionth/M
+Quintina/M
+Quintin/M
+Quint/M
+quint/MS
+Quinton/M
+quintuple/SDG
+quintuplet/MS
+Quintus/M
+quip/MS
+quipped
+quipper
+quipping
+quipster/SM
+quired/AI
+quire/MDSG
+quires/AI
+Quirinal/M
+quiring/IA
+quirkiness/SM
+quirk/SGMD
+quirky/PTR
+quirt/SDMG
+Quisling/M
+quisling/SM
+quitclaim/GDMS
+quit/DGS
+quite/SADG
+Quito/M
+quittance/SM
+quitter/SM
+quitting
+quiver/GDS
+quivering/Y
+quivery
+Quixote/M
+quixotic
+quixotically
+Quixotism/M
+quiz/M
+quizzed
+quizzer/SM
+quizzes
+quizzical/Y
+quizzing
+quo/H
+quoin/SGMD
+quoit/GSDM
+quondam
+quonset
+Quonset
+quorate/I
+quorum/MS
+quotability/S
+quota/MS
+quotation/SM
+quoter/M
+quote/UGSD
+quot/GDRB
+quotidian/S
+quotient/SM
+qwerty
+qwertys
+Rabat/M
+rabbet/GSMD
+Rabbi/M
+rabbi/MS
+rabbinate/MS
+rabbinic
+rabbinical/Y
+rabbiter/M
+rabbit/MRDSG
+rabble/GMRSD
+rabbler/M
+Rabelaisian
+Rabelais/M
+rabidness/SM
+rabid/YP
+rabies
+Rabi/M
+Rabin/M
+rabis
+Rab/M
+raccoon/SM
+racecourse/MS
+racegoers
+racehorse/SM
+raceme/MS
+race/MZGDRSJ
+racer/M
+racetrack/SMR
+raceway/SM
+Rachael/M
+Rachele/M
+Rachelle/M
+Rachel/M
+Rachmaninoff/M
+racialism/MS
+racialist/MS
+racial/Y
+racily
+Racine/M
+raciness/MS
+racism/S
+racist/MS
+racketeer/MDSJG
+racket/SMDG
+rackety
+rack/GDRMS
+raconteur/SM
+racoon's
+racquetball/S
+racquet's
+racy/RTP
+radarscope/MS
+radar/SM
+Radcliffe/M
+radded
+radder
+raddest
+Raddie/M
+radding
+Raddy/M
+radial/SY
+radiance/SM
+radian/SM
+radiant/YS
+radiate/XSDYVNG
+radiation/M
+radiative/Y
+radiator/MS
+radicalism/MS
+radicalization/S
+radicalize/GSD
+radicalness/M
+radical/SPY
+radices's
+radii/M
+radioactive/Y
+radioactivity/MS
+radioastronomical
+radioastronomy
+radiocarbon/MS
+radiochemical/Y
+radiochemistry/M
+radiogalaxy/S
+radiogram/SM
+radiographer/MS
+radiographic
+radiography/MS
+radioisotope/SM
+radiologic
+radiological/Y
+radiologist/MS
+radiology/MS
+radioman/M
+radiomen
+radiometer/SM
+radiometric
+radiometry/MS
+radionics
+radionuclide/M
+radiopasteurization
+radiophone/MS
+radiophysics
+radioscopy/SM
+radio/SMDG
+radiosonde/SM
+radiosterilization
+radiosterilized
+radiotelegraph
+radiotelegraphs
+radiotelegraphy/MS
+radiotelephone/SM
+radiotherapist/SM
+radiotherapy/SM
+radish/MS
+radium/MS
+radius/M
+radix/SM
+Rad/M
+radon/SM
+rad/S
+Raeann/M
+Rae/M
+RAF
+Rafaela/M
+Rafaelia/M
+Rafaelita/M
+Rafaellle/M
+Rafaello/M
+Rafael/M
+Rafa/M
+Rafe/M
+Raffaello/M
+Raffarty/M
+Rafferty/M
+raffia/SM
+raffishness/SM
+raffish/PY
+raffle/MSDG
+Raff/M
+Rafi/M
+Raf/M
+rafter/DM
+raft/GZSMDR
+raga/MS
+ragamuffin/MS
+ragbag/SM
+rage/MS
+raggedness/SM
+ragged/PRYT
+raggedy/TR
+ragging
+rag/GSMD
+raging/Y
+raglan/MS
+Ragnar/M
+Ragnarök
+ragout/SMDG
+ragtag/MS
+ragtime/MS
+ragweed/MS
+ragwort/M
+Rahal/M
+rah/DG
+Rahel/M
+rahs
+raider/M
+raid/MDRSGZ
+railbird/S
+rail/CDGS
+railer/SM
+railhead/SM
+railing/MS
+raillery/MS
+railroader/M
+railroading/M
+railroad/SZRDMGJ
+rail's
+railwaymen
+railway/MS
+raiment/SM
+Raimondo/M
+Raimund/M
+Raimundo/M
+Raina/M
+rainbow/MS
+raincloud/S
+raincoat/SM
+raindrop/SM
+Raine/MR
+Rainer/M
+rainfall/SM
+rainforest's
+rain/GSDM
+Rainier/M
+rainless
+rainmaker/SM
+rainmaking/MS
+rainproof/GSD
+rainstorm/SM
+rainwater/MS
+rainy/RT
+raise/DSRGZ
+raiser/M
+raising/M
+raisin/MS
+rajah/M
+rajahs
+Rajive/M
+raj/M
+Rakel/M
+rake/MGDRS
+raker/M
+rakishness/MS
+rakish/PY
+Raleigh/M
+Ralf/M
+Ralina/M
+rally/GSD
+Ralph/M
+Ralston/M
+Ra/M
+Ramada/M
+Ramadan/SM
+Ramakrishna/M
+Rama/M
+Raman/M
+Ramayana/M
+ramble/JRSDGZ
+rambler/M
+rambling/Y
+Rambo/M
+rambunctiousness/S
+rambunctious/PY
+ramekin/SM
+ramie/MS
+ramification/M
+ramify/XNGSD
+Ramirez/M
+Ramiro/M
+ramjet/SM
+Ram/M
+rammed
+ramming
+Ramo/MS
+Ramona/M
+Ramonda/M
+Ramon/M
+rampage/SDG
+rampancy/S
+rampant/Y
+rampart/SGMD
+ramp/GMDS
+ramrodded
+ramrodding
+ramrod/MS
+RAM/S
+Ramsay/M
+Ramses/M
+Ramsey/M
+ramshackle
+ram/SM
+rams/S
+ran/A
+Rana/M
+Rancell/M
+Rance/M
+rancher/M
+rancho/SM
+ranch/ZRSDMJG
+rancidity/MS
+rancidness/SM
+rancid/P
+rancorous/Y
+rancor/SM
+Randall/M
+Randal/M
+Randa/M
+Randee/M
+Randell/M
+Randene/M
+Randie/M
+Randi/M
+randiness/S
+Rand/M
+rand/MDGS
+Randolf/M
+Randolph/M
+randomization/SM
+randomize/SRDG
+randomness/SM
+random/PYS
+Randy/M
+randy/PRST
+Ranee/M
+ranee/SM
+ranged/C
+rangeland/S
+ranger/M
+ranges/C
+range/SM
+rang/GZDR
+ranginess/S
+ranging/C
+Rangoon/M
+rangy/RPT
+Rania/M
+Ranice/M
+Ranier/M
+Rani/MR
+Ranique/M
+rani's
+ranked/U
+ranker/M
+rank/GZTYDRMPJS
+Rankine/M
+ranking/M
+Rankin/M
+rankle/SDG
+rankness/MS
+Ranna/M
+ransacker/M
+ransack/GRDS
+Ransell/M
+ransomer/M
+Ransom/M
+ransom/ZGMRDS
+ranter/M
+rant/GZDRJS
+ranting/Y
+Raoul/M
+rapaciousness/MS
+rapacious/YP
+rapacity/MS
+rapeseed/M
+rape/SM
+Raphaela/M
+Raphael/M
+rapidity/MS
+rapidness/S
+rapid/YRPST
+rapier/SM
+rapine/SM
+rapist/MS
+rap/MDRSZG
+rapped
+rappelled
+rappelling
+rappel/S
+rapper/SM
+rapping/M
+rapporteur/SM
+rapport/SM
+rapprochement/SM
+rapscallion/MS
+raptness/S
+rapture/MGSD
+rapturousness/M
+rapturous/YP
+rapt/YP
+Rapunzel/M
+Raquela/M
+Raquel/M
+rarebit/MS
+rarefaction/MS
+rarefy/GSD
+rareness/MS
+rare/YTPGDRS
+rarity/SM
+Rasalgethi/M
+Rasalhague/M
+rascal/SMY
+rasher/M
+rashness/S
+rash/PZTYSR
+Rasia/M
+Rasla/M
+Rasmussen/M
+raspberry/SM
+rasper/M
+rasping/Y
+rasp/SGJMDR
+Rasputin/M
+raspy/RT
+Rastaban/M
+Rastafarian/M
+raster/MS
+Rastus/M
+ratchet/MDSG
+rateable
+rated/U
+rate/KNGSD
+ratepayer/SM
+rater/M
+rate's
+Ratfor/M
+rather
+Rather/M
+rathskeller/SM
+ratifier/M
+ratify/ZSRDGXN
+rating/M
+ratiocinate/VNGSDX
+ratiocination/M
+ratio/MS
+rationale/SM
+rationalism/SM
+rationalistic
+rationalist/S
+rationality/MS
+rationalization/SM
+rationalizer/M
+rationalize/ZGSRD
+rationalness/M
+rational/YPS
+ration/DSMG
+Ratliff/M
+ratlike
+ratline/SM
+rat/MDRSJZGB
+rattail
+rattan/MS
+ratted
+ratter/MS
+ratting
+rattlebrain/DMS
+rattle/RSDJGZ
+rattlesnake/MS
+rattletrap/MS
+rattling/Y
+rattly/TR
+rattrap/SM
+ratty/RT
+raucousness/SM
+raucous/YP
+Raul/M
+raunchily
+raunchiness/S
+raunchy/RTP
+ravage/GZRSD
+ravager/M
+raveling/S
+Ravel/M
+ravel/UGDS
+raven/JGMRDS
+Raven/M
+ravenous/YP
+raver/M
+rave/ZGDRSJ
+Ravid/M
+Ravi/M
+ravine/SDGM
+ravioli/SM
+ravisher/M
+ravishing/Y
+ravish/LSRDZG
+ravishment/SM
+Raviv/M
+Rawalpindi/M
+rawboned
+rawhide/SDMG
+Rawley/M
+Rawlings/M
+Rawlins/M
+Rawlinson/M
+rawness/SM
+raw/PSRYT
+Rawson/M
+Rayburn/M
+Raychel/M
+Raye/M
+ray/GSMD
+Rayleigh/M
+Ray/M
+Raymond/M
+Raymondville/M
+Raymund/M
+Raymundo/M
+Rayna/M
+Raynard/M
+Raynell/M
+Rayner/M
+Raynor/M
+rayon/SM
+Rayshell/M
+Raytheon/M
+raze/DRSG
+razer/M
+razorback/SM
+razorblades
+razor/MDGS
+razz/GDS
+razzmatazz/S
+Rb
+RBI/S
+RC
+RCA
+rcpt
+RCS
+rd
+RD
+RDA
+Rd/M
+reabbreviate
+reachability
+reachable/U
+reachably
+reached/U
+reacher/M
+reach/GRB
+reacquisition
+reactant/SM
+reacted/U
+reaction
+reactionary/SM
+reactivity
+readability/MS
+readable/P
+readably
+readdress/G
+Reade/M
+reader/M
+readership/MS
+Read/GM
+readied
+readies
+readily
+readinesses
+readiness/UM
+reading/M
+Reading/M
+read/JGZBR
+readopt/G
+readout/MS
+reads/A
+readying
+ready/TUPR
+Reagan/M
+Reagen/M
+realisms
+realism's
+realism/U
+realistically/U
+realistic/U
+realist/SM
+reality/USM
+realizability/MS
+realizableness/M
+realizable/SMP
+realizably/S
+realization/MS
+realized/U
+realize/JRSDBZG
+realizer/M
+realizes/U
+realizing/MY
+realm/M
+realness/S
+realpolitik/SM
+real/RSTP
+realtor's
+Realtor/S
+realty/SM
+Rea/M
+reamer/M
+ream/MDRGZ
+Reamonn/M
+reanimate
+reaper/M
+reappraise/G
+reap/SGZ
+rear/DRMSG
+rearguard/MS
+rearmost
+rearrange/L
+rearward/S
+reasonableness/SMU
+reasonable/UP
+reasonably/U
+Reasoner/M
+reasoner/SM
+reasoning/MS
+reasonless
+reasons
+reason/UBDMG
+reassess/GL
+reassuringly/U
+reattach/GSL
+reawakening/M
+Reba/M
+rebate/M
+Rebbecca/M
+Rebeca/M
+Rebecca's
+Rebecka/M
+Rebekah/M
+Rebeka/M
+Rebekkah/M
+rebeller
+rebellion/SM
+rebelliousness/MS
+rebellious/YP
+rebel/MS
+Rebe/M
+rebid
+rebidding
+rebind/G
+rebirth
+reboil/G
+rebook
+reboot/ZR
+rebound/G
+rebroadcast/MG
+rebuke/RSDG
+rebuking/Y
+rebus
+rebuttal/SM
+rebutting
+rec
+recalcitrance/SM
+recalcitrant/S
+recalibrate/N
+recantation/S
+recant/G
+recap
+recappable
+recapping
+recast/G
+recd
+rec'd
+recede
+receipt/SGDM
+receivable/S
+received/U
+receiver/M
+receivership/SM
+receive/ZGRSDB
+recency/M
+recension/M
+recentness/SM
+recent/YPT
+receptacle/SM
+receptionist/MS
+reception/MS
+receptiveness/S
+receptive/YP
+receptivity/S
+receptor/MS
+recessional/S
+recessionary
+recessiveness/M
+recessive/YPS
+recess/SDMVG
+rechargeable
+recheck/G
+recherché
+recherches
+recidivism/MS
+recidivist/MS
+Recife/M
+recipe/MS
+recipiency
+recipient/MS
+reciprocal/SY
+reciprocate/NGXVDS
+reciprocation/M
+reciprocity/MS
+recitalist/S
+recital/MS
+recitative/MS
+reciter/M
+recite/ZR
+recked
+recking
+recklessness/S
+reckless/PY
+reckoner/M
+reckoning/M
+reckon/SGRDJ
+reclaim/B
+reclamation/SM
+recliner/M
+recline/RSDZG
+recluse/MVNS
+reclusion/M
+recode/G
+recognizability
+recognizable/U
+recognizably
+recognize/BZGSRD
+recognizedly/S
+recognized/U
+recognizer/M
+recognizingly/S
+recognizing/UY
+recoilless
+recoinage
+recolor/GD
+recombinant
+recombine
+recommended/U
+recompense/GDS
+recompute/B
+reconciled/U
+reconciler/M
+reconcile/SRDGB
+reconditeness/M
+recondite/YP
+reconfigurability
+reconfigure/R
+reconnaissance/MS
+reconnect/R
+reconnoiter/GSD
+reconquer/G
+reconsecrate
+reconstitute
+reconstructed/U
+Reconstruction/M
+reconsult/G
+recontact/G
+recontaminate/N
+recontribute
+recook/G
+recopy/G
+recorded/AU
+records/A
+record/ZGJ
+recourse
+recoverability
+recoverable/U
+recover/B
+recovery/MS
+recreant/S
+recreational
+recriminate/GNVXDS
+recrimination/M
+recriminatory
+recross/G
+recrudesce/GDS
+recrudescence/MS
+recrudescent
+recruiter/M
+recruitment/MS
+recruit/ZSGDRML
+recrystallize
+rectal/Y
+rectangle/SM
+rectangular/Y
+recta's
+rectifiable
+rectification/M
+rectifier/M
+rectify/DRSGXZN
+rectilinear/Y
+rectitude/MS
+recto/MS
+rector/SM
+rectory/MS
+rectum/SM
+recumbent/Y
+recuperate/VGNSDX
+recuperation/M
+recur
+recurrence/MS
+recurrent
+recurse/NX
+recursion/M
+recusant/M
+recuse
+recyclable/S
+recycle/BZ
+redact/DGS
+redaction/SM
+redactor/MS
+redbird/SM
+redbreast/SM
+redbrick/M
+redbud/M
+redcap/MS
+redcoat/SM
+redcurrant/M
+redden/DGS
+redder
+reddest
+redding
+reddish/P
+Redd/M
+redeclaration
+redecorate
+redeemable/U
+redeem/BRZ
+redeemed/U
+redeemer/M
+Redeemer/M
+redemptioner/M
+redemption/RMS
+redemptive
+redeposit/M
+redetermination
+Redford/M
+Redgrave/M
+redhead/DRMS
+Redhook/M
+redial/G
+redirect/G
+redirection
+redlining/S
+Redmond/M
+redneck/SMD
+redness/MS
+redo/G
+redolence/MS
+redolent
+Redondo/M
+redouble/S
+redoubtably
+redound/GDS
+red/PYS
+redshift/S
+redskin/SM
+Redstone/M
+reduced/U
+reducer/M
+reduce/RSDGZ
+reducibility/M
+reducible
+reducibly
+reductionism/M
+reductionist/S
+reduction/SM
+reduct/V
+redundancy/SM
+redundant/Y
+redwood/SM
+redye
+redyeing
+Reeba/M
+Reebok/M
+Reece/M
+reecho/G
+reed/GMDR
+reediness/SM
+reeding/M
+Reed/M
+Reedville/M
+reedy/PTR
+reefer/M
+reef/GZSDRM
+reeker/M
+reek/GSR
+reeler/M
+reel's
+reel/USDG
+Ree/MDS
+Reena/M
+reenforcement
+reentrant
+Reese/M
+reestimate/M
+Reeta/M
+Reeva/M
+reeve/G
+Reeves
+reexamine
+refection/SM
+refectory/SM
+refer/B
+refereed/U
+refereeing
+referee/MSD
+reference/CGSRD
+referenced/U
+reference's
+referencing/U
+referendum/MS
+referentiality
+referential/YM
+referent/SM
+referral/SM
+referred
+referrer/S
+referring
+reffed
+reffing
+refile
+refinance
+refined/U
+refine/LZ
+refinement/MS
+refinish/G
+refit
+reflectance/M
+reflected/U
+reflectional
+reflection/SM
+reflectiveness/M
+reflective/YP
+reflectivity/M
+reflector/MS
+reflect/SDGV
+reflexion/MS
+reflexiveness/M
+reflexive/PSY
+reflexivity/M
+reflex/YV
+reflooring
+refluent
+reflux/G
+refocus/G
+refold/G
+reforestation
+reforge/G
+reformatory/SM
+reform/B
+reformed/U
+reformer/M
+reformism/M
+reformist/S
+refract/DGVS
+refractiveness/M
+refractive/PY
+refractometer/MS
+refractoriness/M
+refractory/PS
+refrain/DGS
+refreshed/U
+refreshing/Y
+refresh/LB
+refreshment/MS
+refrigerant/MS
+refrigerated/U
+refrigerate/XDSGN
+refrigeration/M
+refrigerator/MS
+refrozen
+refry/GS
+refugee/MS
+refuge/SDGM
+Refugio/M
+refulgence/SM
+refulgent
+refund/B
+refunder/M
+refurbish/L
+refurbishment/S
+refusal/SM
+refuse/R
+refuser/M
+refutation/MS
+refute/GZRSDB
+refuter/M
+ref/ZS
+reg
+regale/L
+regalement/S
+regal/GYRD
+regalia/M
+Regan/M
+regard/EGDS
+regardless/PY
+regather/G
+regatta/MS
+regency/MS
+regeneracy/MS
+regenerately
+regenerateness/M
+regenerate/U
+Regen/M
+reggae/SM
+Reggie/M
+Reggi/MS
+Reggy/M
+regicide/SM
+regime/MS
+regimen/MS
+regimental/S
+regimentation/MS
+regiment/SDMG
+Reginae
+Reginald/M
+Regina/M
+Reginauld/M
+Regine/M
+regionalism/MS
+regional/SY
+region/SM
+Regis/M
+register's
+register/UDSG
+registrable
+registrant/SM
+registrar/SM
+registration/AM
+registrations
+registry/MS
+Reg/MN
+regnant
+Regor/M
+regress/DSGV
+regression/MS
+regressiveness/M
+regressive/PY
+regressors
+regretfulness/M
+regretful/PY
+regret/S
+regrettable
+regrettably
+regretted
+regretting
+reground
+regroup/G
+regrow/G
+regularity/MS
+regularization/MS
+regularize/SDG
+regular/YS
+regulate/CSDXNG
+regulated/U
+regulation/M
+regulative
+regulator/SM
+regulatory
+Regulus/M
+regurgitate/XGNSD
+regurgitation/M
+rehabbed
+rehabbing
+rehabilitate/SDXVGN
+rehabilitation/M
+rehab/S
+rehang/G
+rehear/GJ
+rehearsal/SM
+rehearse
+rehearsed/U
+rehearser/M
+rehears/R
+reheat/G
+reheating/M
+Rehnquist
+rehydrate
+Reichenberg/M
+Reich/M
+Reichstags
+Reichstag's
+Reidar/M
+Reider/M
+Reid/MR
+reign/MDSG
+Reiko/M
+Reilly/M
+reimburse/GSDBL
+reimbursement/MS
+Reinald/M
+Reinaldo/MS
+Reina/M
+reindeer/M
+Reine/M
+reinforced/U
+reinforce/GSRDL
+reinforcement/MS
+reinforcer/M
+rein/GDM
+Reinhard/M
+Reinhardt/M
+Reinhold/M
+Reinold/M
+reinstate/L
+reinstatement/MS
+reinsurance
+Reinwald/M
+reissue
+REIT
+reiterative/SP
+rejecter/M
+rejecting/Y
+rejection/SM
+rejector/MS
+reject/RDVGS
+rejigger
+rejoice/RSDJG
+rejoicing/Y
+rejoinder/SM
+rejuvenate/NGSDX
+rejuvenatory
+relapse
+relatedly
+relatedness/MS
+related/U
+relater/M
+relate/XVNGSZ
+relational/Y
+relation/M
+relationship/MS
+relativeness/M
+relative/SPY
+relativism/M
+relativistic
+relativistically
+relativist/MS
+relativity/MS
+relator's
+relaxant/SM
+relaxation/MS
+relaxedness/M
+relaxed/YP
+relax/GZD
+relaxing/Y
+relay/GDM
+relearn/G
+releasable/U
+release/B
+released/U
+relenting/U
+relentlessness/SM
+relentless/PY
+relent/SDG
+relevance/SM
+relevancy/MS
+relevant/Y
+reliability/UMS
+reliables
+reliable/U
+reliably/U
+reliance/MS
+reliant/Y
+relicense/R
+relic/MS
+relict/C
+relict's
+relief/M
+relievedly
+relieved/U
+reliever/M
+relieve/RSDZG
+religionists
+religion/SM
+religiosity/M
+religiousness/MS
+religious/PY
+relink/G
+relinquish/GSDL
+relinquishment/SM
+reliquary/MS
+relish/GSD
+relive/GB
+reload/GR
+relocate/B
+reluctance/MS
+reluctant/Y
+rel/V
+rely/DG
+rem
+Re/M
+remade/S
+remainder/SGMD
+remain/GD
+remake/M
+remand/DGS
+remap
+remapping
+remarkableness/S
+remarkable/U
+remarkably
+remark/BG
+remarked/U
+Remarque/M
+rematch/G
+Rembrandt/M
+remeasure/D
+remediableness/M
+remediable/P
+remedy/SDMG
+remembered/U
+rememberer/M
+remember/GR
+remembrance/MRS
+remembrancer/M
+Remington/M
+reminisce/GSD
+reminiscence/SM
+reminiscent/Y
+remissness/MS
+remiss/YP
+remit/S
+remittance/MS
+remitted
+remitting/U
+Rem/M
+remnant/MS
+remodel/G
+remolding
+remonstrant/MS
+remonstrate/SDXVNG
+remonstration/M
+remonstrative/Y
+remorsefulness/M
+remorseful/PY
+remorselessness/MS
+remorseless/YP
+remorse/SM
+remoteness/MS
+remote/RPTY
+remoulds
+removal/MS
+REM/S
+remunerated/U
+remunerate/VNGXSD
+remuneration/M
+remunerativeness/M
+remunerative/YP
+Remus/M
+Remy/M
+Renado/M
+Renae/M
+renaissance/S
+Renaissance/SM
+renal
+Renaldo/M
+Rena/M
+Renard/M
+Renascence/SM
+Renata/M
+Renate/M
+Renato/M
+renaturation
+Renaud/M
+Renault/MS
+rend
+renderer/M
+render/GJRD
+rendering/M
+rendezvous/DSMG
+rendition/GSDM
+rend/RGZS
+Renee/M
+renegade/SDMG
+renege/GZRSD
+reneger/M
+Renelle/M
+Renell/M
+Rene/M
+renewal/MS
+renew/BG
+renewer/M
+Renie/M
+rennet/MS
+Rennie/M
+rennin/SM
+Renoir/M
+Reno/M
+renounce/LGRSD
+renouncement/MS
+renouncer/M
+renovate/NGXSD
+renovation/M
+renovator/SM
+renown/SGDM
+Rensselaer/M
+rentaller
+rental/SM
+renter/M
+rent/GZMDRS
+renumber/G
+renumeration
+renunciate/VNX
+renunciation/M
+Renville/M
+reoccupy/G
+reopen/G
+reorganized/U
+repack/G
+repairable/U
+repair/BZGR
+repairer/M
+repairman/M
+repairmen
+repairs/E
+repaper
+reparable
+reparation/SM
+reparteeing
+repartee/MDS
+repartition/Z
+repast/G
+repatriate/SDXNG
+repave
+repealer/M
+repeal/GR
+repeatability/M
+repeatable/U
+repeatably
+repeated/Y
+repeater/M
+repeat/RDJBZG
+repelled
+repellent/SY
+repelling/Y
+repel/S
+repentance/SM
+repentant/SY
+repent/RDG
+repertoire/SM
+repertory/SM
+repetition
+repetitiousness/S
+repetitious/YP
+repetitiveness/MS
+repetitive/PY
+repine/R
+repiner/M
+replace/RL
+replay/GM
+replenish/LRSDG
+replenishment/S
+repleteness/MS
+replete/SDPXGN
+repletion/M
+replica/SM
+replicate/SDVG
+replicator/S
+replug
+reply/X
+Rep/M
+repopulate
+reported/Y
+reportorial/Y
+reposeful
+repose/M
+repository/MS
+reprehend/GDS
+reprehensibility/MS
+reprehensibleness/M
+reprehensible/P
+reprehensibly
+reprehension/MS
+representable/U
+representational/Y
+representativeness/M
+Representative/S
+representative/SYMP
+representativity
+represented/U
+represent/GB
+repression/SM
+repressiveness/M
+repressive/YP
+repress/V
+reprieve/GDS
+reprimand/SGMD
+reprint/M
+reprisal/MS
+reproacher/M
+reproachfulness/M
+reproachful/YP
+reproach/GRSDB
+reproaching/Y
+reprobate/N
+reprocess/G
+reproducibility/MS
+reproducible/S
+reproducibly
+reproductive/S
+reproof/G
+reprove/R
+reproving/Y
+rep/S
+reptile/SM
+reptilian/S
+Republicanism/S
+republicanism/SM
+Republican/S
+republic/M
+republish/G
+repudiate/XGNSD
+repudiation/M
+repudiator/S
+repugnance/MS
+repugnant/Y
+repulse/VNX
+repulsion/M
+repulsiveness/MS
+repulsive/PY
+reputability/SM
+reputably/E
+reputation/SM
+reputed/Y
+repute/ESB
+reputing
+requested/U
+request/G
+Requiem/MS
+requiem/SM
+require/LR
+requirement/MS
+requisiteness/M
+requisite/PNXS
+requisitioner/M
+requisition/GDRM
+requital/MS
+requited/U
+requiter/M
+requite/RZ
+reread/G
+rerecord/G
+rerouteing
+rerunning
+res/C
+rescale
+rescind/SDRG
+rescission/SM
+rescue/GZRSD
+reseal/BG
+research/MB
+reselect/G
+resemblant
+resemble/DSG
+resend/G
+resent/DSLG
+resentfulness/SM
+resentful/PY
+resentment/MS
+reserpine/MS
+reservation/MS
+reservednesses
+reservedness/UM
+reserved/UYP
+reservist/SM
+reservoir/MS
+reset/RDG
+resettle/L
+reshipping
+reshow/G
+reshuffle/M
+reside/G
+residence/MS
+residency/SM
+residential/Y
+resident/SM
+resider/M
+residua
+residual/YS
+residuary
+residue/SM
+residuum/M
+resignation/MS
+resigned/YP
+resilience/MS
+resiliency/S
+resilient/Y
+resin/D
+resinlike
+resinous
+resiny
+resistance/SM
+Resistance/SM
+resistantly
+resistants
+resistant/U
+resisted/U
+resistible
+resistibly
+resisting/U
+resistiveness/M
+resistive/PY
+resistivity/M
+resistless
+resistor/MS
+resist/RDZVGS
+resize/G
+resold
+resole/G
+resoluble
+resoluteness/MS
+resolute/PYTRV
+resolvability/M
+resolvable/U
+resolved/U
+resolvent
+resonance/SM
+resonant/YS
+resonate/DSG
+resonator/MS
+resorption/MS
+resort/R
+resound/G
+resourcefulness/SM
+resourceful/PY
+resp
+respectability/SM
+respectable/SP
+respectably
+respect/BSDRMZGV
+respected/E
+respectful/EY
+respectfulness/SM
+respecting/E
+respectiveness/M
+respective/PY
+respect's/E
+respects/E
+respell/G
+respiration/MS
+respirator/SM
+respiratory/M
+resplendence/MS
+resplendent/Y
+respondent/MS
+respond/SDRZG
+responser/M
+response/RSXMV
+responsibility/MS
+responsibleness/M
+responsible/P
+responsibly
+responsiveness/MSU
+responsive/YPU
+respray/G
+restart/B
+restate/L
+restaurant/SM
+restaurateur/SM
+rest/DRSGVM
+rested/U
+rester/M
+restfuller
+restfullest
+restfulness/MS
+restful/YP
+restitution/SM
+restiveness/SM
+restive/PY
+restlessness/MS
+restless/YP
+restorability
+Restoration/M
+restoration/MS
+restorative/PYS
+restorer/M
+restore/Z
+restrained/UY
+restraint/MS
+restrict/DVGS
+restricted/YU
+restriction/SM
+restrictively
+restrictiveness/MS
+restrictives
+restrictive/U
+restroom/SM
+restructurability
+restructure
+rest's/U
+rests/U
+restudy/M
+restyle
+resubstitute
+resultant/YS
+result/SGMD
+resume/SDBG
+resumption/MS
+resurface
+resurgence/MS
+resurgent
+resurrect/GSD
+resurrection/SM
+resurvey/G
+resuscitate/XSDVNG
+resuscitation/M
+resuscitator/MS
+retail/Z
+retainer/M
+retain/LZGSRD
+retake
+retaliate/VNGXSD
+retaliation/M
+retaliatory
+Reta/M
+retardant/SM
+retardation/SM
+retarder/M
+retard/ZGRDS
+retch/SDG
+retention/SM
+retentiveness/S
+retentive/YP
+retentivity/M
+retest/G
+Retha/M
+rethought
+reticence/S
+reticent/Y
+reticle/SM
+reticular
+reticulate/GNYXSD
+reticulation/M
+reticule/MS
+reticulum/M
+retinal/S
+retina/SM
+retinue/MS
+retiredness/M
+retiree/MS
+retire/L
+retirement/SM
+retiring/YP
+retort/GD
+retract/DG
+retractile
+retrench/L
+retrenchment/MS
+retributed
+retribution/MS
+retributive
+retrieval/SM
+retriever/M
+retrieve/ZGDRSB
+retroactive/Y
+retrofire/GMSD
+retrofit/S
+retrofitted
+retrofitting
+retroflection
+retroflex/D
+retroflexion/M
+retrogradations
+retrograde/GYDS
+retrogression/MS
+retrogressive/Y
+retrogress/SDVG
+retrorocket/MS
+retro/SM
+retrospection/MS
+retrospective/SY
+retrospect/SVGMD
+retrovirus/S
+retrovision
+retry/G
+retsina/SM
+returnable/S
+returned/U
+returnee/SM
+retype
+Reube/M
+Reuben/M
+Reub/NM
+Reunion/M
+reuse/B
+Reuters
+Reuther/M
+reutilization
+Reuven/M
+Reva/M
+revanchist
+revealed/U
+revealingly
+revealing/U
+reveal/JBG
+reveille/MS
+revelation/MS
+Revelation/MS
+revelatory
+revelry/MS
+revel/SJRDGZ
+revenge/MGSRD
+revenger/M
+revenuer/M
+revenue/ZR
+reverberant
+reverberate/XVNGSD
+reverberation/M
+revere/GSD
+Revere/M
+reverencer/M
+reverence/SRDGM
+Reverend
+reverend/SM
+reverential/Y
+reverent/Y
+reverie/SM
+reversal/MS
+reverser/M
+reverse/Y
+reversibility/M
+reversible/S
+reversibly
+reversioner/M
+reversion/R
+revers/M
+reverter/M
+revertible
+revert/RDVGS
+revet/L
+revetment/SM
+review/G
+revile/GZSDL
+revilement/MS
+reviler/M
+revise/BRZ
+revised/U
+revisionary
+revisionism/SM
+revisionist/SM
+revitalize/ZR
+revivalism/MS
+revivalist/MS
+revival/SM
+reviver/M
+revive/RSDG
+revivification/M
+revivify/X
+Revkah/M
+Revlon/M
+Rev/M
+revocable
+revoke/GZRSD
+revolter/M
+revolt/GRD
+revolting/Y
+revolutionariness/M
+revolutionary/MSP
+revolutionist/MS
+revolutionize/GDSRZ
+revolutionizer/M
+revolution/SM
+revolve/BSRDZJG
+revolver/M
+revue/MS
+revulsion/MS
+revved
+revving
+rev/ZM
+rewarded/U
+rewarding/Y
+rewarm/G
+reweave
+rewedding
+reweigh/G
+rewind/BGR
+rewire/G
+rework/G
+rexes
+Rex/M
+Reyes
+Reykjavik/M
+re/YM
+Rey/M
+Reynaldo/M
+Reyna/M
+Reynard/M
+Reynold/SM
+rezone
+Rf
+RF
+RFC
+RFD
+R/G
+rhapsodic
+rhapsodical
+rhapsodize/GSD
+rhapsody/SM
+Rhea/M
+rhea/SM
+Rheba/M
+Rhee/M
+Rheims/M
+Rheinholdt/M
+Rhenish
+rhenium/MS
+rheology/M
+rheostat/MS
+rhesus/S
+Rheta/M
+rhetorical/YP
+rhetorician/MS
+rhetoric/MS
+Rhetta/M
+Rhett/M
+rheumatically
+rheumatic/S
+rheumatics/M
+rheumatism/SM
+rheumatoid
+rheum/MS
+rheumy/RT
+Rhiamon/M
+Rhianna/M
+Rhiannon/M
+Rhianon/M
+Rhinelander/M
+Rhineland/RM
+Rhine/M
+rhinestone/SM
+rhinitides
+rhinitis/M
+rhinoceros/MS
+rhino/MS
+rhinotracheitis
+rhizome/MS
+Rh/M
+Rhoda/M
+Rhodes
+Rhodesia/M
+Rhodesian/S
+Rhodia/M
+Rhodie/M
+rhodium/MS
+rhododendron/SM
+rhodolite/M
+rhodonite/M
+Rhody/M
+rhombic
+rhomboidal
+rhomboid/SM
+rhombus/SM
+rho/MS
+Rhona/M
+Rhonda/M
+Rhone
+rhubarb/MS
+rhyme/DSRGZM
+rhymester/MS
+Rhys/M
+rhythmical/Y
+rhythmic/S
+rhythmics/M
+rhythm/MS
+RI
+rial/MS
+Riane/M
+Riannon/M
+Rianon/M
+ribaldry/MS
+ribald/S
+ribbed
+Ribbentrop/M
+ribber/S
+ribbing/M
+ribbon/DMSG
+ribcage
+rib/MS
+riboflavin/MS
+ribonucleic
+ribosomal
+ribosome/MS
+Rica/M
+Rican/SM
+Ricard/M
+Ricardo/M
+Ricca/M
+Riccardo/M
+rice/DRSMZG
+Rice/M
+ricer/M
+Richard/MS
+Richardo/M
+Richardson/M
+Richart/M
+Richelieu/M
+richen/DG
+Richey/M
+Richfield/M
+Richie/M
+Richland/M
+Rich/M
+Richmond/M
+Richmound/M
+richness/MS
+Richter/M
+Richthofen/M
+Richy/M
+rich/YNSRPT
+Rici/M
+Rickard/M
+Rickenbacker/M
+Rickenbaugh/M
+Rickert/M
+rickets/M
+rickety/RT
+Rickey/M
+rick/GSDM
+Rickie/M
+Ricki/M
+Rick/M
+Rickover/M
+rickrack/MS
+rickshaw/SM
+Ricky/M
+Ric/M
+ricochet/GSD
+Rico/M
+Ricoriki/M
+ricotta/MS
+riddance/SM
+ridden
+ridding
+riddle/GMRSD
+Riddle/M
+ride/CZSGR
+Ride/M
+rider/CM
+riderless
+ridership/S
+ridge/DSGM
+Ridgefield/M
+ridgepole/SM
+Ridgway/M
+ridgy/RT
+ridicule/MGDRS
+ridiculer/M
+ridiculousness/MS
+ridiculous/PY
+riding/M
+rid/ZGRJSB
+Riemann/M
+Riesling/SM
+rife/RT
+riff/GSDM
+riffle/SDG
+riffraff/SM
+rifled/U
+rifle/GZMDSR
+rifleman/M
+riflemen
+rifler/M
+rifling/M
+rift/GSMD
+Riga/M
+rigamarole's
+rigatoni/M
+Rigel/M
+rigged
+rigger/SM
+rigging/MS
+Riggs/M
+righteousnesses/U
+righteousness/MS
+righteous/PYU
+rightfulness/MS
+rightful/PY
+rightism/SM
+rightist/S
+rightmost
+rightness/MS
+Right/S
+right/SGTPYRDN
+rightsize/SDG
+rights/M
+rightward/S
+rigidify/S
+rigidity/S
+rigidness/S
+rigid/YP
+rigmarole/MS
+rig/MS
+Rigoberto/M
+Rigoletto/M
+rigor/MS
+rigorousness/S
+rigorous/YP
+Riki/M
+Rikki/M
+Rik/M
+rile/DSG
+Riley/M
+Rilke/M
+rill/GSMD
+Rimbaud/M
+rime/MS
+rimer/M
+rim/GSMDR
+rimless
+rimmed
+rimming
+Rinaldo/M
+Rina/M
+rind/MDGS
+Rinehart/M
+ringer/M
+ring/GZJDRM
+ringing/Y
+ringleader/MS
+ringlet/SM
+ringlike
+Ringling/M
+Ring/M
+ringmaster/MS
+Ringo/M
+ringside/ZMRS
+ringworm/SM
+rink/GDRMS
+rinse/DSRG
+Riobard/M
+Rio/MS
+Riordan/M
+rioter/M
+riotousness/M
+riotous/PY
+riot/SMDRGZJ
+RIP
+riparian/S
+ripcord/SM
+ripened/U
+ripenesses
+ripeness/UM
+ripen/RDG
+ripe/PSY
+riper/U
+ripest/U
+Ripley/M
+Rip/M
+rip/NDRSXTG
+ripoff/S
+riposte/SDMG
+ripped
+ripper/SM
+ripping
+rippler/M
+ripple/RSDGM
+ripply/TR
+ripsaw/GDMS
+riptide/SM
+Risa/M
+RISC
+risen
+riser/M
+rise/RSJZG
+risibility/SM
+risible/S
+rising/M
+risker/M
+risk/GSDRM
+riskily
+riskiness/MS
+risky/RTP
+risotto/SM
+risqué
+rissole/M
+Ritalin
+Rita/M
+Ritchie/M
+rite/DSM
+Ritter/M
+ritualism/SM
+ritualistic
+ritualistically
+ritualized
+ritual/MSY
+Ritz/M
+ritzy/TR
+rivaled/U
+Rivalee/M
+rivalry/MS
+rival/SGDM
+Riva/MS
+rive/CSGRD
+Rivera/M
+riverbank/SM
+riverbed/S
+riverboat/S
+river/CM
+riverfront
+riverine
+Rivers
+Riverside/M
+riverside/S
+Riverview/M
+riveter/M
+rivet/GZSRDM
+riveting/Y
+Riviera/MS
+Rivi/M
+Rivkah/M
+rivulet/SM
+Rivy/M
+riv/ZGNDR
+Riyadh/M
+riyal/SM
+rm
+RMS
+RN
+RNA
+Rn/M
+roach/GSDM
+Roach/M
+roadbed/MS
+roadblock/SMDG
+roadhouse/SM
+roadie/S
+roadkill/S
+road/MIS
+roadrunner/MS
+roadshow/S
+roadside/S
+roadsigns
+roadster/SM
+roadsweepers
+roadway/SM
+roadwork/SM
+roadworthy
+roam/DRGZS
+Roana/M
+Roanna/M
+Roanne/M
+Roanoke/M
+roan/S
+roar/DRSJGZ
+roarer/M
+roaring/T
+Roarke/M
+roaster/M
+roast/SGJZRD
+robbed
+robber/SM
+Robbert/M
+robbery/SM
+Robbie/M
+Robbi/M
+robbing
+Robbin/MS
+Robb/M
+Robby/M
+Robbyn/M
+robe/ESDG
+Robena/M
+Robenia/M
+Robers/M
+Roberson/M
+Roberta/M
+Robert/MS
+Roberto/M
+Robertson/SM
+robe's
+Robeson/M
+Robespierre/M
+Robina/M
+Robinet/M
+Robinetta/M
+Robinette/M
+Robinett/M
+Robinia/M
+Robin/M
+robin/MS
+Robinson/M
+Robinsonville/M
+Robles/M
+Rob/MZ
+robotic/S
+robotism
+robotize/GDS
+robot/MS
+rob/SDG
+Robson/M
+Robt/M
+robustness/SM
+robust/RYPT
+Roby/M
+Robyn/M
+Rocco/M
+Rocha/M
+Rochambeau/M
+Rochella/M
+Rochelle/M
+Rochell/M
+Roche/M
+Rochester/M
+Rochette/M
+Roch/M
+rockabilly/MS
+rockabye
+Rockaway/MS
+rockbound
+Rockefeller/M
+rocker/M
+rocketry/MS
+rocket/SMDG
+Rockey/M
+rockfall/S
+Rockford/M
+rock/GZDRMS
+Rockie/M
+rockiness/MS
+Rockland/M
+Rock/M
+Rockne/M
+Rockville/M
+Rockwell/M
+Rocky/SM
+rocky/SRTP
+rococo/MS
+Roda/M
+rodded
+Roddenberry/M
+rodder
+Roddie/M
+rodding
+Rodd/M
+Roddy/M
+rodent/MS
+rodeo/SMDG
+Roderich/M
+Roderick/M
+Roderic/M
+Roderigo/M
+rode/S
+Rodger/M
+Rodge/ZMR
+Rodie/M
+Rodi/M
+Rodina/M
+Rodin/M
+Rod/M
+Rodney/M
+Rodolfo/M
+Rodolphe/M
+Rodolph/M
+Rodrick/M
+Rodrigo/M
+Rodriguez/M
+Rodrique/M
+Rodriquez/M
+rod/SGMD
+roebuck/SM
+Roentgen's
+roentgen/SM
+roe/SM
+ROFL
+Rogelio/M
+roger/GSD
+Rogerio/M
+Roger/M
+Roget/M
+Rog/MRZ
+rogued/K
+rogue/GMDS
+roguery/MS
+rogues/K
+roguing/K
+roguishness/SM
+roguish/PY
+roil/SGD
+Roi/SM
+roisterer/M
+roister/SZGRD
+Rojas/M
+Roland/M
+Rolando/M
+Roldan/M
+role/MS
+Roley/M
+Rolfe/M
+Rolf/M
+Rolland/M
+rollback/SM
+rolled/A
+Rollerblade/S
+rollerskating
+roller/SM
+rollick/DGS
+rollicking/Y
+Rollie/M
+rolling/S
+Rollin/SM
+Rollo/M
+rollover/S
+roll/UDSG
+Rolodex
+Rolph/M
+Rolvaag/M
+ROM
+romaine/MS
+Romain/M
+Roma/M
+romancer/M
+romance/RSDZMG
+Romanesque/S
+Romania/M
+Romanian/SM
+Romano/MS
+Romanov/M
+roman/S
+Romansh/M
+Romans/M
+Roman/SM
+romantically/U
+romanticism/MS
+Romanticism/S
+romanticist/S
+romanticize/SDG
+romantic/MS
+Romany/SM
+Romeo/MS
+romeo/S
+Romero/M
+Rome/SM
+Rommel/M
+Romney/M
+Romola/M
+Romona/M
+Romonda/M
+romper/M
+romp/GSZDR
+Rom/SM
+Romulus/M
+Romy/M
+Ronalda/M
+Ronald/M
+Rona/M
+Ronda/M
+rondo/SM
+Ronica/M
+Ron/M
+Ronna/M
+Ronnica/M
+Ronnie/M
+Ronni/M
+Ronny/M
+Ronstadt/M
+Rontgen
+Roobbie/M
+rood/MS
+roof/DRMJGZS
+roofer/M
+roofgarden
+roofing/M
+roofless
+rooftop/S
+rookery/MS
+rook/GDMS
+rookie/SRMT
+roomer/M
+roomette/SM
+roomful/MS
+roominess/MS
+roommate/SM
+room/MDRGZS
+roomy/TPSR
+Rooney/M
+Rooseveltian
+Roosevelt/M
+rooster/M
+roost/SGZRDM
+rooted/P
+rooter/M
+rootlessness/M
+rootless/P
+rootlet/SM
+Root/M
+root/MGDRZS
+rootstock/M
+rope/DRSMZG
+roper/M
+roping/M
+Roquefort/MS
+Roquemore/M
+Rora/M
+Rorie/M
+Rori/M
+Rorke/M
+Rorschach
+Rory/M
+Rosabella/M
+Rosabelle/M
+Rosabel/M
+Rosaleen/M
+Rosales/M
+Rosalia/M
+Rosalie/M
+Rosalinda/M
+Rosalinde/M
+Rosalind/M
+Rosaline/M
+Rosalynd/M
+Rosalyn/M
+Rosa/M
+Rosamond/M
+Rosamund/M
+Rosana/M
+Rosanna/M
+Rosanne/M
+Rosario/M
+rosary/SM
+Roscoe/M
+Rosco/M
+Roseanna/M
+Roseanne/M
+Roseann/M
+roseate/Y
+Roseau
+rosebud/MS
+rosebush/SM
+Rosecrans/M
+Roseland/M
+Roselia/M
+Roseline/M
+Roselin/M
+Rosella/M
+Roselle/M
+Rose/M
+Rosemaria/M
+Rosemarie/M
+Rosemary/M
+rosemary/MS
+rose/MGDS
+Rosemonde/M
+Rosenberg/M
+Rosenblum/M
+Rosendo/M
+Rosene/M
+Rosen/M
+Rosenthal/M
+Rosenzweig/M
+Rosetta/M
+Rosette/M
+rosette/SDMG
+rosewater
+rosewood/SM
+Roshelle/M
+Rosicrucian/M
+Rosie/M
+rosily
+Rosina/M
+rosiness/MS
+rosin/SMDG
+Rosita/M
+Roslyn/M
+Rosmunda/M
+Ros/N
+Ross
+Rossetti/M
+Rossie/M
+Rossi/M
+Rossini/M
+Rossy/M
+Rostand/M
+roster/DMGS
+Rostov/M
+rostra's
+rostrum/SM
+Roswell/M
+Rosy/M
+rosy/RTP
+rota/MS
+Rotarian/SM
+rotary/S
+rotated/U
+rotate/VGNXSD
+rotational/Y
+rotation/M
+rotative/Y
+rotator/SM
+rotatory
+ROTC
+rote/MS
+rotgut/MS
+Roth/M
+Rothschild/M
+rotisserie/MS
+rotogravure/SM
+rotor/MS
+rototill/RZ
+rot/SDG
+rotted
+rottenness/S
+rotten/RYSTP
+Rotterdam/M
+rotter/M
+rotting
+rotunda/SM
+rotundity/S
+rotundness/S
+rotund/SDYPG
+Rouault/M
+roué/MS
+rouge/GMDS
+roughage/SM
+roughen/DG
+rougher/M
+roughhouse/GDSM
+roughish
+roughneck/MDSG
+roughness/MS
+roughs
+roughshod
+rough/XPYRDNGT
+roulette/MGDS
+roundabout/PSM
+roundedness/M
+rounded/P
+roundelay/SM
+roundels
+rounder/M
+roundhead/D
+roundheadedness/M
+roundheaded/P
+roundhouse/SM
+roundish
+roundness/MS
+roundoff
+roundup/MS
+roundworm/MS
+round/YRDSGPZT
+Rourke/M
+rouse/DSRG
+rouser/M
+Rousseau/M
+roustabout/SM
+roust/SGD
+route/ASRDZGJ
+router/M
+route's
+rout/GZJMDRS
+routine/SYM
+routing/M
+routinize/GSD
+Rouvin/M
+rover/M
+Rover/M
+rove/ZGJDRS
+roving/M
+Rowan/M
+rowboat/SM
+rowdily
+rowdiness/MS
+rowdyism/MS
+rowdy/PTSR
+rowel/DMSG
+Rowe/M
+Rowena/M
+rowen/M
+Rowen/M
+rower/M
+Rowland/M
+Rowley/M
+Row/MN
+Rowney/M
+row/SJZMGNDR
+Roxana/M
+Roxane/M
+Roxanna/M
+Roxanne/M
+Roxie/M
+Roxi/M
+Roxine/M
+Roxy/M
+royalist/SM
+Royall/M
+Royal/M
+royal/SY
+royalty/MS
+Royce/M
+Roy/M
+Rozalie/M
+Rozalin/M
+Rozamond/M
+Rozanna/M
+Rozanne/M
+Rozele/M
+Rozella/M
+Rozelle/M
+Roze/M
+Rozina/M
+Roz/M
+RP
+rpm
+RPM
+rps
+RR
+Rriocard/M
+rs
+r's
+R's
+RSFSR
+RSI
+RSV
+RSVP
+RSX
+rt
+rte
+Rte
+RTFM
+r/TGVJ
+Rubaiyat/M
+rubato/MS
+rubbed
+rubberize/GSD
+rubberneck/DRMGSZ
+rubber/SDMG
+rubbery/TR
+rubbing/M
+rubbish/DSMG
+rubbishy
+rubble/GMSD
+rubdown/MS
+rubella/MS
+Rube/M
+Ruben/MS
+rube/SM
+Rubetta/M
+Rubia/M
+Rubicon/SM
+rubicund
+rubidium/SM
+Rubie/M
+Rubik/M
+Rubi/M
+Rubina/M
+Rubin/M
+Rubinstein/M
+ruble/MS
+rubout
+rubric/MS
+rub/S
+Ruby/M
+ruby/MTGDSR
+Ruchbah/M
+ruck/M
+rucksack/SM
+ruckus/SM
+ruction/SM
+rudderless
+rudder/MS
+Ruddie/M
+ruddiness/MS
+Rudd/M
+Ruddy/M
+ruddy/PTGRSD
+rudeness/MS
+rude/PYTR
+Rudie/M
+Rudiger/M
+rudimentariness/M
+rudimentary/P
+rudiment/SM
+Rudolf/M
+Rudolfo/M
+Rudolph/M
+Rudyard/M
+Rudy/M
+ruefulness/S
+rueful/PY
+rue/GDS
+Rufe/M
+ruff/GSYDM
+ruffian/GSMDY
+ruffled/U
+ruffler/M
+ruffle/RSDG
+ruffly/TR
+Rufus/M
+Rugby's
+rugby/SM
+ruggedness/S
+rugged/PYRT
+Ruggiero/M
+rugging
+rug/MS
+Ruhr/M
+ruination/MS
+ruiner/M
+ruin/MGSDR
+ruinousness/M
+ruinous/YP
+Ruiz/M
+rulebook/S
+ruled/U
+rule/MZGJDRS
+ruler/GMD
+ruling/M
+Rumanian's
+Rumania's
+rumba/GDMS
+rumble/JRSDG
+rumbler/M
+rumbustious
+rumen/M
+Rumford/M
+Ru/MH
+ruminant/YMS
+ruminate/VNGXSD
+ruminative/Y
+rummage/GRSD
+rummager/M
+Rummel/M
+rummer
+rummest
+rummy/TRSM
+rumored/U
+rumorer/M
+rumormonger/SGMD
+rumor/ZMRDSG
+Rumpelstiltskin/M
+rump/GMYDS
+rumple/SDG
+rumply/TR
+rumpus/SM
+rum/XSMN
+runabout/SM
+runaround/S
+run/AS
+runaway/S
+rundown/SM
+rune/MS
+Runge/M
+rung/MS
+runic
+runlet/SM
+runnable
+runnel/SM
+runner/MS
+running/S
+Runnymede/M
+runny/RT
+runoff/MS
+runtime
+runtiness/M
+runt/MS
+runty/RPT
+runway/MS
+Runyon/M
+rupee/MS
+Ruperta/M
+Rupert/M
+Ruperto/M
+rupiah/M
+rupiahs
+Ruppert/M
+Ruprecht/M
+rupture/GMSD
+rurality/M
+rural/Y
+Rurik/M
+ruse/MS
+Rushdie/M
+rush/DSRGZ
+rusher/M
+rushes/I
+rushing/M
+Rush/M
+Rushmore/M
+rushy/RT
+Ruskin/M
+rusk/MS
+Russell/M
+Russel/M
+russet/MDS
+russetting
+Russia/M
+Russian/SM
+Russo/M
+Russ/S
+Rustbelt/M
+rustically
+rusticate/GSD
+rustication/M
+rusticity/S
+rustic/S
+Rustie/M
+rustiness/MS
+Rustin/M
+rustler/M
+rustle/RSDGZ
+rust/MSDG
+rustproof/DGS
+Rusty/M
+rusty/XNRTP
+rutabaga/SM
+Rutger/SM
+Ruthanne/M
+Ruthann/M
+Ruthe/M
+ruthenium/MS
+rutherfordium/SM
+Rutherford/M
+Ruthie/M
+Ruthi/M
+ruthlessness/MS
+ruthless/YP
+Ruth/M
+Ruthy/M
+Rutland/M
+Rutledge/M
+rut/MS
+rutted
+Rutter/M
+Ruttger/M
+rutting
+rutty/RT
+Ruy/M
+RV
+RVs
+Rwandan/S
+Rwanda/SM
+Rwy/M
+Rx/M
+Ryan/M
+Ryann/M
+Rycca/M
+Rydberg/M
+Ryder/M
+rye/MS
+Ryley/M
+Ry/M
+Ryon/M
+Ryukyu/M
+Ryun/M
+S
+SA
+Saab/M
+Saar/M
+Saba/M
+sabbath
+Sabbath/M
+Sabbaths
+sabbatical/S
+sabered/U
+saber/GSMD
+Sabik/M
+Sabina/M
+Sabine/M
+Sabin/M
+sable/GMDS
+sabotage/DSMG
+saboteur/SM
+sabot/MS
+Sabra/M
+sabra/MS
+Sabrina/M
+SAC
+Sacajawea/M
+saccharides
+saccharine
+saccharin/MS
+Sacco/M
+sacerdotal
+Sacha/M
+sachem/MS
+sachet/SM
+Sachs/M
+sackcloth/M
+sackcloths
+sacker/M
+sackful/MS
+sack/GJDRMS
+sacking/M
+sacral
+sacra/L
+sacramental/S
+sacrament/DMGS
+Sacramento/M
+sacredness/S
+sacred/PY
+sacrificer/M
+sacrifice/RSDZMG
+sacrificial/Y
+sacrilege/MS
+sacrilegious/Y
+sacristan/SM
+sacristy/MS
+sacroiliac/S
+sacrosanctness/MS
+sacrosanct/P
+sacrum/M
+sac/SM
+Sada/M
+Sadat/M
+Saddam/M
+sadden/DSG
+sadder
+saddest
+saddlebag/SM
+saddler/M
+saddle's
+saddle/UGDS
+Sadducee/M
+Sadella/M
+Sade/M
+sades
+Sadie/M
+sadism/MS
+sadistic
+sadistically
+sadist/MS
+sadness/SM
+sadomasochism/MS
+sadomasochistic
+sadomasochist/S
+sad/PY
+Sadr/M
+Sadye/M
+safari/GMDS
+safeguard/MDSG
+safekeeping/MS
+safeness/MS
+safeness's/U
+safes
+safety/SDMG
+safe/URPTY
+safflower/SM
+saffron/MS
+sagaciousness/M
+sagacious/YP
+sagacity/MS
+saga/MS
+Sagan/M
+sagebrush/SM
+sage/MYPS
+sagged
+sagger
+sagging
+saggy/RT
+Saginaw/M
+Sagittarius/MS
+sago/MS
+sag/TSR
+saguaro/SM
+Sahara/M
+Saharan/M
+Sahel
+sahib/MS
+Saidee/M
+saids
+said/U
+Saigon/M
+sailboard/DGS
+sailboat/SRMZG
+sailcloth/M
+sailcloths
+sailer/M
+sailfish/SM
+sail/GJMDRS
+sailing/M
+sailor/YMS
+sailplane/SDMG
+sainthood/MS
+saintlike
+saintliness/MS
+saintly/RTP
+saint/YDMGS
+Saiph/M
+saith
+saiths
+Sakai/M
+sake/MRS
+saker/M
+Sakhalin/M
+Sakharov/M
+Saki/M
+saki's
+salaam/GMDS
+salable/U
+salaciousness/MS
+salacious/YP
+salacity/MS
+Saladin/M
+Salado/M
+salad/SM
+Salaidh/M
+salamander/MS
+salami/MS
+salary/SDMG
+Salas/M
+Salazar/M
+saleability/M
+sale/ABMS
+Saleem/M
+Salem/M
+Salerno/M
+salesclerk/SM
+salesgirl/SM
+saleslady/S
+salesman/M
+salesmanship/SM
+salesmen
+salespeople/M
+salesperson/MS
+salesroom/M
+saleswoman
+saleswomen
+salience/MS
+saliency
+salient/SY
+Salim/M
+Salina/MS
+saline/S
+salinger
+Salinger/M
+salinity/MS
+Salisbury/M
+Salish/M
+saliva/MS
+salivary
+salivate/XNGSD
+salivation/M
+Salk/M
+Sallee/M
+Salle/M
+Sallie/M
+Salli/M
+sallowness/MS
+sallow/TGRDSP
+Sallust/M
+Sallyanne/M
+Sallyann/M
+sally/GSDM
+Sally/M
+salmonellae
+salmonella/M
+Salmon/M
+salmon/SM
+Sal/MY
+Saloma/M
+Salome/M
+Salomi/M
+Salomo/M
+Salomone/M
+Salomon/M
+Salonika/M
+salon/SM
+saloonkeeper
+saloon/MS
+salsa/MS
+salsify/M
+SALT
+saltcellar/SM
+salted/UC
+salter/M
+salt/GZTPMDRS
+saltine/MS
+saltiness/SM
+saltness/M
+Salton/M
+saltpeter/SM
+salts/C
+saltshaker/S
+saltwater
+salty/RSPT
+salubriousness/M
+salubrious/YP
+salubrity/M
+salutariness/M
+salutary/P
+salutation/SM
+salutatory/S
+saluter/M
+salute/RSDG
+Salvadoran/S
+Salvadorian/S
+Salvador/M
+salvageable
+salvage/MGRSD
+salvager/M
+salvation/MS
+Salvatore/M
+salve/GZMDSR
+salver/M
+Salvidor/M
+salvo/GMDS
+Salween/M
+Salyut/M
+Salz/M
+SAM
+Samantha/M
+Samara/M
+Samaria/M
+Samaritan/MS
+samarium/MS
+Samarkand/M
+samba/GSDM
+sameness/MS
+same/SP
+Sam/M
+Sammie/M
+Sammy/M
+Samoa
+Samoan/S
+Samoset/M
+samovar/SM
+Samoyed/M
+sampan/MS
+sampler/M
+sample/RSDJGMZ
+sampling/M
+Sampson/M
+Samsonite/M
+Samson/M
+Samuele/M
+Samuel/SM
+Samuelson/M
+samurai/M
+San'a
+Sana/M
+sanatorium/MS
+Sanborn/M
+Sanchez/M
+Sancho/M
+sanctification/M
+sanctifier/M
+sanctify/RSDGNX
+sanctimoniousness/MS
+sanctimonious/PY
+sanctimony/MS
+sanctioned/U
+sanction/SMDG
+sanctity/SM
+sanctuary/MS
+sanctum/SM
+sandal/MDGS
+sandalwood/SM
+sandbagged
+sandbagging
+sandbag/MS
+sandbank/SM
+sandbar/S
+sandblaster/M
+sandblast/GZSMRD
+sandbox/MS
+Sandburg/M
+sandcastle/S
+Sande/M
+Sanderling/M
+sander/M
+Sander/M
+Sanderson/M
+sandhill
+sandhog/SM
+Sandia/M
+Sandie/M
+Sandi/M
+sandiness/S
+Sandinista
+sandlot/SM
+sandlotter/S
+sandman/M
+sandmen
+Sand/MRZ
+Sandor/M
+Sandoval/M
+sandpaper/DMGS
+sandpile
+sandpiper/MS
+sandpit/M
+Sandra/M
+Sandro/M
+sand/SMDRGZ
+sandstone/MS
+sandstorm/SM
+Sandusky/M
+sandwich/SDMG
+Sandye/M
+Sandy/M
+sandy/PRT
+saned
+sane/IRYTP
+saneness/MS
+saneness's/I
+sanes
+Sanford/M
+Sanforized
+Sanger/M
+sangfroid/S
+sangria/SM
+Sang/RM
+sang/S
+sanguinary
+sanguined
+sanguine/F
+sanguinely
+sanguineness/M
+sanguineous/F
+sanguines
+sanguining
+Sanhedrin/M
+saning
+sanitarian/S
+sanitarium/SM
+sanitary/S
+sanitate/NX
+sanitation/M
+sanitizer/M
+sanitize/RSDZG
+sanity/SIM
+sank
+Sankara/M
+San/M
+sans
+sanserif
+Sanskritic
+Sanskritize/M
+Sanskrit/M
+Sansone/M
+Sanson/M
+Santa/M
+Santana/M
+Santayana/M
+Santeria
+Santiago/M
+Santo/MS
+sapience/MS
+sapient
+sapless
+sapling/SM
+sap/MS
+sapped
+sapper/SM
+Sapphira/M
+Sapphire/M
+sapphire/MS
+Sappho/M
+sappiness/SM
+sapping
+Sapporo/M
+sappy/RPT
+saprophyte/MS
+saprophytic
+sapsucker/SM
+sapwood/SM
+Saraann/M
+Saracen/MS
+Saragossa/M
+Sarah/M
+Sarajane/M
+Sarajevo/M
+Sara/M
+Saran/M
+saran/SM
+sarape's
+Sarasota/M
+Saratoga/M
+Saratov/M
+Sarawak/M
+sarcasm/MS
+sarcastic
+sarcastically
+sarcoma/MS
+sarcophagi
+sarcophagus/M
+sardine/SDMG
+Sardinia/M
+sardonic
+sardonically
+Saree/M
+Sarena/M
+Sarene/M
+Sarette/M
+Sargasso/M
+Sarge/M
+Sargent/M
+sarge/SM
+Sargon/M
+Sari/M
+sari/MS
+Sarina/M
+Sarine/M
+Sarita/M
+Sarnoff/M
+sarong/MS
+Saroyan/M
+sarsaparilla/MS
+Sarto/M
+sartorial/Y
+sartorius/M
+Sartre/M
+Sascha/M
+SASE
+Sasha/M
+sashay/GDS
+Sashenka/M
+sash/GMDS
+Saskatchewan/M
+Saskatoon/M
+Sask/M
+sassafras/MS
+sass/GDSM
+Sassoon/M
+sassy/TRS
+SAT
+satanic
+satanical/Y
+Satanism/M
+satanism/S
+Satanist/M
+satanist/S
+Satan/M
+satchel/SM
+sat/DG
+sateen/MS
+satellite/GMSD
+sate/S
+satiable/I
+satiate/GNXSD
+satiation/M
+satiety/MS
+satin/MDSG
+satinwood/MS
+satiny
+satire/SM
+satiric
+satirical/Y
+satirist/SM
+satirize/DSG
+satirizes/U
+satisfaction/ESM
+satisfactorily/U
+satisfactoriness/MU
+satisfactory/UP
+satisfiability/U
+satisfiable/U
+satisfied/UE
+satisfier/M
+satisfies/E
+satisfy/GZDRS
+satisfying/EU
+satisfyingly
+Sat/M
+satori/SM
+satrap/SM
+saturated/CUA
+saturater/M
+saturates/A
+saturate/XDRSNG
+saturation/M
+Saturday/MS
+saturnalia
+Saturnalia/M
+saturnine/Y
+Saturn/M
+Satyanarayanan/M
+satyriases
+satyriasis/M
+satyric
+satyr/MS
+sauce/DSRGZM
+saucepan/SM
+saucer/M
+saucily
+sauciness/S
+saucy/TRP
+Saudi/S
+Saud/M
+Saudra/M
+sauerkraut/SM
+Saukville/M
+Saul/M
+Sault/M
+sauna/DMSG
+Sauncho/M
+Saunder/SM
+Saunderson/M
+Saundra/M
+saunter/DRSG
+saurian/S
+sauropod/SM
+sausage/MS
+Saussure/M
+sauté/DGS
+Sauternes/M
+Sauveur/M
+savage/GTZYPRSD
+Savage/M
+savageness/SM
+savagery/MS
+Savannah/M
+savanna/MS
+savant/SM
+saved/U
+saveloy/M
+saver/M
+save/ZGJDRSB
+Savina/M
+Savior/M
+savior/SM
+Saviour/M
+Savonarola/M
+savored/U
+savorer/M
+savorier
+savoriest
+savoriness/S
+savoringly/S
+savoring/Y
+savor/SMRDGZ
+savory/UMPS
+Savoyard/M
+Savoy/M
+savoy/SM
+savvy/GTRSD
+sawbones/M
+sawbuck/SM
+sawdust/MDSG
+sawer/M
+sawfly/SM
+sawhorse/MS
+Saw/M
+sawmill/SM
+saw/SMDRG
+sawtooth
+Sawyere/M
+Sawyer/M
+sawyer/MS
+Saxe/M
+saxifrage/SM
+Sax/M
+sax/MS
+Saxon/SM
+Saxony/M
+saxophone/MS
+saxophonist/SM
+Saxton/M
+Sayer/M
+sayer/SM
+sayest
+saying/MS
+Sayre/MS
+says/M
+say/USG
+Say/ZMR
+SBA
+Sb/M
+SC
+scabbard/SGDM
+scabbed
+scabbiness/SM
+scabbing
+scabby/RTP
+scabies/M
+scabrousness/M
+scabrous/YP
+scab/SM
+scad/SM
+scaffolding/M
+scaffold/JGDMS
+scalability
+Scala/M
+scalar/SM
+scalawag/SM
+scald/GJRDS
+scaled/AU
+scale/JGZMBDSR
+scaleless
+scalene
+scaler/M
+scales/A
+scaliness/MS
+scaling/A
+scallion/MS
+scalloper/M
+scallop/GSMDR
+scalloping/M
+scalpel/SM
+scalper/M
+scalp/GZRDMS
+scalping/M
+scaly/TPR
+scammed
+scamming
+scamper/GD
+scampi/M
+scamp/RDMGZS
+scam/SM
+Scan
+scan/AS
+scandal/GMDS
+scandalized/U
+scandalize/GDS
+scandalmonger/SM
+scandalousness/M
+scandalous/YP
+Scandinavia/M
+Scandinavian/S
+scandium/MS
+scanned/A
+scanner/SM
+scanning/A
+scansion/SM
+scant/CDRSG
+scantest
+scantily
+scantiness/MS
+scantly
+scantness/MS
+scanty/TPRS
+scapegoat/SGDM
+scapegrace/MS
+scape/M
+scapulae
+scapula/M
+scapular/S
+scarab/SM
+Scaramouch/M
+Scarborough/M
+scarceness/SM
+scarce/RTYP
+scarcity/MS
+scar/DRMSG
+scarecrow/MS
+scaremongering/M
+scaremonger/SGM
+scarer/M
+scare/S
+scarface
+Scarface/M
+scarf/SDGM
+scarification/M
+scarify/DRSNGX
+scarily
+scariness/S
+scarlatina/MS
+Scarlatti/M
+Scarlet/M
+scarlet/MDSG
+Scarlett/M
+scarp/SDMG
+scarred
+scarring
+scarves/M
+scary/PTR
+scathe/DG
+scathed/U
+scathing/Y
+scatological
+scatology/SM
+scat/S
+scatted
+scatterbrain/MDS
+scatter/DRJZSG
+scatterer/M
+scattergun
+scattering/YM
+scatting
+scavenge/GDRSZ
+scavenger/M
+SCCS
+scenario/SM
+scenarist/MS
+scene/GMDS
+scenery/SM
+scenically
+scenic/S
+scented/U
+scent/GDMS
+scentless
+scent's/C
+scents/C
+scepter/DMSG
+scepters/U
+sceptically
+sch
+Schaefer/M
+Schaeffer/M
+Schafer/M
+Schaffner/M
+Schantz/M
+Schapiro/M
+Scheat/M
+Schedar/M
+schedule/ADSRG
+scheduled/U
+scheduler/MS
+schedule's
+Scheherazade/M
+Scheherezade/M
+Schelling/M
+schema/M
+schemata
+schematically
+schematic/S
+scheme/JSRDGMZ
+schemer/M
+schemta
+Schenectady/M
+scherzo/MS
+Schick/M
+Schiller/M
+schilling/SM
+schismatic/S
+schism/SM
+schist/SM
+schizoid/S
+schizomycetes
+schizophrenia/SM
+schizophrenically
+schizophrenic/S
+schizo/S
+schlemiel/MS
+schlepped
+schlepping
+schlep/S
+Schlesinger/M
+Schliemann/M
+Schlitz/M
+schlock/SM
+schlocky/TR
+Schloss/M
+schmaltz/MS
+schmaltzy/TR
+Schmidt/M
+Schmitt/M
+schmoes
+schmo/M
+schmooze/GSD
+schmuck/MS
+Schnabel/M
+schnapps/M
+schnauzer/MS
+Schneider/M
+schnitzel/MS
+schnook/SM
+schnoz/S
+schnozzle/MS
+Schoenberg/M
+Schofield/M
+scholarship/MS
+scholar/SYM
+scholastically
+scholastic/S
+schoolbag/SM
+schoolbook/SM
+schoolboy/MS
+schoolchild/M
+schoolchildren
+schooldays
+schooled/U
+schoolfellow/S
+schoolfriend
+schoolgirlish
+schoolgirl/MS
+schoolhouse/MS
+schooling/M
+schoolmarmish
+schoolmarm/MS
+schoolmaster/SGDM
+schoolmate/MS
+schoolmistress/MS
+schoolroom/SM
+schoolteacher/MS
+schoolwork/SM
+schoolyard/SM
+school/ZGMRDJS
+schooner/SM
+Schopenhauer/M
+Schottky/M
+Schrieffer/M
+Schrödinger/M
+Schroeder/M
+Schroedinger/M
+Schubert/M
+Schultz/M
+Schulz/M
+Schumacher/M
+Schuman/M
+Schumann/M
+schussboomer/S
+schuss/SDMG
+Schuster/M
+Schuyler/M
+Schuylkill/M
+Schwab/M
+Schwartzkopf/M
+Schwartz/M
+Schwarzenegger/M
+schwa/SM
+Schweitzer/M
+Schweppes/M
+Schwinger/M
+Schwinn/M
+sci
+sciatica/SM
+sciatic/S
+science/FMS
+scientifically/U
+scientific/U
+scientist/SM
+Scientology/M
+scimitar/SM
+scintilla/MS
+scintillate/GNDSX
+scintillation/M
+scintillator/SM
+scion/SM
+Scipio/M
+scissor/SGD
+scleroses
+sclerosis/M
+sclerotic/S
+Sc/M
+scoffer/M
+scofflaw/MS
+scoff/RDGZS
+scolder/M
+scold/GSJRD
+scolioses
+scoliosis/M
+scollop's
+sconce/SDGM
+scone/SM
+scooper/M
+scoop/SRDMG
+scooter/M
+scoot/SRDGZ
+scope/DSGM
+Scopes/M
+scops
+scorbutic
+scorcher/M
+scorching/Y
+scorch/ZGRSD
+scoreboard/MS
+scorecard/MS
+scored/M
+scorekeeper/SM
+scoreless
+scoreline
+score/ZMDSRJG
+scorner/M
+scornfulness/M
+scornful/PY
+scorn/SGZMRD
+scorpion/SM
+Scorpio/SM
+Scorpius/M
+Scorsese/M
+Scotchgard/M
+Scotchman/M
+Scotchmen
+scotch/MSDG
+scotchs
+Scotch/S
+Scotchwoman
+Scotchwomen
+Scotia/M
+Scotian/M
+Scotland/M
+Scot/MS
+Scotsman/M
+Scotsmen
+Scotswoman
+Scotswomen
+Scottie/SM
+Scotti/M
+Scottish
+Scott/M
+Scottsdale/M
+Scotty's
+scoundrel/YMS
+scourer/M
+scourge/MGRSD
+scourger/M
+scouring/M
+scour/SRDGZ
+scouter/M
+scouting/M
+scoutmaster/SM
+Scout's
+scout/SRDMJG
+scow/DMGS
+scowler/M
+scowl/SRDG
+scrabble/DRSZG
+scrabbler/M
+Scrabble/SM
+scragged
+scragging
+scraggly/TR
+scraggy/TR
+scrag/SM
+scrambler/MS
+scrambler's/U
+scramble/UDSRG
+scrammed
+scramming
+scram/S
+Scranton/M
+scrapbook/SM
+scraper/M
+scrape/S
+scrapheap/SM
+scrapped
+scrapper/SM
+scrapping
+scrappy/RT
+scrap/SGZJRDM
+scrapyard/S
+scratched/U
+scratcher/M
+scratches/M
+scratchily
+scratchiness/S
+scratch/JDRSZG
+scratchy/TRP
+scrawler/M
+scrawl/GRDS
+scrawly/RT
+scrawniness/MS
+scrawny/TRP
+screamer/M
+screaming/Y
+scream/ZGSRD
+screecher/M
+screech/GMDRS
+screechy/TR
+screed/MS
+scree/DSM
+screened/U
+screening/M
+screenplay/MS
+screen/RDMJSG
+screenwriter/MS
+screwball/SM
+screwdriver/SM
+screwer/M
+screw/GUSD
+screwiness/S
+screw's
+screwup
+screwworm/MS
+screwy/RTP
+Scriabin/M
+scribal
+scribble/JZDRSG
+scribbler/M
+scribe/CDRSGIK
+scriber/MKIC
+scribe's
+Scribner/MS
+scrimmager/M
+scrimmage/RSDMG
+scrimp/DGS
+scrimshaw/GSDM
+scrim/SM
+Scripps/M
+scrip/SM
+scripted/U
+script/FGMDS
+scriptural/Y
+scripture/MS
+Scripture/MS
+scriptwriter/SM
+scriptwriting/M
+scrivener/M
+scriven/ZR
+scrod/M
+scrofula/MS
+scrofulous
+scrollbar/SM
+scroll/GMDSB
+Scrooge/MS
+scrooge/SDMG
+scrota
+scrotal
+scrotum/M
+scrounge/ZGDRS
+scroungy/TR
+scrubbed
+scrubber/MS
+scrubbing
+scrubby/TR
+scrub/S
+scruffily
+scruffiness/S
+scruff/SM
+scruffy/PRT
+Scruggs/M
+scrummage/MG
+scrum/MS
+scrumptious/Y
+scrunch/DSG
+scrunchy/S
+scruple/SDMG
+scrupulosity/SM
+scrupulousness's
+scrupulousness/US
+scrupulous/UPY
+scrutable/I
+scrutinized/U
+scrutinizer/M
+scrutinize/RSDGZ
+scrutinizingly/S
+scrutinizing/UY
+scrutiny/MS
+SCSI
+scuba/SDMG
+scudded
+scudding
+Scud/M
+scud/S
+scuff/GSD
+scuffle/SDG
+sculler/M
+scullery/MS
+Sculley/M
+scullion/MS
+scull/SRDMGZ
+sculptor/MS
+sculptress/MS
+sculpt/SDG
+sculptural/Y
+sculpture/SDGM
+scumbag/S
+scummed
+scumming
+scum/MS
+scummy/TR
+scupper/SDMG
+scurf/MS
+scurfy/TR
+scurrility/MS
+scurrilousness/MS
+scurrilous/PY
+scurry/GJSD
+scurvily
+scurviness/M
+scurvy/SRTP
+scutcheon/SM
+scuttlebutt/MS
+scuttle/MGSD
+scuzzy/RT
+Scylla/M
+scythe/SDGM
+Scythia/M
+SD
+SDI
+SE
+seabed/S
+seabird/S
+seaboard/MS
+Seaborg/M
+seaborne
+Seabrook/M
+seacoast/MS
+seafare/JRZG
+seafarer/M
+seafood/MS
+seafront/MS
+Seagate/M
+seagoing
+Seagram/M
+seagull/S
+seahorse/S
+sealant/MS
+sealed/AU
+sealer/M
+seal/MDRSGZ
+sealskin/SM
+seals/UA
+seamail
+seamanship/SM
+seaman/YM
+seamer/M
+seaminess/M
+seamlessness/M
+seamless/PY
+seam/MNDRGS
+seams/I
+seamstress/MS
+Seamus/M
+sea/MYS
+seamy/TRP
+Seana/M
+séance/SM
+Sean/M
+seaplane/SM
+seaport/SM
+seaquake/M
+Seaquarium/M
+searcher/AM
+searching/YS
+searchlight/SM
+search/RSDAGZ
+sear/DRSJGT
+searing/Y
+Sears/M
+seascape/SM
+seashell/MS
+seashore/SM
+seasickness/SM
+seasick/P
+seaside/SM
+seasonableness/M
+seasonable/UP
+seasonably/U
+seasonality
+seasonal/Y
+seasoned/U
+seasoner/M
+seasoning/M
+season/JRDYMBZSG
+seatbelt
+seated/A
+seater/M
+seating/SM
+SEATO
+seat's
+Seattle/M
+seat/UDSG
+seawall/S
+seaward/S
+seawater/S
+seaway/MS
+seaweed/SM
+seaworthinesses
+seaworthiness/MU
+seaworthy/TRP
+sebaceous
+Sebastian/M
+Sebastiano/M
+Sebastien/M
+seborrhea/SM
+SEC
+secant/SM
+secede/GRSD
+secessionist/MS
+secession/MS
+secludedness/M
+secluded/YP
+seclude/GSD
+seclusion/SM
+seclusive
+Seconal
+secondarily
+secondary/PS
+seconder/M
+secondhand
+second/RDYZGSL
+secrecy/MS
+secretarial
+secretariat/MS
+secretaryship/MS
+secretary/SM
+secrete/XNS
+secretion/M
+secretiveness/S
+secretive/PY
+secretory
+secret/TVGRDYS
+sec/S
+sectarianism/MS
+sectarian/S
+sectary/MS
+sectionalism/MS
+sectionalized
+sectional/SY
+section/ASEM
+sectioned
+sectioning
+sect/ISM
+sectoral
+sectored
+sector/EMS
+sectoring
+sects/E
+secularism/MS
+secularist/MS
+secularity/M
+secularization/MS
+secularized/U
+secularize/GSD
+secular/SY
+secured/U
+securely/I
+secure/PGTYRSDJ
+security/MSI
+secy
+sec'y
+sedan/SM
+sedateness/SM
+sedate/PXVNGTYRSD
+sedation/M
+sedative/S
+sedentary
+Seder/SM
+sedge/SM
+Sedgwick/M
+sedgy/RT
+sedimentary
+sedimentation/SM
+sediment/SGDM
+sedition/SM
+seditiousness/M
+seditious/PY
+seducer/M
+seduce/RSDGZ
+seduction/MS
+seductiveness/MS
+seductive/YP
+seductress/SM
+sedulous/Y
+Seebeck/M
+seed/ADSG
+seedbed/MS
+seedcase/SM
+seeded/U
+seeder/MS
+seediness/MS
+seeding/S
+seedless
+seedling/SM
+seedpod/S
+seed's
+seedy/TPR
+seeings
+seeing's
+seeing/U
+seeker/M
+seek/GZSR
+seeking/Y
+Seeley/M
+See/M
+seem/GJSYD
+seeming/Y
+seemliness's
+seemliness/US
+seemly/UTPR
+seen/U
+seepage/MS
+seep/GSD
+seer/SM
+seersucker/MS
+sees
+seesaw/DMSG
+seethe/SDGJ
+see/U
+segmental/Y
+segmentation/SM
+segmented/U
+segment/SGDM
+Segovia/M
+segregant
+segregated/U
+segregate/XCNGSD
+segregation/CM
+segregationist/SM
+segregative
+Segre/M
+segue/DS
+segueing
+Segundo/M
+Se/H
+Seidel/M
+seigneur/MS
+seignior/SM
+Seiko/M
+seine/GZMDSR
+Seine/M
+seiner/M
+Seinfeld/M
+seismic
+seismically
+seismographer/M
+seismographic
+seismographs
+seismography/SM
+seismograph/ZMR
+seismologic
+seismological
+seismologist/MS
+seismology/SM
+seismometer/S
+seize/BJGZDSR
+seizer/M
+seizing/M
+seizin/MS
+seizor/MS
+seizure/MS
+Seka/M
+Sela/M
+Selassie/M
+Selby/M
+seldom
+selected/UAC
+selectional
+selection/MS
+selectiveness/M
+selective/YP
+selectivity/MS
+selectman/M
+selectmen
+selectness/SM
+selector/SM
+select/PDSVGB
+Selectric/M
+selects/A
+Selena/M
+selenate/M
+Selene/M
+selenite/M
+selenium/MS
+selenographer/SM
+selenography/MS
+Selestina/M
+Seleucid/M
+Seleucus/M
+self/GPDMS
+selfishness/SU
+selfish/PUY
+selflessness/MS
+selfless/YP
+selfness/M
+Selfridge/M
+selfsameness/M
+selfsame/P
+Selia/M
+Selie/M
+Selig/M
+Selim/M
+Selina/M
+Selinda/M
+Seline/M
+Seljuk/M
+Selkirk/M
+Sella/M
+sell/AZGSR
+seller/AM
+Sellers/M
+Selle/ZM
+sellout/MS
+Selma/M
+seltzer/S
+selvage/MGSD
+selves/M
+Selznick/M
+semantical/Y
+semanticist/SM
+semantic/S
+semantics/M
+semaphore/GMSD
+Semarang/M
+semblance/ASME
+semen/SM
+semester/SM
+semiannual/Y
+semiarid
+semiautomated
+semiautomatic/S
+semicircle/SM
+semicircular
+semicolon/MS
+semiconductor/SM
+semiconscious
+semidefinite
+semidetached
+semidrying/M
+semifinalist/MS
+semifinal/MS
+semilogarithmic
+semimonthly/S
+seminal/Y
+seminarian/MS
+seminar/SM
+seminary/MS
+Seminole/SM
+semiofficial
+semioticians
+semiotic/S
+semiotics/M
+semipermanent/Y
+semipermeable
+semiprecious
+semiprivate
+semiprofessional/YS
+semipublic
+semiquantitative/Y
+Semiramis/M
+semiretired
+semisecret
+semiskilled
+semi/SM
+semisolid/S
+semistructured
+semisweet
+Semite/SM
+Semitic/MS
+semitic/S
+semitone/SM
+semitrailer/SM
+semitrance
+semitransparent
+semitropical
+semivowel/MS
+semiweekly/S
+semiyearly
+semolina/SM
+sempiternal
+sempstress/SM
+Semtex
+sen
+Sen
+Sena/M
+senate/MS
+Senate/MS
+senatorial
+senator/MS
+Sendai/M
+sender/M
+sends/A
+send/SRGZ
+Seneca/MS
+Senegalese
+Senegal/M
+senescence/SM
+senescent
+senile/SY
+senility/MS
+seniority/SM
+senior/MS
+Senior/S
+Sennacherib/M
+senna/MS
+Sennett/M
+Señora/M
+senora/S
+senorita/S
+senor/MS
+sensately/I
+sensate/YNX
+sensationalism/MS
+sensationalist/S
+sensationalize/GSD
+sensational/Y
+sensation/M
+sens/DSG
+senselessness/SM
+senseless/PY
+sense/M
+sensibility/ISM
+sensibleness/MS
+sensible/PRST
+sensibly/I
+sensitiveness/MS
+sensitiveness's/I
+sensitives
+sensitive/YIP
+sensitivity/ISM
+sensitization/CSM
+sensitized/U
+sensitizers
+sensitize/SDCG
+sensor/MS
+sensory
+sensualist/MS
+sensuality/MS
+sensual/YF
+sensuousness/S
+sensuous/PY
+Sensurround/M
+sentence/SDMG
+sentential/Y
+sententious/Y
+sentience/ISM
+sentient/YS
+sentimentalism/SM
+sentimentalist/SM
+sentimentality/SM
+sentimentalization/SM
+sentimentalize/RSDZG
+sentimentalizes/U
+sentimental/Y
+sentiment/MS
+sentinel/GDMS
+sentry/SM
+sent/UFEA
+Seoul/M
+sepal/SM
+separability/MSI
+separableness/MI
+separable/PI
+separably/I
+separateness/MS
+separates/M
+separate/YNGVDSXP
+separation/M
+separatism/SM
+separatist/SM
+separator/SM
+Sephardi/M
+Sephira/M
+sepia/MS
+Sepoy/M
+sepses
+sepsis/M
+septa/M
+septate/N
+September/MS
+septennial/Y
+septet/MS
+septicemia/SM
+septicemic
+septic/S
+septillion/M
+sept/M
+Sept/M
+septuagenarian/MS
+Septuagint/MS
+septum/M
+sepulcher/MGSD
+sepulchers/UA
+sepulchral/Y
+seq
+sequel/MS
+sequenced/A
+sequence/DRSJZMG
+sequencer/M
+sequence's/F
+sequences/F
+sequent/F
+sequentiality/FM
+sequentialize/DSG
+sequential/YF
+sequester/SDG
+sequestrate/XGNDS
+sequestration/M
+sequin/SDMG
+sequitur
+Sequoia/M
+sequoia/MS
+Sequoya/M
+Serafin/M
+seraglio/SM
+serape/S
+seraphic
+seraphically
+seraphim's
+seraph/M
+seraphs
+sera's
+Serbia/M
+Serbian/S
+Serb/MS
+Serbo/M
+serenade/MGDRS
+serenader/M
+Serena/M
+serendipitous/Y
+serendipity/MS
+serene/GTYRSDP
+Serene/M
+sereneness/SM
+Serengeti/M
+serenity/MS
+sere/TGDRS
+serfdom/MS
+serf/MS
+Sergeant/M
+sergeant/SM
+serge/DSGM
+Sergei/M
+Serge/M
+Sergent/M
+Sergio/M
+serialization/MS
+serialize/GSD
+serial/MYS
+series/M
+serif/SMD
+serigraph/M
+serigraphs
+seriousness/SM
+serious/PY
+sermonize/GSD
+sermon/SGDM
+serological/Y
+serology/MS
+serons
+serous
+Serpens/M
+serpent/GSDM
+serpentine/GYS
+Serra/M
+Serrano/M
+serrate/GNXSD
+serration/M
+serried
+serum/MS
+servant/SDMG
+serve/AGCFDSR
+served/U
+server/MCF
+servers
+serviceability/SM
+serviceableness/M
+serviceable/P
+serviced/U
+serviceman/M
+servicemen
+service/MGSRD
+service's/E
+services/E
+servicewoman
+servicewomen
+serviette/MS
+servilely
+servileness/M
+serviles
+servile/U
+servility/SM
+serving/SM
+servitor/SM
+servitude/MS
+servomechanism/MS
+servomotor/MS
+servo/S
+sesame/MS
+sesquicentennial/S
+sessile
+session/SM
+setback/S
+Seth/M
+Set/M
+Seton/M
+set's
+setscrew/SM
+set/SIA
+settable/A
+sett/BJGZSMR
+settee/MS
+setter/M
+setting/AS
+setting's
+settle/AUDSG
+settlement/ASM
+settler/MS
+settling/S
+setup/MS
+Seumas/M
+Seurat/M
+Seuss/M
+Sevastopol/M
+sevenfold
+sevenpence
+seven/SMH
+seventeen/HMS
+seventeenths
+sevenths
+seventieths
+seventy/MSH
+severalfold
+severalty/M
+several/YS
+severance/SM
+severed/E
+severeness/SM
+severe/PY
+severing/E
+severity/MS
+Severn/M
+severs/E
+sever/SGTRD
+Severus/M
+Seville/M
+sewage/MS
+Seward/M
+sewerage/SM
+sewer/GSMD
+sewing/SM
+sewn
+sew/SAGD
+sexagenarian/MS
+sex/GMDS
+sexily
+sexiness/MS
+sexism/SM
+sexist/SM
+sexless
+sexologist/SM
+sexology/MS
+sexpot/SM
+Sextans/M
+sextant/SM
+sextet/SM
+sextillion/M
+Sexton/M
+sexton/MS
+sextuple/MDG
+sextuplet/MS
+sexuality/MS
+sexualized
+sexual/Y
+sexy/RTP
+Seychelles
+Seyfert
+Seymour/M
+sf
+SF
+Sgt
+shabbily
+shabbiness/SM
+shabby/RTP
+shack/GMDS
+shackler/M
+shackle's
+Shackleton/M
+shackle/UGDS
+shad/DRJGSM
+shaded/U
+shadeless
+shade/SM
+shadily
+shadiness/MS
+shading/M
+shadowbox/SDG
+shadower/M
+shadow/GSDRM
+shadowiness/M
+Shadow/M
+shadowy/TRP
+shady/TRP
+Shae/M
+Shafer/M
+Shaffer/M
+shafting/M
+shaft/SDMG
+shagged
+shagginess/SM
+shagging
+shaggy/TPR
+shag/MS
+shah/M
+shahs
+Shaina/M
+Shaine/M
+shakable/U
+shakably/U
+shakeable
+shakedown/S
+shaken/U
+shakeout/SM
+shaker/M
+Shaker/S
+Shakespearean/S
+Shakespeare/M
+Shakespearian
+shake/SRGZB
+shakeup/S
+shakily
+shakiness/S
+shaking/M
+shaky/TPR
+shale/SM
+shall
+shallot/SM
+shallowness/SM
+shallow/STPGDRY
+Shalna/M
+Shalne/M
+shalom
+Shalom/M
+shalt
+shamanic
+shaman/SM
+shamble/DSG
+shambles/M
+shamefaced/Y
+shamefulness/S
+shameful/YP
+shamelessness/SM
+shameless/PY
+shame/SM
+sham/MDSG
+shammed
+shammer
+shamming
+shammy's
+shampoo/DRSMZG
+shampooer/M
+shamrock/SM
+Shamus/M
+Shana/M
+Shanan/M
+Shanda/M
+Shandee/M
+Shandeigh/M
+Shandie/M
+Shandra/M
+shandy/M
+Shandy/M
+Shane/M
+Shanghai/GM
+Shanghaiing/M
+shanghai/SDG
+Shanie/M
+Shani/M
+shank/SMDG
+Shannah/M
+Shanna/M
+Shannan/M
+Shannen/M
+Shannon/M
+Shanon/M
+shan't
+Shanta/M
+Shantee/M
+shantis
+Shantung/M
+shantung/MS
+shanty/SM
+shantytown/SM
+shape/AGDSR
+shaped/U
+shapelessness/SM
+shapeless/PY
+shapeliness/S
+shapely/RPT
+shaper/S
+shape's
+Shapiro/M
+sharable/U
+Sharai/M
+Shara/M
+shard/SM
+shareable
+sharecropped
+sharecropper/MS
+sharecropping
+sharecrop/S
+share/DSRGZMB
+shared/U
+shareholder/MS
+shareholding/S
+sharer/M
+shareware/S
+Shari'a
+Sharia/M
+sharia/SM
+Shari/M
+Sharity/M
+shark/SGMD
+sharkskin/SM
+Sharla/M
+Sharleen/M
+Sharlene/M
+Sharline/M
+Sharl/M
+Sharona/M
+Sharon/M
+Sharpe/M
+sharpen/ASGD
+sharpened/U
+sharpener/S
+sharper/M
+sharpie/SM
+Sharp/M
+sharpness/MS
+sharp/SGTZXPYRDN
+sharpshooter/M
+sharpshooting/M
+sharpshoot/JRGZ
+sharpy's
+Sharron/M
+Sharyl/M
+Shasta/M
+shat
+shatter/DSG
+shattering/Y
+shatterproof
+Shaughn/M
+Shaula/M
+Shauna/M
+Shaun/M
+shave/DSRJGZ
+shaved/U
+shaver/M
+Shavian
+shaving/M
+Shavuot/M
+Shawano/M
+shawl/SDMG
+shaw/M
+Shaw/M
+Shawna/M
+Shawnee/SM
+Shawn/M
+Shaylah/M
+Shayla/M
+Shaylyn/M
+Shaylynn/M
+Shay/M
+shay/MS
+Shayna/M
+Shayne/M
+Shcharansky/M
+sh/DRS
+sheaf/MDGS
+Shea/M
+shearer/M
+shear/RDGZS
+sheather/M
+sheathe/UGSD
+sheath/GJMDRS
+sheathing/M
+sheaths
+sheave/SDG
+sheaves/M
+Sheba/M
+shebang/MS
+Shebeli/M
+Sheboygan/M
+she'd
+shedding
+Shedir/M
+sheds
+shed's
+shed/U
+Sheelagh/M
+Sheelah/M
+Sheela/M
+Sheena/M
+sheen/MDGS
+sheeny/TRSM
+sheepdog/SM
+sheepfold/MS
+sheepherder/MS
+sheepishness/SM
+sheepish/YP
+sheep/M
+sheepskin/SM
+Sheeree/M
+sheerness/S
+sheer/PGTYRDS
+sheeting/M
+sheetlike
+sheet/RDMJSG
+Sheetrock
+Sheffielder/M
+Sheffield/RMZ
+Sheffie/M
+Sheff/M
+Sheffy/M
+sheikdom/SM
+sheikh's
+sheik/SM
+Sheilah/M
+Sheila/M
+shekel/MS
+Shelagh/M
+Shela/M
+Shelba/M
+Shelbi/M
+Shelby/M
+Shelden/M
+Sheldon/M
+shelf/MDGS
+Shelia/M
+she'll
+shellacked
+shellacking/MS
+shellac/S
+shelled/U
+Shelley/M
+shellfire/SM
+shellfish/SM
+Shellie/M
+Shelli/M
+Shell/M
+shell/RDMGS
+Shelly/M
+Shel/MY
+shelter/DRMGS
+sheltered/U
+shelterer/M
+Shelton/M
+shelve/JRSDG
+shelver/M
+shelves/M
+shelving/M
+she/M
+Shem/M
+Shena/M
+Shenandoah/M
+shenanigan/SM
+Shenyang/M
+Sheol/M
+Shepard/M
+shepherd/DMSG
+shepherdess/S
+Shepherd/M
+Shep/M
+Sheppard/M
+Shepperd/M
+Sheratan/M
+Sheraton/M
+sherbet/MS
+sherd's
+Sheree/M
+Sheridan/M
+Sherie/M
+sheriff/SM
+Sherill/M
+Sherilyn/M
+Sheri/M
+Sherline/M
+Sherlocke/M
+sherlock/M
+Sherlock/M
+Sher/M
+Sherman/M
+Shermie/M
+Sherm/M
+Shermy/M
+Sherpa/SM
+Sherrie/M
+Sherri/M
+Sherry/M
+sherry/MS
+Sherwin/M
+Sherwood/M
+Sherwynd/M
+Sherye/M
+Sheryl/M
+Shetland/S
+Shevardnadze/M
+shew/GSD
+shewn
+shh
+shiatsu/S
+shibboleth/M
+shibboleths
+shielded/U
+shielder/M
+shield/MDRSG
+Shields/M
+shiftily
+shiftiness/SM
+shiftlessness/S
+shiftless/PY
+shift/RDGZS
+shifty/TRP
+Shi'ite
+Shiite/SM
+Shijiazhuang
+Shikoku/M
+shill/DJSG
+shillelagh/M
+shillelaghs
+shilling/M
+Shillong/M
+Shiloh/M
+shimmed
+shimmer/DGS
+shimmery
+shimming
+shimmy/DSMG
+shim/SM
+Shina/M
+shinbone/SM
+shindig/MS
+shiner/M
+shine/S
+shingle/MDRSG
+shingler/M
+shinguard
+shininess/MS
+shining/Y
+shinned
+shinning
+shinny/GDSM
+shin/SGZDRM
+shinsplints
+Shintoism/S
+Shintoist/MS
+Shinto/MS
+shiny/PRT
+shipboard/MS
+shipborne
+shipbuilder/M
+shipbuild/RGZJ
+shipload/SM
+shipman/M
+shipmate/SM
+shipmen
+shipment/AMS
+shipowner/MS
+shippable
+shipped/A
+shipper/SM
+shipping/MS
+ship's
+shipshape
+ship/SLA
+shipwreck/GSMD
+shipwright/MS
+shipyard/MS
+Shiraz/M
+shire/MS
+shirker/M
+shirk/RDGZS
+Shirlee/M
+Shirleen/M
+Shirlene/M
+Shirley/M
+Shirline/M
+Shirl/M
+Shir/M
+shirr/GJDS
+shirtfront/S
+shirting/M
+shirt/JDMSG
+shirtless
+shirtmake/R
+shirtmaker/M
+shirtsleeve/MS
+shirttail/S
+shirtwaist/SM
+shit/S!
+shitting/!
+shitty/RT!
+Shiva/M
+shiverer/M
+shiver/GDR
+shivery
+shiv/SZRM
+shivved
+shivving
+shlemiel's
+Shmuel/M
+shoal/SRDMGT
+shoat/SM
+shocker/M
+shocking/Y
+Shockley/M
+shockproof
+shock/SGZRD
+shoddily
+shoddiness/SM
+shoddy/RSTP
+shod/U
+shoehorn/GSMD
+shoeing
+shoelace/MS
+shoemaker/M
+shoemake/RZ
+shoe/MS
+shoer's
+shoeshine/MS
+shoestring/MS
+shoetree/MS
+shogunate/SM
+shogun/MS
+Shoji/M
+Sholom/M
+shone
+shoo/DSG
+shoofly
+shook/SM
+shooter/M
+shootout/MS
+shoot/SJRGZ
+shopkeeper/M
+shopkeep/RGZ
+shoplifter/M
+shoplifting/M
+shoplift/SRDGZ
+shop/MS
+shopped/M
+shopper/M
+shoppe/RSDGZJ
+shopping/M
+shoptalk/SM
+shopworn
+shorebird/S
+shore/DSRGMJ
+shoreline/SM
+Shorewood/M
+shoring/M
+shortage/MS
+shortbread/MS
+shortcake/SM
+shortchange/DSG
+shortcoming/MS
+shortcrust
+shortcut/MS
+shortcutting
+shortener/M
+shortening/M
+shorten/RDGJ
+shortfall/SM
+shorthand/DMS
+Shorthorn/M
+shorthorn/MS
+shortie's
+shortish
+shortlist/GD
+Short/M
+shortness/MS
+short/SGTXYRDNP
+shortsightedness/S
+shortsighted/YP
+shortstop/MS
+shortwave/SM
+shorty/SM
+Shoshana/M
+Shoshanna/M
+Shoshone/SM
+Shostakovitch/M
+shotgunned
+shotgunner
+shotgunning
+shotgun/SM
+shot/MS
+shotted
+shotting
+shoulder/GMD
+shouldn't
+should/TZR
+shout/SGZRDM
+shove/DSRG
+shoveler/M
+shovelful/MS
+shovel/MDRSZG
+shover/M
+showbiz
+showbizzes
+showboat/SGDM
+showcase/MGSD
+showdown/MS
+shower/GDM
+showery/TR
+show/GDRZJS
+showgirl/SM
+showily
+showiness/MS
+showing/M
+showman/M
+showmanship/SM
+showmen
+shown
+showoff/S
+showpiece/SM
+showplace/SM
+showroom/MS
+showy/RTP
+shpt
+shrank
+shrapnel/SM
+shredded
+shredder/MS
+shredding
+shred/MS
+Shreveport/M
+shrewdness/SM
+shrewd/RYTP
+shrew/GSMD
+shrewishness/M
+shrewish/PY
+shrieker/M
+shriek/SGDRMZ
+shrift/SM
+shrike/SM
+shrill/DRTGPS
+shrillness/MS
+shrilly
+shrimp/MDGS
+shrine/SDGM
+shrinkage/SM
+shrinker/M
+shrinking/U
+shrink/SRBG
+shrivel/GSD
+shriven
+shrive/RSDG
+Shropshire/M
+shroud/GSMD
+shrubbed
+shrubbery/SM
+shrubbing
+shrubby/TR
+shrub/SM
+shrugged
+shrugging
+shrug/S
+shrunk/N
+shtick/S
+shucker/M
+shuck/SGMRD
+shucks/S
+shudder/DSG
+shuddery
+shuffleboard/MS
+shuffled/A
+shuffle/GDSRZ
+shuffles/A
+shuffling/A
+Shulman/M
+Shu/M
+shunned
+shunning
+shun/S
+shunter/M
+shunt/GSRD
+Shurlocke/M
+Shurlock/M
+Shurwood/M
+shush/SDG
+shutdown/MS
+shuteye/SM
+shutoff/M
+shutout/SM
+shut/S
+shutterbug/S
+shutter/DMGS
+shuttering/M
+shutting
+shuttlecock/MDSG
+shuttle/MGDS
+shy/DRSGTZY
+shyer
+shyest
+Shylockian/M
+Shylock/M
+shyness/SM
+shyster/SM
+Siamese/M
+Siam/M
+Siana/M
+Sianna/M
+Sian's
+Sibbie/M
+Sibby/M
+Sibeal/M
+Sibelius/M
+Sibella/M
+Sibelle/M
+Sibel/M
+Siberia/M
+Siberian/S
+sibilance/M
+sibilancy/M
+sibilant/SY
+Sibilla/M
+Sibley/M
+sibling/SM
+Sib/M
+Sibylla/M
+Sibylle/M
+sibylline
+Sibyl/M
+sibyl/SM
+Siciliana/M
+Sicilian/S
+Sicily/M
+sickbay/M
+sickbed/S
+sickener/M
+sickening/Y
+sicken/JRDG
+sicker/Y
+sick/GXTYNDRSP
+sickie/SM
+sickish/PY
+sickle/SDGM
+sickliness/M
+sickly/TRSDPG
+sickness/MS
+sicko/S
+sickout/S
+sickroom/SM
+sic/S
+sidearm/S
+sideband/MS
+sidebar/MS
+sideboard/SM
+sideburns
+sidecar/MS
+sided/A
+sidedness
+side/ISRM
+sidekick/MS
+sidelight/SM
+sideline/MGDRS
+sidelong
+sideman/M
+sidemen
+sidepiece/S
+sidereal
+sider/FA
+sides/A
+sidesaddle/MS
+sideshow/MS
+sidesplitting
+sidestepped
+sidestepping
+sidestep/S
+sidestroke/GMSD
+sideswipe/GSDM
+sidetrack/SDG
+sidewalk/MS
+sidewall/MS
+sidewards
+sideway/SM
+sidewinder/SM
+siding/SM
+sidle/DSG
+Sid/M
+Sidnee/M
+Sidney/M
+Sidoney/M
+Sidonia/M
+Sidonnie/M
+SIDS
+siege/GMDS
+Siegel/M
+Siegfried/M
+Sieglinda/M
+Siegmund/M
+Siemens/M
+Siena/M
+sienna/SM
+Sierpinski/M
+sierra/SM
+siesta/MS
+sieve/GZMDS
+Siffre/M
+sifted/UA
+sifter/M
+sift/GZJSDR
+Sigfrid/M
+Sigfried/M
+SIGGRAPH/M
+sigh/DRG
+sigher/M
+sighs
+sighted/P
+sighter/M
+sighting/S
+sight/ISM
+sightless/Y
+sightliness/UM
+sightly/TURP
+sightread
+sightseeing/S
+sightsee/RZ
+Sigismond/M
+Sigismondo/M
+Sigismund/M
+Sigismundo/M
+Sig/M
+sigma/SM
+sigmoid
+Sigmund/M
+signal/A
+signaled
+signaler/S
+signaling
+signalization/S
+signalize/GSD
+signally
+signalman/M
+signalmen
+signals
+signal's
+signatory/SM
+signature/MS
+signboard/MS
+signed/FU
+signer/SC
+signet/SGMD
+sign/GARDCS
+significance/IMS
+significantly/I
+significant/YS
+signification/M
+signify/DRSGNX
+signing/S
+Signora/M
+signora/SM
+signore/M
+signori
+signories
+signorina/SM
+signorine
+Signor/M
+signor/SFM
+signpost/DMSG
+sign's
+signs/F
+Sigrid/M
+Sigurd/M
+Sigvard/M
+Sihanouk/M
+Sikhism/MS
+Sikh/MS
+Sikhs
+Sikkimese
+Sikkim/M
+Sikorsky/M
+silage/GMSD
+Silas/M
+Sileas/M
+siled
+Sile/M
+silence/MZGRSD
+silencer/M
+silentness/M
+silent/TSPRY
+Silesia/M
+silhouette/GMSD
+silica/SM
+silicate/SM
+siliceous
+silicide/M
+silicone/SM
+silicon/MS
+silicoses
+silicosis/M
+silken/DG
+silk/GXNDMS
+silkily
+silkiness/SM
+silkscreen/SM
+silkworm/MS
+silky/RSPT
+silliness/SM
+sill/MS
+silly/PRST
+silo/GSM
+siltation/M
+silt/MDGS
+siltstone/M
+silty/RT
+Silurian/S
+Silvain/M
+Silva/M
+Silvana/M
+Silvan/M
+Silvano/M
+Silvanus/M
+silverer/M
+silverfish/MS
+Silverman/M
+silver/RDYMGS
+silversmith/M
+silversmiths
+Silverstein/M
+silverware/SM
+silvery/RTP
+Silvester/M
+Silvia/M
+Silvie/M
+Silvio/M
+Si/M
+SIMD
+Simenon/M
+Simeon/M
+simian/S
+similar/EY
+similarity/EMS
+simile/SM
+similitude/SME
+Simla/M
+simmer/GSD
+Simmonds/M
+Simmons/M
+Simmonsville/M
+Sim/MS
+Simms/M
+Simona/M
+Simone/M
+Simonette/M
+simonize/SDG
+Simon/M
+Simonne/M
+simony/MS
+simpatico
+simper/GDS
+simpleminded/YP
+simpleness/S
+simple/RSDGTP
+simpleton/SM
+simplex/S
+simplicity/MS
+simplified/U
+simplify/ZXRSDNG
+simplistic
+simplistically
+simply
+Simpson/M
+simulacrum/M
+Simula/M
+SIMULA/M
+simulate/XENGSD
+simulation/ME
+simulative
+simulator/SEM
+simulcast/GSD
+simultaneity/SM
+simultaneousness/M
+simultaneous/YP
+Sinai/M
+Sinatra/M
+since
+sincere/IY
+sincereness/M
+sincerer
+sincerest
+sincerity/MIS
+Sinclair/M
+Sinclare/M
+Sindbad/M
+Sindee/M
+Sindhi/M
+sinecure/MS
+sinecurist/M
+sine/SM
+sinew/SGMD
+sinewy
+sinfulness/SM
+sinful/YP
+Singaporean/S
+Singapore/M
+sing/BGJZYDR
+Singborg/M
+singeing
+singer/M
+Singer/M
+singe/S
+singing/Y
+singlehanded/Y
+singleness/SM
+single/PSDG
+Singleton/M
+singleton/SM
+singletree/SM
+singlet/SM
+singsong/GSMD
+singularity/SM
+singularization/M
+singular/SY
+Sinhalese/M
+sinisterness/M
+sinister/YP
+sinistral/Y
+sinkable/U
+sinker/M
+sink/GZSDRB
+sinkhole/SM
+Sinkiang/M
+sinking/M
+sinlessness/M
+sinless/YP
+sin/MAGS
+sinned
+sinner/MS
+sinning
+sinter/DM
+sinuosity/MS
+sinuousities
+sinuousness/M
+sinuous/PY
+sinusitis/SM
+sinus/MS
+sinusoidal/Y
+sinusoid/MS
+Siobhan/M
+Siouxie/M
+Sioux/M
+siphon/DMSG
+siphons/U
+sipped
+sipper/SM
+sipping
+sip/S
+sired/C
+sire/MS
+siren/M
+sires/C
+siring/C
+Sirius/M
+sirloin/MS
+Sir/MS
+sirocco/MS
+sirred
+sirring
+sirup's
+sir/XGMNDS
+sisal/MS
+Sisely/M
+Sisile/M
+sis/S
+Sissie/M
+sissified
+Sissy/M
+sissy/TRSM
+sister/GDYMS
+sisterhood/MS
+sisterliness/MS
+sisterly/P
+sister's/A
+Sistine
+Sisyphean
+Sisyphus/M
+sit/AG
+sitarist/SM
+sitar/SM
+sitcom/SM
+site/DSJM
+sits
+sitter/MS
+sitting/SM
+situate/GNSDX
+situational/Y
+situationist
+situation/M
+situ/S
+situs/M
+Siusan/M
+Siva/M
+Siward/M
+sixfold
+sixgun
+six/MRSH
+sixpence/MS
+sixpenny
+sixshooter
+sixteen/HRSM
+sixteenths
+sixths
+sixth/Y
+sixtieths
+sixty/SMH
+sizableness/M
+sizable/P
+sized/UA
+size/GJDRSBMZ
+sizer/M
+sizes/A
+sizing/M
+sizzler/M
+sizzle/RSDG
+SJ
+Sjaelland/M
+SK
+ska/S
+skateboard/SJGZMDR
+skater/M
+skate/SM
+skat/JMDRGZ
+skedaddle/GSD
+skeet/RMS
+skein/MDGS
+skeletal/Y
+skeleton/MS
+Skell/M
+Skelly/M
+skeptical/Y
+skepticism/MS
+skeptic/SM
+sketchbook/SM
+sketcher/M
+sketchily
+sketchiness/MS
+sketch/MRSDZG
+sketchpad
+sketchy/PRT
+skew/DRSPGZ
+skewer/GDM
+skewing/M
+skewness/M
+skidded
+skidding
+skid/S
+skiff/GMDS
+skiing/M
+skilfully
+skill/DMSG
+skilled/U
+skillet/MS
+skillfulnesses
+skillfulness/MU
+skillful/YUP
+skilling/M
+skimmed
+skimmer/MS
+skimming/SM
+ski/MNJSG
+skimp/GDS
+skimpily
+skimpiness/MS
+skimpy/PRT
+skim/SM
+skincare
+skindive/G
+skinflint/MS
+skinhead/SM
+skinless
+skinned
+Skinner/M
+skinner/SM
+skinniness/MS
+skinning
+skinny/TRSP
+skin/SM
+skintight
+Skip/M
+skipped
+Skipper/M
+skipper/SGDM
+Skippie/M
+skipping
+Skipp/RM
+Skippy/M
+skip/S
+Skipton/M
+skirmisher/M
+skirmish/RSDMZG
+skirter/M
+skirting/M
+skirt/RDMGS
+skit/GSMD
+skitter/SDG
+skittishness/SM
+skittish/YP
+skittle/SM
+skivvy/GSDM
+skoal/SDG
+Skopje/M
+skulduggery/MS
+skulker/M
+skulk/SRDGZ
+skullcap/MS
+skullduggery's
+skull/SDM
+skunk/GMDS
+skycap/MS
+skydiver/SM
+skydiving/MS
+Skye/M
+skyhook
+skyjacker/M
+skyjack/ZSGRDJ
+Skylab/M
+skylarker/M
+skylark/SRDMG
+Skylar/M
+Skyler/M
+skylight/MS
+skyline/MS
+Sky/M
+sky/MDRSGZ
+skyrocket/GDMS
+skyscraper/M
+skyscrape/RZ
+skyward/S
+skywave
+skyway/M
+skywriter/MS
+skywriting/MS
+slabbed
+slabbing
+slab/MS
+slacken/DG
+slacker/M
+slackness/MS
+slack/SPGTZXYRDN
+Slade/M
+slagged
+slagging
+slag/MS
+slain
+slake/DSG
+slaked/U
+slalom/SGMD
+slammed
+slammer/S
+slamming
+slam/S
+slander/MDRZSG
+slanderousness/M
+slanderous/PY
+slang/SMGD
+slangy/TR
+slanting/Y
+slant/SDG
+slantwise
+slapdash/S
+slaphappy/TR
+slap/MS
+slapped
+slapper
+slapping
+slapstick/MS
+slash/GZRSD
+slashing/Y
+slater/M
+Slater/M
+slate/SM
+slather/SMDG
+slating/M
+slat/MDRSGZ
+slatted
+slattern/MYS
+slatting
+slaughterer/M
+slaughterhouse/SM
+slaughter/SJMRDGZ
+slave/DSRGZM
+slaveholder/SM
+slaver/GDM
+slavery/SM
+Slavic/M
+slavishness/SM
+slavish/YP
+Slav/MS
+Slavonic/M
+slaw/MS
+slay/RGZS
+sleaze/S
+sleazily
+sleaziness/SM
+sleazy/RTP
+sledded
+sledder/S
+sledding
+sledgehammer/MDGS
+sledge/SDGM
+sled/SM
+sleekness/S
+sleek/PYRDGTS
+sleeper/M
+sleepily
+sleepiness/SM
+sleeping/M
+sleeplessness/SM
+sleepless/YP
+sleepover/S
+sleep/RMGZS
+sleepwalker/M
+sleepwalk/JGRDZS
+sleepwear/M
+sleepyhead/MS
+sleepy/PTR
+sleet/DMSG
+sleety/TR
+sleeveless
+sleeve/SDGM
+sleeving/M
+sleigh/GMD
+sleighs
+sleight/SM
+sleken/DG
+slenderize/DSG
+slenderness/MS
+slender/RYTP
+slept
+Slesinger/M
+sleuth/GMD
+sleuths
+slew/DGS
+slice/DSRGZM
+sliced/U
+slicer/M
+slicker/M
+slickness/MS
+slick/PSYRDGTZ
+slider/M
+slide/S
+slid/GZDR
+slight/DRYPSTG
+slighter/M
+slighting/Y
+slightness/S
+slime/SM
+sliminess/S
+slimline
+slimmed
+slimmer/S
+slimmest
+slimming/S
+slimness/S
+slim/SPGYD
+slimy/PTR
+sling/GMRS
+slingshot/MS
+slings/U
+slink/GS
+slinky/RT
+slipcase/MS
+slipcover/GMDS
+slipknot/SM
+slippage/SM
+slipped
+slipper/GSMD
+slipperiness/S
+slippery/PRT
+slipping
+slipshod
+slip/SM
+slipstream/MDGS
+slipway/SM
+slither/DSG
+slithery
+slit/SM
+slitted
+slitter/S
+slitting
+sliver/GSDM
+slivery
+Sloane/M
+Sloan/M
+slobber/SDG
+slobbery
+slob/MS
+Slocum/M
+sloe/MS
+sloganeer/MG
+slogan/MS
+slogged
+slogging
+slog/S
+sloop/SM
+slop/DRSGZ
+sloped/U
+slope/S
+slopped
+sloppily
+sloppiness/SM
+slopping
+sloppy/RTP
+slosh/GSDM
+slothfulness/MS
+slothful/PY
+sloth/GDM
+sloths
+slot/MS
+slotted
+slotting
+slouch/DRSZG
+sloucher/M
+slouchy/RT
+slough/GMD
+sloughs
+Slovakia/M
+Slovakian/S
+Slovak/S
+Slovene/S
+Slovenia/M
+Slovenian/S
+slovenliness/SM
+slovenly/TRP
+sloven/YMS
+slowcoaches
+slowdown/MS
+slowish
+slowness/MS
+slow/PGTYDRS
+slowpoke/MS
+SLR
+sludge/SDGM
+sludgy/TR
+slue/MGDS
+sluggard/MS
+slugged
+slugger/SM
+slugging
+sluggishness/SM
+sluggish/YP
+slug/MS
+sluice/SDGM
+slumberer/M
+slumber/MDRGS
+slumberous
+slumlord/MS
+slummed
+slummer
+slumming
+slum/MS
+slummy/TR
+slump/DSG
+slung/U
+slunk
+slur/MS
+slurp/GSD
+slurred
+slurried/M
+slurring
+slurrying/M
+slurry/MGDS
+slushiness/SM
+slush/SDMG
+slushy/RTP
+slut/MS
+sluttish
+slutty/TR
+Sly/M
+slyness/MS
+sly/RTY
+smacker/M
+smack/SMRDGZ
+smallholders
+smallholding/MS
+smallish
+Small/M
+smallness/S
+smallpox/SM
+small/SGTRDP
+smalltalk
+smalltime
+Smallwood/M
+smarmy/RT
+smarten/GD
+smartness/S
+smartypants
+smart/YRDNSGTXP
+smasher/M
+smash/GZRSD
+smashing/Y
+smashup/S
+smattering/SM
+smearer/M
+smear/GRDS
+smeary/TR
+smeller/M
+smelliness/MS
+smell/SBRDG
+smelly/TRP
+smelter/M
+smelt/SRDGZ
+Smetana/M
+smidgen/MS
+smilax/MS
+smile/GMDSR
+smiley/M
+smilies
+smiling/UY
+smirch/SDG
+smirk/GSMD
+Smirnoff/M
+smite/GSR
+smiter/M
+smith/DMG
+smithereens
+Smithfield/M
+Smith/M
+smiths
+Smithsonian/M
+Smithson/M
+Smithtown/M
+smithy/SM
+smitten
+Smitty/M
+Sm/M
+smocking/M
+smock/SGMDJ
+smoggy/TR
+smog/SM
+smoke/GZMDSRBJ
+smokehouse/MS
+smokeless
+smoker/M
+smokescreen/S
+smokestack/MS
+Smokey/M
+smokiness/S
+smoking/M
+smoky/RSPT
+smoldering/Y
+smolder/SGD
+Smolensk/M
+Smollett/M
+smooch/SDG
+smoothen/DG
+smoother/M
+smoothie/SM
+smoothness/MS
+smooths
+smooth/TZGPRDNY
+smörgåsbord/SM
+smote
+smother/GSD
+SMSA/MS
+SMTP
+Smucker/M
+smudge/GSD
+smudginess/M
+smudgy/TRP
+smugged
+smugger
+smuggest
+smugging
+smuggle/JZGSRD
+smuggler/M
+smugness/MS
+smug/YSP
+smut/SM
+Smuts/M
+smutted
+smuttiness/SM
+smutting
+smutty/TRP
+Smyrna/M
+snack/SGMD
+snaffle/GDSM
+snafu/DMSG
+snagged
+snagging
+snag/MS
+snail/GSDM
+Snake
+snakebird/M
+snakebite/MS
+snake/DSGM
+snakelike
+snakeroot/M
+snaky/TR
+snapback/M
+snapdragon/MS
+snapped/U
+snapper/SM
+snappily
+snappiness/SM
+snapping/U
+snappishness/SM
+snappish/PY
+snappy/PTR
+snapshot/MS
+snapshotted
+snapshotting
+snap/US
+snare/DSRGM
+snarer/M
+snarf/JSGD
+snarler/M
+snarling/Y
+snarl/UGSD
+snarly/RT
+snatch/DRSZG
+snatcher/M
+snazzily
+snazzy/TR
+Snead/M
+sneaker/MD
+sneakily
+sneakiness/SM
+sneaking/Y
+sneak/RDGZS
+sneaky/PRT
+Sneed/M
+sneerer/M
+sneer/GMRDJS
+sneering/Y
+sneeze/SRDG
+Snell/M
+snicker/GMRD
+snick/MRZ
+snideness/M
+Snider/M
+snide/YTSRP
+sniffer/M
+sniff/GZSRD
+sniffle/GDRS
+sniffler/M
+sniffles/M
+snifter/MDSG
+snigger's
+sniper/M
+snipe/SM
+snipped
+snipper/SM
+snippet/SM
+snipping
+snippy/RT
+snip/SGDRZ
+snitch/GDS
+snit/SM
+sniveler/M
+snivel/JSZGDR
+Sn/M
+snobbery/SM
+snobbishness/S
+snobbish/YP
+snobby/RT
+snob/MS
+Snodgrass/M
+snood/SGDM
+snooker/GMD
+snook/SMRZ
+snooper/M
+snoop/SRDGZ
+Snoopy/M
+snoopy/RT
+snootily
+snootiness/MS
+snoot/SDMG
+snooty/TRP
+snooze/GSD
+snore/DSRGZ
+snorkel/ZGSRDM
+snorter/M
+snort/GSZRD
+snot/MS
+snotted
+snottily
+snottiness/SM
+snotting
+snotty/TRP
+snout/SGDM
+snowball/SDMG
+snowbank/SM
+Snowbelt/SM
+snowbird/SM
+snowblower/S
+snowboard/GZDRJS
+snowbound
+snowcapped
+snowdrift/MS
+snowdrop/MS
+snowfall/MS
+snowfield/MS
+snowflake/MS
+snow/GDMS
+snowily
+snowiness/MS
+Snow/M
+snowman/M
+snowmen
+snowmobile/GMDRS
+snowplough/M
+snowploughs
+snowplow/SMGD
+snowshed
+snowshoeing
+snowshoe/MRS
+snowshoer/M
+snowstorm/MS
+snowsuit/S
+snowy/RTP
+snubbed
+snubber
+snubbing
+snub/SP
+snuffbox/SM
+snuffer/M
+snuff/GZSYRD
+snuffle/GDSR
+snuffler/M
+snuffly/RT
+snugged
+snugger
+snuggest
+snugging
+snuggle/GDS
+snuggly
+snugness/MS
+snug/SYP
+Snyder/M
+so
+SO
+soaker/M
+soak/GDRSJ
+soapbox/DSMG
+soapiness/S
+soap/MDRGS
+soapstone/MS
+soapsud/S
+soapy/RPT
+soar/DRJSG
+soarer/M
+soaring/Y
+sobbed
+sobbing/Y
+soberer/M
+soberness/SM
+sober/PGTYRD
+sobriety/SIM
+sobriquet/MS
+sob/SZR
+Soc
+soccer/MS
+sociabilities
+sociability/IM
+sociable/S
+sociably/IU
+socialism/SM
+socialistic
+socialist/SM
+socialite/SM
+sociality/M
+socialization/SM
+socialized/U
+socializer/M
+socialize/RSDG
+socially/U
+social/SY
+societal/Y
+society/MS
+socio
+sociobiology/M
+sociocultural/Y
+sociodemographic
+socioeconomically
+socioeconomic/S
+sociolinguistics/M
+sociological/MY
+sociologist/SM
+sociology/SM
+sociometric
+sociometry/M
+sociopath/M
+sociopaths
+socket/SMDG
+sock/GDMS
+Socorro/M
+Socrates/M
+Socratic/S
+soc/S
+soda/SM
+sodded
+sodden/DYPSG
+soddenness/M
+sodding
+Soddy/M
+sodium/MS
+sod/MS
+sodomite/MS
+sodomize/GDS
+Sodom/M
+sodomy/SM
+soever
+sofa/SM
+Sofia/M
+Sofie/M
+softball/MS
+softbound
+softener/M
+soften/ZGRD
+softhearted
+softie's
+softness/MS
+soft/SPXTYNR
+software/MS
+softwood/SM
+softy/SM
+soggily
+sogginess/S
+soggy/RPT
+Soho/M
+soigné
+soiled/U
+soil/SGMD
+soirée/SM
+sojourn/RDZGSM
+solace/GMSRD
+solacer/M
+solaria
+solarium/M
+solar/S
+solder/RDMSZG
+soldier/MDYSG
+soldiery/MS
+sold/RU
+solecism/MS
+soled/FA
+solemness
+solemnify/GSD
+solemnity/MS
+solemnization/SM
+solemnize/GSD
+solemnness/SM
+solemn/PTRY
+solenoid/MS
+soler/F
+soles/IFA
+sole/YSP
+sol/GSMDR
+solicitation/S
+solicited/U
+solicitor/MS
+solicitousness/S
+solicitous/YP
+solicit/SDG
+solicitude/MS
+solidarity/MS
+solidi
+solidification/M
+solidify/NXSDG
+solidity/S
+solidness/SM
+solid/STYRP
+solidus/M
+soliloquies
+soliloquize/DSG
+soliloquy/M
+soling/NM
+solipsism/MS
+solipsist/S
+Solis/M
+solitaire/SM
+solitary/SP
+solitude/SM
+Sollie/M
+Solly/M
+Sol/MY
+solo/DMSG
+soloist/SM
+Solomon/SM
+Solon/M
+Soloviev/M
+solstice/SM
+solubility/IMS
+soluble/SI
+solute/ENAXS
+solute's
+solution/AME
+solvable/UI
+solvating
+solve/ABSRDZG
+solved/EU
+solvency/IMS
+solvent/IS
+solvently
+solvent's
+solver/MEA
+solves/E
+solving/E
+Solzhenitsyn/M
+Somalia/M
+Somalian/S
+Somali/MS
+soma/M
+somatic
+somberness/SM
+somber/PY
+sombre
+sombrero/SM
+somebody'll
+somebody/SM
+someday
+somehow
+someone'll
+someone/SM
+someplace/M
+somersault/DSGM
+Somerset/M
+somerset/S
+somersetted
+somersetting
+Somerville/M
+something/S
+sometime/S
+someway/S
+somewhat/S
+somewhere/S
+some/Z
+sommelier/SM
+Somme/M
+somnambulism/SM
+somnambulist/SM
+somnolence/MS
+somnolent/Y
+Somoza/M
+sonar/SM
+sonata/MS
+sonatina/SM
+Sondheim/M
+Sondra/M
+Sonenberg/M
+songbag
+songbird/SM
+songbook/S
+songfest/MS
+songfulness/M
+songful/YP
+Songhai/M
+Songhua/M
+song/MS
+songster/MS
+songstress/SM
+songwriter/SM
+songwriting
+Sonia/M
+sonic/S
+Sonja/M
+Son/M
+sonnet/MDSG
+Sonnie/M
+Sonni/M
+Sonnnie/M
+Sonny/M
+sonny/SM
+Sonoma/M
+Sonora/M
+sonority/S
+sonorousness/SM
+sonorous/PY
+son/SMY
+Sontag/M
+sonuvabitch
+Sonya/M
+Sony/M
+soonish
+soon/TR
+soothe
+soother/M
+sooth/GZTYSRDMJ
+soothingness/M
+soothing/YP
+sooths
+soothsayer/M
+soothsay/JGZR
+soot/MGDS
+sooty/RT
+SOP
+Sophey/M
+Sophia/SM
+Sophie/M
+Sophi/M
+sophism/SM
+sophister/M
+sophistical
+sophisticatedly
+sophisticated/U
+sophisticate/XNGDS
+sophistication/MU
+sophistic/S
+sophist/RMS
+sophistry/SM
+Sophoclean
+Sophocles/M
+sophomore/SM
+sophomoric
+Sophronia/M
+soporifically
+soporific/SM
+sopped
+sopping/S
+soppy/RT
+soprano/SM
+sop/SM
+Sopwith/M
+sorbet/SM
+Sorbonne/M
+sorcerer/MS
+sorceress/S
+sorcery/MS
+Sorcha/M
+sordidness/SM
+sordid/PY
+sorehead/SM
+soreness/S
+Sorensen/M
+Sorenson/M
+sore/PYTGDRS
+sorghum/MS
+sorority/MS
+sorrel/SM
+Sorrentine/M
+sorrily
+sorriness/SM
+sorrower/M
+sorrowfulness/SM
+sorrowful/YP
+sorrow/GRDMS
+sorry/PTSR
+sorta
+sortable
+sorted/U
+sorter/MS
+sort/FSAGD
+sortieing
+sortie/MSD
+sort's
+sos
+SOS
+Sosa/M
+Sosanna/M
+Soto/M
+sot/SM
+sottish
+soubriquet's
+soufflé/MS
+sough/DG
+soughs
+sought/U
+soulfulness/MS
+soulful/YP
+soulless/Y
+soul/MDS
+sound/AUD
+soundboard/MS
+sounders
+sounder's
+sounder/U
+soundest
+sounding/AY
+soundings
+sounding's
+soundless/Y
+soundly/U
+soundness/UMS
+soundproof/GSD
+soundproofing/M
+sound's
+sounds/A
+soundtrack/MS
+soupçon/SM
+soup/GMDS
+Souphanouvong/M
+soupy/RT
+source/ASDMG
+sourceless
+sourdough
+sourdoughs
+sourish
+sourness/MS
+sourpuss/MS
+sour/TYDRPSG
+Sousa/M
+sousaphone/SM
+sous/DSG
+souse
+sou/SMH
+Southampton/M
+southbound
+southeastern
+southeaster/YM
+Southeast/MS
+southeast/RZMS
+southeastward/S
+southerly/S
+souther/MY
+southerner/M
+Southerner/MS
+southernisms
+southernmost
+southern/PZSYR
+Southey/M
+Southfield/M
+southing/M
+southland/M
+South/M
+southpaw/MS
+south/RDMG
+souths
+Souths
+southward/S
+southwestern
+southwester/YM
+Southwest/MS
+southwest/RMSZ
+southwestward/S
+souvenir/SM
+sou'wester
+sovereignty/MS
+sovereign/YMS
+soviet/MS
+Soviet/S
+sow/ADGS
+sowbelly/M
+sowens/M
+sower/DS
+Soweto/M
+sown/A
+sox's
+soybean/MS
+Soyinka/M
+soy/MS
+Soyuz/M
+Spaatz/M
+spacecraft/MS
+space/DSRGZMJ
+spaceflight/S
+spaceman/M
+spacemen
+spaceport/SM
+spacer/M
+spaceship/MS
+spacesuit/MS
+spacewalk/GSMD
+Spacewar/M
+spacewoman
+spacewomen
+spacey
+spacial
+spacier
+spaciest
+spaciness
+spacing/M
+spaciousness/SM
+spacious/PY
+Spackle
+spade/DSRGM
+spadeful/SM
+spader/M
+spadework/SM
+spadices
+spadix/M
+Spafford/M
+spaghetti/SM
+Spahn/M
+Spain/M
+spake
+Spalding/M
+Spam/M
+spa/MS
+Span
+spandex/MS
+spandrels
+spangle/GMDS
+Spanglish/S
+Spaniard/SM
+spanielled
+spanielling
+spaniel/SM
+Spanish/M
+spanker/M
+spanking/M
+spank/SRDJG
+span/MS
+spanned/U
+spanner/SM
+spanning
+SPARC/M
+SPARCstation/M
+spar/DRMGTS
+spareness/MS
+spare/PSY
+spareribs
+sparer/M
+sparing/UY
+sparker/M
+sparkle/DRSGZ
+sparkler/M
+Sparkman/M
+Sparks
+spark/SGMRD
+sparky/RT
+sparling/SM
+sparred
+sparrer
+sparring/U
+sparrow/MS
+sparseness/S
+sparse/YP
+sparsity/S
+spars/TR
+Spartacus/M
+Sparta/M
+spartan
+Spartan/S
+spasm/GSDM
+spasmodic
+spasmodically
+spastic/S
+spate/SM
+spathe/MS
+spatiality/M
+spatial/Y
+spat/MS
+spatted
+spatter/DGS
+spatterdock/M
+spatting
+spatula/SM
+spavin/DMS
+spawner/M
+spawn/MRDSG
+spay/DGS
+SPCA
+speakable/U
+speakeasy/SM
+speaker/M
+Speaker's
+speakership/M
+speaking/U
+speak/RBGZJS
+spearer/M
+spearfish/SDMG
+spearhead/GSDM
+spearmint/MS
+spear/MRDGS
+Spears
+spec'd
+specialism/MS
+specialist/MS
+specialization/SM
+specialized/U
+specialize/GZDSR
+specializing/U
+special/SRYP
+specialty/MS
+specie/MS
+specif
+specifiability
+specifiable
+specifiably
+specifically
+specification/SM
+specificity/S
+specific/SP
+specified/U
+specifier/SM
+specifies
+specify/AD
+specifying
+specimen/SM
+spec'ing
+speciousness/SM
+specious/YP
+speck/GMDS
+speckle/GMDS
+spec/SM
+spectacle/MSD
+spectacular/SY
+spectator/SM
+specter/DMS
+specter's/A
+spectralness/M
+spectral/YP
+spectra/M
+spectrogram/MS
+spectrographically
+spectrograph/M
+spectrography/M
+spectrometer/MS
+spectrometric
+spectrometry/M
+spectrophotometer/SM
+spectrophotometric
+spectrophotometry/M
+spectroscope/SM
+spectroscopic
+spectroscopically
+spectroscopy/SM
+spectrum/M
+specularity
+specular/Y
+speculate/VNGSDX
+speculation/M
+speculative/Y
+speculator/SM
+sped
+speech/GMDS
+speechlessness/SM
+speechless/YP
+speedboat/GSRM
+speedboating/M
+speeder/M
+speedily
+speediness/SM
+speedometer/MS
+speed/RMJGZS
+speedster/SM
+speedup/MS
+speedway/SM
+speedwell/MS
+speedy/PTR
+speer/M
+speleological
+speleologist/S
+speleology/MS
+spellbinder/M
+spellbind/SRGZ
+spellbound
+spelldown/MS
+spelled/A
+speller/M
+spelling/M
+spell/RDSJGZ
+spells/A
+spelunker/MS
+spelunking/S
+Spencerian
+Spencer/M
+Spence/RM
+spender/M
+spend/SBJRGZ
+spendthrift/MS
+Spenglerian
+Spengler/M
+Spense/MR
+Spenserian
+Spenser/M
+spent/U
+spermatophyte/M
+spermatozoa
+spermatozoon/M
+spermicidal
+spermicide/MS
+sperm/SM
+Sperry/M
+spew/DRGZJS
+spewer/M
+SPF
+sphagnum/SM
+sphere/SDGM
+spherical/Y
+spheric/S
+spherics/M
+spheroidal/Y
+spheroid/SM
+spherule/MS
+sphincter/SM
+Sphinx/M
+sphinx/MS
+Spica/M
+spic/DGM
+spicebush/M
+spice/SM
+spicily
+spiciness/SM
+spicule/MS
+spicy/PTR
+spider/SM
+spiderweb/S
+spiderwort/M
+spidery/TR
+Spiegel/M
+Spielberg/M
+spiel/GDMS
+spier/M
+spiffy/TDRSG
+spigot/MS
+spike/GMDSR
+Spike/M
+spiker/M
+spikiness/SM
+spiky/PTR
+spillage/SM
+Spillane/M
+spillover/SM
+spill/RDSG
+spillway/SM
+spinach/MS
+spinal/YS
+spindle/JGMDRS
+spindly/RT
+spinelessness/M
+spineless/YP
+spine/MS
+spinet/SM
+spininess/M
+spinnability/M
+spinnaker/SM
+spinneret/MS
+spinner/SM
+spinning/SM
+Spinoza/M
+spin/S
+spinsterhood/SM
+spinsterish
+spinster/MS
+spiny/PRT
+spiracle/SM
+spiraea's
+spiral/YDSG
+spire/AIDSGF
+spirea/MS
+spire's
+spiritedness/M
+spirited/PY
+spirit/GMDS
+spiritless
+spirits/I
+spiritualism/SM
+spiritualistic
+spiritualist/SM
+spirituality/SM
+spiritual/SYP
+spirituous
+spirochete/SM
+Spiro/M
+spiry/TR
+spitball/SM
+spite/CSDAG
+spitefuller
+spitefullest
+spitefulness/MS
+spiteful/PY
+spite's/A
+spitfire/SM
+spit/SGD
+spitted
+spitting
+spittle/SM
+spittoon/SM
+Spitz/M
+splashdown/MS
+splasher/M
+splash/GZDRS
+splashily
+splashiness/MS
+splashy/RTP
+splat/SM
+splatted
+splatter/DSG
+splatting
+splayfeet
+splayfoot/MD
+splay/SDG
+spleen/SM
+splendidness/M
+splendid/YRPT
+splendorous
+splendor/SM
+splenetic/S
+splicer/M
+splice/RSDGZJ
+spline/MSD
+splinter/GMD
+splintery
+splint/SGZMDR
+splits/M
+split/SM
+splittable
+splitter/MS
+splitting/S
+splodge/SM
+splotch/MSDG
+splotchy/RT
+splurge/GMDS
+splutterer/M
+splutter/RDSG
+Sp/M
+Spock/M
+spoilables
+spoilage/SM
+spoil/CSZGDR
+spoiled/U
+spoiler/MC
+spoilsport/SM
+Spokane/M
+spoke/DSG
+spoken/U
+spokeshave/MS
+spokesman/M
+spokesmen
+spokespeople
+spokesperson/S
+spokeswoman/M
+spokeswomen
+spoliation/MCS
+spongecake
+sponge/GMZRSD
+sponger/M
+sponginess/S
+spongy/TRP
+sponsor/DGMS
+sponsorship/S
+spontaneity/SM
+spontaneousness/M
+spontaneous/PY
+spoof/SMDG
+spookiness/MS
+spook/SMDG
+spooky/PRT
+spool/SRDMGZ
+spoonbill/SM
+spoonerism/SM
+spoonful/MS
+spoon/GSMD
+spoor/GSMD
+sporadically
+sporadic/Y
+spore/DSGM
+sporran/MS
+sportiness/SM
+sporting/Y
+sportiveness/M
+sportive/PY
+sportscast/RSGZM
+sportsmanlike/U
+sportsman/MY
+sportsmanship/MS
+sportsmen
+sportswear/M
+sportswoman/M
+sportswomen
+sportswriter/S
+sport/VGSRDM
+sporty/PRT
+Sposato/M
+spotlessness/MS
+spotless/YP
+spotlight/GDMS
+spotlit
+spot/MSC
+spotted/U
+spotter/MS
+spottily
+spottiness/SM
+spotting/M
+spotty/RTP
+spousal/MS
+spouse/GMSD
+spouter/M
+spout/SGRD
+sprain/SGD
+sprang/S
+sprat/SM
+sprawl/GSD
+sprayed/UA
+sprayer/M
+spray/GZSRDM
+sprays/A
+spreadeagled
+spreader/M
+spread/RSJGZB
+spreadsheet/S
+spreeing
+spree/MDS
+sprigged
+sprigging
+sprightliness/MS
+sprightly/PRT
+sprig/MS
+springboard/MS
+springbok/MS
+springeing
+springer/M
+Springfield/M
+springily
+springiness/SM
+springing/M
+springlike
+spring/SGZR
+Springsteen/M
+springtime/MS
+springy/TRP
+sprinkle/DRSJZG
+sprinkler/DM
+sprinkling/M
+Sprint/M
+sprint/SGZMDR
+sprite/SM
+spritz/GZDSR
+sprocket/DMGS
+sprocketed/U
+Sproul/M
+sprout/GSD
+spruce/GMTYRSDP
+spruceness/SM
+sprue/M
+sprung/U
+spryness/S
+spry/TRY
+SPSS
+spudded
+spudding
+spud/MS
+Spuds/M
+spume/DSGM
+spumone's
+spumoni/S
+spumy/TR
+spun
+spunk/GSMD
+spunky/SRT
+spurge/MS
+spuriousness/SM
+spurious/PY
+spur/MS
+spurn/RDSG
+spurred
+spurring
+spurt/SGD
+sputa
+Sputnik
+sputnik/MS
+sputter/DRGS
+sputum/M
+spy/DRSGM
+spyglass/MS
+sq
+sqq
+sqrt
+squabbed
+squabber
+squabbest
+squabbing
+squabbler/M
+squabble/ZGDRS
+squab/SM
+squadded
+squadding
+squadron/MDGS
+squad/SM
+squalidness/SM
+squalid/PRYT
+squaller/M
+squall/GMRDS
+squally/RT
+squalor/SM
+squamous/Y
+squander/GSRD
+Squanto
+square/GMTYRSDP
+squareness/SM
+squarer/M
+Squaresville/M
+squarish
+squash/GSRD
+squashiness/M
+squashy/RTP
+squatness/MS
+squat/SPY
+squatted
+squatter/SMDG
+squattest
+squatting
+squawker/M
+squawk/GRDMZS
+squaw/SM
+squeaker/M
+squeakily
+squeakiness/S
+squeak/RDMGZS
+squeaky/RPT
+squealer/M
+squeal/MRDSGZ
+squeamishness/SM
+squeamish/YP
+squeegee/DSM
+squeegeeing
+squeeze/GZSRDB
+squeezer/M
+squelcher/M
+squelch/GDRS
+squelchy/RT
+squibbed
+Squibb/GM
+squibbing
+Squibbing/M
+squib/SM
+squidded
+squidding
+squid/SM
+squiggle/MGDS
+squiggly/RT
+squinter/M
+squint/GTSRD
+squinting/Y
+squirehood
+squire/SDGM
+squirm/SGD
+squirmy/TR
+squirrel/SGYDM
+squirter/M
+squirt/GSRD
+squish/GSD
+squishy/RTP
+Sr
+Srinagar/M
+SRO
+S's
+SS
+SSA
+SSE
+ssh
+s's/KI
+SSS
+SST
+SSW
+ST
+stabbed
+stabber/S
+stabbing/S
+stability/ISM
+stabilizability
+stabilization/CS
+stabilization's
+stabilize/CGSD
+stabilizer/MS
+stableman/M
+stablemate
+stablemen
+stableness/UM
+stable/RSDGMTP
+stabler/U
+stable's/F
+stables/F
+stablest/U
+stabling/M
+stably/U
+stab/YS
+staccato/S
+Stacee/M
+Stace/M
+Stacey/M
+Stacia/M
+Stacie/M
+Staci/M
+stackable
+stacker/M
+stack's
+stack/USDG
+Stacy/M
+stadias
+stadia's
+stadium/MS
+Stael/M
+Stafani/M
+staff/ADSG
+Staffard/M
+staffer/MS
+Stafford/M
+Staffordshire/M
+staffroom
+staff's
+Staford/M
+stag/DRMJSGZ
+stagecoach/MS
+stagecraft/MS
+stagehand/MS
+stager/M
+stage/SM
+stagestruck
+stagflation/SM
+stagged
+staggerer/M
+stagger/GSJDR
+staggering/Y
+staggers/M
+stagging
+staginess/M
+staging/M
+stagnancy/SM
+stagnant/Y
+stagnate/NGDSX
+stagnation/M
+stagy/PTR
+Stahl/M
+staidness/MS
+staid/YRTP
+stained/U
+stainer/M
+stainless/YS
+stain/SGRD
+staircase/SM
+stair/MS
+stairway/SM
+stairwell/MS
+stake/DSGM
+stakeholder/S
+stakeout/SM
+stalactite/SM
+stalag/M
+stalagmite/SM
+stalemate/SDMG
+staleness/MS
+stale/PGYTDSR
+Staley/M
+Stalingrad/M
+Stalinist
+Stalin/SM
+stalker/M
+stalk/MRDSGZJ
+stall/DMSJG
+stalled/I
+stallholders
+stallion/SM
+Stallone/M
+stalls/I
+stalwartness/M
+stalwart/PYS
+Sta/M
+stamen/MS
+Stamford/M
+stamina/SM
+staminate
+stammer/DRSZG
+stammerer/M
+stammering/Y
+stampede/MGDRS
+stampeder/M
+stamped/U
+stamper/M
+stamp/RDSGZJ
+stance/MIS
+stancher/M
+stanch/GDRST
+stanchion/SGMD
+standalone
+standardization/AMS
+standardized/U
+standardize/GZDSR
+standardizer/M
+standardizes/A
+standard/YMS
+standby
+standbys
+standee/MS
+Standford/M
+standing/M
+Standish/M
+standoffish
+standoff/SM
+standout/MS
+standpipe/MS
+standpoint/SM
+stand/SJGZR
+standstill/SM
+Stanfield/M
+Stanford/M
+Stanislas/M
+Stanislaus/M
+Stanislavsky/M
+Stanislaw/M
+stank/S
+Stanleigh/M
+Stanley/M
+Stanly/M
+stannic
+stannous
+Stanton/M
+Stanwood/M
+Stan/YMS
+stanza/MS
+staph/M
+staphs
+staphylococcal
+staphylococci
+staphylococcus/M
+stapled/U
+stapler/M
+Stapleton/M
+staple/ZRSDGM
+starboard/SDMG
+starchily
+starchiness/MS
+starch/MDSG
+starchy/TRP
+stardom/MS
+star/DRMGZS
+stardust/MS
+stare/S
+starfish/SM
+Stargate/M
+stargaze/ZGDRS
+staring/U
+Starkey/M
+Stark/M
+starkness/MS
+stark/SPGTYRD
+Starla/M
+Starlene/M
+starless
+starlet/MS
+starlight/MS
+starling/MS
+Starlin/M
+starlit
+Star/M
+starred
+starring
+Starr/M
+starry/TR
+starship
+starstruck
+start/ASGDR
+starter/MS
+startle/GDS
+startling/PY
+startup/SM
+starvation/MS
+starveling/M
+starver/M
+starve/RSDG
+stash/GSD
+stasis/M
+stat/DRSGV
+statecraft/MS
+stated/U
+statehood/MS
+statehouse/S
+Statehouse's
+state/IGASD
+statelessness/MS
+stateless/P
+stateliness/MS
+stately/PRT
+statement/MSA
+Staten/M
+stater/M
+stateroom/SM
+stateside
+state's/K
+states/K
+statesmanlike
+statesman/MY
+statesmanship/SM
+statesmen
+stateswoman
+stateswomen
+statewide
+statical/Y
+static/S
+statics/M
+stationarity
+stationary/S
+stationer/M
+stationery/MS
+stationmaster/M
+station/SZGMDR
+statistical/Y
+statistician/MS
+statistic/MS
+Statler/M
+stator/SM
+statuary/SM
+statue/MSD
+statuesque/YP
+statuette/MS
+stature/MS
+status/SM
+statute/SM
+statutorily
+statutory/P
+Stauffer/M
+staunchness/S
+staunch/PDRSYTG
+stave/DGM
+Stavro/MS
+stay/DRGZS
+stayer/M
+std
+STD
+stdio
+steadfastness/MS
+steadfast/PY
+steadily/U
+steadiness's
+steadiness/US
+steading/M
+stead/SGDM
+steady/DRSUTGP
+steakhouse/SM
+steak/SM
+stealer/M
+stealing/M
+steal/SRHG
+stealthily
+stealthiness/MS
+stealth/M
+stealths
+stealthy/PTR
+steamboat/MS
+steamer/MDG
+steamfitter/S
+steamfitting/S
+steamily
+steaminess/SM
+steamroller/DMG
+steamroll/GZRDS
+steam/SGZRDMJ
+steamship/SM
+steamy/RSTP
+Stearne/M
+Stearn/SM
+steed/SM
+Steele/M
+steeliness/SM
+steelmaker/M
+steel/SDMGZ
+steelworker/M
+steelwork/ZSMR
+steelyard/MS
+steely/TPRS
+Steen/M
+steepen/GD
+steeper/M
+steeplebush/M
+steeplechase/GMSD
+steeplejack/MS
+steeple/MS
+steepness/S
+steep/SYRNDPGTX
+steerage/MS
+steerer/M
+steer/SGBRDJ
+steersman/M
+steersmen
+steeves
+Stefa/M
+Stefania/M
+Stefanie/M
+Stefan/M
+Stefano/M
+Steffane/M
+Steffen/M
+Steffie/M
+Steffi/M
+stegosauri
+stegosaurus/S
+Steinbeck/SM
+Steinberg/M
+Steinem/M
+Steiner/M
+Steinmetz/M
+Stein/RM
+stein/SGZMRD
+Steinway/M
+Stella/M
+stellar
+stellated
+Ste/M
+stemless
+stemmed/U
+stemming
+stem/MS
+stemware/MS
+stench/GMDS
+stenciler/M
+stencil/GDRMSZ
+stencillings
+Stendhal/M
+Stendler/M
+Stengel/M
+stenographer/SM
+stenographic
+stenography/SM
+steno/SM
+stenotype/M
+stentorian
+stepbrother/MS
+stepchild/M
+stepchildren
+stepdaughter/MS
+stepfather/SM
+Stepha/M
+Stephana/M
+Stephanie/M
+Stephani/M
+Stephan/M
+Stephannie/M
+Stephanus/M
+Stephenie/M
+Stephen/MS
+Stephenson/M
+Stephie/M
+Stephi/M
+Stephine/M
+stepladder/SM
+step/MIS
+stepmother/SM
+stepparent/SM
+stepper/M
+steppe/RSDGMZ
+steppingstone/S
+stepsister/SM
+stepson/SM
+stepwise
+stereographic
+stereography/M
+stereo/GSDM
+stereophonic
+stereoscope/MS
+stereoscopic
+stereoscopically
+stereoscopy/M
+stereotype/GMZDRS
+stereotypic
+stereotypical/Y
+sterile
+sterility/SM
+sterilization/SM
+sterilized/U
+sterilize/RSDGZ
+sterilizes/A
+Sterling/M
+sterling/MPYS
+sterlingness/M
+sternal
+Sternberg/M
+Sterne/M
+Stern/M
+sternness/S
+Sterno
+stern/SYRDPGT
+sternum/SM
+steroidal
+steroid/MS
+stertorous
+Stesha/M
+stethoscope/SM
+stet/MS
+stetson/MS
+Stetson/SM
+stetted
+stetting
+Steuben/M
+Stevana/M
+stevedore/GMSD
+Steve/M
+Stevena/M
+Steven/MS
+Stevenson/M
+Stevie/M
+Stevy/M
+steward/DMSG
+stewardess/SM
+Steward/M
+stewardship/MS
+Stewart/M
+stew/GDMS
+st/GBJ
+sticker/M
+stickily
+stickiness/SM
+stickleback/MS
+stickle/GZDR
+stickler/M
+stick/MRDSGZ
+stickpin/SM
+stickup/SM
+sticky/GPTDRS
+Stieglitz/M
+stiffen/JZRDG
+stiff/GTXPSYRND
+stiffness/MS
+stifle/GJRSD
+stifler/M
+stifling/Y
+stigma/MS
+stigmata
+stigmatic/S
+stigmatization/C
+stigmatizations
+stigmatization's
+stigmatize/DSG
+stigmatized/U
+stile/GMDS
+stiletto/MDSG
+stillbirth/M
+stillbirths
+stillborn/S
+stiller/MI
+stillest
+Stillman/M
+Stillmann/M
+stillness/MS
+still/RDIGS
+Stillwell/M
+stilted/PY
+stilt/GDMS
+Stilton/MS
+Stimson/M
+stimulant/MS
+stimulated/U
+stimulate/SDVGNX
+stimulation/M
+stimulative/S
+stimulator/M
+stimulatory
+stimuli/M
+stimulus/MS
+Stine/M
+stinger/M
+sting/GZR
+stingily
+stinginess/MS
+stinging/Y
+stingray/MS
+stingy/RTP
+stinkbug/S
+stinker/M
+stink/GZRJS
+stinking/Y
+stinkpot/M
+Stinky/M
+stinky/RT
+stinter/M
+stinting/U
+stint/JGRDMS
+stipendiary
+stipend/MS
+stipple/JDRSG
+stippler/M
+stipulate/XNGSD
+stipulation/M
+Stirling/M
+stirred/U
+stirrer/SM
+stirring/YS
+stirrup/SM
+stir/S
+stitch/ASDG
+stitcher/M
+stitchery/S
+stitching/MS
+stitch's
+St/M
+stoat/SM
+stochastic
+stochastically
+stochasticity
+stockade/SDMG
+stockbreeder/SM
+stockbroker/MS
+stockbroking/S
+stocker/SM
+Stockhausen/M
+stockholder/SM
+Stockholm/M
+stockily
+stockiness/SM
+stockinet's
+stockinette/S
+stocking/MDS
+stockist/MS
+stockpile/GRSD
+stockpiler/M
+stockpot/MS
+stockroom/MS
+stock's
+stock/SGAD
+stocktaking/MS
+Stockton/M
+stockyard/SM
+stocky/PRT
+Stoddard/M
+stodge/M
+stodgily
+stodginess/S
+stodgy/TRP
+stogy/SM
+stoical/Y
+stoichiometric
+stoichiometry/M
+stoicism/SM
+Stoicism/SM
+stoic/MS
+Stoic/MS
+stoke/DSRGZ
+stoker/M
+stokes/M
+Stokes/M
+STOL
+stole/MDS
+stolen
+stolidity/S
+stolidness/S
+stolid/PTYR
+stolon/SM
+stomachache/MS
+stomacher/M
+stomach/RSDMZG
+stomachs
+stomp/DSG
+stonecutter/SM
+stone/DSRGM
+Stonehenge/M
+stoneless
+Stone/M
+stonemason/MS
+stoner/M
+stonewall/GDS
+stoneware/MS
+stonewashed
+stonework/SM
+stonewort/M
+stonily
+stoniness/MS
+stony/TPR
+stood
+stooge/SDGM
+stool/SDMG
+stoop/SDG
+stopcock/MS
+stopgap/SM
+stoplight/SM
+stopover/MS
+stoppable/U
+stoppage/MS
+Stoppard/M
+stopped/U
+stopper/GMDS
+stopping/M
+stopple/GDSM
+stop's
+stops/M
+stop/US
+stopwatch/SM
+storage/SM
+store/ADSRG
+storefront/SM
+storehouse/MS
+storekeeper/M
+storekeep/ZR
+storeroom/SM
+store's
+stork/SM
+stormbound
+stormer/M
+Stormie/M
+stormily
+Stormi/M
+storminess/S
+Storm/M
+storm/SRDMGZ
+stormtroopers
+Stormy/M
+stormy/PTR
+storyboard/MDSG
+storybook/MS
+story/GSDM
+storyline
+storyteller/SM
+storytelling/MS
+Stouffer/M
+stoup/SM
+stouten/DG
+stouthearted
+Stout/M
+stoutness/MS
+stout/STYRNP
+stove/DSRGM
+stovepipe/SM
+stover/M
+stowage/SM
+stowaway/MS
+Stowe/M
+stow/GDS
+Strabo/M
+straddler/M
+straddle/ZDRSG
+Stradivari/SM
+Stradivarius/M
+strafe/GRSD
+strafer/M
+straggle/GDRSZ
+straggly/RT
+straightaway/S
+straightedge/MS
+straightener/M
+straighten/ZGDR
+straightforwardness/MS
+straightforward/SYP
+straightjacket's
+straightness/MS
+straight/RNDYSTXGP
+straightway/S
+strain/ASGZDR
+strained/UF
+strainer/MA
+straining/F
+strains/F
+straiten/DG
+straitjacket/GDMS
+straitlaced
+straitness/M
+strait/XTPSMGYDNR
+stranded/P
+strand/SDRG
+strangeness/SM
+strange/PYZTR
+stranger/GMD
+stranglehold/MS
+strangle/JDRSZG
+strangles/M
+strangulate/NGSDX
+strangulation/M
+strapless/S
+strapped/U
+strapping/S
+strap's
+strap/US
+Strasbourg/M
+stratagem/SM
+strata/MS
+strategical/Y
+strategic/S
+strategics/M
+strategist/SM
+strategy/SM
+Stratford/M
+strati
+stratification/M
+stratified/U
+stratify/NSDGX
+stratigraphic
+stratigraphical
+stratigraphy/M
+stratosphere/SM
+stratospheric
+stratospherically
+stratum/M
+stratus/M
+Strauss
+Stravinsky/M
+strawberry/SM
+strawflower/SM
+straw/SMDG
+strayer/M
+stray/GSRDM
+streak/DRMSGZ
+streaker/M
+streaky/TR
+streamed/U
+streamer/M
+stream/GZSMDR
+streaming/M
+streamline/SRDGM
+streetcar/MS
+streetlight/SM
+street/SMZ
+streetwalker/MS
+streetwise
+Streisand/M
+strengthen/AGDS
+strengthener/MS
+strength/NMX
+strengths
+strenuousness/SM
+strenuous/PY
+strep/MS
+streptococcal
+streptococci
+streptococcus/M
+streptomycin/SM
+stress/DSMG
+stressed/U
+stressful/YP
+stretchability/M
+stretchable/U
+stretch/BDRSZG
+stretcher/DMG
+stretchy/TRP
+strew/GDHS
+strewn
+striae
+stria/M
+striate/DSXGN
+striated/U
+striation/M
+stricken
+Strickland/M
+strict/AF
+stricter
+strictest
+strictly
+strictness/S
+stricture/SM
+stridden
+stridency/S
+strident/Y
+strider/M
+stride/RSGM
+strife/SM
+strikebreaker/M
+strikebreaking/M
+strikebreak/ZGR
+strikeout/S
+striker/M
+strike/RSGZJ
+striking/Y
+Strindberg/M
+stringed
+stringency/S
+stringent/Y
+stringer/MS
+stringiness/SM
+stringing/M
+string's
+string/SAG
+stringy/RTP
+striper/M
+stripe/SM
+strip/GRDMS
+stripling/M
+stripped/U
+stripper/MS
+stripping
+stripteaser/M
+striptease/SRDGZM
+stripy/RT
+strive/JRSG
+striven
+striver/M
+strobe/SDGM
+stroboscope/SM
+stroboscopic
+strode
+stroke/ZRSDGM
+stroking/M
+stroller/M
+stroll/GZSDR
+Stromberg/M
+Stromboli/M
+Strom/M
+strongbow
+strongbox/MS
+Strongheart/M
+stronghold/SM
+strongish
+Strong/M
+strongman/M
+strongmen
+strongroom/MS
+strong/YRT
+strontium/SM
+strophe/MS
+strophic
+stropped
+stropping
+strop/SM
+strove
+struck
+structuralism/M
+structuralist/SM
+structural/Y
+structured/AU
+structureless
+structures/A
+structure/SRDMG
+structuring/A
+strudel/MS
+struggle/GDRS
+struggler/M
+strummed
+strumming
+strumpet/GSDM
+strum/S
+strung/UA
+strut/S
+strutted
+strutter/M
+strutting
+strychnine/MS
+Stuart/MS
+stubbed/M
+stubbing
+Stubblefield/MS
+stubble/SM
+stubbly/RT
+stubbornness/SM
+stubborn/SGTYRDP
+stubby/SRT
+stub/MS
+stuccoes
+stucco/GDM
+stuck/U
+studbook/SM
+studded
+studding/SM
+Studebaker/M
+studentship/MS
+student/SM
+studiedness/M
+studied/PY
+studier/SM
+studio/MS
+studiousness/SM
+studious/PY
+stud/MS
+study/AGDS
+stuffily
+stuffiness/SM
+stuffing/M
+stuff/JGSRD
+stuffy/TRP
+stultify/NXGSD
+Stu/M
+stumble/GZDSR
+stumbling/Y
+stumpage/M
+stumper/M
+stump/RDMSG
+stumpy/RT
+stung
+stunk
+stunned
+stunner/M
+stunning/Y
+stun/S
+stunted/P
+stunt/GSDM
+stupefaction/SM
+stupefy/DSG
+stupendousness/M
+stupendous/PY
+stupidity/SM
+stupidness/M
+stupid/PTYRS
+stupor/MS
+sturdily
+sturdiness/SM
+sturdy/SRPT
+sturgeon/SM
+Sturm/M
+stutter/DRSZG
+Stuttgart/M
+Stuyvesant/M
+sty/DSGM
+Stygian
+styled/A
+style/GZMDSR
+styles/A
+styli
+styling/A
+stylishness/S
+stylish/PY
+stylistically
+stylistic/S
+stylist/MS
+stylites
+stylization/MS
+stylize/DSG
+stylos
+stylus/SM
+stymieing
+stymie/SD
+stymy's
+styptic/S
+styrene/MS
+Styrofoam/S
+Styx/M
+suable
+Suarez/M
+suasion/EMS
+suaveness/S
+suave/PRYT
+suavity/SM
+subaltern/SM
+subarctic/S
+subareas
+Subaru/M
+subassembly/M
+subatomic/S
+subbasement/SM
+subbed
+subbing
+subbranch/S
+subcaste/M
+subcategorizing
+subcategory/SM
+subchain
+subclassifications
+subclass/MS
+subclauses
+subcommand/S
+subcommittee/SM
+subcompact/S
+subcomponent/MS
+subcomputation/MS
+subconcept
+subconsciousness/SM
+subconscious/PSY
+subconstituent
+subcontinental
+subcontinent/MS
+subcontractor/SM
+subcontract/SMDG
+subcultural
+subculture/GMDS
+subcutaneous/Y
+subdirectory/S
+subdistrict/M
+subdivide/SRDG
+subdivision/SM
+subdued/Y
+subdue/GRSD
+subduer/M
+subexpression/MS
+subfamily/SM
+subfield/MS
+subfile/SM
+subfreezing
+subgoal/SM
+subgraph
+subgraphs
+subgroup/SGM
+subharmonic/S
+subheading/M
+subhead/MGJS
+subhuman/S
+subindex/M
+subinterval/MS
+subj
+subject/GVDMS
+subjection/SM
+subjectiveness/M
+subjective/PSY
+subjectivist/S
+subjectivity/SM
+subjoin/DSG
+subjugate/NGXSD
+subjugation/M
+subjunctive/S
+sublayer
+sublease/DSMG
+sublet/S
+subletting
+sublimate/GNSDX
+sublimation/M
+sublime/GRSDTYP
+sublimeness/M
+sublimer/M
+subliminal/Y
+sublimity/SM
+sublist/SM
+subliterary
+sublunary
+submachine
+submarginal
+submarine/MZGSRD
+submariner/M
+submerge/DSG
+submergence/SM
+submerse/XNGDS
+submersible/S
+submersion/M
+submicroscopic
+submission/SAM
+submissiveness/MS
+submissive/PY
+submit/SA
+submittable
+submittal
+submitted/A
+submitter/S
+submitting/A
+submode/S
+submodule/MS
+sub/MS
+subnational
+subnet/SM
+subnetwork/SM
+subnormal/SY
+suboptimal
+suborbital
+suborder/MS
+subordinately/I
+subordinates/I
+subordinate/YVNGXPSD
+subordination/IMS
+subordinator
+subornation/SM
+suborn/GSD
+subpage
+subparagraph/M
+subpart/MS
+subplot/MS
+subpoena/GSDM
+subpopulation/MS
+subproblem/SM
+subprocess/SM
+subprofessional/S
+subprogram/SM
+subproject
+subproof/SM
+subquestion/MS
+subrange/SM
+subregional/Y
+subregion/MS
+subrogation/M
+subroutine/SM
+subsample/MS
+subschema/MS
+subscribe/ASDG
+subscriber/SM
+subscripted/U
+subscription/MS
+subscript/SGD
+subsection/SM
+subsegment/SM
+subsentence
+subsequence/MS
+subsequent/SYP
+subservience/SM
+subservient/SY
+subset/MS
+subsidence/MS
+subside/SDG
+subsidiarity
+subsidiary/MS
+subsidization/MS
+subsidized/U
+subsidizer/M
+subsidize/ZRSDG
+subsidy/MS
+subsistence/MS
+subsistent
+subsist/SGD
+subsocietal
+subsoil/DRMSG
+subsonic
+subspace/MS
+subspecies/M
+substance/MS
+substandard
+substantially/IU
+substantialness/M
+substantial/PYS
+substantiated/U
+substantiate/VGNSDX
+substantiation/MFS
+substantiveness/M
+substantive/PSYM
+substantivity
+substation/MS
+substerilization
+substitutability
+substituted/U
+substitute/NGVBXDRS
+substitutionary
+substitution/M
+substitutive/Y
+substrata
+substrate/MS
+substratum/M
+substring/S
+substructure/SM
+subsume/SDG
+subsurface/S
+subsystem/MS
+subtable/S
+subtask/SM
+subteen/SM
+subtenancy/MS
+subtenant/SM
+subtend/DS
+subterfuge/SM
+subterranean/SY
+subtest
+subtext/SM
+subtitle/DSMG
+subtleness/M
+subtle/RPT
+subtlety/MS
+subtly/U
+subtopic/SM
+subtotal/GSDM
+subtracter/M
+subtraction/MS
+subtract/SRDZVG
+subtrahend/SM
+subtree/SM
+subtropical
+subtropic/S
+subtype/MS
+subunit/SM
+suburbanite/MS
+suburbanization/MS
+suburbanized
+suburbanizing
+suburban/S
+suburbia/SM
+suburb/MS
+subvention/MS
+subversion/SM
+subversiveness/MS
+subversive/SPY
+subverter/M
+subvert/SGDR
+subway/MDGS
+subzero
+succeeder/M
+succeed/GDRS
+successfulness/M
+successful/UY
+succession/SM
+successiveness/M
+successive/YP
+success/MSV
+successor/MS
+successorship
+succinctness/SM
+succinct/RYPT
+succored/U
+succorer/M
+succor/SGZRDM
+succotash/SM
+succubus/M
+succulence/SM
+succulency/MS
+succulent/S
+succumb/SDG
+such
+suchlike
+sucker/DMG
+suck/GZSDRB
+suckle/SDJG
+suckling/M
+Sucre/M
+sucrose/MS
+suction/SMGD
+Sudanese/M
+Sudanic/M
+Sudan/M
+suddenness/SM
+sudden/YPS
+Sudetenland/M
+sud/S
+suds/DSRG
+sudsy/TR
+sued/DG
+suede/SM
+Suellen/M
+Sue/M
+suer/M
+suet/MS
+Suetonius/M
+suety
+sue/ZGDRS
+Suez/M
+sufferance/SM
+sufferer/M
+suffering/M
+suffer/SJRDGZ
+suffice/GRSD
+sufficiency/SIM
+sufficient/IY
+suffixation/S
+suffixed/U
+suffix/GMRSD
+suffocate/XSDVGN
+suffocating/Y
+Suffolk/M
+suffragan/S
+suffrage/MS
+suffragette/MS
+suffragist/SM
+suffuse/VNGSDX
+suffusion/M
+Sufi/M
+Sufism/M
+sugarcane/S
+sugarcoat/GDS
+sugarless
+sugarplum/MS
+sugar/SJGMD
+sugary/TR
+suggest/DRZGVS
+suggester/M
+suggestibility/SM
+suggestible
+suggestion/MS
+suggestiveness/MS
+suggestive/PY
+sugillate
+Suharto/M
+suicidal/Y
+suicide/GSDM
+Sui/M
+suitability/SU
+suitableness/S
+suitable/P
+suitably/U
+suitcase/MS
+suited/U
+suite/SM
+suiting/M
+suit/MDGZBJS
+suitor/SM
+Sukarno/M
+Sukey/M
+Suki/M
+sukiyaki/SM
+Sukkoth's
+Sukkot/S
+Sula/M
+Sulawesi/M
+Suleiman/M
+sulfaquinoxaline
+sulfa/S
+sulfate/MSDG
+sulfide/S
+sulfite/M
+sulfonamide/SM
+sulfur/DMSG
+sulfuric
+sulfurousness/M
+sulfurous/YP
+sulk/GDS
+sulkily
+sulkiness/S
+sulky/RSPT
+Sulla/M
+sullenness/MS
+sullen/TYRP
+sullied/U
+Sullivan/M
+sully/GSD
+Sully/M
+sulphate/SM
+sulphide/MS
+sulphuric
+sultana/SM
+sultanate/MS
+sultan/SM
+sultrily
+sultriness/SM
+sultry/PRT
+Sulzberger/M
+sumach's
+sumac/SM
+Sumatra/M
+Sumatran/S
+sumer/F
+Sumeria/M
+Sumerian/M
+summability/M
+summable
+summand/MS
+summarily
+summarization/MS
+summarized/U
+summarize/GSRDZ
+summarizer/M
+summary/MS
+summation/FMS
+summed
+Summerdale/M
+summerhouse/MS
+summer/SGDM
+Summer/SM
+summertime/MS
+summery/TR
+summing
+summit/GMDS
+summitry/MS
+summoner/M
+summon/JSRDGZ
+summons/MSDG
+sum/MRS
+Sumner/M
+sumo/SM
+sump/SM
+sumptuousness/SM
+sumptuous/PY
+Sumter/M
+Sun
+sunbaked
+sunbathe
+sunbather/M
+sunbathing/M
+sunbaths
+sunbath/ZRSDG
+sunbeam/MS
+Sunbelt/M
+sunblock/S
+sunbonnet/MS
+sunburn/GSMD
+sunburst/MS
+suncream
+sundae/MS
+Sundanese/M
+Sundas
+Sunday/MS
+sunder/SDG
+sundial/MS
+sundowner/M
+sundown/MRDSZG
+sundris
+sundry/S
+sunfish/SM
+sunflower/MS
+sunglass/MS
+Sung/M
+sung/U
+sunk/SN
+sunlamp/S
+sunless
+sunlight/MS
+sunlit
+sun/MS
+sunned
+Sunni/MS
+sunniness/SM
+sunning
+Sunnite/SM
+Sunny/M
+sunny/RSTP
+Sunnyvale/M
+sunrise/GMS
+sunroof/S
+sunscreen/S
+sunset/MS
+sunsetting
+sunshade/MS
+Sunshine/M
+sunshine/MS
+sunshiny
+sunspot/SM
+sunstroke/MS
+suntanned
+suntanning
+suntan/SM
+sunup/MS
+superabundance/MS
+superabundant
+superannuate/GNXSD
+superannuation/M
+superbness/M
+superb/YRPT
+supercargoes
+supercargo/M
+supercharger/M
+supercharge/SRDZG
+superciliousness/SM
+supercilious/PY
+supercity/S
+superclass/M
+supercomputer/MS
+supercomputing
+superconcept
+superconducting
+superconductivity/SM
+superconductor/SM
+supercooled
+supercooling
+supercritical
+superdense
+super/DG
+superego/SM
+supererogation/MS
+supererogatory
+superficiality/S
+superficial/SPY
+superfine
+superfix/M
+superfluity/MS
+superfluousness/S
+superfluous/YP
+superheat/D
+superheroes
+superhero/SM
+superhighway/MS
+superhumanness/M
+superhuman/YP
+superimpose/SDG
+superimposition/MS
+superintendence/S
+superintendency/SM
+superintendent/SM
+superintend/GSD
+superiority/MS
+Superior/M
+superior/SMY
+superlativeness/M
+superlative/PYS
+superlunary
+supermachine
+superman/M
+Superman/M
+supermarket/SM
+supermen
+supermodel
+supermom/S
+supernal
+supernatant
+supernaturalism/M
+supernaturalness/M
+supernatural/SPY
+supernormal/Y
+supernovae
+supernova/MS
+supernumerary/S
+superordinate
+superpose/BSDG
+superposition/MS
+superpower/MS
+superpredicate
+supersaturate/XNGDS
+supersaturation/M
+superscribe/GSD
+superscript/DGS
+superscription/SM
+superseder/M
+supersede/SRDG
+supersensitiveness/M
+supersensitive/P
+superset/MS
+supersonically
+supersonic/S
+supersonics/M
+superstar/SM
+superstition/SM
+superstitious/YP
+superstore/S
+superstructural
+superstructure/SM
+supertanker/SM
+supertitle/MSDG
+superuser/MS
+supervene/GSD
+supervention/S
+supervised/U
+supervise/SDGNX
+supervision/M
+supervisor/SM
+supervisory
+superwoman/M
+superwomen
+supineness/M
+supine/PSY
+supper/DMG
+supplanter/M
+supplant/SGRD
+supplemental/S
+supplementary/S
+supplementation/S
+supplementer/M
+supplement/SMDRG
+suppleness/SM
+supple/SPLY
+suppliant/S
+supplicant/MS
+supplicate/NGXSD
+supplication/M
+supplier/AM
+suppl/RDGT
+supply/MAZGSRD
+supportability/M
+supportable/UI
+supported/U
+supporter/M
+supporting/Y
+supportive/Y
+support/ZGVSBDR
+supposed/Y
+suppose/SRDBJG
+supposition/MS
+suppository/MS
+suppressant/S
+suppressed/U
+suppressible/I
+suppression/SM
+suppressive/P
+suppressor/S
+suppress/VGSD
+suppurate/NGXSD
+suppuration/M
+supp/YDRGZ
+supra
+supranational
+supranationalism/M
+suprasegmental
+supremacist/SM
+supremacy/SM
+supremal
+supremeness/M
+supreme/PSRTY
+supremo/M
+sup/RSZ
+supt
+Supt/M
+Surabaya/M
+Surat/M
+surcease/DSMG
+surcharge/MGSD
+surcingle/MGSD
+surd/M
+sured/I
+surefire
+surefooted
+surely
+sureness/MS
+sureness's/U
+sure/PU
+surer/I
+surest
+surety/SM
+surfaced/UA
+surface/GSRDPZM
+surfacer/AMS
+surfaces/A
+surfacing/A
+surfactant/SM
+surfboard/MDSG
+surfeit/SDRMG
+surfer/M
+surfing/M
+surf/SJDRGMZ
+surged/A
+surge/GYMDS
+surgeon/MS
+surgery/MS
+surges/A
+surgical/Y
+Suriname
+Surinamese
+Surinam's
+surliness/SM
+surly/TPR
+surmiser/M
+surmise/SRDG
+surmountable/IU
+surmount/DBSG
+surname/GSDM
+surpassed/U
+surpass/GDS
+surpassing/Y
+surplice/SM
+surplus/MS
+surplussed
+surplussing
+surprised/U
+surprise/MGDRSJ
+surpriser/M
+surprising/YU
+surrealism/MS
+surrealistic
+surrealistically
+surrealist/S
+surreality
+surreal/S
+surrender/DRSG
+surrenderer/M
+surreptitiousness/S
+surreptitious/PY
+surrey/SM
+surrogacy/S
+surrogate/SDMNG
+surrogation/M
+surrounding/M
+surround/JGSD
+surtax/SDGM
+surveillance/SM
+surveillant
+surveyed/A
+surveying/M
+survey/JDSG
+surveyor/MS
+surveys/A
+survivability/M
+survivable/U
+survivalist/S
+survival/MS
+survive/SRDBG
+survivor/MS
+survivorship/M
+Surya/M
+Sus
+Susana/M
+Susanetta/M
+Susan/M
+Susannah/M
+Susanna/M
+Susanne/M
+Susann/M
+susceptibilities
+susceptibility/IM
+susceptible/I
+Susette/M
+sushi/SM
+Susie/M
+Susi/M
+suspected/U
+suspecter/M
+suspect/GSDR
+suspecting/U
+suspend/DRZGS
+suspended/UA
+suspender/M
+suspenseful
+suspense/MXNVS
+suspension/AM
+suspensive/Y
+suspensor/M
+suspicion/GSMD
+suspiciousness/M
+suspicious/YP
+Susquehanna/M
+Sussex/M
+sustainability
+sustainable/U
+sustain/DRGLBS
+sustainer/M
+sustainment/M
+sustenance/MS
+Susy/M
+Sutherland/M
+Sutherlan/M
+sutler/MS
+Sutton/M
+suture/GMSD
+SUV
+Suva/M
+Suwanee/M
+Suzanna/M
+Suzanne/M
+Suzann/M
+suzerain/SM
+suzerainty/MS
+Suzette/M
+Suzhou/M
+Suzie/M
+Suzi/M
+Suzuki/M
+Suzy/M
+Svalbard/M
+svelte/RPTY
+Svend/M
+Svengali
+Sven/M
+Sverdlovsk/M
+Svetlana/M
+SW
+swabbed
+swabbing
+swabby/S
+Swabian/SM
+swab/MS
+swaddle/SDG
+swagged
+swagger/GSDR
+swagging
+swag/GMS
+Swahili/MS
+swain/SM
+SWAK
+swallower/M
+swallow/GDRS
+swallowtail/SM
+swam
+swami/SM
+swamper/M
+swampland/MS
+swamp/SRDMG
+swampy/RPT
+Swanee/M
+swankily
+swankiness/MS
+swank/RDSGT
+swanky/PTRS
+swanlike
+swan/MS
+swanned
+swanning
+Swansea/M
+Swanson/M
+swappable/U
+swapped
+swapper/SM
+swapping
+swap/S
+sward/MSGD
+swarmer/M
+swarm/GSRDM
+swarthiness/M
+Swarthmore/M
+swarthy/RTP
+swart/P
+Swartz/M
+swashbuckler/SM
+swashbuckling/S
+swash/GSRD
+swastika/SM
+SWAT
+swatch/MS
+swathe
+swather/M
+swaths
+swath/SRDMGJ
+swat/S
+swatted
+swatter/MDSG
+swatting
+swayback/SD
+sway/DRGS
+swayer/M
+Swaziland/M
+Swazi/SM
+swearer/M
+swear/SGZR
+swearword/SM
+sweatband/MS
+sweater/M
+sweatily
+sweatiness/M
+sweatpants
+sweat/SGZRM
+sweatshirt/S
+sweatshop/MS
+sweaty/TRP
+Swedenborg/M
+Sweden/M
+swede/SM
+Swede/SM
+Swedish
+Swed/MN
+Sweeney/SM
+sweeper/M
+sweepingness/M
+sweeping/PY
+sweep/SBRJGZ
+sweeps/M
+sweepstakes
+sweepstake's
+sweetbread/SM
+sweetbrier/SM
+sweetcorn
+sweetened/U
+sweetener/M
+sweetening/M
+sweeten/ZDRGJ
+sweetheart/MS
+sweetie/MS
+sweeting/M
+sweetish/Y
+Sweet/M
+sweetmeat/MS
+sweetness/MS
+sweetshop
+sweet/TXSYRNPG
+swellhead/DS
+swelling/M
+swell/SJRDGT
+swelter/DJGS
+sweltering/Y
+Swen/M
+Swenson/M
+swept
+sweptback
+swerve/GSD
+swerving/U
+swifter/M
+swift/GTYRDPS
+Swift/M
+swiftness/MS
+swigged
+swigging
+swig/SM
+swill/SDG
+swimmer/MS
+swimming/MYS
+swim/S
+swimsuit/MS
+Swinburne/M
+swindle/GZRSD
+swindler/M
+swineherd/MS
+swine/SM
+swingeing
+swinger/M
+swinging/Y
+swing/SGRZJB
+swingy/R
+swinishness/M
+swinish/PY
+Swink/M
+swipe/DSG
+swirling/Y
+swirl/SGRD
+swirly/TR
+swish/GSRD
+swishy/R
+swiss
+Swiss/S
+switchback/GDMS
+switchblade/SM
+switchboard/MS
+switcher/M
+switch/GBZMRSDJ
+switchgear
+switchman/M
+switchmen/M
+switchover/M
+Switzerland/M
+Switzer/M
+Switz/MR
+swivel/GMDS
+swizzle/RDGM
+swob's
+swollen
+swoon/GSRD
+swooning/Y
+swoop/RDSG
+swoosh/GSD
+swop's
+sword/DMSG
+swordfish/SM
+swordplayer/M
+swordplay/RMS
+swordsman/M
+swordsmanship/SM
+swordsmen
+swordtail/M
+swore
+sworn
+swot/S
+swum
+swung
+s/XJBG
+sybarite/MS
+sybaritic
+Sybila/M
+Sybilla/M
+Sybille/M
+Sybil/M
+Sybyl/M
+sycamore/SM
+sycophancy/S
+sycophantic
+sycophantically
+sycophant/SYM
+Sydelle/M
+Sydel/M
+Syd/M
+Sydney/M
+Sykes/M
+Sylas/M
+syllabicate/GNDSX
+syllabication/M
+syllabicity
+syllabic/S
+syllabification/M
+syllabify/GSDXN
+syllabi's
+syllable/SDMG
+syllabub/M
+syllabus/MS
+syllabusss
+syllogism/MS
+syllogistic
+Sylow/M
+sylphic
+sylphlike
+sylph/M
+sylphs
+Sylvania/M
+Sylvan/M
+sylvan/S
+Sylvester/M
+Sylvia/M
+Sylvie/M
+Syman/M
+symbiont/M
+symbioses
+symbiosis/M
+symbiotic
+symbol/GMDS
+symbolical/Y
+symbolics/M
+symbolic/SM
+symbolism/MS
+symbolist/MS
+symbolization/MAS
+symbolized/U
+symbolize/GZRSD
+symbolizes/A
+Symington/M
+symmetric
+symmetrically/U
+symmetricalness/M
+symmetrical/PY
+symmetrization/M
+symmetrizing
+symmetry/MS
+Symon/M
+sympathetically/U
+sympathetic/S
+sympathized/U
+sympathizer/M
+sympathize/SRDJGZ
+sympathizing/MYUS
+sympathy/MS
+symphonic
+symphonists
+symphony/MS
+symposium/MS
+symptomatic
+symptomatically
+symptomatology/M
+symptom/MS
+syn
+synagogal
+synagogue/SM
+synapse/SDGM
+synaptic
+synchronism/M
+synchronization's
+synchronization/SA
+synchronize/AGCDS
+synchronized/U
+synchronizer/MS
+synchronousness/M
+synchronous/YP
+synchrony
+synchrotron/M
+syncopate/VNGXSD
+syncopation/M
+syncope/MS
+sync/SGD
+syndicalist
+syndicate/XSDGNM
+syndic/SM
+syndrome/SM
+synergism/SM
+synergistic
+synergy/MS
+synfuel/S
+Synge/M
+synod/SM
+synonymic
+synonymous/Y
+synonym/SM
+synonymy/MS
+synopses
+synopsis/M
+synopsized
+synopsizes
+synopsizing
+synoptic/S
+syntactical/Y
+syntactics/M
+syntactic/SY
+syntax/MS
+syntheses
+synthesis/M
+synthesized/U
+synthesize/GZSRD
+synthesizer/M
+synthesizes/A
+synthetically
+synthetic/S
+syphilis/MS
+syphilitic/S
+syphilized
+syphilizing
+Syracuse/M
+Syriac/M
+Syria/M
+Syrian/SM
+syringe/GMSD
+syrup/DMSG
+syrupy
+sys
+systematical/Y
+systematics/M
+systematic/SP
+systematization/SM
+systematized/U
+systematizer/M
+systematize/ZDRSG
+systematizing/U
+systemically
+systemic/S
+systemization/SM
+system/MS
+systole/MS
+systolic
+Szilard/M
+Szymborska/M
+TA
+Tabasco/MS
+Tabatha/M
+Tabbatha/M
+tabbed
+Tabbie/M
+Tabbi/M
+tabbing
+Tabbitha/M
+Tabb/M
+tabbouleh
+tabboulehs
+tabby/GSD
+Tabby/M
+Taber/M
+Tabernacle/S
+tabernacle/SDGM
+Tabina/M
+Tabitha/M
+tabla/MS
+tableau/M
+tableaux
+tablecloth/M
+tablecloths
+table/GMSD
+tableland/SM
+tablespoonful/MS
+tablespoon/SM
+tablet/MDGS
+tabletop/MS
+tableware/SM
+tabling/M
+tabloid/MS
+Tab/MR
+taboo/GSMD
+Tabor/M
+tabor/MDGS
+Tabriz/SM
+tab/SM
+tabula
+tabular/Y
+tabulate/XNGDS
+tabulation/M
+tabulator/MS
+tachometer/SM
+tachometry
+tachycardia/MS
+tachyon/SM
+tacitness/MS
+taciturnity/MS
+taciturn/Y
+Tacitus/M
+tacit/YP
+tacker/M
+tack/GZRDMS
+tackiness/MS
+tackler/M
+tackle/RSDMZG
+tackling/M
+tacky/RSTP
+Tacoma/M
+taco/MS
+tact/FSM
+tactfulness/S
+tactful/YP
+tactical/Y
+tactician/MS
+tactic/SM
+tactile/Y
+tactility/S
+tactlessness/SM
+tactless/PY
+tactual/Y
+Taddeo/M
+Taddeusz/M
+Tadd/M
+Tadeas/M
+Tadeo/M
+Tades
+Tadio/M
+Tad/M
+tadpole/MS
+tad/SM
+Tadzhikistan's
+Tadzhikstan/M
+Taegu/M
+Taejon/M
+taffeta/MS
+taffrail/SM
+Taffy/M
+taffy/SM
+Taft/M
+Tagalog/SM
+tagged/U
+tagger/S
+tagging
+Tagore/M
+tag/SM
+Tagus/M
+Tahitian/S
+Tahiti/M
+Tahoe/M
+Taichung/M
+taiga/MS
+tailback/MS
+tail/CMRDGAS
+tailcoat/S
+tailer/AM
+tailgate/MGRSD
+tailgater/M
+tailing/MS
+taillessness/M
+tailless/P
+taillight/MS
+tailor/DMJSGB
+Tailor/M
+tailpipe/SM
+tailspin/MS
+tailwind/SM
+Tainan/M
+Taine/M
+taint/DGS
+tainted/U
+Taipei/M
+Taite/M
+Tait/M
+Taiwanese
+Taiwan/M
+Taiyuan/M
+Tajikistan
+takeaway/S
+taken/A
+takeoff/SM
+takeout/S
+takeover/SM
+taker/M
+take/RSHZGJ
+takes/IA
+taking/IA
+Taklamakan/M
+Talbert/M
+Talbot/M
+talcked
+talcking
+talc/SM
+talcum/S
+talebearer/SM
+talented/M
+talentless
+talent/SMD
+taler/M
+tale/RSMN
+tali
+Talia/M
+Taliesin/M
+talion/M
+talismanic
+talisman/SM
+talkativeness/MS
+talkative/YP
+talker/M
+talk/GZSRD
+talkie/M
+talky/RST
+Talladega/M
+Tallahassee/M
+Tallahatchie/M
+Tallahoosa/M
+tallboy/MS
+Tallchief/M
+Talley/M
+Talleyrand/M
+Tallia/M
+Tallie/M
+Tallinn/M
+tallish
+tallness/MS
+Tallou/M
+tallow/DMSG
+tallowy
+tall/TPR
+Tallulah/M
+tally/GRSDZ
+tallyho/DMSG
+Tally/M
+Talmudic
+Talmudist/MS
+Talmud/MS
+talon/SMD
+talus/MS
+Talyah/M
+Talya/M
+Ta/M
+tamable/M
+tamale/SM
+tamarack/SM
+Tamarah/M
+Tamara/M
+tamarind/MS
+Tamar/M
+Tamarra/M
+Tamas
+tambourine/MS
+tamed/U
+Tameka/M
+tameness/S
+Tamera/M
+Tamerlane/M
+tame/SYP
+Tamika/M
+Tamiko/M
+Tamil/MS
+Tami/M
+Tam/M
+Tamma/M
+Tammany/M
+Tammara/M
+tam/MDRSTZGB
+Tammie/M
+Tammi/M
+Tammy/M
+Tampa/M
+Tampax/M
+tampered/U
+tamperer/M
+tamper/ZGRD
+tampon/DMSG
+tamp/SGZRD
+Tamqrah/M
+Tamra/M
+tanager/MS
+Tanaka/M
+Tana/M
+Tananarive/M
+tanbark/SM
+Tancred/M
+tandem/SM
+Tandie/M
+Tandi/M
+tandoori/S
+Tandy/M
+Taney/M
+T'ang
+Tanganyika/M
+tangelo/SM
+tangency/M
+tangential/Y
+tangent/SM
+tangerine/MS
+tang/GSYDM
+tangibility/MIS
+tangible/IPS
+tangibleness's/I
+tangibleness/SM
+tangibly/I
+Tangier/M
+tangle's
+tangle/UDSG
+tango/MDSG
+Tangshan/M
+tangy/RST
+Tanhya/M
+Tania/M
+Tani/M
+Tanisha/M
+Tanitansy/M
+tankard/MS
+tanker/M
+tankful/MS
+tank/GZSRDM
+Tan/M
+tan/MS
+tanned/U
+Tannenbaum/M
+Tanner/M
+tanner/SM
+tannery/MS
+tannest
+Tanney/M
+Tannhäuser/M
+Tannie/M
+tanning/SM
+tannin/SM
+Tann/RM
+Tanny/M
+Tansy/M
+tansy/SM
+tantalization/SM
+tantalized/U
+tantalize/GZSRD
+tantalizingly/S
+tantalizingness/S
+tantalizing/YP
+tantalum/MS
+Tantalus/M
+tantamount
+tantra/S
+tantrum/SM
+Tanya/M
+Tanzania/M
+Tanzanian/S
+taoism
+Taoism/MS
+Taoist/MS
+taoist/S
+Tao/M
+tao/S
+Tapdance/M
+taped/U
+tapeline/S
+taperer/M
+taper/GRD
+tape/SM
+tapestry/GMSD
+tapeworm/MS
+tapioca/MS
+tapir/MS
+tap/MSDRJZG
+tapped/U
+tapper/MS
+tappet/MS
+tapping/M
+taproom/MS
+taproot/SM
+taps/M
+Tarah/M
+Tara/M
+tarantella/MS
+tarantula/MS
+Tarawa/M
+Tarazed/M
+Tarbell/M
+tardily
+tardiness/S
+tardy/TPRS
+tare/MS
+target/GSMD
+tar/GSMD
+tariff/DMSG
+Tarim/M
+Tarkington/M
+tarmacked
+tarmacking
+tarmac/S
+tarnished/U
+tarnish/GDS
+tarn/MS
+taro/MS
+tarot/MS
+tarpapered
+tarpaulin/MS
+tarp/MS
+tarpon/MS
+tarragon/SM
+Tarrah/M
+Tarra/M
+Tarrance/M
+tarred/M
+tarring/M
+tarry/TGRSD
+Tarrytown/M
+tarsal/S
+tarsi
+tarsus/M
+tartan/MS
+tartaric
+Tartar's
+tartar/SM
+Tartary/M
+tartness/MS
+tart/PMYRDGTS
+Tartuffe/M
+Taryn/M
+Tarzan/M
+Tasha/M
+Tashkent/M
+Tasia/M
+task/GSDM
+taskmaster/SM
+taskmistress/MS
+Tasmania/M
+Tasmanian/S
+tassellings
+tassel/MDGS
+Tass/M
+tasted/EU
+tastefulness/SME
+tasteful/PEY
+taste/GZMJSRD
+tastelessness/SM
+tasteless/YP
+taster/M
+taste's/E
+tastes/E
+tastily
+tastiness/MS
+tasting/E
+tasty/RTP
+tatami/MS
+Tatar/SM
+Tate/M
+tater/M
+Tatiana/M
+Tatiania/M
+tat/SRZ
+tatted
+tatterdemalion/SM
+tattered/M
+tatter/GDS
+tatting/SM
+tattler/M
+tattle/RSDZG
+tattletale/SM
+tattooer/M
+tattooist/MS
+tattoo/ZRDMGS
+tatty/R
+Tatum/M
+taught/AU
+taunter/M
+taunting/Y
+taunt/ZGRDS
+taupe/SM
+Taurus/SM
+tau/SM
+tauten/GD
+tautness/S
+tautological/Y
+tautologous
+tautology/SM
+taut/PGTXYRDNS
+taverner/M
+tavern/RMS
+tawdrily
+tawdriness/SM
+tawdry/SRTP
+Tawney/M
+Tawnya/M
+tawny/RSMPT
+Tawsha/M
+taxable/S
+taxably
+taxation/MS
+taxed/U
+taxicab/MS
+taxidermist/SM
+taxidermy/MS
+taxi/MDGS
+taximeter/SM
+taxing/Y
+taxiway/MS
+taxonomic
+taxonomically
+taxonomist/SM
+taxonomy/SM
+taxpayer/MS
+taxpaying/M
+tax/ZGJMDRSB
+Taylor/SM
+Tb
+TB
+TBA
+Tbilisi/M
+tbs
+tbsp
+Tchaikovsky/M
+Tc/M
+TCP
+TD
+TDD
+Te
+teabag/S
+teacake/MS
+teacart/M
+teachable/P
+teach/AGS
+teacher/MS
+teaching/SM
+teacloth
+teacupful/MS
+teacup/MS
+Teador/M
+teahouse/SM
+teakettle/SM
+teak/SM
+teakwood/M
+tealeaves
+teal/MS
+tea/MDGS
+teammate/MS
+team/MRDGS
+teamster/MS
+teamwork/SM
+teapot/MS
+tearaway
+teardrop/MS
+tearer/M
+tearfulness/M
+tearful/YP
+teargas/S
+teargassed
+teargassing
+tearjerker/S
+tearoom/MS
+tear/RDMSG
+teary/RT
+Teasdale/M
+tease/KS
+teasel/DGSM
+teaser/M
+teashop/SM
+teasing/Y
+teaspoonful/MS
+teaspoon/MS
+teas/SRDGZ
+teatime/MS
+teat/MDS
+tech/D
+technetium/SM
+technicality/MS
+technicalness/M
+technical/YSP
+technician/MS
+Technicolor/MS
+Technion/M
+technique/SM
+technocracy/MS
+technocratic
+technocrat/S
+technological/Y
+technologist/MS
+technology/MS
+technophobia
+technophobic
+techs
+tectonically
+tectonic/S
+tectonics/M
+Tecumseh/M
+Tedda/M
+Teddie/M
+Teddi/M
+Tedd/M
+Teddy/M
+teddy/SM
+Tedie/M
+Tedi/M
+tediousness/SM
+tedious/YP
+tedium/MS
+Ted/M
+Tedman/M
+Tedmund/M
+Tedra/M
+tee/DRSMH
+teeing
+teem/GSD
+teemingness/M
+teeming/PY
+teenager/M
+teenage/RZ
+Teena/M
+teen/SR
+teenybopper/SM
+teeny/RT
+teepee's
+teeshirt/S
+teeter/GDS
+teethe
+teether/M
+teething/M
+teethmarks
+teeth/RSDJMG
+teetotaler/M
+teetotalism/MS
+teetotal/SRDGZ
+TEFL
+Teflon/MS
+Tegucigalpa/M
+Teheran's
+Tehran
+TEirtza/M
+tektite/SM
+Tektronix/M
+telecast/SRGZ
+telecommunicate/NX
+telecommunication/M
+telecommute/SRDZGJ
+telecoms
+teleconference/GMJSD
+Teledyne/M
+Telefunken/M
+telegenic
+telegrammed
+telegramming
+telegram/MS
+telegraphic
+telegraphically
+telegraphist/MS
+telegraph/MRDGZ
+telegraphs
+telegraphy/MS
+telekineses
+telekinesis/M
+telekinetic
+Telemachus/M
+Telemann/M
+telemarketer/S
+telemarketing/S
+telemeter/DMSG
+telemetric
+telemetry/MS
+teleological/Y
+teleology/M
+telepathic
+telepathically
+telepathy/SM
+telephone/SRDGMZ
+telephonic
+telephonist/SM
+telephony/MS
+telephotography/MS
+telephoto/S
+teleprinter/MS
+teleprocessing/S
+teleprompter
+TelePrompter/M
+TelePrompTer/S
+telescope/GSDM
+telescopic
+telescopically
+teletext/S
+telethon/MS
+teletype/SM
+Teletype/SM
+teletypewriter/SM
+televangelism/S
+televangelist/S
+televise/SDXNG
+television/M
+televisor/MS
+televisual
+telex/GSDM
+Telex/M
+tell/AGS
+Teller/M
+teller/SDMG
+telling/YS
+Tell/MR
+telltale/MS
+tellurium/SM
+telly/SM
+Telnet/M
+TELNET/M
+telnet/S
+telomeric
+tel/SY
+Telugu/M
+temblor/SM
+temerity/MS
+Tempe/M
+temperamental/Y
+temperament/SM
+temperance/IMS
+tempera/SLM
+temperately/I
+temperateness's/I
+temperateness/SM
+temperate/SDGPY
+temperature/MS
+tempered/UE
+temper/GRDM
+tempering/E
+temper's/E
+tempers/E
+tempest/DMSG
+tempestuousness/SM
+tempestuous/PY
+template/FS
+template's
+Temple/M
+Templeman/M
+temple/SDM
+Templeton/M
+Temp/M
+tempoes
+tempo/MS
+temporal/YS
+temporarily
+temporarinesses
+temporariness/FM
+temporary/SFP
+temporize/GJZRSD
+temporizer/M
+temporizings/U
+temporizing/YM
+temp/SGZTMRD
+temptation/MS
+tempted
+tempter/S
+tempt/FS
+tempting/YS
+temptress/MS
+tempura/SM
+tenabilities
+tenability/UM
+tenableness/M
+tenable/P
+tenably
+tenaciousness/S
+tenacious/YP
+tenacity/S
+tenancy/MS
+tenanted/U
+tenant/MDSG
+tenantry/MS
+tench/M
+tended/UE
+tendency/MS
+tendentiousness/SM
+tendentious/PY
+tendered
+tenderer
+tenderest
+tenderfoot/MS
+tender/FS
+tenderheartedness/MS
+tenderhearted/YP
+tendering
+tenderizer/M
+tenderize/SRDGZ
+tenderloin/SM
+tenderly
+tenderness/SM
+tending/E
+tendinitis/S
+tend/ISFRDG
+tendon/MS
+tendril/SM
+tends/E
+tenebrous
+tenement/MS
+tenet/SM
+Tenex/M
+TENEX/M
+tenfold/S
+ten/MHB
+Tenneco/M
+tenner
+Tennessean/S
+Tennessee/M
+Tenney/M
+tennis/SM
+Tenn/M
+Tennyson/M
+Tenochtitlan/M
+tenon/GSMD
+tenor/MS
+tenpin/SM
+tense/IPYTNVR
+tenseness's/I
+tenseness/SM
+tensile
+tensional/I
+tension/GMRDS
+tensionless
+tensions/E
+tension's/I
+tensity/IMS
+tensorial
+tensor/MS
+tenspot
+tens/SRDVGT
+tentacle/MSD
+tentativeness/S
+tentative/SPY
+tented/UF
+tenterhook/MS
+tenter/M
+tent/FSIM
+tenths
+tenth/SY
+tenting/F
+tenuity/S
+tenuousness/SM
+tenuous/YP
+tenure/SDM
+Teodoor/M
+Teodora/M
+Teodorico/M
+Teodor/M
+Teodoro/M
+tepee/MS
+tepidity/S
+tepidness/S
+tepid/YP
+tequila/SM
+Tera/M
+teratogenic
+teratology/MS
+terbium/SM
+tercel/M
+tercentenary/S
+tercentennial/S
+Terence/M
+Terencio/M
+Teresa/M
+Terese/M
+Tereshkova/M
+Teresina/M
+Teresita/M
+Teressa/M
+Teriann/M
+Teri/M
+Terkel/M
+termagant/SM
+termcap
+termer/M
+terminable/CPI
+terminableness/IMC
+terminal/SYM
+terminate/CXNV
+terminated/U
+terminates
+terminating
+termination/MC
+terminative/YC
+terminator/SM
+termini
+terminological/Y
+terminology/MS
+terminus/M
+termite/SM
+term/MYRDGS
+ternary/S
+tern/GIDS
+tern's
+terpsichorean
+Terpsichore/M
+terrace/MGSD
+terracing/M
+terracotta
+terrain/MS
+Terra/M
+terramycin
+Terrance/M
+Terran/M
+terrapin/MS
+terrarium/MS
+terrazzo/SM
+Terrell/M
+Terrel/M
+Terre/M
+Terrence/M
+terrestrial/YMS
+terribleness/SM
+terrible/P
+terribly
+Terrie/M
+terrier/M
+terrifically
+terrific/Y
+terrify/GDS
+terrifying/Y
+Terrijo/M
+Terrill/M
+Terri/M
+terrine/M
+territoriality/M
+Territorial/SM
+territorial/SY
+Territory's
+territory/SM
+terrorism/MS
+terroristic
+terrorist/MS
+terrorized/U
+terrorizer/M
+terrorize/RSDZG
+terror/MS
+terr/S
+terrycloth
+Terrye/M
+Terry/M
+terry/ZMRS
+terseness/SM
+terse/RTYP
+Tersina/M
+tertian
+Tertiary
+tertiary/S
+Terza/M
+TESL
+Tesla/M
+TESOL
+Tessa/M
+tessellate/XDSNG
+tessellation/M
+tesseral
+Tessie/M
+Tessi/M
+Tess/M
+Tessy/M
+testability/M
+testable/U
+testamentary
+testament/SM
+testate/IS
+testator/MS
+testatrices
+testatrix
+testbed/S
+testcard
+tested/AKU
+tester/MFCKS
+testes/M
+testicle/SM
+testicular
+testifier/M
+testify/GZDRS
+testily
+testimonial/SM
+testimony/SM
+testiness/S
+testing/S
+testis/M
+testosterone/SM
+test/RDBFZGSC
+tests/AK
+test's/AKF
+testy/RTP
+tetanus/MS
+tetchy/TR
+tether/DMSG
+tethered/U
+Tethys/M
+Tetons
+tetrachloride/M
+tetracycline/SM
+tetrafluoride
+tetragonal/Y
+tetrahalides
+tetrahedral/Y
+tetrahedron/SM
+tetrameron
+tetrameter/SM
+tetra/MS
+tetrasodium
+tetravalent
+Teutonic
+Teuton/SM
+Texaco/M
+Texan/S
+Texas/MS
+Tex/M
+TeX/M
+textbook/SM
+text/FSM
+textile/SM
+Textron/M
+textual/FY
+textural/Y
+textured/U
+texture/MGSD
+T/G
+Thacher/M
+Thackeray/M
+Thaddeus/M
+Thaddus/M
+Thadeus/M
+Thad/M
+Thailand/M
+Thaine/M
+Thain/M
+Thai/S
+thalami
+thalamus/M
+Thales/M
+Thalia/M
+thalidomide/MS
+thallium/SM
+thallophyte/M
+Thames
+than
+Thane/M
+thane/SM
+Thanh/M
+thanker/M
+thankfuller
+thankfullest
+thankfulness/SM
+thankful/YP
+thanklessness/SM
+thankless/PY
+thanksgiving/MS
+Thanksgiving/S
+thank/SRDG
+Thant/M
+Thar/M
+Thatcher/M
+thatching/M
+thatch/JMDRSZG
+Thatch/MR
+that'd
+that'll
+that/MS
+thaumaturge/M
+thaw/DGS
+Thaxter/M
+Thayer/M
+Thayne/M
+THC
+the
+Theadora/M
+Thea/M
+theatergoer/MS
+theatergoing/MS
+theater/SM
+theatricality/SM
+theatrical/YS
+theatric/S
+theatrics/M
+Thebault/M
+Thebes
+Theda/M
+Thedrick/M
+Thedric/M
+thee/DS
+theeing
+theft/MS
+Theiler/M
+their/MS
+theism/SM
+theistic
+theist/SM
+Thekla/M
+Thelma/M
+themas
+thematically
+thematics
+thematic/U
+theme/MS
+them/GD
+Themistocles/M
+themselves
+thence
+thenceforth
+thenceforward/S
+Theobald/M
+theocracy/SM
+theocratic
+Theocritus/M
+theodolite/MS
+Theodora/M
+Theodore/M
+Theodoric/M
+Theodor/M
+Theodosia/M
+Theodosian
+Theodosius/M
+theologian/SM
+theological/Y
+theologists
+theology/MS
+Theo/M
+theorem/MS
+theoretical/Y
+theoretician/MS
+theoretic/S
+theoretics/M
+theorist/SM
+theorization/SM
+theorize/ZGDRS
+theory/MS
+theosophic
+theosophical
+theosophist/MS
+Theosophy
+theosophy/SM
+therapeutically
+therapeutic/S
+therapeutics/M
+therapist/MS
+therapy/MS
+Theravada/M
+thereabout/S
+thereafter
+thereat
+thereby
+there'd
+therefor
+therefore
+therefrom
+therein
+there'll
+there/MS
+thereof
+thereon
+Theresa/M
+Therese/M
+Theresina/M
+Theresita/M
+Theressa/M
+thereto
+theretofore
+thereunder
+thereunto
+thereupon
+therewith
+Therine/M
+thermal/YS
+thermionic/S
+thermionics/M
+thermistor/MS
+therm/MS
+thermocouple/MS
+thermodynamical/Y
+thermodynamic/S
+thermodynamics/M
+thermoelastic
+thermoelectric
+thermoformed
+thermoforming
+thermogravimetric
+thermoluminescence/M
+thermometer/MS
+thermometric
+thermometry/M
+thermonuclear
+thermopile/M
+thermoplastic/S
+thermopower
+thermo/S
+thermosetting
+thermos/S
+Thermos/SM
+thermostable
+thermostatically
+thermostatic/S
+thermostatics/M
+thermostat/SM
+thermostatted
+thermostatting
+Theron/M
+thesauri
+thesaurus/MS
+these/S
+Theseus/M
+thesis/M
+thespian/S
+Thespian/S
+Thespis/M
+Thessalonian
+Thessaloníki/M
+Thessaly/M
+theta/MS
+thew/SM
+they
+they'd
+they'll
+they're
+they've
+th/GNJX
+Thia/M
+thiamine/MS
+Thibaud/M
+Thibaut/M
+thickener/M
+thickening/M
+thicken/RDJZG
+thicket/SMD
+thickheaded/M
+thickish
+thickness/MS
+thickset/S
+thick/TXPSRNY
+thief/M
+Thiensville/M
+Thieu/M
+thievery/MS
+thieve/SDJG
+thievishness/M
+thievish/P
+thighbone/SM
+thigh/DM
+thighs
+thimble/DSMG
+thimbleful/MS
+Thimbu/M
+Thimphu
+thine
+thingamabob/MS
+thingamajig/SM
+thing/MP
+thinkableness/M
+thinkable/U
+thinkably/U
+think/AGRS
+thinker/MS
+thinkingly/U
+thinking/SMYP
+thinned
+thinner/MS
+thinness/MS
+thinnest
+thinning
+thinnish
+thin/STPYR
+thiocyanate/M
+thiouracil/M
+third/DYGS
+thirster/M
+thirst/GSMDR
+thirstily
+thirstiness/S
+thirsty/TPR
+thirteen/MHS
+thirteenths
+thirtieths
+thirty/HMS
+this
+this'll
+thistledown/MS
+thistle/SM
+thither
+Th/M
+tho
+thole/GMSD
+Thomasa/M
+Thomasina/M
+Thomasine/M
+Thomasin/M
+Thoma/SM
+Thomism/M
+Thomistic
+Thom/M
+Thompson/M
+Thomson/M
+thong/SMD
+thoracic
+thorax/MS
+Thorazine
+Thoreau/M
+thoriate/D
+Thorin/M
+thorium/MS
+Thor/M
+Thornburg/M
+Thorndike/M
+Thornie/M
+thorniness/S
+Thorn/M
+thorn/SMDG
+Thornton/M
+Thorny/M
+thorny/PTR
+thoroughbred/S
+thoroughfare/MS
+thoroughgoing
+thoroughness/SM
+thorough/PTYR
+Thorpe/M
+Thorstein/M
+Thorsten/M
+Thorvald/M
+those
+Thoth/M
+thou/DSG
+though
+thoughtfully
+thoughtfulness/S
+thoughtful/U
+thoughtlessness/MS
+thoughtless/YP
+thought/MS
+thousandfold
+thousand/SHM
+thousandths
+Thrace/M
+Thracian/M
+thralldom/S
+thrall/GSMD
+thrash/DSRZGJ
+thrasher/M
+thrashing/M
+threadbare/P
+threader/M
+threading/A
+threadlike
+thread/MZDRGS
+thready/RT
+threatener/M
+threaten/GJRD
+threatening/Y
+threat/MDNSXG
+threefold
+three/MS
+threepence/M
+threepenny
+threescore/S
+threesome/SM
+threnody/SM
+thresh/DSRZG
+thresher/M
+threshold/MDGS
+threw
+thrice
+thriftily
+thriftiness/S
+thriftless
+thrift/SM
+thrifty/PTR
+thriller/M
+thrilling/Y
+thrill/ZMGDRS
+thriver/M
+thrive/RSDJG
+thriving/Y
+throatily
+throatiness/MS
+throat/MDSG
+throaty/PRT
+throbbed
+throbbing
+throb/S
+throeing
+throe/SDM
+thrombi
+thromboses
+thrombosis/M
+thrombotic
+thrombus/M
+Throneberry/M
+throne/CGSD
+throne's
+throng/GDSM
+throttle/DRSZMG
+throttler/M
+throughout
+throughput/SM
+throughway's
+through/Y
+throwaway/SM
+throwback/MS
+thrower/M
+thrown
+throwout
+throw/SZGR
+thrummed
+thrumming
+thrum/S
+thrush/MS
+thruster/M
+thrust/ZGSR
+Thruway/MS
+thruway/SM
+Thunderbird/M
+Thu
+Thucydides/M
+thudded
+thudding
+thud/MS
+thuggee/M
+thuggery/SM
+thuggish
+thug/MS
+Thule/M
+thulium/SM
+thumbnail/MS
+thumbscrew/SM
+thumb/SMDG
+thumbtack/GMDS
+thump/RDMSG
+thunderbolt/MS
+thunderclap/SM
+thundercloud/SM
+thunderer/M
+thunderhead/SM
+thundering/Y
+thunderous/Y
+thundershower/MS
+thunderstorm/MS
+thunderstruck
+thundery
+thunder/ZGJDRMS
+thunk
+Thurber/M
+Thurman/M
+Thur/MS
+Thursday/SM
+Thurstan/M
+Thurston/M
+thus/Y
+thwack/DRSZG
+thwacker/M
+thwarter/M
+thwart/GSDRY
+thy
+thyme/SM
+thymine/MS
+thymus/SM
+thyratron/M
+thyristor/MS
+thyroglobulin
+thyroidal
+thyroid/S
+thyronine
+thyrotoxic
+thyrotrophic
+thyrotrophin
+thyrotropic
+thyrotropin/M
+thyroxine/M
+thyself
+Tia/M
+Tianjin
+tiara/MS
+Tiberius/M
+Tiber/M
+Tibetan/S
+Tibet/M
+tibiae
+tibial
+tibia/M
+Tibold/M
+Tiburon/M
+ticker/M
+ticket/SGMD
+tick/GZJRDMS
+ticking/M
+tickler/M
+tickle/RSDZG
+ticklishness/MS
+ticklish/PY
+ticktacktoe/S
+ticktock/SMDG
+tic/MS
+Ticonderoga/M
+tidal/Y
+tidbit/MS
+tiddlywinks/M
+tide/GJDS
+tideland/MS
+tidewater/SM
+tideway/SM
+tidily/U
+tidiness/USM
+tidying/M
+tidy/UGDSRPT
+tie/AUDS
+tieback/MS
+Tiebold/M
+Tiebout/M
+tiebreaker/SM
+Tieck/M
+Tiena/M
+Tienanmen/M
+Tientsin's
+tier/DGM
+Tierney/M
+Tiertza/M
+Tiffanie/M
+Tiffani/M
+tiffany/M
+Tiffany/M
+tiff/GDMS
+Tiffie/M
+Tiffi/M
+Tiff/M
+Tiffy/M
+tigerish
+tiger/SM
+tightener/M
+tighten/JZGDR
+tightfisted
+tightness/MS
+tightrope/SM
+tight/STXPRNY
+tightwad/MS
+tigress/SM
+Tigris/M
+Tijuana/M
+tike's
+Tilda/M
+tilde/MS
+Tildie/M
+Tildi/M
+Tildy/M
+tile/DRSJMZG
+tiled/UE
+Tiler/M
+tiles/U
+tiling/M
+tillable
+tillage/SM
+till/EGSZDR
+tiller/GDM
+tiller's/E
+Tillich/M
+Tillie/M
+Tillman/M
+Tilly/M
+tilth/M
+tilt/RDSGZ
+Ti/M
+timber/DMSG
+timbering/M
+timberland/SM
+timberline/S
+timbrel/SM
+timbre/MS
+Timbuktu/M
+ti/MDRZ
+timebase
+time/DRSJMYZG
+timekeeper/MS
+timekeeping/SM
+timelessness/S
+timeless/PY
+timeliness/SMU
+timely/UTRP
+timeout/S
+timepiece/MS
+timer/M
+timescale/S
+timeserver/MS
+timeserving/S
+timeshare/SDG
+timespan
+timestamped
+timestamps
+timetable/GMSD
+timeworn
+Timex/M
+timezone/S
+timidity/SM
+timidness/MS
+timid/RYTP
+Timi/M
+timing/M
+Timmie/M
+Timmi/M
+Tim/MS
+Timmy/M
+Timofei/M
+Timon/M
+timorousness/MS
+timorous/YP
+Timoteo/M
+Timothea/M
+Timothee/M
+Timotheus/M
+Timothy/M
+timothy/MS
+timpani
+timpanist/S
+Timur/M
+Tina/M
+tincture/SDMG
+tinderbox/MS
+tinder/MS
+Tine/M
+tine/SM
+tinfoil/MS
+tingeing
+tinge/S
+ting/GYDM
+tingle/SDG
+tingling/Y
+tingly/TR
+Ting/M
+tinily
+tininess/MS
+tinker/SRDMZG
+Tinkertoy
+tinkle/SDG
+tinkling/M
+tinkly
+tin/MDGS
+tinned
+tinner/M
+tinnily
+tinniness/SM
+tinning/M
+tinnitus/MS
+tinny/RSTP
+tinplate/S
+tinsel/GMDYS
+Tinseltown/M
+tinsmith/M
+tinsmiths
+tinter/M
+tintinnabulation/MS
+Tintoretto/M
+tint/SGMRDB
+tintype/SM
+tinware/MS
+tiny/RPT
+Tioga/M
+Tiphanie/M
+Tiphani/M
+Tiphany/M
+tipi's
+tip/MS
+tipoff
+Tippecanoe/M
+tipped
+Tipperary/M
+tipper/MS
+tippet/MS
+tipping
+tippler/M
+tipple/ZGRSD
+tippy/R
+tipsily
+tipsiness/SM
+tipster/SM
+tipsy/TPR
+tiptoeing
+tiptoe/SD
+tiptop/S
+tirade/SM
+Tirana's
+Tirane
+tired/AYP
+tireder
+tiredest
+tiredness/S
+tirelessness/SM
+tireless/PY
+tire/MGDSJ
+tires/A
+Tiresias/M
+tiresomeness/S
+tiresome/PY
+tiring/AU
+Tirolean/S
+Tirol/M
+tiro's
+Tirrell/M
+tis
+Tisha/M
+Tish/M
+tissue/MGSD
+titanate/M
+Titania/M
+titanic
+titanically
+Titanic/M
+titanium/SM
+titan/SM
+Titan/SM
+titbit's
+titer/M
+tither/M
+tithe/SRDGZM
+tithing/M
+Titian/M
+titian/S
+Titicaca/M
+titillate/XSDVNG
+titillating/Y
+titillation/M
+titivate/NGDSX
+titivation/M
+titled/AU
+title/GMSRD
+titleholder/SM
+titling/A
+titmice
+titmouse/M
+tit/MRZS
+Tito/SM
+titrate/SDGN
+titration/M
+titted
+titter/GDS
+titting
+tittle/SDMG
+titular/SY
+Titus/M
+tizzy/SM
+TKO
+Tlaloc/M
+TLC
+Tlingit/M
+Tl/M
+TM
+Tm/M
+tn
+TN
+tnpk
+TNT
+toad/SM
+toadstool/SM
+toady/GSDM
+toadyism/M
+toaster/M
+toastmaster/MS
+toastmistress/S
+toast/SZGRDM
+toasty/TRS
+tobacconist/SM
+tobacco/SM
+tobaggon/SM
+Tobago/M
+Tobe/M
+Tobey/M
+Tobiah/M
+Tobias/M
+Tobie/M
+Tobi/M
+Tobin/M
+Tobit/M
+toboggan/MRDSZG
+Tobye/M
+Toby/M
+Tocantins/M
+toccata/M
+Tocqueville
+tocsin/MS
+to/D
+today'll
+today/SM
+Toddie/M
+toddler/M
+toddle/ZGSRD
+Todd/M
+Toddy/M
+toddy/SM
+Tod/M
+toecap/SM
+toeclip/S
+TOEFL
+toehold/MS
+toeing
+toe/MS
+toenail/DMGS
+toffee/SM
+tofu/S
+toga/SMD
+toge
+togetherness/MS
+together/P
+togged
+togging
+toggle/SDMG
+Togolese/M
+Togo/M
+tog/SMG
+Toiboid/M
+toilet/GMDS
+toiletry/MS
+toilette/SM
+toil/SGZMRD
+toilsomeness/M
+toilsome/PY
+Toinette/M
+Tojo/M
+tokamak
+Tokay/M
+toke/GDS
+tokenism/SM
+tokenized
+token/SMDG
+Tokugawa/M
+Tokyoite/MS
+Tokyo/M
+Toland/M
+told/AU
+Toledo/SM
+tole/MGDS
+tolerability/IM
+tolerable/I
+tolerably/I
+tolerance/SIM
+tolerant/IY
+tolerate/XVNGSD
+toleration/M
+Tolkien
+tollbooth/M
+tollbooths
+toll/DGS
+Tolley/M
+tollgate/MS
+tollhouse/M
+tollway/S
+Tolstoy/M
+toluene/MS
+Tolyatti/M
+tomahawk/SGMD
+Tomasina/M
+Tomasine/M
+Toma/SM
+Tomaso/M
+tomatoes
+tomato/M
+Tombaugh/M
+tomb/GSDM
+Tombigbee/M
+tomblike
+tombola/M
+tomboyish
+tomboy/MS
+tombstone/MS
+tomcat/SM
+tomcatted
+tomcatting
+Tome/M
+tome/SM
+tomfoolery/MS
+tomfool/M
+Tomi/M
+Tomkin/M
+Tomlin/M
+Tom/M
+tommed
+Tommie/M
+Tommi/M
+tomming
+tommy/M
+Tommy/M
+tomographic
+tomography/MS
+tomorrow/MS
+Tompkins/M
+Tomsk/M
+tom/SM
+tomtit/SM
+tonality/MS
+tonal/Y
+tonearm/S
+tone/ISRDZG
+tonelessness/M
+toneless/YP
+toner/IM
+tone's
+Tonga/M
+Tongan/SM
+tong/GRDS
+tongueless
+tongue/SDMG
+tonguing/M
+Tonia/M
+tonic/SM
+Tonie/M
+tonight/MS
+Toni/M
+Tonio/M
+tonk/MS
+tonnage/SM
+tonne/MS
+Tonnie/M
+tonsillectomy/MS
+tonsillitis/SM
+tonsil/SM
+ton/SKM
+tonsorial
+tonsure/SDGM
+Tonto/M
+Tonya/M
+Tonye/M
+Tony/M
+tony/RT
+toodle
+too/H
+took/A
+tool/AGDS
+toolbox/SM
+tooler/SM
+tooling/M
+toolkit/SM
+toolmaker/M
+toolmake/ZRG
+toolmaking/M
+tool's
+toolsmith
+Toomey/M
+tooter/M
+toot/GRDZS
+toothache/SM
+toothbrush/MSG
+tooth/DMG
+toothily
+toothless
+toothmarks
+toothpaste/SM
+toothpick/MS
+tooths
+toothsome
+toothy/TR
+tootle/SRDG
+tootsie
+Tootsie/M
+toots/M
+tootsy/MS
+topaz/MS
+topcoat/MS
+topdressing/S
+Topeka/M
+toper/M
+topflight
+topgallant/M
+topiary/S
+topicality/MS
+topical/Y
+topic/MS
+topknot/MS
+topless
+topmast/MS
+topmost
+topnotch/R
+topocentric
+topographer/SM
+topographic
+topographical/Y
+topography/MS
+topological/Y
+topologist/MS
+topology/MS
+topped
+topper/MS
+topping/MS
+topple/GSD
+topsail/MS
+topside/SRM
+top/SMDRG
+topsoil/GDMS
+topspin/MS
+Topsy/M
+toque/MS
+Torah/M
+Torahs
+torchbearer/SM
+torchlight/S
+torch/SDMG
+toreador/SM
+Tore/M
+tore/S
+Torey/M
+Torie/M
+tori/M
+Tori/M
+Torin/M
+torment/GSD
+tormenting/Y
+tormentor/MS
+torn
+tornadoes
+tornado/M
+toroidal/Y
+toroid/MS
+Toronto/M
+torpedoes
+torpedo/GMD
+torpidity/S
+torpid/SY
+torpor/MS
+Torquemada/M
+torque/MZGSRD
+Torrance/M
+Torre/MS
+torrence
+Torrence/M
+Torrens/M
+torrential
+torrent/MS
+Torrey/M
+Torricelli/M
+torridity/SM
+torridness/SM
+torrid/RYTP
+Torrie/M
+Torrin/M
+Torr/XM
+Torry/M
+torsional/Y
+torsion/IAM
+torsions
+torsi's
+tor/SLM
+torso/SM
+tors/S
+tort/ASFE
+tortellini/MS
+torte/MS
+torten
+tortilla/MS
+tortoiseshell/SM
+tortoise/SM
+Tortola/M
+tortoni/MS
+tort's
+Tortuga/M
+tortuousness/MS
+tortuous/PY
+torture/ZGSRD
+torturous
+torus/MS
+Tory/SM
+Tosca/M
+Toscanini/M
+Toshiba/M
+toss/SRDGZ
+tossup/MS
+totaler/M
+totalistic
+totalitarianism/SM
+totalitarian/S
+totality/MS
+totalizator/S
+totalizing
+total/ZGSRDYM
+totemic
+totem/MS
+toter/M
+tote/S
+toting/M
+tot/MDRSG
+Toto/M
+totted
+totterer/M
+tottering/Y
+totter/ZGRDS
+totting
+toucan/MS
+touchable/U
+touch/ASDG
+touchdown/SM
+touché
+touched/U
+toucher/M
+touchily
+touchiness/SM
+touching/SY
+touchline/M
+touchscreen
+touchstone/SM
+touchy/TPR
+toughen/DRZG
+toughener/M
+toughness/SM
+toughs
+tough/TXGRDNYP
+Toulouse/M
+toupee/SM
+toured/CF
+tourer/M
+tour/GZSRDM
+touring/F
+tourism/SM
+touristic
+tourist/SM
+touristy
+tourmaline/SM
+tournament/MS
+tourney/GDMS
+tourniquet/MS
+tour's/CF
+tours/CF
+tousle/GSD
+touter/M
+tout/SGRD
+Tova/M
+Tove/M
+towardliness/M
+towardly/P
+towards
+toward/YU
+towboat/MS
+tow/DRSZG
+towelette/S
+towel/GJDMS
+toweling/M
+tower/GMD
+towering/Y
+towhead/MSD
+towhee/SM
+towline/MS
+towner/M
+Townes
+Towney/M
+townhouse/S
+Townie/M
+townie/S
+Townley/M
+Town/M
+Townsend/M
+townsfolk
+township/MS
+townsman/M
+townsmen
+townspeople/M
+town/SRM
+townswoman/M
+townswomen
+Towny/M
+towpath/M
+towpaths
+towrope/MS
+Towsley/M
+toxemia/MS
+toxicity/MS
+toxicological
+toxicologist/SM
+toxicology/MS
+toxic/S
+toxin/MS
+toyer/M
+toymaker
+toy/MDRSG
+Toynbee/M
+Toyoda/M
+Toyota/M
+toyshop
+tr
+traceability/M
+traceableness/M
+traceable/P
+trace/ASDG
+traceback/MS
+traced/U
+Tracee/M
+traceless/Y
+Trace/M
+tracepoint/SM
+tracer/MS
+tracery/MDS
+trace's
+Tracey/M
+tracheae
+tracheal/M
+trachea/M
+tracheotomy/SM
+Tracie/M
+Traci/M
+tracing/SM
+trackage
+trackball/S
+trackbed
+tracked/U
+tracker/M
+trackless
+tracksuit/SM
+track/SZGMRD
+tractability/SI
+tractable/I
+tractably/I
+tract/ABS
+Tractarians
+traction/KSCEMAF
+tractive/KFE
+tractor/FKMASC
+tract's
+tracts/CEFK
+Tracy/M
+trademark/GSMD
+trader/M
+tradesman/M
+tradesmen
+tradespeople
+tradespersons
+trade/SRDGZM
+tradeswoman/M
+tradeswomen
+traditionalism/MS
+traditionalistic
+traditionalist/MS
+traditionalized
+traditionally
+traditional/U
+tradition/SM
+traduce/DRSGZ
+Trafalgar/M
+trafficked
+trafficker/MS
+trafficking/S
+traffic/SM
+tragedian/SM
+tragedienne/MS
+tragedy/MS
+tragically
+tragicomedy/SM
+tragicomic
+tragic/S
+trailblazer/MS
+trailblazing/S
+trailer/GDM
+trails/F
+trailside
+trail/SZGJRD
+trainable
+train/ASDG
+trained/U
+trainee/MS
+traineeships
+trainer/MS
+training/SM
+trainman/M
+trainmen
+trainspotter/S
+traipse/DSG
+trait/MS
+traitorous/Y
+traitor/SM
+Trajan/M
+trajectory/MS
+trammed
+trammeled/U
+trammel/GSD
+tramming
+tram/MS
+trample/DGRSZ
+trampler/M
+trampoline/GMSD
+tramp/RDSZG
+tramway/M
+trance/MGSD
+tranche/SM
+Tran/M
+tranquility/S
+tranquilized/U
+tranquilize/JGZDSR
+tranquilizer/M
+tranquilizes/A
+tranquilizing/YM
+tranquillize/GRSDZ
+tranquillizer/M
+tranquilness/M
+tranquil/PTRY
+transact/GSD
+transactional
+transaction/MS
+transactor/SM
+transalpine
+transaminase
+transatlantic
+Transcaucasia/M
+transceiver/SM
+transcendence/MS
+transcendentalism/SM
+transcendentalist/SM
+transcendental/YS
+transcendent/Y
+transcend/SDG
+transconductance
+transcontinental
+transcribe/DSRGZ
+transcriber/M
+transcription/SM
+transcript/SM
+transcultural
+transducer/SM
+transduction/M
+transect/DSG
+transept/SM
+transferability/M
+transferal/MS
+transfer/BSMD
+transferee/M
+transference/SM
+transferor/MS
+transferral/SM
+transferred
+transferrer/SM
+transferring
+transfiguration/SM
+transfigure/SDG
+transfinite/Y
+transfix/SDG
+transformational
+transformation/MS
+transform/DRZBSG
+transformed/U
+transformer/M
+transfuse/XSDGNB
+transfusion/M
+transgression/SM
+transgressor/S
+transgress/VGSD
+trans/I
+transience/SM
+transiency/S
+transient/YS
+transistorize/GDS
+transistor/SM
+Transite/M
+transitional/Y
+transition/MDGS
+transitivenesses
+transitiveness/IM
+transitive/PIY
+transitivity/MS
+transitoriness/M
+transitory/P
+transit/SGVMD
+transl
+translatability/M
+translatable/U
+translated/AU
+translate/VGNXSDB
+translational
+translation/M
+translator/SM
+transliterate/XNGSD
+translucence/SM
+translucency/MS
+translucent/Y
+transmigrate/XNGSD
+transmissible
+transmission/MSA
+transmissive
+transmit/AS
+transmittable
+transmittal/SM
+transmittance/MS
+transmitted/A
+transmitter/SM
+transmitting/A
+transmogrification/M
+transmogrify/GXDSN
+transmutation/SM
+transmute/GBSD
+transnational/S
+transoceanic
+transom/SM
+transonic
+transpacific
+transparency/MS
+transparentness/M
+transparent/YP
+transpiration/SM
+transpire/GSD
+transplantation/S
+transplant/GRDBS
+transpolar
+transponder/MS
+transportability
+transportable/U
+transportation/SM
+transport/BGZSDR
+transpose/BGSD
+transposed/U
+transposition/SM
+Transputer/M
+transsexualism/MS
+transsexual/SM
+transship/LS
+transshipment/SM
+transshipped
+transshipping
+transubstantiation/MS
+Transvaal/M
+transversal/YM
+transverse/GYDS
+transvestism/SM
+transvestite/SM
+transvestitism
+Transylvania/M
+trapdoor/S
+trapeze/DSGM
+trapezium/MS
+trapezoidal
+trapezoid/MS
+trap/MS
+trappable/U
+trapped
+trapper/SM
+trapping/S
+Trappist/MS
+trapshooting/SM
+trashcan/SM
+trashiness/SM
+trash/SRDMG
+trashy/TRP
+Trastevere/M
+trauma/MS
+traumatic
+traumatically
+traumatize/SDG
+travail/SMDG
+traveled/U
+traveler/M
+travelog's
+travelogue/S
+travel/SDRGZJ
+Traver/MS
+traversal/SM
+traverse/GBDRS
+traverser/M
+travertine/M
+travesty/SDGM
+Travis/M
+Travus/M
+trawler/M
+trawl/RDMSZG
+tray/SM
+treacherousness/SM
+treacherous/PY
+treachery/SM
+treacle/DSGM
+treacly
+treader/M
+treadle/GDSM
+treadmill/MS
+tread/SAGD
+Treadwell/M
+treas
+treason/BMS
+treasonous
+treasure/DRSZMG
+treasurer/M
+treasurership
+treasury/SM
+Treasury/SM
+treatable
+treated/U
+treater/S
+treatise/MS
+treatment/MS
+treat's
+treat/SAGDR
+treaty/MS
+treble/SDG
+Treblinka/M
+treeing
+treeless
+treelike
+tree/MDS
+treetop/SM
+trefoil/SM
+Trefor/M
+trekked
+trekker/MS
+Trekkie/M
+trekking
+trek/MS
+trellis/GDSM
+Tremaine/M
+Tremain/M
+trematode/SM
+Tremayne/M
+tremble/JDRSG
+trembler/M
+trembles/M
+trembly
+tremendousness/M
+tremendous/YP
+tremolo/MS
+tremor/MS
+tremulousness/SM
+tremulous/YP
+trenchancy/MS
+trenchant/Y
+trencherman/M
+trenchermen
+trencher/SM
+trench/GASD
+trench's
+trendily
+trendiness/S
+trend/SDMG
+trendy/PTRS
+Trenna/M
+Trent/M
+Trenton/M
+trepanned
+trepidation/MS
+Tresa/M
+Trescha/M
+trespasser/M
+trespass/ZRSDG
+Tressa/M
+tressed/E
+tresses/E
+tressing/E
+tress/MSDG
+trestle/MS
+Trevar/M
+Trevelyan/M
+Trever/M
+Trevino/M
+Trevor/M
+Trev/RM
+Trey/M
+trey/MS
+triableness/M
+triable/P
+triadic
+triad/MS
+triage/SDMG
+trial/ASM
+trialization
+trialled
+trialling
+triamcinolone
+triangle/SM
+triangulable
+triangularization/S
+triangular/Y
+triangulate/YGNXSD
+triangulation/M
+Triangulum/M
+Trianon/M
+Triassic
+triathlon/S
+triatomic
+tribalism/MS
+tribal/Y
+tribe/MS
+tribesman/M
+tribesmen
+tribeswoman
+tribeswomen
+tribulate/NX
+tribulation/M
+tribunal/MS
+tribune/SM
+tributary/MS
+tribute/EGSF
+tribute's
+trice/GSDM
+tricentennial/S
+triceps/SM
+triceratops/M
+trichinae
+trichina/M
+trichinoses
+trichinosis/M
+trichloroacetic
+trichloroethane
+trichotomy/M
+trichromatic
+Tricia/M
+trickery/MS
+trick/GMSRD
+trickily
+trickiness/SM
+trickle/DSG
+trickster/MS
+tricky/RPT
+tricolor/SMD
+tricycle/SDMG
+trident/SM
+tridiagonal
+tried/UA
+triennial/SY
+trier/AS
+trier's
+tries/A
+Trieste/M
+triffid/S
+trifle/MZGJSRD
+trifler/M
+trifluoride/M
+trifocals
+trigged
+trigger/GSDM
+triggest
+trigging
+triglyceride/MS
+trigonal/Y
+trigonometric
+trigonometrical
+trigonometry/MS
+trigram/S
+trig/S
+trihedral
+trike/GMSD
+trilateral/S
+trilby/SM
+trilingual
+trillion/SMH
+trillionth/M
+trillionths
+trillium/SM
+trill/RDMGS
+trilobite/MS
+trilogy/MS
+trimaran/MS
+Trimble/M
+trimer/M
+trimester/MS
+trimmed/U
+trimmer/MS
+trimmest
+trimming/MS
+trimness/S
+trimodal
+trimonthly
+trim/PSYR
+Trimurti/M
+Trina/M
+Trinidad/M
+trinitarian/S
+trinitrotoluene/SM
+trinity/MS
+Trinity/MS
+trinketer/M
+trinket/MRDSG
+triode/MS
+trio/SM
+trioxide/M
+tripartite/N
+tripartition/M
+tripe/MS
+triphenylarsine
+triphenylphosphine
+triphenylstibine
+triphosphopyridine
+triple/GSD
+triplet/SM
+triplex/S
+triplicate/SDG
+triplication/M
+triply/GDSN
+Trip/M
+tripodal
+tripod/MS
+tripoli/M
+Tripoli/M
+tripolyphosphate
+tripos/SM
+tripped
+Trippe/M
+tripper/MS
+tripping/Y
+Tripp/M
+trip/SMY
+triptych/M
+triptychs
+tripwire/MS
+trireme/SM
+Tris
+trisect/GSD
+trisection/S
+trisector
+Trisha/M
+Trish/M
+trisodium
+Trista/M
+Tristam/M
+Tristan/M
+tristate
+trisyllable/M
+tritely/F
+triteness/SF
+trite/SRPTY
+tritium/MS
+triton/M
+Triton/M
+triumphal
+triumphalism
+triumphant/Y
+triumph/GMD
+triumphs
+triumvirate/MS
+triumvir/MS
+triune
+trivalent
+trivet/SM
+trivia
+triviality/MS
+trivialization/MS
+trivialize/DSG
+trivial/Y
+trivium/M
+Trixie/M
+Trixi/M
+Trix/M
+Trixy/M
+Trobriand/M
+trochaic/S
+trochee/SM
+trod/AU
+trodden/UA
+trodes
+troff/MR
+troglodyte/MS
+troika/SM
+Trojan/MS
+troll/DMSG
+trolled/F
+trolleybus/S
+trolley/SGMD
+trolling/F
+trollish
+Trollope/M
+trollop/GSMD
+trolly's
+trombone/MS
+trombonist/SM
+tromp/DSG
+Trondheim/M
+trooper/M
+troopship/SM
+troop/SRDMZG
+trope/SM
+Tropez/M
+trophic
+trophy/MGDS
+tropical/SY
+tropic/MS
+tropism/SM
+tropocollagen
+troposphere/MS
+tropospheric
+troth/GDM
+troths
+trot/S
+Trotsky/M
+trotted
+trotter/SM
+trotting
+troubadour/SM
+troubled/U
+trouble/GDRSM
+troublemaker/MS
+troubler/M
+troubleshooter/M
+troubleshoot/SRDZG
+troubleshot
+troublesomeness/M
+troublesome/YP
+trough/M
+troughs
+trounce/GZDRS
+trouncer/M
+troupe/MZGSRD
+trouper/M
+trouser/DMGS
+trousseau/M
+trousseaux
+Troutman/M
+trout/SM
+trove/SM
+troweler/M
+trowel/SMDRGZ
+trow/SGD
+Troyes
+Troy/M
+troy/S
+Trstram/M
+truancy/MS
+truant/SMDG
+truce/SDGM
+Truckee/M
+trucker/M
+trucking/M
+truckle/GDS
+truckload/MS
+truck/SZGMRDJ
+truculence/SM
+truculent/Y
+Truda/M
+Trudeau/M
+Trude/M
+Trudey/M
+trudge/SRDG
+Trudie/M
+Trudi/M
+Trudy/M
+true/DRSPTG
+truelove/MS
+Trueman/M
+trueness/M
+truer/U
+truest/U
+truffle/MS
+truism/SM
+Trujillo/M
+Trula/M
+truly/U
+Trumaine/M
+Truman/M
+Trumann/M
+Trumbull/M
+trump/DMSG
+trumpery/SM
+trumpeter/M
+trumpet/MDRZGS
+Trump/M
+truncate/NGDSX
+truncation/M
+truncheon/MDSG
+trundle/GZDSR
+trundler/M
+trunk/GSMD
+trunnion/SM
+trusser/M
+trussing/M
+truss/SRDG
+trusted/EU
+trusteeing
+trustee/MDS
+trusteeship/SM
+truster/M
+trustful/EY
+trustfulness/SM
+trustiness/M
+trusting/Y
+trust/RDMSG
+trusts/E
+trustworthier
+trustworthiest
+trustworthiness/MS
+trustworthy/UP
+trusty/PTMSR
+Truth
+truthfulness/US
+truthful/UYP
+truths/U
+truth/UM
+TRW
+trying/Y
+try/JGDRSZ
+tryout/MS
+trypsin/M
+tryst/GDMS
+ts
+T's
+tsarevich
+tsarina's
+tsarism/M
+tsarist
+tsetse/S
+Tsimshian/M
+Tsiolkovsky/M
+Tsitsihar/M
+tsp
+tsunami/MS
+Tsunematsu/M
+Tswana/M
+TTL
+tty/M
+ttys
+Tuamotu/M
+Tuareg/M
+tubae
+tubal
+tuba/SM
+tubbed
+tubbing
+tubby/TR
+tubeless
+tubercle/MS
+tubercular/S
+tuberculin/MS
+tuberculoses
+tuberculosis/M
+tuberculous
+tuber/M
+tuberose/SM
+tuberous
+tube/SM
+tubing/M
+tub/JMDRSZG
+Tubman/M
+tubular/Y
+tubule/SM
+tucker/GDM
+Tucker/M
+tuck/GZSRD
+Tuckie/M
+Tuck/RM
+Tucky/M
+Tucson/M
+Tucuman/M
+Tudor/MS
+Tue/S
+Tuesday/SM
+tufter/M
+tuft/GZSMRD
+tufting/M
+tugboat/MS
+tugged
+tugging
+tug/S
+tuition/ISM
+Tulane/M
+tularemia/S
+tulip/SM
+tulle/SM
+Tulley/M
+Tull/M
+Tully/M
+Tulsa/M
+tum
+tumbledown
+tumbler/M
+tumbleweed/MS
+tumble/ZGRSDJ
+tumbrel/SM
+tumescence/S
+tumescent
+tumidity/MS
+tumid/Y
+tummy/SM
+tumor/MDS
+tumorous
+Tums/M
+tumult/SGMD
+tumultuousness/M
+tumultuous/PY
+tumulus/M
+tunableness/M
+tunable/P
+tuna/SM
+tundra/SM
+tun/DRJZGBS
+tune/CSDG
+tunefulness/MS
+tuneful/YP
+tuneless/Y
+tuner/M
+tune's
+tuneup/S
+tung
+tungstate/M
+tungsten/SM
+Tunguska/M
+Tungus/M
+tunic/MS
+tuning/A
+tuning's
+Tunisia/M
+Tunisian/S
+Tunis/M
+tunned
+tunneler/M
+tunnel/MRDSJGZ
+tunning
+tunny/SM
+tupelo/M
+Tupi/M
+tuple/SM
+tuppence/M
+Tupperware
+Tupungato/M
+turban/SDM
+turbid
+turbidity/SM
+turbinate/SD
+turbine/SM
+turbocharged
+turbocharger/SM
+turbofan/MS
+turbojet/MS
+turboprop/MS
+turbo/SM
+turbot/MS
+turbulence/SM
+turbulent/Y
+turd/MS
+tureen/MS
+turf/DGSM
+turfy/RT
+Turgenev/M
+turgidity/SM
+turgidness/M
+turgid/PY
+Turing/M
+Turin/M
+Turkestan/M
+Turkey/M
+turkey/SM
+Turkic/SM
+Turkish
+Turkmenistan/M
+turk/S
+Turk/SM
+turmeric/MS
+turmoil/SDMG
+turnabout/SM
+turnaround/MS
+turn/AZGRDBS
+turnbuckle/SM
+turncoat/SM
+turned/U
+turner/M
+Turner/M
+turning/MS
+turnip/SMDG
+turnkey/MS
+turnoff/MS
+turnout/MS
+turnover/SM
+turnpike/MS
+turnround/MS
+turnstile/SM
+turnstone/M
+turntable/SM
+turpentine/GMSD
+Turpin/M
+turpitude/SM
+turquoise/SM
+turret/SMD
+turtleback/MS
+turtledove/MS
+turtleneck/SDM
+turtle/SDMG
+turves's
+turvy
+Tuscaloosa/M
+Tuscan
+Tuscany/M
+Tuscarora/M
+Tuscon/M
+tush/SDG
+Tuskegee/M
+tusker/M
+tusk/GZRDMS
+tussle/GSD
+tussock/MS
+tussocky
+Tussuad/M
+Tutankhamen/M
+tutelage/MS
+tutelary/S
+Tut/M
+tutored/U
+tutorial/MS
+tutor/MDGS
+tutorship/S
+tut/S
+Tutsi
+tutted
+tutting
+tutti/S
+Tuttle/M
+tutu/SM
+Tuvalu
+tuxedo/SDM
+tux/S
+TVA
+TV/M
+TVs
+twaddle/GZMRSD
+twaddler/M
+Twain/M
+twain/S
+TWA/M
+twang/MDSG
+twangy/TR
+twas
+tweak/SGRD
+tweediness/M
+Tweedledee/M
+Tweedledum/M
+Tweed/M
+twee/DP
+tweed/SM
+tweedy/PTR
+tween
+tweeter/M
+tweet/ZSGRD
+tweezer/M
+tweeze/ZGRD
+twelfth
+twelfths
+twelvemonth/M
+twelvemonths
+twelve/MS
+twentieths
+twenty/MSH
+twerp/MS
+twice/R
+twiddle/GRSD
+twiddler/M
+twiddly/RT
+twigged
+twigging
+twiggy/RT
+twig/SM
+Twila/M
+twilight/MS
+twilit
+twill/SGD
+twiner/M
+twine/SM
+twinge/SDMG
+Twinkie
+twinkler/M
+twinkle/RSDG
+twinkling/M
+twinkly
+twinned
+twinning
+twin/RDMGZS
+twirler/M
+twirling/Y
+twirl/SZGRD
+twirly/TR
+twisted/U
+twister/M
+twists/U
+twist/SZGRD
+twisty
+twitch/GRSD
+twitchy/TR
+twit/S
+twitted
+twitterer/M
+twitter/SGRD
+twittery
+twitting
+twixt
+twofer/MS
+twofold/S
+two/MS
+twopence/SM
+twopenny/S
+twosome/MS
+twp
+Twp
+TWX
+Twyla/M
+TX
+t/XTJBG
+Tybalt/M
+Tybie/M
+Tybi/M
+tycoon/MS
+tyeing
+Tye/M
+tying/UA
+tyke/SM
+Tylenol/M
+Tyler/M
+Ty/M
+Tymon/M
+Tymothy/M
+tympani
+tympanist/SM
+tympanum/SM
+Tynan/M
+Tyndale/M
+Tyndall/M
+Tyne/M
+typeahead
+typecast/SG
+typed/AU
+typedef/S
+typeface/MS
+typeless
+type/MGDRSJ
+types/A
+typescript/SM
+typeset/S
+typesetter/MS
+typesetting/SM
+typewriter/M
+typewrite/SRJZG
+typewriting/M
+typewritten
+typewrote
+typhoid/SM
+Typhon/M
+typhoon/SM
+typhus/SM
+typicality/MS
+typically
+typicalness/M
+typical/U
+typification/M
+typify/SDNXG
+typing/A
+typist/MS
+typographer/SM
+typographic
+typographical/Y
+typography/MS
+typological/Y
+typology/MS
+typo/MS
+tyrannic
+tyrannicalness/M
+tyrannical/PY
+tyrannicide/M
+tyrannizer/M
+tyrannize/ZGJRSD
+tyrannizing/YM
+tyrannosaur/MS
+tyrannosaurus/S
+tyrannous
+tyranny/MS
+tyrant/MS
+Tyree/M
+tyreo
+Tyrolean/S
+Tyrol's
+Tyrone/M
+tyrosine/M
+tyro/SM
+Tyrus/M
+Tyson/M
+tzarina's
+tzar's
+Tzeltal/M
+u
+U
+UAR
+UART
+UAW
+Ubangi/M
+ubiquitous/YP
+ubiquity/S
+Ucayali/M
+Uccello/M
+UCLA/M
+Udale/M
+Udall/M
+udder/SM
+Udell/M
+Ufa/M
+ufologist/S
+ufology/MS
+UFO/S
+Uganda/M
+Ugandan/S
+ugh
+ughs
+uglification
+ugliness/MS
+uglis
+ugly/PTGSRD
+Ugo/M
+uh
+UHF
+Uighur
+Ujungpandang/M
+UK
+ukase/SM
+Ukraine/M
+Ukrainian/S
+ukulele/SM
+UL
+Ula/M
+Ulberto/M
+ulcerate/NGVXDS
+ulceration/M
+ulcer/MDGS
+ulcerous
+Ulick/M
+Ulises/M
+Ulla/M
+Ullman/M
+ulnae
+ulna/M
+ulnar
+Ulrica/M
+Ulrich/M
+Ulrick/M
+Ulric/M
+Ulrika/M
+Ulrikaumeko/M
+Ulrike/M
+Ulster/M
+ulster/MS
+ult
+ulterior/Y
+ultimas
+ultimate/DSYPG
+ultimateness/M
+ultimatum/MS
+ultimo
+ultracentrifugally
+ultracentrifugation
+ultracentrifuge/M
+ultraconservative/S
+ultrafast
+ultrahigh
+ultralight/S
+ultramarine/SM
+ultramodern
+ultramontane
+ultra/S
+ultrashort
+ultrasonically
+ultrasonic/S
+ultrasonics/M
+ultrasound/SM
+ultrastructure/M
+Ultrasuede
+ultraviolet/SM
+Ultrix/M
+ULTRIX/M
+ululate/DSXGN
+ululation/M
+Ulyanovsk/M
+Ulysses/M
+um
+umbel/MS
+umber/GMDS
+Umberto/M
+umbilical/S
+umbilici
+umbilicus/M
+umbrage/MGSD
+umbrageous
+umbra/MS
+umbrella/GDMS
+Umbriel/M
+Umeko/M
+umiak/MS
+umlaut/GMDS
+umpire/MGSD
+ump/MDSG
+umpteen/H
+UN
+unabated/Y
+unabridged/S
+unacceptability
+unacceptable
+unaccepted
+unaccommodating
+unaccountability
+unaccustomed/Y
+unadapted
+unadulterated/Y
+unadventurous
+unalienability
+unalterableness/M
+unalterable/P
+unalterably
+Una/M
+unambiguity
+unambiguous
+unambitious
+unamused
+unanimity/SM
+unanimous/Y
+unanticipated/Y
+unapologetic
+unapologizing/M
+unappeasable
+unappeasably
+unappreciative
+unary
+unassailableness/M
+unassailable/P
+unassertive
+unassumingness/M
+unassuming/PY
+unauthorized/PY
+unavailing/PY
+unaware/SPY
+unbalanced/P
+unbar
+unbarring
+unbecoming/P
+unbeknown
+unbelieving/Y
+unbiased/P
+unbid
+unbind/G
+unblessed
+unblinking/Y
+unbodied
+unbolt/G
+unbreakability
+unbred
+unbroken
+unbuckle
+unbudging/Y
+unburnt
+uncap
+uncapping
+uncatalogued
+uncauterized/MS
+unceasing/Y
+uncelebrated
+uncertain/P
+unchallengeable
+unchangingness/M
+unchanging/PY
+uncharacteristic
+uncharismatic
+unchastity
+unchristian
+uncial/S
+uncivilized/Y
+unclassified
+uncle/MSD
+unclouded/Y
+uncodable
+uncollected
+uncoloredness/M
+uncolored/PY
+uncombable
+uncommunicative
+uncompetitive
+uncomplicated
+uncomprehending/Y
+uncompromisable
+unconcerned/P
+unconcern/M
+unconfirmed
+unconfused
+unconscionableness/M
+unconscionable/P
+unconscionably
+unconstitutional
+unconsumed
+uncontentious
+uncontrollability
+unconvertible
+uncool
+uncooperative
+uncork/G
+uncouple/G
+uncouthness/M
+uncouth/YP
+uncreate/V
+uncritical
+uncross/GB
+uncrowded
+unction/IM
+unctions
+unctuousness/MS
+unctuous/PY
+uncustomary
+uncut
+undated/I
+undaunted/Y
+undeceive
+undecided/S
+undedicated
+undefinability
+undefinedness/M
+undefined/P
+undelete
+undeliverability
+undeniableness/M
+undeniable/P
+undeniably
+undependable
+underachiever/M
+underachieve/SRDGZ
+underact/GDS
+underadjusting
+underage/S
+underarm/DGS
+underbedding
+underbelly/MS
+underbidding
+underbid/S
+underbracing
+underbrush/MSDG
+undercarriage/MS
+undercharge/GSD
+underclassman
+underclassmen
+underclass/S
+underclothes
+underclothing/MS
+undercoating/M
+undercoat/JMDGS
+underconsumption/M
+undercooked
+undercount/S
+undercover
+undercurrent/SM
+undercut/S
+undercutting
+underdeveloped
+underdevelopment/MS
+underdog/MS
+underdone
+undereducated
+underemphasis
+underemployed
+underemployment/SM
+underenumerated
+underenumeration
+underestimate/NGXSD
+underexploited
+underexpose/SDG
+underexposure/SM
+underfed
+underfeed/SG
+underfloor
+underflow/GDMS
+underfoot
+underfund/DG
+underfur/MS
+undergarment/SM
+undergirding
+undergoes
+undergo/G
+undergone
+undergrad/MS
+undergraduate/MS
+underground/RMS
+undergrowth/M
+undergrowths
+underhand/D
+underhandedness/MS
+underhanded/YP
+underheat
+underinvestment
+underlaid
+underlain/S
+underlay/GS
+underlie
+underline/GSDJ
+underling/MS
+underlip/SM
+underloaded
+underly/GS
+undermanned
+undermentioned
+undermine/SDG
+undermost
+underneath
+underneaths
+undernourished
+undernourishment/SM
+underpaid
+underpants
+underpart/MS
+underpass/SM
+underpay/GSL
+underpayment/SM
+underperformed
+underpinned
+underpinning/MS
+underpin/S
+underplay/SGD
+underpopulated
+underpopulation/M
+underpowered
+underpricing
+underprivileged
+underproduction/MS
+underrate/GSD
+underregistration/M
+underreported
+underreporting
+underrepresentation/M
+underrepresented
+underscore/SDG
+undersealed
+undersea/S
+undersecretary/SM
+undersell/SG
+undersexed
+undershirt/SM
+undershoot/SG
+undershorts
+undershot
+underside/SM
+undersigned/M
+undersign/SGD
+undersized
+undersizes
+undersizing
+underskirt/MS
+undersold
+underspecification
+underspecified
+underspend/G
+understaffed
+understandability/M
+understandably
+understanding/YM
+understand/RGSJB
+understate/GSDL
+understatement/MS
+understocked
+understood
+understrength
+understructure/SM
+understudy/GMSD
+undertaken
+undertaker/M
+undertake/SRGZJ
+undertaking/M
+underthings
+undertone/SM
+undertook
+undertow/MS
+underused
+underusing
+underutilization/M
+underutilized
+undervaluation/S
+undervalue/SDG
+underwater/S
+underway
+underwear/M
+underweight/S
+underwent
+underwhelm/DGS
+underwood/M
+Underwood/M
+underworld/MS
+underwrite/GZSR
+underwriter/M
+underwritten
+underwrote
+under/Y
+undeserving
+undesigned
+undeviating/Y
+undialyzed/SM
+undiplomatic
+undiscerning
+undiscriminating
+undo/GJ
+undoubted/Y
+undramatic
+undramatized/SM
+undress/G
+undrinkability
+undrinkable
+undroppable
+undue
+undulant
+undulate/XDSNG
+undulation/M
+unearthliness/S
+unearthly/P
+unearth/YG
+unease
+uneconomic
+uneducated
+unemployed/S
+unencroachable
+unending/Y
+unendurable/P
+unenergized/MS
+unenforced
+unenterprising
+UNESCO
+unethical
+uneulogized/SM
+unexacting
+unexceptionably
+unexcited
+unexpectedness/MS
+unfading/Y
+unfailingness/M
+unfailing/P
+unfamiliar
+unfashionable
+unfathomably
+unfavored
+unfeeling
+unfeigned/Y
+unfelt
+unfeminine
+unfertile
+unfetchable
+unflagging
+unflappability/S
+unflappable
+unflappably
+unflinching/Y
+unfold/LG
+unfoldment/M
+unforced
+unforgeable
+unfossilized/MS
+unfraternizing/SM
+unfrozen
+unfulfillable
+unfunny
+unfussy
+ungainliness/MS
+ungainly/PRT
+Ungava/M
+ungenerous
+ungentle
+unglamorous
+ungrammaticality
+ungrudging
+unguent/MS
+ungulate/MS
+unharmonious
+unharness/G
+unhistorical
+unholy/TP
+unhook/DG
+unhydrolyzed/SM
+unhygienic
+Unibus/M
+unicameral
+UNICEF
+unicellular
+Unicode/M
+unicorn/SM
+unicycle/MGSD
+unicyclist/MS
+unideal
+unidimensional
+unidiomatic
+unidirectionality
+unidirectional/Y
+unidolized/MS
+unifiable
+unification/MA
+unifier/MS
+unifilar
+uniformity/MS
+uniformness/M
+uniform/TGSRDYMP
+unify/AXDSNG
+unilateralism/M
+unilateralist
+unilateral/Y
+unimodal
+unimpeachably
+unimportance
+unimportant
+unimpressive
+unindustrialized/MS
+uninhibited/YP
+uninominal
+uninsured
+unintellectual
+unintended
+uninteresting
+uninterruptedness/M
+uninterrupted/YP
+unintuitive
+uninviting
+union/AEMS
+unionism/SM
+unionist/SM
+Unionist/SM
+unionize
+Union/MS
+UniPlus/M
+unipolar
+uniprocessor/SM
+uniqueness/S
+unique/TYSRP
+Uniroyal/M
+unisex/S
+UniSoft/M
+unison/MS
+Unisys/M
+unitarianism/M
+Unitarianism/SM
+unitarian/MS
+Unitarian/MS
+unitary
+unite/AEDSG
+united/Y
+uniter/M
+unitize/GDS
+unit/VGRD
+unity/SEM
+univ
+Univac/M
+univalent/S
+univalve/MS
+univariate
+universalism/M
+universalistic
+universality/SM
+universalize/DSRZG
+universalizer/M
+universal/YSP
+universe/MS
+university/MS
+Unix/M
+UNIX/M
+unjam
+unkempt
+unkind/TP
+unkink
+unknightly
+unknowable/S
+unknowing
+unlabored
+unlace/G
+unlearn/G
+unlikeable
+unlikeliness/S
+unlimber/G
+unlimited
+unlit
+unliterary
+unloose/G
+unlucky/TP
+unmagnetized/MS
+unmanageably
+unmannered/Y
+unmask/G
+unmeaning
+unmeasured
+unmeetable
+unmelodious
+unmemorable
+unmemorialized/MS
+unmentionable/S
+unmerciful
+unmeritorious
+unmethodical
+unmineralized/MS
+unmissable
+unmistakably
+unmitigated/YP
+unmnemonic
+unmobilized/SM
+unmoral
+unmount/B
+unmovable
+unmoving
+unnaturalness/M
+unnavigable
+unnerving/Y
+unobliging
+unoffensive
+unofficial
+unorganized/YP
+unorthodox
+unpack/G
+unpaintable
+unpalatability
+unpalatable
+unpartizan
+unpatronizing
+unpeople
+unperceptive
+unperson
+unperturbed/Y
+unphysical
+unpick/G
+unpicturesque
+unpinning
+unpleasing
+unploughed
+unpolarized/SM
+unpopular
+unpractical
+unprecedented/Y
+unpredictable/S
+unpreemphasized
+unpremeditated
+unpretentiousness/M
+unprincipled/P
+unproblematic
+unproductive
+unpropitious
+unprovable
+unproven
+unprovocative
+unpunctual
+unquestionable
+unraisable
+unravellings
+unreadability
+unread/B
+unreal
+unrealizable
+unreasoning/Y
+unreceptive
+unrecordable
+unreflective
+unrelenting/Y
+unremitting/Y
+unrepeatability
+unrepeated
+unrepentant
+unreported
+unrepresentative
+unreproducible
+unrest/G
+unrestrained/P
+unrewarding
+unriddle
+unripe/P
+unromantic
+unruliness/SM
+unruly/PTR
+unsaleable
+unsanitary
+unsavored/YP
+unsavoriness/M
+unseal/GB
+unsearchable
+unseasonal
+unseeing/Y
+unseen/S
+unselfconsciousness/M
+unselfconscious/P
+unselfishness/M
+unsellable
+unsentimental
+unset
+unsettledness/M
+unsettled/P
+unsettling/Y
+unshapely
+unshaven
+unshorn
+unsighted
+unsightliness/S
+unskilful
+unsociability
+unsociable/P
+unsocial
+unsound/PT
+unspeakably
+unspecific
+unspectacular
+unspoilt
+unspoke
+unsporting
+unstable/P
+unstigmatized/SM
+unstilted
+unstinting/Y
+unstopping
+unstrapping
+unstudied
+unstuffy
+unsubdued
+unsubstantial
+unsubtle
+unsuitable
+unsuspecting/Y
+unswerving/Y
+unsymmetrical
+unsympathetic
+unsystematic
+unsystematized/Y
+untactful
+untalented
+untaxing
+unteach/B
+untellable
+untenable
+unthinking
+until/G
+untiring/Y
+unto
+untouchable/MS
+untowardness/M
+untoward/P
+untraceable
+untrue
+untruthfulness/M
+untwist/G
+Unukalhai/M
+unusualness/M
+unutterable
+unutterably
+unvocalized/MS
+unvulcanized/SM
+unwaivering
+unwarrantable
+unwarrantably
+unwashed/PS
+unwearable
+unwearied/Y
+unwed
+unwedge
+unwelcome
+unwell/M
+unwieldiness/MS
+unwieldy/TPR
+unwind/B
+unwomanly
+unworkable/S
+unworried
+unwrap
+unwrapping
+unyielding/Y
+unyoke
+unzip
+up
+Upanishads
+uparrow
+upbeat/SM
+upbraid/GDRS
+upbringing/M
+upbring/JG
+UPC
+upchuck/SDG
+upcome/G
+upcountry/S
+updatability
+updater/M
+update/RSDG
+Updike/M
+updraft/SM
+upend/SDG
+upfield
+upfront
+upgradeable
+upgrade/DSJG
+upheaval/MS
+upheld
+uphill/S
+upholder/M
+uphold/RSGZ
+upholster/ADGS
+upholsterer/SM
+upholstery/MS
+UPI
+upkeep/SM
+uplander/M
+upland/MRS
+uplifter/M
+uplift/SJDRG
+upload/GSD
+upmarket
+upon
+upped
+uppercase/GSD
+upperclassman/M
+upperclassmen
+uppercut/S
+uppercutting
+uppermost
+upper/S
+upping
+uppish
+uppity
+upraise/GDS
+uprated
+uprating
+uprear/DSG
+upright/DYGSP
+uprightness/S
+uprise/RGJ
+uprising/M
+upriver/S
+uproariousness/M
+uproarious/PY
+uproar/MS
+uproot/DRGS
+uprooter/M
+ups
+UPS
+upscale/GDS
+upset/S
+upsetting/MS
+upshot/SM
+upside/MS
+upsilon/MS
+upslope
+upstage/DSRG
+upstairs
+upstandingness/M
+upstanding/P
+upstart/MDGS
+upstate/SR
+upstream/DSG
+upstroke/MS
+upsurge/DSG
+upswing/GMS
+upswung
+uptake/SM
+upthrust/GMS
+uptight
+uptime
+Upton/M
+uptown/RS
+uptrend/M
+upturn/GDS
+upwardness/M
+upward/SYP
+upwelling
+upwind/S
+uracil/MS
+Ural/MS
+Urania/M
+uranium/MS
+Uranus/M
+uranyl/M
+Urbain/M
+Urbana/M
+urbane/Y
+urbanism/M
+urbanite/SM
+urbanity/SM
+urbanization/MS
+urbanize/DSG
+Urban/M
+urbanologist/S
+urbanology/S
+Urbano/M
+urban/RT
+Urbanus/M
+urchin/SM
+Urdu/M
+urea/SM
+uremia/MS
+uremic
+ureter/MS
+urethane/MS
+urethrae
+urethral
+urethra/M
+urethritis/M
+Urey/M
+urge/GDRSJ
+urgency/SM
+urgent/Y
+urger/M
+Uriah/M
+uric
+Uriel/M
+urinal/MS
+urinalyses
+urinalysis/M
+urinary/MS
+urinate/XDSNG
+urination/M
+urine/MS
+Uri/SM
+URL
+Ur/M
+urning/M
+urn/MDGS
+urogenital
+urological
+urologist/S
+urology/MS
+Urquhart/M
+Ursala/M
+Ursa/M
+ursine
+Ursola/M
+Urson/M
+Ursula/M
+Ursulina/M
+Ursuline/M
+urticaria/MS
+Uruguayan/S
+Uruguay/M
+Urumqi
+US
+USA
+usability/S
+usable/U
+usably/U
+USAF
+usage/SM
+USART
+USCG
+USC/M
+USDA
+us/DRSBZG
+used/U
+use/ESDAG
+usefulness/SM
+useful/YP
+uselessness/MS
+useless/PY
+Usenet/M
+Usenix/M
+user/M
+USG/M
+usherette/SM
+usher/SGMD
+USIA
+USMC
+USN
+USO
+USP
+USPS
+USS
+USSR
+Ustinov/M
+usu
+usuals
+usual/UPY
+usurer/SM
+usuriousness/M
+usurious/PY
+usurpation/MS
+usurper/M
+usurp/RDZSG
+usury/SM
+UT
+Utahan/SM
+Utah/M
+Uta/M
+Ute/M
+utensil/SM
+uteri
+uterine
+uterus/M
+Utica/M
+utile/I
+utilitarianism/MS
+utilitarian/S
+utility/MS
+utilization/MS
+utilization's/A
+utilize/GZDRS
+utilizer/M
+utilizes/A
+utmost/S
+Utopia/MS
+utopianism/M
+utopian's
+Utopian/S
+utopia/S
+Utrecht/M
+Utrillo/M
+utterance/MS
+uttered/U
+utterer/M
+uttermost/S
+utter/TRDYGS
+uucp/M
+UV
+uvula/MS
+uvular/S
+uxorious
+Uzbekistan
+Uzbek/M
+Uzi/M
+V
+VA
+vacancy/MS
+vacantness/M
+vacant/PY
+vacate/NGXSD
+vacationist/SM
+vacationland
+vacation/MRDZG
+vaccinate/NGSDX
+vaccination/M
+vaccine/SM
+vaccinial
+vaccinia/M
+Vachel/M
+vacillate/XNGSD
+vacillating/Y
+vacillation/M
+vacillator/SM
+Vaclav/M
+vacua's
+vacuity/MS
+vacuo
+vacuolated/U
+vacuolate/SDGN
+vacuole/SM
+vacuolization/SM
+vacuousness/MS
+vacuous/PY
+vacuum/GSMD
+Vader/M
+Vaduz/M
+vagabondage/MS
+vagabond/DMSG
+vagarious
+vagary/MS
+vaginae
+vaginal/Y
+vagina/M
+vagrancy/MS
+vagrant/SMY
+vagueing
+vagueness/MS
+vague/TYSRDP
+Vail/M
+vaingloriousness/M
+vainglorious/YP
+vainglory/MS
+vain/TYRP
+val
+valance/SDMG
+Valaree/M
+Valaria/M
+Valarie/M
+Valdemar/M
+Valdez/M
+Valeda/M
+valediction/MS
+valedictorian/MS
+valedictory/MS
+Vale/M
+valence/SM
+Valencia/MS
+valency/MS
+Valene/M
+Valenka/M
+Valentia/M
+Valentijn/M
+Valentina/M
+Valentine/M
+valentine/SM
+Valentin/M
+Valentino/M
+Valenzuela/M
+Valera/M
+Valeria/M
+Valerian/M
+Valerie/M
+Valerye/M
+Valéry/M
+vale/SM
+valet/GDMS
+valetudinarianism/MS
+valetudinarian/MS
+Valhalla/M
+valiance/S
+valiantness/M
+valiant/SPY
+Valida/M
+validated/AU
+validate/INGSDX
+validates/A
+validation/AMI
+validity/IMS
+validnesses
+validness/MI
+valid/PIY
+Valina/M
+valise/MS
+Valium/S
+Valkyrie/SM
+Vallejo
+Valle/M
+Valletta/M
+valley/SM
+Vallie/M
+Valli/M
+Vally/M
+Valma/M
+Val/MY
+Valois/M
+valor/MS
+valorous/Y
+Valparaiso/M
+Valry/M
+valuable/IP
+valuableness/IM
+valuables
+valuably/I
+valuate/NGXSD
+valuation/CSAM
+valuator/SM
+value/CGASD
+valued/U
+valuelessness/M
+valueless/P
+valuer/SM
+value's
+values/E
+valve/GMSD
+valveless
+valvular
+Va/M
+vamoose/GSD
+vamp/ADSG
+vamper
+vampire/MGSD
+vamp's
+vanadium/MS
+Vance/M
+Vancouver/M
+vandalism/MS
+vandalize/GSD
+vandal/MS
+Vandal/MS
+Vanda/M
+Vandenberg/M
+Vanderbilt/M
+Vanderburgh/M
+Vanderpoel/M
+Vandyke/SM
+vane/MS
+Vanessa/M
+Vang/M
+vanguard/MS
+Vania/M
+vanilla/MS
+vanisher/M
+vanish/GRSDJ
+vanishing/Y
+vanity/SM
+Van/M
+Vanna/M
+vanned
+Vannie/M
+Vanni/M
+vanning
+Vanny/M
+vanquisher/M
+vanquish/RSDGZ
+van/SMD
+vantage/MS
+Vanuatu
+Vanya/M
+Vanzetti/M
+vapidity/MS
+vapidness/SM
+vapid/PY
+vaporer/M
+vaporing/MY
+vaporisation
+vaporise/DSG
+vaporization/AMS
+vaporize/DRSZG
+vaporizer/M
+vapor/MRDJGZS
+vaporous
+vapory
+vaquero/SM
+VAR
+Varanasi/M
+Varese/M
+Vargas/M
+variability/IMS
+variableness/IM
+variable/PMS
+variables/I
+variably/I
+variance/I
+variances
+variance's
+Varian/M
+variant/ISY
+variate/MGNSDX
+variational
+variation/M
+varicolored/MS
+varicose/S
+variedly
+varied/U
+variegate/NGXSD
+variegation/M
+varier/M
+varietal/S
+variety/MS
+various/PY
+varistor/M
+Varityping/M
+varlet/MS
+varmint/SM
+varnished/U
+varnisher/M
+varnish/ZGMDRS
+var/S
+varsity/MS
+varying/UY
+vary/SRDJG
+vascular
+vasectomy/SM
+Vaseline/DSMG
+vase/SM
+Vasili/MS
+Vasily/M
+vasomotor
+Vasquez/M
+vassalage/MS
+vassal/GSMD
+Vassar/M
+Vassili/M
+Vassily/M
+vastness/MS
+vast/PTSYR
+v/ASV
+VAT
+Vatican/M
+vat/SM
+vatted
+vatting
+vaudeville/SM
+vaudevillian/SM
+Vaudois
+Vaughan/M
+Vaughn/M
+vaulter/M
+vaulting/M
+vault/ZSRDMGJ
+vaunter/M
+vaunt/GRDS
+VAXes
+Vax/M
+VAX/M
+Vazquez/M
+vb
+VCR
+VD
+VDT
+VDU
+vealed/A
+vealer/MA
+veal/MRDGS
+veals/A
+Veblen/M
+vectorial
+vectorization
+vectorized
+vectorizing
+vector's/F
+vector/SGDM
+Veda/MS
+Vedanta/M
+veejay/S
+veep/S
+veer/DSG
+veering/Y
+vegan/SM
+Vega/SM
+Vegemite/M
+veges
+vegetable/MS
+vegetarianism/MS
+vegetarian/SM
+vegetate/DSNGVX
+vegetation/M
+vegetative/PY
+vegged
+veggie/S
+vegging
+veg/M
+vehemence/MS
+vehemency/S
+vehement/Y
+vehicle/SM
+vehicular
+veiling/MU
+veil's
+veil/UGSD
+vein/GSRDM
+veining/M
+vela/M
+Vela/M
+velarize/SDG
+velar/S
+Velásquez/M
+Velázquez
+Velcro/SM
+veld/SM
+veldt's
+Velez/M
+Vella/M
+vellum/MS
+Velma/M
+velocipede/SM
+velocity/SM
+velor/S
+velour's
+velum/M
+Velveeta/M
+velveteen/MS
+velvet/GSMD
+Velvet/M
+velvety/RT
+venality/MS
+venal/Y
+venation/SM
+vend/DSG
+vender's/K
+vendetta/MS
+vendible/S
+vendor/MS
+veneerer/M
+veneer/GSRDM
+veneering/M
+venerability/S
+venerable/P
+venerate/XNGSD
+veneration/M
+venereal
+venetian
+Venetian/SM
+Venezuela/M
+Venezuelan/S
+vengeance/MS
+vengeful/APY
+vengefulness/AM
+venialness/M
+venial/YP
+Venice/M
+venireman/M
+veniremen
+venison/SM
+Venita/M
+Venn/M
+venomousness/M
+venomous/YP
+venom/SGDM
+venous/Y
+venter/M
+ventilated/U
+ventilate/XSDVGN
+ventilation/M
+ventilator/MS
+vent/ISGFD
+ventral/YS
+ventricle/MS
+ventricular
+ventriloquies
+ventriloquism/MS
+ventriloquist/MS
+ventriloquy
+vent's/F
+Ventura/M
+venture/RSDJZG
+venturesomeness/SM
+venturesome/YP
+venturi/S
+venturousness/MS
+venturous/YP
+venue/MAS
+Venusian/S
+Venus/S
+veraciousness/M
+veracious/YP
+veracities
+veracity/IM
+Veracruz/M
+Veradis
+Vera/M
+verandahed
+veranda/SDM
+verbalization/MS
+verbalized/U
+verbalizer/M
+verbalize/ZGRSD
+verballed
+verballing
+verbal/SY
+verbatim
+verbena/MS
+verbiage/SM
+verb/KSM
+verbose/YP
+verbosity/SM
+verboten
+verdant/Y
+Verde/M
+Verderer/M
+verdict/SM
+verdigris/GSDM
+Verdi/M
+verdure/SDM
+Vere/M
+Verena/M
+Verene/M
+verge/FGSD
+Verge/M
+verger/SM
+verge's
+Vergil's
+veridical/Y
+Veriee/M
+verifiability/M
+verifiableness/M
+verifiable/U
+verification/S
+verified/U
+verifier/MS
+verify/GASD
+Verile/M
+verily
+Verina/M
+Verine/M
+verisimilitude/SM
+veritableness/M
+veritable/P
+veritably
+verity/MS
+Verlag/M
+Verlaine/M
+Verla/M
+Vermeer/M
+vermicelli/MS
+vermiculite/MS
+vermiform
+vermilion/MS
+vermin/M
+verminous
+Vermonter/M
+Vermont/ZRM
+vermouth/M
+vermouths
+vernacular/YS
+vernal/Y
+Verna/M
+Verne/M
+Vernen/M
+Verney/M
+Vernice/M
+vernier/SM
+Vern/NM
+Vernon/M
+Vernor/M
+Verona/M
+Veronese/M
+Veronica/M
+veronica/SM
+Veronika/M
+Veronike/M
+Veronique/M
+verrucae
+verruca/MS
+versa
+Versailles/M
+Versatec/M
+versatileness/M
+versatile/YP
+versatility/SM
+versed/UI
+verse's
+verses/I
+verse/XSRDAGNF
+versicle/M
+versification/M
+versifier/M
+versify/GDRSZXN
+versing/I
+version/MFISA
+verso/SM
+versus
+vertebrae
+vertebral/Y
+vertebra/M
+vertebrate/IMS
+vertebration/M
+vertex/SM
+vertical/YPS
+vertices's
+vertiginous
+vertigoes
+vertigo/M
+verve/SM
+very/RT
+Vesalius/M
+vesicle/SM
+vesicular/Y
+vesiculate/GSD
+Vespasian/M
+vesper/SM
+Vespucci/M
+vessel/MS
+vestal/YS
+Vesta/M
+vest/DIGSL
+vestibular
+vestibule/SDM
+vestige/SM
+vestigial/Y
+vesting/SM
+vestment/ISM
+vestryman/M
+vestrymen
+vestry/MS
+vest's
+vesture/SDMG
+Vesuvius/M
+vetch/SM
+veteran/SM
+veterinarian/MS
+veterinary/S
+veter/M
+veto/DMG
+vetoes
+vet/SMR
+vetted
+vetting/A
+Vevay/M
+vexation/SM
+vexatiousness/M
+vexatious/PY
+vexed/Y
+vex/GFSD
+VF
+VFW
+VG
+VGA
+vhf
+VHF
+VHS
+VI
+via
+viability/SM
+viable/I
+viably
+viaduct/MS
+Viagra/M
+vial/MDGS
+viand/SM
+vibe/S
+vibraharp/MS
+vibrancy/MS
+vibrant/YS
+vibraphone/MS
+vibraphonist/SM
+vibrate/XNGSD
+vibrational/Y
+vibration/M
+vibrato/MS
+vibrator/SM
+vibratory
+vibrio/M
+vibrionic
+viburnum/SM
+vicarage/SM
+vicariousness/MS
+vicarious/YP
+vicar/SM
+vice/CMS
+viced
+vicegerent/MS
+vicennial
+Vicente/M
+viceregal
+viceroy/SM
+Vichy/M
+vichyssoise/MS
+vicing
+vicinity/MS
+viciousness/S
+vicious/YP
+vicissitude/MS
+Vickers/M
+Vickie/M
+Vicki/M
+Vicksburg/M
+Vicky/M
+Vick/ZM
+Vic/M
+victimization/SM
+victimized/U
+victimizer/M
+victimize/SRDZG
+victim/SM
+Victoir/M
+Victoria/M
+Victorianism/S
+Victorian/S
+victoriousness/M
+victorious/YP
+Victor/M
+victor/SM
+victory/MS
+Victrola/SM
+victualer/M
+victual/ZGSDR
+vicuña/S
+Vidal/M
+Vida/M
+videlicet
+videocassette/S
+videoconferencing
+videodisc/S
+videodisk/SM
+video/GSMD
+videophone/SM
+videotape/SDGM
+Vidovic/M
+Vidovik/M
+Vienna/M
+Viennese/M
+Vientiane/M
+vier/M
+vie/S
+Vietcong/M
+Viet/M
+Vietminh/M
+Vietnamese/M
+Vietnam/M
+viewed/A
+viewer/AS
+viewer's
+viewfinder/MS
+viewgraph/SM
+viewing/M
+viewless/Y
+view/MBGZJSRD
+viewpoint/SM
+views/A
+vigesimal
+vigilance/MS
+vigilante/SM
+vigilantism/MS
+vigilantist
+vigilant/Y
+vigil/SM
+vignette/MGDRS
+vignetter/M
+vignetting/M
+vignettist/MS
+vigor/MS
+vigorousness/M
+vigorous/YP
+vii
+viii
+Vijayawada/M
+Viki/M
+Viking/MS
+viking/S
+Vikki/M
+Vikky/M
+Vikram/M
+Vila
+vile/AR
+vilely
+vileness/MS
+vilest
+Vilhelmina/M
+vilification/M
+vilifier/M
+vilify/GNXRSD
+villager/M
+village/RSMZ
+villainousness/M
+villainous/YP
+villain/SM
+villainy/MS
+Villa/M
+villa/MS
+Villarreal/M
+ville
+villeinage/SM
+villein/MS
+villi
+Villon/M
+villus/M
+Vilma/M
+Vilnius/M
+Vilyui/M
+Vi/M
+vi/MDR
+vim/MS
+vinaigrette/MS
+Vina/M
+Vince/M
+Vincent/MS
+Vincenty/M
+Vincenz/M
+vincible/I
+Vinci/M
+Vindemiatrix/M
+vindicate/XSDVGN
+vindication/M
+vindicator/SM
+vindictiveness/MS
+vindictive/PY
+vinegar/DMSG
+vinegary
+vine/MGDS
+vineyard/SM
+Vinita/M
+Vin/M
+Vinnie/M
+Vinni/M
+Vinny/M
+vino/MS
+vinous
+Vinson/M
+vintage/MRSDG
+vintager/M
+vintner/MS
+vinyl/SM
+violable/I
+Viola/M
+Violante/M
+viola/SM
+violate/VNGXSD
+violator/MS
+Viole/M
+violence/SM
+violent/Y
+Violet/M
+violet/SM
+Violetta/M
+Violette/M
+violinist/SM
+violin/MS
+violist/MS
+viol/MSB
+violoncellist/S
+violoncello/MS
+viper/MS
+viperous
+VIP/S
+viragoes
+virago/M
+viral/Y
+vireo/SM
+Virge/M
+Virgie/M
+Virgilio/M
+Virgil/M
+virginal/YS
+Virgina/M
+Virginia/M
+Virginian/S
+Virginie/M
+virginity/SM
+virgin/SM
+Virgo/MS
+virgule/MS
+virile
+virility/MS
+virologist/S
+virology/SM
+virtual/Y
+virtue/SM
+virtuosity/MS
+virtuosoes
+virtuoso/MS
+virtuousness/SM
+virtuous/PY
+virulence/SM
+virulent/Y
+virus/MS
+visage/MSD
+Visakhapatnam's
+Visa/M
+visa/SGMD
+Visayans
+viscera
+visceral/Y
+viscid/Y
+viscoelastic
+viscoelasticity
+viscometer/SM
+viscose/MS
+viscosity/MS
+viscountcy/MS
+viscountess/SM
+viscount/MS
+viscousness/M
+viscous/PY
+viscus/M
+vise/CAXNGSD
+viselike
+vise's
+Vishnu/M
+visibility/ISM
+visible/PI
+visibly/I
+Visigoth/M
+Visigoths
+visionariness/M
+visionary/PS
+vision/KMDGS
+vision's/A
+visitable/U
+visitant/SM
+visitation/SM
+visited/U
+visit/GASD
+visitor/MS
+vis/MDSGV
+visor/SMDG
+VISTA
+vista/GSDM
+Vistula/M
+visualization/AMS
+visualized/U
+visualizer/M
+visualizes/A
+visualize/SRDZG
+visual/SY
+vitae
+vitality/MS
+vitalization/AMS
+vitalize/ASDGC
+vital/SY
+vita/M
+Vita/M
+vitamin/SM
+Vite/M
+Vitia/M
+vitiate/XGNSD
+vitiation/M
+viticulture/SM
+viticulturist/S
+Vitim/M
+Vito/M
+Vitoria/M
+vitreous/YSP
+vitrifaction/S
+vitrification/M
+vitrify/XDSNG
+vitrine/SM
+vitriolic
+vitriol/MDSG
+vitro
+vittles
+Vittoria/M
+Vittorio/M
+vituperate/SDXVGN
+vituperation/M
+vituperative/Y
+Vitus/M
+vivace/S
+vivaciousness/MS
+vivacious/YP
+vivacity/SM
+viva/DGS
+Vivaldi
+Viva/M
+vivaria
+vivarium/MS
+vivaxes
+Vivekananda/M
+vive/Z
+Vivia/M
+Viviana/M
+Vivian/M
+Vivianna/M
+Vivianne/M
+vividness/SM
+vivid/PTYR
+Vivie/M
+Viviene/M
+Vivien/M
+Vivienne/M
+vivifier
+vivify/NGASD
+Vivi/MN
+viviparous
+vivisect/DGS
+vivisectional
+vivisectionist/SM
+vivisection/MS
+Viviyan/M
+Viv/M
+vivo
+Vivyan/M
+Vivyanne/M
+vixenish/Y
+vixen/SM
+viz
+vizier/MS
+vizor's
+VJ
+Vladamir/M
+Vladimir/M
+Vladivostok/M
+Vlad/M
+VLF
+VLSI
+VMS/M
+VOA
+vocable/SM
+vocab/S
+vocabularian
+vocabularianism
+vocabulary/MS
+vocalic/S
+vocalise's
+vocalism/M
+vocalist/MS
+vocalization/SM
+vocalized/U
+vocalizer/M
+vocalize/ZGDRS
+vocal/SY
+vocation/AKMISF
+vocational/Y
+vocative/KYS
+vociferate/NGXSD
+vociferation/M
+vociferousness/MS
+vociferous/YP
+vocoded
+vocoder
+vodka/MS
+voe/S
+Vogel/M
+vogue/GMSRD
+vogueing
+voguish
+voiceband
+voiced/CU
+voice/IMGDS
+voicelessness/SM
+voiceless/YP
+voicer/S
+voices/C
+voicing/C
+voidable
+void/C
+voided
+voider/M
+voiding
+voidness/M
+voids
+voilà
+voile/MS
+volar
+volatileness/M
+volatile/PS
+volatility/MS
+volatilization/MS
+volatilize/SDG
+volcanically
+volcanic/S
+volcanism/M
+volcanoes
+volcano/M
+vole/MS
+Volga/M
+Volgograd/M
+vol/GSD
+volitionality
+volitional/Y
+volition/MS
+Volkswagen/SM
+volleyball/MS
+volleyer/M
+volley/SMRDG
+Vol/M
+Volstead/M
+voltage/SM
+voltaic
+Voltaire/M
+Volta/M
+volt/AMS
+Volterra/M
+voltmeter/MS
+volubility/S
+voluble/P
+volubly
+volume/SDGM
+volumetric
+volumetrically
+voluminousness/MS
+voluminous/PY
+voluntarily/I
+voluntariness/MI
+voluntarism/MS
+voluntary/PS
+volunteer/DMSG
+voluptuary/SM
+voluptuousness/S
+voluptuous/YP
+volute/S
+Volvo/M
+vomit/GRDS
+Vonda/M
+Von/M
+Vonnegut/M
+Vonnie/M
+Vonni/M
+Vonny/M
+voodoo/GDMS
+voodooism/S
+voraciousness/MS
+voracious/YP
+voracity/MS
+Voronezh/M
+Vorster/M
+vortex/SM
+vortices's
+vorticity/M
+votary/MS
+vote/CSDG
+voter/SM
+vote's
+votive/YP
+voucher/GMD
+vouchsafe/SDG
+vouch/SRDGZ
+vowelled
+vowelling
+vowel/MS
+vower/M
+vow/SMDRG
+voyage/GMZJSRD
+voyager/M
+voyageur/SM
+voyeurism/MS
+voyeuristic
+voyeur/MS
+VP
+vs
+V's
+VT
+Vt/M
+VTOL
+vulcanization/SM
+vulcanized/U
+vulcanize/SDG
+Vulcan/M
+vulgarian/MS
+vulgarism/MS
+vulgarity/MS
+vulgarization/S
+vulgarize/GZSRD
+vulgar/TSYR
+Vulgate/SM
+Vulg/M
+vulnerability/SI
+vulnerable/IP
+vulnerably/I
+vulpine
+vulturelike
+vulture/SM
+vulturous
+vulvae
+vulva/M
+vying
+Vyky/M
+WA
+Waals
+Wabash/M
+WAC
+Wacke/M
+wackes
+wackiness/MS
+wacko/MS
+wacky/RTP
+Waco/M
+Wac/S
+wadded
+wadding/SM
+waddle/GRSD
+Wade/M
+wader/M
+wade/S
+wadi/SM
+wad/MDRZGS
+Wadsworth/M
+wafer/GSMD
+waffle/GMZRSD
+Wafs
+wafter/M
+waft/SGRD
+wag/DRZGS
+waged/U
+wager/GZMRD
+wage/SM
+wagged
+waggery/MS
+wagging
+waggishness/SM
+waggish/YP
+waggle/SDG
+waggly
+Wagnerian
+Wagner/M
+wagoner/M
+wagon/SGZMRD
+wagtail/SM
+Wahl/M
+waif/SGDM
+Waikiki/M
+wailer/M
+wail/SGZRD
+wain/GSDM
+Wain/M
+wainscot/SGJD
+Wainwright/M
+wainwright/SM
+waistband/MS
+waistcoat/GDMS
+waister/M
+waist/GSRDM
+waistline/MS
+Waite/M
+waiter/DMG
+Waiter/M
+wait/GSZJRD
+Wait/MR
+waitpeople
+waitperson/S
+waitress/GMSD
+waiver/MB
+waive/SRDGZ
+Wakefield/M
+wakefulness/MS
+wakeful/PY
+Wake/M
+wake/MGDRSJ
+waken/SMRDG
+waker/M
+wakeup
+Waksman/M
+Walbridge/M
+Walcott/M
+Waldemar/M
+Walden/M
+Waldensian
+Waldheim/M
+Wald/MN
+Waldo/M
+Waldon/M
+Waldorf/M
+wale/DRSMG
+Wales
+Walesa/M
+Walford/M
+Walgreen/M
+waling/M
+walkabout/M
+walkaway/SM
+walker/M
+Walker/M
+walk/GZSBJRD
+walkie
+Walkman/S
+walkout/SM
+walkover/SM
+walkway/MS
+wallaby/MS
+Wallace/M
+Wallache/M
+wallah/M
+Wallas/M
+wallboard/MS
+Wallenstein/M
+Waller/M
+wallet/SM
+walleye/MSD
+wallflower/MS
+Wallie/M
+Wallis
+Walliw/M
+Walloon/SM
+walloper/M
+walloping/M
+wallop/RDSJG
+wallower/M
+wallow/RDSG
+wallpaper/DMGS
+wall/SGMRD
+Wall/SMR
+Wally/M
+wally/S
+walnut/SM
+Walpole/M
+Walpurgisnacht
+walrus/SM
+Walsh/M
+Walter/M
+Walther/M
+Walton/M
+waltzer/M
+Walt/ZMR
+waltz/MRSDGZ
+Walworth/M
+Waly/M
+wampum/SM
+Wanamaker/M
+Wanda/M
+wanderer/M
+wander/JZGRD
+wanderlust/SM
+Wandie/M
+Wandis/M
+wand/MRSZ
+wane/S
+Waneta/M
+wangler/M
+wangle/RSDGZ
+Wang/M
+Wanids/M
+Wankel/M
+wanna
+wannabe/S
+wanned
+wanner
+wanness/S
+wannest
+wanning
+wan/PGSDY
+Wansee/M
+Wansley/M
+wanted/U
+wanter/M
+want/GRDSJ
+wantonness/S
+wanton/PGSRDY
+wapiti/MS
+warble/GZRSD
+warbler/M
+warbonnet/S
+ward/AGMRDS
+Warde/M
+warden/DMGS
+Warden/M
+warder/DMGS
+Ward/MN
+wardrobe/MDSG
+wardroom/MS
+wardship/M
+wards/I
+warehouseman/M
+warehouse/MGSRD
+Ware/MG
+ware/MS
+warfare/SM
+Warfield/M
+war/GSMD
+warhead/MS
+Warhol/M
+warhorse/SM
+warily/U
+warinesses/U
+wariness/MS
+Waring/M
+warless
+warlike
+warlock/SM
+warlord/MS
+warmblooded
+warmed/A
+warmer/M
+warmheartedness/SM
+warmhearted/PY
+warmish
+warmness/MS
+warmongering/M
+warmonger/JGSM
+warms/A
+warmth/M
+warmths
+warm/YRDHPGZTS
+warned/U
+warner/M
+Warner/M
+warn/GRDJS
+warning/YM
+Warnock/M
+warpaint
+warpath/M
+warpaths
+warper/M
+warplane/MS
+warp/MRDGS
+warranted/U
+warranter/M
+warrant/GSMDR
+warranty/SDGM
+warred/M
+warrener/M
+Warren/M
+warren/SZRM
+warring/M
+warrior/MS
+Warsaw/M
+wars/C
+warship/MS
+warthog/S
+wartime/SM
+wart/MDS
+warty/RT
+Warwick/M
+wary/URPT
+Wasatch/M
+washable/S
+wash/AGSD
+washbasin/SM
+washboard/SM
+washbowl/SM
+Washburn/M
+washcloth/M
+washcloths
+washday/M
+washed/U
+washer/GDMS
+washerwoman/M
+washerwomen
+washing/SM
+Washingtonian/S
+Washington/M
+Wash/M
+Washoe/M
+washout/SM
+washrag/SM
+washroom/MS
+washstand/SM
+washtub/MS
+washy/RT
+wasn't
+WASP
+waspishness/SM
+waspish/PY
+Wasp's
+wasp/SM
+was/S
+wassail/GMDS
+Wasserman/M
+Wassermann/M
+wastage/SM
+wastebasket/SM
+wastefulness/S
+wasteful/YP
+wasteland/MS
+wastepaper/MS
+waster/DG
+waste/S
+wastewater
+wast/GZSRD
+wasting/Y
+wastrel/MS
+Watanabe/M
+watchable/U
+watchband/SM
+watchdogged
+watchdogging
+watchdog/SM
+watched/U
+watcher/M
+watchfulness/MS
+watchful/PY
+watch/JRSDGZB
+watchmake/JRGZ
+watchmaker/M
+watchman/M
+watchmen
+watchpoints
+watchtower/MS
+watchword/MS
+waterbird/S
+waterborne
+Waterbury/M
+watercolor/DMGS
+watercolorist/SM
+watercourse/SM
+watercraft/M
+watercress/SM
+waterer/M
+waterfall/SM
+waterfowl/M
+waterfront/SM
+Watergate/M
+waterhole/S
+Waterhouse/M
+wateriness/SM
+watering/M
+water/JGSMRD
+waterless
+waterlily/S
+waterline/S
+waterlogged
+waterloo
+Waterloo/SM
+waterman/M
+watermark/GSDM
+watermelon/SM
+watermill/S
+waterproof/PGRDSJ
+watershed/SM
+waterside/MSR
+watersider/M
+Waters/M
+waterspout/MS
+watertightness/M
+watertight/P
+Watertown/M
+waterway/MS
+waterwheel/S
+waterworks/M
+watery/PRT
+Watkins
+WATS
+Watson/M
+wattage/SM
+Watteau/M
+Wattenberg/M
+Watterson/M
+wattle/SDGM
+Watt/MS
+watt/TMRS
+Watusi/M
+Wat/ZM
+Waugh/M
+Waukesha/M
+Waunona/M
+Waupaca/M
+Waupun/M
+Wausau/M
+Wauwatosa/M
+waveband/MS
+waveform/SM
+wavefront/MS
+waveguide/MS
+Waveland/M
+wavelength/M
+wavelengths
+wavelet/SM
+wavelike
+wavenumber
+waver/GZRD
+wavering/YU
+Waverley/M
+Waverly/M
+Wave/S
+wave/ZGDRS
+wavily
+waviness/MS
+wavy/SRTP
+waxer/M
+waxiness/MS
+wax/MNDRSZG
+waxwing/MS
+waxwork/MS
+waxy/PRT
+wayfarer/MS
+wayfaring/S
+waylaid
+Wayland/M
+Waylan/M
+waylayer/M
+waylay/GRSZ
+wayleave/MS
+Waylen/M
+Waylin/M
+Waylon/M
+Way/M
+waymarked
+way/MS
+Wayne/M
+Waynesboro/M
+wayside/MS
+waywardness/S
+wayward/YP
+WC
+we
+weakener/M
+weaken/ZGRD
+weakfish/SM
+weakish
+weakliness/M
+weakling/SM
+weakly/RTP
+weakness/MS
+weak/TXPYRN
+weal/MHS
+wealthiness/MS
+wealth/M
+wealths
+wealthy/PTR
+weaner/M
+weanling/M
+wean/RDGS
+weapon/GDMS
+weaponless
+weaponry/MS
+wearable/S
+wearer/M
+wearied/U
+wearily
+weariness/MS
+wearing/Y
+wearisomeness/M
+wearisome/YP
+wear/RBSJGZ
+wearying/Y
+weary/TGPRSD
+weasel/SGMDY
+weatherbeaten
+weathercock/SDMG
+weatherer/M
+Weatherford/M
+weathering/M
+weatherize/GSD
+weatherman/M
+weather/MDRYJGS
+weathermen
+weatherperson/S
+weatherproof/SGPD
+weatherstripped
+weatherstripping/S
+weatherstrip/S
+weaver/M
+Weaver/M
+weaves/A
+weave/SRDGZ
+weaving/A
+webbed
+Webber/M
+webbing/MS
+Webb/RM
+weber/M
+Weber/M
+Webern/M
+webfeet
+webfoot/M
+Web/MR
+website/S
+web/SMR
+Webster/MS
+Websterville/M
+we'd
+wedded/A
+Weddell/M
+wedder
+wedding/SM
+wedge/SDGM
+wedgie/RST
+Wedgwood/M
+wedlock/SM
+Wed/M
+Wednesday/SM
+wed/SA
+weeder/M
+weediness/M
+weedkiller/M
+weedless
+wee/DRST
+weed/SGMRDZ
+weedy/TRP
+weeing
+weekday/MS
+weekender/M
+weekend/SDRMG
+weekly/S
+weeknight/SM
+Weeks/M
+week/SYM
+weenie/M
+ween/SGD
+weeny/RSMT
+weeper/M
+weep/SGZJRD
+weepy/RST
+weevil/MS
+weft/SGMD
+Wehr/M
+Weibull/M
+Weidar/M
+Weider/M
+Weidman/M
+Weierstrass/M
+weighed/UA
+weigher/M
+weigh/RDJG
+weighs/A
+weighted/U
+weighter/M
+weightily
+weightiness/SM
+weighting/M
+weight/JMSRDG
+weightlessness/SM
+weightless/YP
+weightlifter/S
+weightlifting/MS
+weighty/TPR
+Weill/M
+Wei/M
+Weinberg/M
+Weiner/M
+Weinstein/M
+weirdie/SM
+weirdness/MS
+weirdo/SM
+weird/YRDPGTS
+weir/SDMG
+Weisenheimer/M
+Weiss/M
+Weissman/M
+Weissmuller/M
+Weizmann/M
+Welbie/M
+Welby/M
+Welcher/M
+Welches
+welcomeness/M
+welcome/PRSDYG
+welcoming/U
+welder/M
+Weldon/M
+weld/SBJGZRD
+Weldwood/M
+welfare/SM
+welkin/SM
+we'll
+Welland/M
+wellbeing/M
+Weller/M
+Wellesley/M
+Welles/M
+wellhead/SM
+Wellington/MS
+wellington/S
+Wellman/M
+wellness/MS
+well/SGPD
+Wells/M
+wellspring/SM
+Wellsville/M
+Welmers/M
+Welsh
+welsher/M
+Welshman/M
+Welshmen
+welsh/RSDGZ
+Welshwoman/M
+Welshwomen
+welter/GD
+welterweight/MS
+welt/GZSMRD
+wencher/M
+wench/GRSDM
+Wendall/M
+Wenda/M
+wend/DSG
+Wendeline/M
+Wendell/M
+Wendel/M
+Wendie/M
+Wendi/M
+Wendye/M
+Wendy/M
+wen/M
+Wenonah/M
+Wenona/M
+went
+Wentworth/M
+wept/U
+were
+we're
+weren't
+werewolf/M
+werewolves
+Werner/M
+Wernher/M
+Werther/M
+werwolf's
+Wes
+Wesleyan
+Wesley/M
+Wessex/M
+Wesson/M
+westbound
+Westbrooke/M
+Westbrook/M
+Westchester/M
+wester/DYG
+westerly/S
+westerner/M
+westernization/MS
+westernize/GSD
+westernmost
+Western/ZRS
+western/ZSR
+Westfield/M
+Westhampton/M
+Westinghouse/M
+westing/M
+Westleigh/M
+Westley/M
+Westminster/M
+Westmore/M
+West/MS
+Weston/M
+Westphalia/M
+Westport/M
+west/RDGSM
+westward/S
+Westwood/M
+wetback/MS
+wetland/S
+wetness/MS
+wet/SPY
+wettable
+wetter/S
+wettest
+wetting
+we've
+Weyden/M
+Weyerhauser/M
+Weylin/M
+Wezen/M
+WFF
+whacker/M
+whack/GZRDS
+whaleboat/MS
+whalebone/SM
+whale/GSRDZM
+Whalen/M
+whaler/M
+whaling/M
+whammed
+whamming/M
+wham/MS
+whammy/S
+wharf/SGMD
+Wharton/M
+wharves
+whatchamacallit/MS
+what'd
+whatever
+what/MS
+whatnot/MS
+what're
+whatsoever
+wheal/MS
+wheatgerm
+Wheaties/M
+Wheatland/M
+wheat/NMXS
+Wheaton/M
+Wheatstone/M
+wheedle/ZDRSG
+wheelbarrow/GSDM
+wheelbase/MS
+wheelchair/MS
+wheeler/M
+Wheeler/M
+wheelhouse/SM
+wheelie/MS
+wheeling/M
+Wheeling/M
+Wheelock/M
+wheel/RDMJSGZ
+wheelwright/MS
+whee/S
+wheeze/SDG
+wheezily
+wheeziness/SM
+wheezy/PRT
+Whelan/M
+whelk/MDS
+Wheller/M
+whelm/DGS
+whelp/DMGS
+whence/S
+whenever
+when/S
+whensoever
+whereabout/S
+whereas/S
+whereat
+whereby
+where'd
+wherefore/MS
+wherein
+where/MS
+whereof
+whereon
+where're
+wheresoever
+whereto
+whereupon
+wherever
+wherewith
+wherewithal/SM
+wherry/DSGM
+whether
+whet/S
+whetstone/MS
+whetted
+whetting
+whew/GSD
+whey/MS
+which
+whichever
+whiff/GSMD
+whiffle/DRSG
+whiffler/M
+whiffletree/SM
+whig/S
+Whig/SM
+while/GSD
+whilom
+whilst
+whimmed
+whimming
+whimper/DSG
+whimsey's
+whimsicality/MS
+whimsical/YP
+whim/SM
+whimsy/TMDRS
+whine/GZMSRD
+whining/Y
+whinny/GTDRS
+whiny/RT
+whipcord/SM
+whiplash/SDMG
+Whippany/M
+whipped
+whipper/MS
+whippersnapper/MS
+whippet/MS
+whipping/SM
+Whipple/M
+whippletree/SM
+whippoorwill/SM
+whipsaw/GDMS
+whips/M
+whip/SM
+whirligig/MS
+whirlpool/MS
+whirl/RDGS
+whirlwind/MS
+whirlybird/MS
+whirly/MS
+whirred
+whirring
+whir/SY
+whisker/DM
+whiskery
+whiskey/SM
+whisk/GZRDS
+whisperer/M
+whisper/GRDJZS
+whispering/YM
+whist/GDMS
+whistleable
+whistle/DRSZG
+whistler/M
+Whistler/M
+whistling/M
+Whitaker/M
+Whitby/M
+Whitcomb/M
+whitebait/M
+whitecap/MS
+whiteface/M
+Whitefield/M
+whitefish/SM
+Whitehall/M
+Whitehead/M
+whitehead/S
+Whitehorse/M
+Whiteleaf/M
+Whiteley/M
+White/MS
+whitener/M
+whiteness/MS
+whitening/M
+whiten/JZDRG
+whiteout/S
+white/PYS
+whitespace
+whitetail/S
+whitewall/SM
+whitewash/GRSDM
+whitewater
+Whitewater/M
+whitey/MS
+Whitfield/M
+whither/DGS
+whitier
+whitiest
+whiting/M
+whitish
+Whitley/M
+Whitlock/M
+Whit/M
+Whitman/M
+Whitney/M
+whit/SJGTXMRND
+Whitsunday/MS
+Whittaker/M
+whitter
+Whittier
+whittle/JDRSZG
+whittler/M
+whiz
+whizkid
+whizzbang/S
+whizzed
+whizzes
+whizzing
+WHO
+whoa/S
+who'd
+whodunit/SM
+whoever
+wholegrain
+wholeheartedness/MS
+wholehearted/PY
+wholemeal
+wholeness/S
+wholesale/GZMSRD
+wholesaler/M
+wholesomeness/USM
+wholesome/UYP
+whole/SP
+wholewheat
+who'll
+wholly
+whom
+who/M
+whomever
+whomsoever
+whoopee/S
+whooper/M
+whoop/SRDGZ
+whoosh/DSGM
+whop
+whopper/MS
+whopping/S
+who're
+whorehouse/SM
+whoreish
+whore/SDGM
+whorish
+whorl/SDM
+whose
+whoso
+whosoever
+who've
+why
+whys
+WI
+Wiatt/M
+Wichita/M
+wickedness/MS
+wicked/RYPT
+wicker/M
+wickerwork/MS
+wicketkeeper/SM
+wicket/SM
+wick/GZRDMS
+wicking/M
+widemouthed
+widener/M
+wideness/S
+widen/SGZRD
+wide/RSYTP
+widespread
+widgeon's
+widget/SM
+widower/M
+widowhood/S
+widow/MRDSGZ
+width/M
+widths
+widthwise
+Wieland/M
+wielder/M
+wield/GZRDS
+Wiemar/M
+wiener/SM
+wienie/SM
+Wier/M
+Wiesel/M
+wife/DSMYG
+wifeless
+wifely/RPT
+wigeon/MS
+wigged
+wigging/M
+Wiggins
+wiggler/M
+wiggle/RSDGZ
+wiggly/RT
+wight/SGDM
+wiglet/S
+wigmaker
+wig/MS
+Wigner/M
+wigwagged
+wigwagging
+wigwag/S
+wigwam/MS
+Wilberforce/M
+Wilbert/M
+Wilbur/M
+Wilburn/M
+Wilburt/M
+Wilcox/M
+Wilda/M
+wildcat/SM
+wildcatted
+wildcatter/MS
+wildcatting
+wildebeest/SM
+Wilde/MR
+Wilden/M
+Wilder/M
+wilderness/SM
+wilder/P
+wildfire/MS
+wildflower/S
+wildfowl/M
+wilding/M
+wildlife/M
+wildness/MS
+Wildon/M
+wild/SPGTYRD
+wile/DSMG
+Wileen/M
+Wilek/M
+Wiley/M
+Wilford/M
+Wilfred/M
+Wilfredo/M
+Wilfrid/M
+wilfulness's
+Wilhelmina/M
+Wilhelmine/M
+Wilhelm/M
+Wilie/M
+wilily
+wiliness/MS
+Wilkerson/M
+Wilkes/M
+Wilkins/M
+Wilkinson/M
+Willabella/M
+Willa/M
+Willamette/M
+Willamina/M
+Willard/M
+Willcox/M
+Willdon/M
+willed/U
+Willem/M
+Willemstad/M
+willer/M
+Willetta/M
+Willette/M
+Willey/M
+willfulness/S
+willful/YP
+Williamsburg/M
+William/SM
+Williamson/M
+Willied/M
+Willie/M
+willies
+Willi/MS
+willinger
+willingest
+willingness's
+willingness/US
+willing/UYP
+Willisson/M
+williwaw/MS
+Will/M
+Willoughby/M
+willower/M
+Willow/M
+willow/RDMSG
+willowy/TR
+willpower/MS
+will/SGJRD
+Willy/SDM
+Willyt/M
+Wilma/M
+Wilmar/M
+Wilmer/M
+Wilmette/M
+Wilmington/M
+Wilona/M
+Wilone/M
+Wilow/M
+Wilshire/M
+Wilsonian
+Wilson/M
+wilt/DGS
+Wilt/M
+Wilton/M
+wily/PTR
+Wimbledon/M
+wimp/GSMD
+wimpish
+wimple/SDGM
+wimpy/RT
+wince/SDG
+Winchell/M
+wincher/M
+winchester/M
+Winchester/MS
+winch/GRSDM
+windbag/SM
+windblown
+windbreak/MZSR
+windburn/GSMD
+winded
+winder/UM
+windfall/SM
+windflower/MS
+Windham/M
+Windhoek/M
+windily
+windiness/SM
+winding/MS
+windjammer/SM
+windlass/GMSD
+windless/YP
+windmill/GDMS
+window/DMGS
+windowless
+windowpane/SM
+Windows
+windowsill/SM
+windpipe/SM
+windproof
+windrow/GDMS
+wind's
+winds/A
+windscreen/MS
+windshield/SM
+windsock/MS
+Windsor/MS
+windstorm/MS
+windsurf/GZJSRD
+windswept
+windup/MS
+wind/USRZG
+Windward/M
+windward/SY
+Windy/M
+windy/TPR
+wineglass/SM
+winegrower/SM
+Winehead/M
+winemake
+winemaster
+wine/MS
+winery/MS
+Winesap/M
+wineskin/M
+Winfield/M
+Winfred/M
+Winfrey/M
+wingback/M
+wingding/MS
+wingeing
+winger/M
+wing/GZRDM
+wingless
+winglike
+wingman
+wingmen
+wingspan/SM
+wingspread/MS
+wingtip/S
+Winifield/M
+Winifred/M
+Wini/M
+winker/M
+wink/GZRDS
+winking/U
+Winkle/M
+winkle/SDGM
+winless
+Win/M
+winnable
+Winnah/M
+Winna/M
+Winnebago/M
+Winne/M
+winner/MS
+Winnetka/M
+Winnie/M
+Winnifred/M
+Winni/M
+winning/SY
+Winnipeg/M
+Winn/M
+winnow/SZGRD
+Winny/M
+Winograd/M
+wino/MS
+Winonah/M
+Winona/M
+Winooski/M
+Winsborough/M
+Winsett/M
+Winslow/M
+winsomeness/SM
+winsome/PRTY
+Winston/M
+winterer/M
+wintergreen/SM
+winterize/GSD
+Winters
+winter/SGRDYM
+wintertime/MS
+Winthrop/M
+wintriness/M
+wintry/TPR
+winy/RT
+win/ZGDRS
+wipe/DRSZG
+wiper/M
+wirehair/MS
+wireless/MSDG
+wireman/M
+wiremen
+wirer/M
+wire's
+wires/A
+wiretap/MS
+wiretapped
+wiretapper/SM
+wiretapping
+wire/UDA
+wiriness/S
+wiring/SM
+wiry/RTP
+Wisc
+Wisconsinite/SM
+Wisconsin/M
+wisdoms
+wisdom/UM
+wiseacre/MS
+wisecrack/GMRDS
+wised
+wisely/TR
+Wise/M
+wiseness
+wisenheimer/M
+Wisenheimer/M
+wises
+wise/URTY
+wishbone/MS
+wishfulness/M
+wishful/PY
+wish/GZSRD
+wishy
+wising
+Wis/M
+wisp/MDGS
+wispy/RT
+wist/DGS
+wisteria/SM
+wistfulness/MS
+wistful/PY
+witchcraft/SM
+witchdoctor/S
+witchery/MS
+witch/SDMG
+withal
+withdrawal/MS
+withdrawer/M
+withdrawnness/M
+withdrawn/P
+withdraw/RGS
+withdrew
+withe/M
+wither/GDJ
+withering/Y
+Witherspoon/M
+with/GSRDZ
+withheld
+withholder/M
+withhold/SJGZR
+within/S
+without/S
+withs
+withstand/SG
+withstood
+witlessness/MS
+witless/PY
+Wit/M
+witness/DSMG
+witnessed/U
+wit/PSM
+witted
+witter/G
+Wittgenstein/M
+witticism/MS
+Wittie/M
+wittily
+wittiness/SM
+wittings
+witting/UY
+Witt/M
+Witty/M
+witty/RTP
+Witwatersrand/M
+wive/GDS
+wives/M
+wizard/MYS
+wizardry/MS
+wizen/D
+wiz's
+wk/Y
+Wm/M
+WNW
+woad/MS
+wobble/GSRD
+wobbler/M
+wobbliness/S
+wobbly/PRST
+Wodehouse/M
+woebegone/P
+woefuller
+woefullest
+woefulness/SM
+woeful/PY
+woe/PSM
+woke
+wok/SMN
+Wolcott/M
+wold/MS
+Wolfe/M
+wolfer/M
+Wolff/M
+Wolfgang/M
+wolfhound/MS
+Wolfie/M
+wolfishness/M
+wolfish/YP
+Wolf/M
+wolfram/MS
+wolf/RDMGS
+Wolfy/M
+Wollongong/M
+Wollstonecraft/M
+Wolsey/M
+Wolverhampton/M
+wolverine/SM
+Wolverton/M
+wolves/M
+woman/GSMYD
+womanhood/MS
+womanish
+womanized/U
+womanizer/M
+womanize/RSDZG
+womanizes/U
+womankind/M
+womanlike
+womanliness/SM
+womanly/PRT
+wombat/MS
+womb/SDM
+womenfolk/MS
+women/MS
+wonderer/M
+wonderfulness/SM
+wonderful/PY
+wonder/GLRDMS
+wondering/Y
+wonderland/SM
+wonderment/SM
+wondrousness/M
+wondrous/YP
+Wong/M
+wonk/S
+wonky/RT
+wonned
+wonning
+won/SG
+won't
+wontedness/MU
+wonted/PUY
+wont/SGMD
+Woodard/M
+Woodberry/M
+woodbine/SM
+woodblock/S
+Woodbury/M
+woodcarver/S
+woodcarving/MS
+woodchopper/SM
+woodchuck/MS
+woodcock/MS
+woodcraft/MS
+woodcut/SM
+woodcutter/MS
+woodcutting/MS
+woodenness/SM
+wooden/TPRY
+woodgrain/G
+woodhen
+Woodhull/M
+Woodie/M
+woodiness/MS
+woodland/SRM
+Woodlawn/M
+woodlice
+woodlot/S
+woodlouse/M
+woodman/M
+Woodman/M
+woodmen
+woodpecker/SM
+woodpile/SM
+Woodrow/M
+woodruff/M
+woo/DRZGS
+woodshedded
+woodshedding
+woodshed/SM
+woodside
+Wood/SM
+woodsman/M
+woodsmen
+wood/SMNDG
+woodsmoke
+woods/R
+Woodstock/M
+woodsy/TRP
+Woodward/MS
+woodwind/S
+woodworker/M
+woodworking/M
+woodwork/SMRGZJ
+woodworm/M
+woodyard
+Woody/M
+woody/TPSR
+woofer/M
+woof/SRDMGZ
+Woolf/M
+woolgatherer/M
+woolgathering/M
+woolgather/RGJ
+woolliness/MS
+woolly/RSPT
+Woolongong/M
+wool/SMYNDX
+Woolworth/M
+Woonsocket/M
+Wooster/M
+Wooten/M
+woozily
+wooziness/MS
+woozy/RTP
+wop/MS!
+Worcestershire/M
+Worcester/SM
+wordage/SM
+word/AGSJD
+wordbook/MS
+Worden/M
+wordily
+wordiness/SM
+wording/AM
+wordless/Y
+wordplay/SM
+word's
+Wordsworth/M
+wordy/TPR
+wore
+workability's
+workability/U
+workableness/M
+workable/U
+workably
+workaday
+workaholic/S
+workaround/SM
+workbench/MS
+workbook/SM
+workday/SM
+worked/A
+worker/M
+workfare/S
+workforce/S
+work/GZJSRDMB
+workhorse/MS
+workhouse/SM
+working/M
+workingman/M
+workingmen
+workingwoman/M
+workingwomen
+workload/SM
+workmanlike
+Workman/M
+workman/MY
+workmanship/MS
+workmate/S
+workmen/M
+workout/SM
+workpiece/SM
+workplace/SM
+workroom/MS
+works/A
+worksheet/S
+workshop/MS
+workspace/S
+workstation/MS
+worktable/SM
+worktop/S
+workup/S
+workweek/SM
+worldlier
+worldliest
+worldliness/USM
+worldly/UP
+worldwide
+world/ZSYM
+wormer/M
+wormhole/SM
+worm/SGMRD
+Worms/M
+wormwood/SM
+wormy/RT
+worn/U
+worried/Y
+worrier/M
+worriment/MS
+worrisome/YP
+worrying/Y
+worrywart/SM
+worry/ZGSRD
+worsen/GSD
+worse/SR
+worshiper/M
+worshipfulness/M
+worshipful/YP
+worship/ZDRGS
+worsted/MS
+worst/SGD
+worth/DG
+worthily/U
+worthinesses/U
+worthiness/SM
+Worthington/M
+worthlessness/SM
+worthless/PY
+Worth/M
+worths
+worthwhile/P
+Worthy/M
+worthy/UTSRP
+wort/SM
+wost
+wot
+Wotan/M
+wouldn't
+would/S
+wouldst
+would've
+wound/AU
+wounded/U
+wounder
+wounding
+wounds
+wound's
+wove/A
+woven/AU
+wovens
+wow/SDG
+Wozniak/M
+WP
+wpm
+wrack/SGMD
+wraith/M
+wraiths
+Wrangell/M
+wrangle/GZDRS
+wrangler/M
+wraparound/S
+wrap/MS
+wrapped/U
+wrapper/MS
+wrapping/SM
+wraps/U
+wrasse/SM
+wrathful/YP
+wrath/GDM
+wraths
+wreak/SDG
+wreathe
+wreath/GMDS
+wreaths
+wreckage/MS
+wrecker/M
+wreck/GZRDS
+wrenching/Y
+wrench/MDSG
+wren/MS
+Wren/MS
+Wrennie/M
+wrester/M
+wrestle/JGZDRS
+wrestler/M
+wrestling/M
+wrest/SRDG
+wretchedness/SM
+wretched/TPYR
+wretch/MDS
+wriggle/DRSGZ
+wriggler/M
+wriggly/RT
+Wright/M
+wright/MS
+Wrigley/M
+wringer/M
+wring/GZRS
+wrinkled/U
+wrinkle/GMDS
+wrinkly/RST
+wristband/SM
+wrist/MS
+wristwatch/MS
+writable/U
+write/ASBRJG
+writer/MA
+writeup
+writhe/SDG
+writing/M
+writ/MRSBJGZ
+written/UA
+Wroclaw
+wrongdoer/MS
+wrongdoing/MS
+wronger/M
+wrongfulness/MS
+wrongful/PY
+wrongheadedness/MS
+wrongheaded/PY
+wrongness/MS
+wrong/PSGTYRD
+Wronskian/M
+wrote/A
+wroth
+wrought/I
+wrung
+wry/DSGY
+wryer
+wryest
+wryness/SM
+W's
+WSW
+wt
+W/T
+Wuhan/M
+Wu/M
+Wurlitzer/M
+wurst/SM
+wuss/S
+wussy/TRS
+WV
+WW
+WWI
+WWII
+WWW
+w/XTJGV
+WY
+Wyatan/M
+Wyatt/M
+Wycherley/M
+Wycliffe/M
+Wye/MH
+Wyeth/M
+Wylie/M
+Wylma/M
+Wyman/M
+Wyndham/M
+Wyn/M
+Wynne/M
+Wynnie/M
+Wynn/M
+Wynny/M
+Wyo/M
+Wyomingite/SM
+Wyoming/M
+WYSIWYG
+x
+X
+Xanadu
+Xanthippe/M
+Xanthus/M
+Xaviera/M
+Xavier/M
+Xebec/M
+Xe/M
+XEmacs/M
+Xenakis/M
+Xena/M
+Xenia/M
+Xenix/M
+xenon/SM
+xenophobe/MS
+xenophobia/SM
+xenophobic
+Xenophon/M
+Xenos
+xerographic
+xerography/MS
+xerox/GSD
+Xerox/MGSD
+Xerxes/M
+Xever/M
+Xhosa/M
+Xi'an
+Xian/S
+Xiaoping/M
+xii
+xiii
+xi/M
+Ximenes/M
+Ximenez/M
+Ximian/SM
+Xingu/M
+xis
+xiv
+xix
+XL
+Xmas/SM
+XML
+Xochipilli/M
+XOR
+X's
+XS
+xterm/M
+Xuzhou/M
+xv
+xvi
+xvii
+xviii
+xx
+XXL
+xylem/SM
+xylene/M
+Xylia/M
+Xylina/M
+xylophone/MS
+xylophonist/S
+Xymenes/M
+Y
+ya
+yacc/M
+Yacc/M
+yachting/M
+yachtsman
+yachtsmen
+yachtswoman/M
+yachtswomen
+yacht/ZGJSDM
+yack's
+Yagi/M
+yahoo/MS
+Yahweh/M
+Yakima/M
+yakked
+yakking
+yak/SM
+Yakut/M
+Yakutsk/M
+Yale/M
+Yalies/M
+y'all
+Yalonda/M
+Yalow/M
+Yalta/M
+Yalu/M
+Yamaha/M
+yammer/RDZGS
+Yamoussoukro
+yam/SM
+Yanaton/M
+Yance/M
+Yancey/M
+Yancy/M
+Yang/M
+Yangon
+yang/S
+Yangtze/M
+Yankee/SM
+yank/GDS
+Yank/MS
+Yaounde/M
+yapped
+yapping
+yap/S
+Yaqui/M
+yardage/SM
+yardarm/SM
+Yardley/M
+Yard/M
+yardman/M
+yardmaster/S
+yardmen
+yard/SMDG
+yardstick/SM
+yarmulke/SM
+yarn/SGDM
+Yaroslavl/M
+yarrow/MS
+Yasmeen/M
+Yasmin/M
+Yates
+yaw/DSG
+yawl/SGMD
+yawner/M
+yawn/GZSDR
+yawning/Y
+Yb/M
+yd
+Yeager/M
+yeah
+yeahs
+yearbook/SM
+yearling/M
+yearlong
+yearly/S
+yearner/M
+yearning/MY
+yearn/JSGRD
+year/YMS
+yea/S
+yeastiness/M
+yeast/SGDM
+yeasty/PTR
+Yeats/M
+yecch
+yegg/MS
+Yehudi/M
+Yehudit/M
+Yekaterinburg/M
+Yelena/M
+yell/GSDR
+yellowhammers
+yellowish
+Yellowknife/M
+yellowness/MS
+Yellowstone/M
+yellow/TGPSRDM
+yellowy
+yelper/M
+yelp/GSDR
+Yeltsin
+Yemeni/S
+Yemenite/SM
+Yemen/M
+Yenisei/M
+yenned
+yenning
+yen/SM
+Yentl/M
+yeomanry/MS
+yeoman/YM
+yeomen
+yep/S
+Yerevan/M
+Yerkes/M
+Yesenia/M
+yeshiva/SM
+yes/S
+yessed
+yessing
+yesterday/MS
+yesteryear/SM
+yet
+ye/T
+yeti/SM
+Yetta/M
+Yettie/M
+Yetty/M
+Yevette/M
+Yevtushenko/M
+yew/SM
+y/F
+Yggdrasil/M
+Yiddish/M
+yielded/U
+yielding/U
+yield/JGRDS
+yikes
+yin/S
+yipe/S
+yipped
+yippee/S
+yipping
+yip/S
+YMCA
+YMHA
+Ymir/M
+YMMV
+Ynes/M
+Ynez/M
+yo
+Yoda/M
+yodeler/M
+yodel/SZRDG
+Yoder/M
+yoga/MS
+yoghurt's
+yogi/MS
+yogurt/SM
+yoke/DSMG
+yoked/U
+yokel/SM
+yokes/U
+yoking/U
+Yoknapatawpha/M
+Yokohama/M
+Yoko/M
+Yolanda/M
+Yolande/M
+Yolane/M
+Yolanthe/M
+yolk/DMS
+yon
+yonder
+Yong/M
+Yonkers/M
+yore/MS
+Yorgo/MS
+Yorick/M
+Yorke/M
+Yorker/M
+yorker/SM
+Yorkshire/MS
+Yorktown/M
+York/ZRMS
+Yoruba/M
+Yosemite/M
+Yoshiko/M
+Yoshi/M
+Yost/M
+you'd
+you'll
+youngish
+Young/M
+youngster/MS
+Youngstown/M
+young/TRYP
+you're
+your/MS
+yourself
+yourselves
+you/SH
+youthfulness/SM
+youthful/YP
+youths
+youth/SM
+you've
+Yovonnda/M
+yow
+yowl/GSD
+Ypres/M
+Ypsilanti/M
+yr
+yrs
+Y's
+Ysabel/M
+YT
+ytterbium/MS
+yttrium/SM
+yuan/M
+Yuba/M
+Yucatan
+yucca/MS
+yuck/GSD
+yucky/RT
+Yugo/M
+Yugoslavia/M
+Yugoslavian/S
+Yugoslav/M
+Yuh/M
+Yuki/M
+yukked
+yukking
+Yukon/M
+yuk/S
+yule/MS
+Yule/MS
+yuletide/MS
+Yuletide/S
+Yul/M
+Yulma/M
+yum
+Yuma/M
+yummy/TRS
+Yunnan/M
+yuppie/SM
+yup/S
+Yurik/M
+Yuri/M
+yurt/SM
+Yves/M
+Yvette/M
+Yvon/M
+Yvonne/M
+Yvor/M
+YWCA
+YWHA
+Zabrina/M
+Zaccaria/M
+Zachariah/M
+Zacharia/SM
+Zacharie/M
+Zachary/M
+Zacherie/M
+Zachery/M
+Zach/M
+Zackariah/M
+Zack/M
+zagging
+Zagreb/M
+zag/S
+Zahara/M
+Zaire/M
+Zairian/S
+Zak/M
+Zambezi/M
+Zambia/M
+Zambian/S
+Zamboni
+Zamenhof/M
+Zamora/M
+Zandra/M
+Zane/M
+Zaneta/M
+zaniness/MS
+Zan/M
+Zanuck/M
+zany/PDSRTG
+Zanzibar/M
+Zapata/M
+Zaporozhye/M
+Zappa/M
+zapped
+zapper/S
+zapping
+zap/S
+Zarah/M
+Zara/M
+Zared/M
+Zaria/M
+Zarla/M
+Zealand/M
+zeal/MS
+zealot/MS
+zealotry/MS
+zealousness/SM
+zealous/YP
+Zea/M
+Zebadiah/M
+Zebedee/M
+Zeb/M
+zebra/MS
+Zebulen/M
+Zebulon/M
+zebu/SM
+Zechariah/M
+Zedekiah/M
+Zed/M
+Zedong/M
+zed/SM
+Zeffirelli/M
+Zeiss/M
+zeitgeist/S
+Zeke/M
+Zelda/M
+Zelig/M
+Zellerbach/M
+Zelma/M
+Zena/M
+Zenger/M
+Zenia/M
+zenith/M
+zeniths
+Zen/M
+Zennist/M
+Zeno/M
+Zephaniah/M
+zephyr/MS
+Zephyrus/M
+Zeppelin's
+zeppelin/SM
+Zerk/M
+zeroed/M
+zeroing/M
+zero/SDHMG
+zestfulness/MS
+zestful/YP
+zest/MDSG
+zesty/RT
+zeta/SM
+zeugma/M
+Zeus/M
+Zhdanov/M
+Zhengzhou
+Zhivago/M
+Zhukov/M
+Zia/M
+Zibo/M
+Ziegfeld/MS
+Ziegler/M
+zig
+zigged
+zigging
+Ziggy/M
+zigzagged
+zigzagger
+zigzagging
+zigzag/MS
+zilch/S
+zillion/MS
+Zilvia/M
+Zimbabwean/S
+Zimbabwe/M
+Zimmerman/M
+zincked
+zincking
+zinc/MS
+zing/GZDRM
+zingy/RT
+zinnia/SM
+Zionism/MS
+Zionist/MS
+Zion/SM
+zip/MS
+zipped/U
+zipper/GSDM
+zipping/U
+zippy/RT
+zips/U
+zirconium/MS
+zircon/SM
+Zita/M
+Zitella/M
+zither/SM
+zit/S
+zloty/SM
+Zn/M
+zodiacal
+zodiac/SM
+Zoe/M
+Zola/M
+Zollie/M
+Zolly/M
+Zomba/M
+zombie/SM
+zombi's
+zonal/Y
+Zonda/M
+Zondra/M
+zoned/A
+zone/MYDSRJG
+zones/A
+zoning/A
+zonked
+Zonnya/M
+zookeepers
+zoological/Y
+zoologist/SM
+zoology/MS
+zoom/DGS
+zoophyte/SM
+zoophytic
+zoo/SM
+Zorah/M
+Zora/M
+Zorana/M
+Zorina/M
+Zorine/M
+Zorn/M
+Zoroaster/M
+Zoroastrianism/MS
+Zoroastrian/S
+Zorro/M
+Zosma/M
+zounds/S
+Zr/M
+Zs
+Zsazsa/M
+Zsigmondy/M
+z/TGJ
+Zubenelgenubi/M
+Zubeneschamali/M
+zucchini/SM
+Zukor/M
+Zulema/M
+Zululand/M
+Zulu/MS
+Zuni/S
+Zürich/M
+Zuzana/M
+zwieback/MS
+Zwingli/M
+Zworykin/M
+Z/X
+zydeco/S
+zygote/SM
+zygotic
+zymurgy/S
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index b042fb2..dafd35e 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -1299,6 +1299,66 @@
+
+
+ EmeraldEnableAutoCorrect
+
+ Comment
+ whether to enable autocorrect or not
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 0
+
+ EmeraldTranslateReplace
+
+ Comment
+ Whether or not right click tranlate replaces the selected text or adds to it.
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 0
+
+ EmeraldSpellDisplay
+
+ Comment
+ Turn on to show mispelled text in red
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 0
+
+ EmeraldSpellInstalled
+
+ Comment
+ The list of installed dictionaries
+ Persist
+ 1
+ Type
+ String
+ Value
+ EN_SL
+
+ EmeraldSpellBase
+
+ Comment
+ The base dictionary to spell check with
+ Persist
+ 1
+ Type
+ String
+ Value
+ English (United States of America)
+
+
+
+
RestrainedLife
Comment
diff --git a/linden/indra/newview/lggautocorrect.cpp b/linden/indra/newview/lggautocorrect.cpp
new file mode 100644
index 0000000..41340fe
--- /dev/null
+++ b/linden/indra/newview/lggautocorrect.cpp
@@ -0,0 +1,400 @@
+/* Copyright (C) 2010 LordGregGreg Back
+
+ This 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 is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the viewer; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ 02111-1307, USA. */
+
+#include "llviewerprecompiledheaders.h"
+#include "lggautocorrect.h"
+#include "llsdserialize.h"
+#include "llboost.h"
+#include "llcontrol.h"
+#include "llviewercontrol.h"
+#include "llnotifications.h"
+
+LGGAutoCorrect* LGGAutoCorrect::sInstance;
+
+LGGAutoCorrect::LGGAutoCorrect()
+{
+ sInstance = this;
+ sInstance->loadFromDisk();
+}
+
+LGGAutoCorrect::~LGGAutoCorrect()
+{
+ sInstance = NULL;
+}
+
+LGGAutoCorrect* LGGAutoCorrect::getInstance()
+{
+ if(sInstance)return sInstance;
+ else
+ {
+ sInstance = new LGGAutoCorrect();
+ return sInstance;
+ }
+}
+void LGGAutoCorrect::save()
+{
+ saveToDisk(mAutoCorrects);
+}
+std::string LGGAutoCorrect::getFileName()
+{
+ std::string path=gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "");
+
+ if (!path.empty())
+ {
+ path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "settings_autocorrect.xml");
+ }
+ return path;
+}
+std::string LGGAutoCorrect::getDefaultFileName()
+{
+ std::string path=gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "");
+
+ if (!path.empty())
+ {
+ path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "settings_autocorrect.xml");
+ }
+ return path;
+}
+LLSD LGGAutoCorrect::exportList(std::string listName)
+{
+ LLSD toReturn;
+ if(mAutoCorrects.has(listName))
+ {
+ toReturn["listName"]=listName;
+ toReturn["data"]=mAutoCorrects[listName]["data"];
+ toReturn["author"]=mAutoCorrects[listName]["author"];
+ toReturn["wordStyle"]=mAutoCorrects[listName]["wordStyle"];
+ toReturn["priority"]=mAutoCorrects[listName]["priority"];
+ }
+ return toReturn;
+}
+BOOL LGGAutoCorrect::addCorrectionList(LLSD newList)
+{
+ if(newList.has("listName"))
+ {
+ std::string name = newList["listName"];
+ //if(!mAutoCorrects.has(name)){
+ LLSD newPart;
+ newPart["data"]=newList["data"];
+ newPart["enabled"]=TRUE;
+ newPart["announce"]=FALSE;
+ newPart["author"]=newList["author"];
+ newPart["wordStyle"]=newList["wordStyle"];
+ newPart["priority"]=newList["priority"].asInteger();
+ llinfos << "adding new list with settings priority "<fileExists(filename))
+ {
+ std::string defaultName = getDefaultFileName();
+ llinfos << " user settings file doesnt exist, going to try and read default one from "<fileExists(defaultName))
+ {
+ LLSD blankllsd;
+ llifstream file;
+ file.open(defaultName.c_str());
+ if (file.is_open())
+ {
+ LLSDSerialize::fromXMLDocument(blankllsd, file);
+ }
+ file.close();
+ saveToDisk(blankllsd);
+ }else
+ saveToDisk(getExampleLLSD());
+ }
+ else
+ {
+ llifstream file;
+ file.open(filename.c_str());
+ if (file.is_open())
+ {
+ LLSDSerialize::fromXML(mAutoCorrects, file);
+ }
+ file.close();
+ }
+}
+void LGGAutoCorrect::saveToDisk(LLSD newSettings)
+{
+ mAutoCorrects=newSettings;
+ std::string filename=getFileName();
+ llofstream file;
+ file.open(filename.c_str());
+ LLSDSerialize::toPrettyXML(mAutoCorrects, file);
+ file.close();
+}
+void LGGAutoCorrect::runTest()
+{
+ std::string startS("He just abandonned all his abilties");
+ std::string endS = replaceWords(startS);
+ llinfos << "!!! Test of autoreplace; start with "<("EmeraldEnableAutoCorrect", &gSavedSettings, true);
+ if(!(*doAnything))return currentWord;
+
+ //loop through priorities
+ for(int currentPriority = 10;currentPriority>=0;currentPriority--)
+ {
+ LLSD::map_const_iterator loc_it = mAutoCorrects.beginMap();
+ LLSD::map_const_iterator loc_end = mAutoCorrects.endMap();
+ for ( ; loc_it != loc_end; ++loc_it)
+ {
+ const std::string& location = (*loc_it).first;
+ //llinfos << "location is "<add("EmeraldAutoReplace",args);
+ }
+ gSavedSettings.setS32("EmeraldAutoCorrectCount",gSavedSettings.getS32("EmeraldAutoCorrectCount")+1);
+ llinfos << "found a word in list " << location.c_str() << " and it will replace " << currentWord.c_str() << " => " << replacement.c_str() << llendl;
+ return replacement;
+ }
+ }
+ }
+ }
+ return currentWord;
+}
+std::string LGGAutoCorrect::replaceWords(std::string words)
+{
+ static BOOL *doAnything = rebind_llcontrol("EmeraldEnableAutoCorrect", &gSavedSettings, true);
+ if(!(*doAnything))return words;
+ //TODO update this function to use the "wordStyle" thing,
+ //but so far this function is never used, so later
+
+ boost_tokenizer tokens(words, boost::char_separator(" "));
+ for (boost_tokenizer::iterator token_iter = tokens.begin(); token_iter != tokens.end(); ++token_iter)
+ {
+ std::string currentWord(*token_iter);
+ LLSD::map_const_iterator loc_it = mAutoCorrects.beginMap();
+ LLSD::map_const_iterator loc_end = mAutoCorrects.endMap();
+ for ( ; loc_it != loc_end; ++loc_it)
+ {
+ const std::string& location = (*loc_it).first;
+ //llinfos << "location is "<add("EmeraldAutoReplace",args);
+ }
+ llinfos << "found a word in list " << location.c_str() << " and it will replace " << currentWord.c_str() << " => " << replacement.c_str() << llendl;
+ int wordStart = words.find(currentWord);
+ words.replace(wordStart,currentWord.length(),replacement);
+ return replaceWords(words);//lol recursion!
+ }
+ }
+ }
+ return words;
+}
+BOOL LGGAutoCorrect::addEntryToList(std::string wrong, std::string right, std::string listName)
+{
+ // *HACK: Make sure the "Custom" list exists, because the design of this
+ // system prevents us from updating it by changing the original file...
+ if(mAutoCorrects.has(listName))
+ {
+ mAutoCorrects[listName]["data"][wrong]=right;
+ return TRUE;
+ }
+ else if(listName == "Custom")
+ {
+ mAutoCorrects[listName]["announce"] = 0;
+ mAutoCorrects[listName]["author"] = "You";
+ mAutoCorrects[listName]["data"][wrong] = right;
+ mAutoCorrects[listName]["enabled"] = 1;
+ mAutoCorrects[listName]["priority"] = 10;
+ mAutoCorrects[listName]["wordStyle"] = 1;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+BOOL LGGAutoCorrect::removeEntryFromList(std::string wrong, std::string listName)
+{
+ if(mAutoCorrects.has(listName))
+ {
+ if(mAutoCorrects[listName]["data"].has(wrong))
+ {
+ mAutoCorrects[listName]["data"].erase(wrong);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+LLSD LGGAutoCorrect::getExampleLLSD()
+{
+ LLSD toReturn;
+
+ LLSD listone;
+ LLSD listtwo;
+
+ LLSD itemOne;
+ itemOne["wrong"]="wrong1";
+ itemOne["right"]="right1";
+ listone[0]=itemOne;
+
+ LLSD itemTwo;
+ itemTwo["wrong"]="wrong2";
+ itemTwo["right"]="right2";
+ listone[1]=itemTwo;
+
+ toReturn["listOne"]=listone;
+
+
+ itemOne["wrong"]="secondwrong1";
+ itemOne["right"]="secondright1";
+ listone[0]=itemOne;
+
+ itemTwo["wrong"]="secondwrong2";
+ itemTwo["right"]="secondright2";
+ listone[1]=itemTwo;
+
+ toReturn["listTwo"]=listone;
+
+ return toReturn;
+}
+
diff --git a/linden/indra/newview/lggautocorrect.h b/linden/indra/newview/lggautocorrect.h
new file mode 100644
index 0000000..63a7558
--- /dev/null
+++ b/linden/indra/newview/lggautocorrect.h
@@ -0,0 +1,59 @@
+/* Copyright (C) 2010 LordGregGreg Back
+
+ This 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 is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the viewer; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ 02111-1307, USA. */
+
+
+#ifndef LGG_AUTO_CORRECT
+#define LGG_AUTO_CORRECT
+class LGGAutoCorrect
+{
+ LGGAutoCorrect();
+ ~LGGAutoCorrect();
+ static LGGAutoCorrect* sInstance;
+public:
+ static LGGAutoCorrect* getInstance();
+ BOOL addCorrectionList(LLSD newList);
+ BOOL removeCorrectionList(std::string listName);
+ BOOL setListEnabled(std::string listName, BOOL enabled);
+ BOOL setListAnnounceeState(std::string listName, BOOL announce);
+ BOOL setListPriority(std::string listName, int priority);
+ BOOL setListStyle(std::string listName, BOOL announce);
+ std::string replaceWords(std::string words);
+ std::string replaceWord(std::string currentWord);
+ BOOL addEntryToList(std::string wrong, std::string right, std::string listName);
+ BOOL removeEntryFromList(std::string wrong, std::string listName);
+ BOOL saveListToDisk(std::string listName, std::string fileName);
+ LLSD exportList(std::string listName);
+ void runTest();
+ LLSD getAutoCorrects();
+ LLSD getAutoCorrectEntries(std::string listName);
+ void save();
+
+ void loadFromDisk();
+
+private:
+ void saveToDisk(LLSD newSettings);
+ LLSD getExampleLLSD();
+ std::string getFileName();
+ std::string getDefaultFileName();
+
+ LLSD mAutoCorrects;
+
+};
+
+
+
+#endif
diff --git a/linden/indra/newview/lggdicdownload.cpp b/linden/indra/newview/lggdicdownload.cpp
new file mode 100644
index 0000000..7011312
--- /dev/null
+++ b/linden/indra/newview/lggdicdownload.cpp
@@ -0,0 +1,183 @@
+/* Copyright (c) 2009
+*
+* Greg Hendrickson (LordGregGreg Back). All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or
+* without modification, are permitted provided that the following
+* conditions are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* 2. 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.
+* 3. Neither the name Modular Systems 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 MODULAR SYSTEMS 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 MODULAR SYSTEMS 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 "llviewerprecompiledheaders.h"
+
+#include "lggdicdownload.h"
+
+#include "llagentdata.h"
+#include "llcommandhandler.h"
+#include "llfloater.h"
+#include "lluictrlfactory.h"
+#include "llagent.h"
+#include "llpanel.h"
+#include "llbutton.h"
+#include "llcolorswatch.h"
+#include "llcombobox.h"
+#include "llview.h"
+#include "llprefsadvanced.h"
+#include "llhttpclient.h"
+#include "llbufferstream.h"
+
+class lggDicDownloadFloater;
+class EmeraldDicDownloader : public LLHTTPClient::Responder
+{
+public:
+ EmeraldDicDownloader(lggDicDownloadFloater * spanel,std::string sname);
+ ~EmeraldDicDownloader() { }
+ void completedRaw(
+ U32 status,
+ const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer);
+private:
+ lggDicDownloadFloater* panel;
+ std::string name;
+};
+
+
+class lggDicDownloadFloater : public LLFloater, public LLFloaterSingleton
+{
+public:
+ lggDicDownloadFloater(const LLSD& seed);
+ virtual ~lggDicDownloadFloater();
+ BOOL postBuild(void);
+ void setData(std::vector shortNames, std::vector longNames, void * data);
+ static void onClickDownload(void* data);
+ std::vector sNames;
+ std::vector lNames;
+ LLPrefsAdvanced * empanel;
+};
+lggDicDownloadFloater::~lggDicDownloadFloater()
+{
+}
+lggDicDownloadFloater::lggDicDownloadFloater(const LLSD& seed)
+{
+ LLUICtrlFactory::getInstance()->buildFloater(this, "floater_dictionaries.xml");
+
+ if (getRect().mLeft == 0
+ && getRect().mBottom == 0)
+ {
+ center();
+ }
+
+}
+
+BOOL lggDicDownloadFloater::postBuild(void)
+{
+ childSetAction("Emerald_dic_download",onClickDownload,this);
+ return true;
+}
+void lggDicDownloadFloater::setData(std::vector shortNames, std::vector longNames, void * data)
+{
+ sNames=shortNames;
+ lNames=longNames;
+ empanel = (LLPrefsAdvanced*)data;
+
+ LLComboBox* comboBox = getChild("Emerald_combo_dics");
+ if(comboBox != NULL)
+ {
+ comboBox->removeall();
+ comboBox->add("");
+ for(int i = 0; i < (int)lNames.size(); i++)
+ {
+ comboBox->add(lNames[i]);
+ }
+ comboBox->setCurrentByIndex(0);
+ }
+}
+void lggDicDownloadFloater::onClickDownload(void* data)
+{
+ lggDicDownloadFloater* self = (lggDicDownloadFloater*)data;
+ if(self)
+ {
+ //std::string selection = self->childGetValue("Emerald_combo_dics").asString();
+ LLComboBox* comboBox = self->getChild("Emerald_combo_dics");
+ if(comboBox != NULL)
+ {
+ int index = comboBox->getCurrentIndex();
+ if(index!=0)
+ {
+ index--;
+ std::string newDict(self->sNames[index]);
+ LLHTTPClient::get("http://www.modularsystems.sl/app/dics/"+newDict+".aff", new EmeraldDicDownloader(self,newDict+".aff"));
+ LLHTTPClient::get("http://www.modularsystems.sl/app/dics/"+newDict+".dic", new EmeraldDicDownloader(NULL,newDict+".dic"));
+
+ LLButton* butt = self->getChild("Emerald_dic_download");
+ if(butt)
+ {
+ butt->setLabel(LLStringExplicit("Downloading... Please Wait"));
+ butt->setEnabled(FALSE);
+ }
+
+ }
+ }
+ }
+
+
+}
+
+void LggDicDownload::show(BOOL showin, std::vector shortNames, std::vector longNames, void * data)
+{
+ if(showin)
+ {
+ lggDicDownloadFloater* dic_floater = lggDicDownloadFloater::showInstance();
+ dic_floater->setData(shortNames,longNames,data);
+ }
+}
+EmeraldDicDownloader::EmeraldDicDownloader(lggDicDownloadFloater* spanel, std::string sname):
+panel(spanel),name(sname){}
+
+
+void EmeraldDicDownloader::completedRaw(U32 status, const std::string& reason, const LLChannelDescriptors& channels, const LLIOPipe::buffer_ptr_t& buffer)
+{
+ if(status < 200 || status >= 300)
+ {
+ return;
+ }
+ LLBufferStream istr(channels, buffer.get());
+ std::string dicpath(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries",
+ name.c_str()));
+
+
+ llofstream ostr(dicpath, std::ios::binary);
+
+ while(istr.good() && ostr.good())
+ ostr << istr.rdbuf();
+ ostr.close();
+ if(panel)
+ {
+ panel->empanel->refresh();
+ panel->close();
+ }
+
+
+}
diff --git a/linden/indra/newview/lggdicdownload.h b/linden/indra/newview/lggdicdownload.h
new file mode 100644
index 0000000..75f3053
--- /dev/null
+++ b/linden/indra/newview/lggdicdownload.h
@@ -0,0 +1,37 @@
+/* Copyright (c) 2009
+*
+* Greg Hendrickson (LordGregGreg Back). All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or
+* without modification, are permitted provided that the following
+* conditions are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* 2. 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.
+* 3. Neither the name Modular Systems 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 MODULAR SYSTEMS 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 MODULAR SYSTEMS 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.
+*/
+
+class LggDicDownload
+{
+ public:
+ static void show( BOOL showw , std::vector shortNames, std::vector longNames, void * data);
+};
+
diff --git a/linden/indra/newview/lgghunspell_wrapper.cpp b/linden/indra/newview/lgghunspell_wrapper.cpp
new file mode 100644
index 0000000..36ad94a
--- /dev/null
+++ b/linden/indra/newview/lgghunspell_wrapper.cpp
@@ -0,0 +1,885 @@
+/* Copyright (C) 2009 LordGregGreg Back
+
+ This 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 is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the viewer; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ 02111-1307, USA. */
+
+#include "llviewerprecompiledheaders.h"
+#include "lgghunspell_wrapper.h"
+#include
+#include "llweb.h"
+#include "llviewercontrol.h"
+#include "llviewerwindow.h"
+#include "llfile.h"
+#include "llhttpclient.h"
+#include "lggdicdownload.h"
+
+lggHunSpell_Wrapper *glggHunSpell = 0;
+Hunspell* lggHunSpell_Wrapper::myHunspell = 0;
+// do not insert empty lines after this line until the size calculation
+#define COUNTRY_CODES_RAW_START_LINE (__LINE__ + 2)
+static char * countryCodesraw[] = {
+ (char*)"SL",(char*)"SecondLife",
+ (char*)"AD",(char*)"Andorra",
+ (char*)"AE",(char*)"United Arab Emirates",
+ (char*)"AF",(char*)"Afghanistan",
+ (char*)"AG",(char*)"Antigua & Barbuda",
+ (char*)"AI",(char*)"Anguilla",
+ (char*)"AL",(char*)"Albania",
+ (char*)"AM",(char*)"Armenia",
+ (char*)"AN",(char*)"Netherlands Antilles",
+ (char*)"AO",(char*)"Angola",
+ (char*)"AQ",(char*)"Antarctica",
+ (char*)"AR",(char*)"Argentina",
+ (char*)"AS",(char*)"American Samoa",
+ (char*)"AT",(char*)"Austria",
+ (char*)"AU",(char*)"Australia",
+ (char*)"AW",(char*)"Aruba",
+ (char*)"AZ",(char*)"Azerbaijan",
+ (char*)"BA",(char*)"Bosnia and Herzegovina",
+ (char*)"BB",(char*)"Barbados",
+ (char*)"BD",(char*)"Bangladesh",
+ (char*)"BE",(char*)"Belgium",
+ (char*)"BF",(char*)"Burkina Faso",
+ (char*)"BG",(char*)"Bulgaria",
+ (char*)"BH",(char*)"Bahrain",
+ (char*)"BI",(char*)"Burundi",
+ (char*)"BJ",(char*)"Benin",
+ (char*)"BM",(char*)"Bermuda",
+ (char*)"BN",(char*)"Brunei Darussalam",
+ (char*)"BO",(char*)"Bolivia",
+ (char*)"BR",(char*)"Brazil",
+ (char*)"BS",(char*)"Bahama",
+ (char*)"BT",(char*)"Bhutan",
+ (char*)"BU",(char*)"Burma",
+ (char*)"BV",(char*)"Bouvet Island",
+ (char*)"BW",(char*)"Botswana",
+ (char*)"BY",(char*)"Belarus",
+ (char*)"BZ",(char*)"Belize",
+ (char*)"CA",(char*)"Canada",
+ (char*)"CC",(char*)"Cocos (Keeling) Islands",
+ (char*)"CF",(char*)"Central African Republic",
+ (char*)"CG",(char*)"Congo",
+ (char*)"CH",(char*)"Switzerland",
+ (char*)"CI",(char*)"Côte D'ivoire (Ivory Coast)",
+ (char*)"CK",(char*)"Cook Iislands",
+ (char*)"CL",(char*)"Chile",
+ (char*)"CM",(char*)"Cameroon",
+ (char*)"CN",(char*)"China",
+ (char*)"CO",(char*)"Colombia",
+ (char*)"CR",(char*)"Costa Rica",
+ (char*)"CS",(char*)"Czechoslovakia",
+ (char*)"CU",(char*)"Cuba",
+ (char*)"CV",(char*)"Cape Verde",
+ (char*)"CX",(char*)"Christmas Island",
+ (char*)"CY",(char*)"Cyprus",
+ (char*)"CZ",(char*)"Czech Republic",
+ (char*)"DD",(char*)"German Democratic Republic",
+ (char*)"DE",(char*)"Germany",
+ (char*)"DJ",(char*)"Djibouti",
+ (char*)"DK",(char*)"Denmark",
+ (char*)"DM",(char*)"Dominica",
+ (char*)"DO",(char*)"Dominican Republic",
+ (char*)"DZ",(char*)"Algeria",
+ (char*)"EC",(char*)"Ecuador",
+ (char*)"EE",(char*)"Estonia",
+ (char*)"EG",(char*)"Egypt",
+ (char*)"EH",(char*)"Western Sahara",
+ (char*)"ER",(char*)"Eritrea",
+ (char*)"ES",(char*)"Spain",
+ (char*)"ET",(char*)"Ethiopia",
+ (char*)"FI",(char*)"Finland",
+ (char*)"FJ",(char*)"Fiji",
+ (char*)"FK",(char*)"Falkland Islands (Malvinas)",
+ (char*)"FM",(char*)"Micronesia",
+ (char*)"FO",(char*)"Faroe Islands",
+ (char*)"FR",(char*)"France",
+ (char*)"FX",(char*)"France, Metropolitan",
+ (char*)"GA",(char*)"Gabon",
+ (char*)"GB",(char*)"United Kingdom (Great Britain)",
+ (char*)"GD",(char*)"Grenada",
+ (char*)"GE",(char*)"Georgia",
+ (char*)"GF",(char*)"French Guiana",
+ (char*)"GH",(char*)"Ghana",
+ (char*)"GI",(char*)"Gibraltar",
+ (char*)"GL",(char*)"Greenland",
+ (char*)"GM",(char*)"Gambia",
+ (char*)"GN",(char*)"Guinea",
+ (char*)"GP",(char*)"Guadeloupe",
+ (char*)"GQ",(char*)"Equatorial Guinea",
+ (char*)"GR",(char*)"Greece",
+ (char*)"GS",(char*)"South Georgia and the South Sandwich Islands",
+ (char*)"GT",(char*)"Guatemala",
+ (char*)"GU",(char*)"Guam",
+ (char*)"GW",(char*)"Guinea-Bissau",
+ (char*)"GY",(char*)"Guyana",
+ (char*)"HK",(char*)"Hong Kong",
+ (char*)"HM",(char*)"Heard & McDonald Islands",
+ (char*)"HN",(char*)"Honduras",
+ (char*)"HR",(char*)"Croatia",
+ (char*)"HT",(char*)"Haiti",
+ (char*)"HU",(char*)"Hungary",
+ (char*)"ID",(char*)"Indonesia",
+ (char*)"IE",(char*)"Ireland",
+ (char*)"IL",(char*)"Israel",
+ (char*)"IN",(char*)"India",
+ (char*)"IO",(char*)"British Indian Ocean Territory",
+ (char*)"IQ",(char*)"Iraq",
+ (char*)"IR",(char*)"Islamic Republic of Iran",
+ (char*)"IS",(char*)"Iceland",
+ (char*)"IT",(char*)"Italy",
+ (char*)"JM",(char*)"Jamaica",
+ (char*)"JO",(char*)"Jordan",
+ (char*)"JP",(char*)"Japan",
+ (char*)"KE",(char*)"Kenya",
+ (char*)"KG",(char*)"Kyrgyzstan",
+ (char*)"KH",(char*)"Cambodia",
+ (char*)"KI",(char*)"Kiribati",
+ (char*)"KM",(char*)"Comoros",
+ (char*)"KN",(char*)"St. Kitts and Nevis",
+ (char*)"KP",(char*)"Korea, Democratic People's Republic of",
+ (char*)"KR",(char*)"Korea, Republic of",
+ (char*)"KW",(char*)"Kuwait",
+ (char*)"KY",(char*)"Cayman Islands",
+ (char*)"KZ",(char*)"Kazakhstan",
+ (char*)"LA",(char*)"Lao People's Democratic Republic",
+ (char*)"LB",(char*)"Lebanon",
+ (char*)"LC",(char*)"Saint Lucia",
+ (char*)"LI",(char*)"Liechtenstein",
+ (char*)"LK",(char*)"Sri Lanka",
+ (char*)"LR",(char*)"Liberia",
+ (char*)"LS",(char*)"Lesotho",
+ (char*)"LT",(char*)"Lithuania",
+ (char*)"LU",(char*)"Luxembourg",
+ (char*)"LV",(char*)"Latvia",
+ (char*)"LY",(char*)"Libyan Arab Jamahiriya",
+ (char*)"MA",(char*)"Morocco",
+ (char*)"MC",(char*)"Monaco",
+ (char*)"MD",(char*)"Moldova, Republic of",
+ (char*)"MG",(char*)"Madagascar",
+ (char*)"MH",(char*)"Marshall Islands",
+ (char*)"ML",(char*)"Mali",
+ (char*)"MN",(char*)"Mongolia",
+ (char*)"MM",(char*)"Myanmar",
+ (char*)"MO",(char*)"Macau",
+ (char*)"MP",(char*)"Northern Mariana Islands",
+ (char*)"MQ",(char*)"Martinique",
+ (char*)"MR",(char*)"Mauritania",
+ (char*)"MS",(char*)"Monserrat",
+ (char*)"MT",(char*)"Malta",
+ (char*)"MU",(char*)"Mauritius",
+ (char*)"MV",(char*)"Maldives",
+ (char*)"MW",(char*)"Malawi",
+ (char*)"MX",(char*)"Mexico",
+ (char*)"MY",(char*)"Malaysia",
+ (char*)"MZ",(char*)"Mozambique",
+ (char*)"NA",(char*)"Namibia",
+ (char*)"NC",(char*)"New Caledonia",
+ (char*)"NE",(char*)"Niger",
+ (char*)"NF",(char*)"Norfolk Island",
+ (char*)"NG",(char*)"Nigeria",
+ (char*)"NI",(char*)"Nicaragua",
+ (char*)"NL",(char*)"Netherlands",
+ (char*)"NO",(char*)"Norway",
+ (char*)"NP",(char*)"Nepal",
+ (char*)"NR",(char*)"Nauru",
+ (char*)"NT",(char*)"Neutral Zone",
+ (char*)"NU",(char*)"Niue",
+ (char*)"NZ",(char*)"New Zealand",
+ (char*)"OM",(char*)"Oman",
+ (char*)"PA",(char*)"Panama",
+ (char*)"PE",(char*)"Peru",
+ (char*)"PF",(char*)"French Polynesia",
+ (char*)"PG",(char*)"Papua New Guinea",
+ (char*)"PH",(char*)"Philippines",
+ (char*)"PK",(char*)"Pakistan",
+ (char*)"PL",(char*)"Poland",
+ (char*)"PM",(char*)"St. Pierre & Miquelon",
+ (char*)"PN",(char*)"Pitcairn",
+ (char*)"PR",(char*)"Puerto Rico",
+ (char*)"PT",(char*)"Portugal",
+ (char*)"PW",(char*)"Palau",
+ (char*)"PY",(char*)"Paraguay",
+ (char*)"QA",(char*)"Qatar",
+ (char*)"RE",(char*)"Réunion",
+ (char*)"RO",(char*)"Romania",
+ (char*)"RU",(char*)"Russian Federation",
+ (char*)"RW",(char*)"Rwanda",
+ (char*)"SA",(char*)"Saudi Arabia",
+ (char*)"SB",(char*)"Solomon Islands",
+ (char*)"SC",(char*)"Seychelles",
+ (char*)"SD",(char*)"Sudan",
+ (char*)"SE",(char*)"Sweden",
+ (char*)"SG",(char*)"Singapore",
+ (char*)"SH",(char*)"St. Helena",
+ (char*)"SI",(char*)"Slovenia",
+ (char*)"SJ",(char*)"Svalbard & Jan Mayen Islands",
+ (char*)"SK",(char*)"Slovakia",
+ (char*)"SL",(char*)"Sierra Leone",
+ (char*)"SM",(char*)"San Marino",
+ (char*)"SN",(char*)"Senegal",
+ (char*)"SO",(char*)"Somalia",
+ (char*)"SR",(char*)"Suriname",
+ (char*)"ST",(char*)"Sao Tome & Principe",
+ (char*)"SU",(char*)"Union of Soviet Socialist Republics",
+ (char*)"SV",(char*)"El Salvador",
+ (char*)"SY",(char*)"Syrian Arab Republic",
+ (char*)"SZ",(char*)"Swaziland",
+ (char*)"TC",(char*)"Turks & Caicos Islands",
+ (char*)"TD",(char*)"Chad",
+ (char*)"TF",(char*)"French Southern Territories",
+ (char*)"TG",(char*)"Togo",
+ (char*)"TH",(char*)"Thailand",
+ (char*)"TJ",(char*)"Tajikistan",
+ (char*)"TK",(char*)"Tokelau",
+ (char*)"TM",(char*)"Turkmenistan",
+ (char*)"TN",(char*)"Tunisia",
+ (char*)"TO",(char*)"Tonga",
+ (char*)"TP",(char*)"East Timor",
+ (char*)"TR",(char*)"Turkey",
+ (char*)"TT",(char*)"Trinidad & Tobago",
+ (char*)"TV",(char*)"Tuvalu",
+ (char*)"TW",(char*)"Taiwan, Province of China",
+ (char*)"TZ",(char*)"Tanzania, United Republic of",
+ (char*)"UA",(char*)"Ukraine",
+ (char*)"UG",(char*)"Uganda",
+ (char*)"UM",(char*)"United States Minor Outlying Islands",
+ (char*)"US",(char*)"United States of America",
+ (char*)"UY",(char*)"Uruguay",
+ (char*)"UZ",(char*)"Uzbekistan",
+ (char*)"VA",(char*)"Vatican City State",
+ (char*)"VC",(char*)"St. Vincent & the Grenadines",
+ (char*)"VE",(char*)"Venezuela",
+ (char*)"VG",(char*)"British Virgin Islands",
+ (char*)"VI",(char*)"United States Virgin Islands",
+ (char*)"VN",(char*)"Viet Nam",
+ (char*)"VU",(char*)"Vanuatu",
+ (char*)"WF",(char*)"Wallis & Futuna Islands",
+ (char*)"WS",(char*)"Samoa",
+ (char*)"YD",(char*)"Democratic Yemen",
+ (char*)"YE",(char*)"Yemen",
+ (char*)"YT",(char*)"Mayotte",
+ (char*)"YU",(char*)"Yugoslavia",
+ (char*)"ZA",(char*)"South Africa",
+ (char*)"ZM",(char*)"Zambia",
+ (char*)"ZR",(char*)"Zaire",
+ (char*)"ZW",(char*)"Zimbabwe",
+ (char*)"ZZ",(char*)"Unknown or unspecified country"
+};
+//#define COUNTRY_CODES_RAW_SIZE ((__LINE__ - 1 - COUNTRY_CODES_RAW_START_LINE) * 2)
+#define COUNTRY_CODES_RAW_SIZE 492
+#define LANGUAGE_CODES_RAW_START_LINE (__LINE__ + 2)
+static char * languageCodesraw[]={
+ (char*)"aa",(char*)"Afar",
+ (char*)"ab",(char*)"Abkhazian",
+ (char*)"ae",(char*)"Avestan",
+ (char*)"af",(char*)"Afrikaans",
+ (char*)"ak",(char*)"Akan",
+ (char*)"am",(char*)"Amharic",
+ (char*)"an",(char*)"Aragonese",
+ (char*)"ar",(char*)"Arabic",
+ (char*)"as",(char*)"Assamese",
+ (char*)"av",(char*)"Avaric",
+ (char*)"ay",(char*)"Aymara",
+ (char*)"az",(char*)"Azerbaijani",
+ (char*)"ba",(char*)"Bashkir",
+ (char*)"be",(char*)"Belarusian",
+ (char*)"bg",(char*)"Bulgarian",
+ (char*)"bh",(char*)"Bihari",
+ (char*)"bi",(char*)"Bislama",
+ (char*)"bm",(char*)"Bambara",
+ (char*)"bn",(char*)"Bengali",
+ (char*)"bo",(char*)"Tibetan",
+ (char*)"br",(char*)"Breton",
+ (char*)"bs",(char*)"Bosnian",
+ (char*)"ca",(char*)"Catalan",
+ (char*)"ce",(char*)"Chechen",
+ (char*)"ch",(char*)"Chamorro",
+ (char*)"co",(char*)"Corsican",
+ (char*)"cr",(char*)"Cree",
+ (char*)"cs",(char*)"Czech",
+ (char*)"cu",(char*)"ChurchSlavic",
+ (char*)"cv",(char*)"Chuvash",
+ (char*)"cy",(char*)"Welsh",
+ (char*)"da",(char*)"Danish",
+ (char*)"de",(char*)"German",
+ (char*)"dv",(char*)"Divehi",
+ (char*)"dz",(char*)"Dzongkha",
+ (char*)"ee",(char*)"Ewe",
+ (char*)"el",(char*)"ModernGreek",
+ (char*)"en",(char*)"English",
+ (char*)"eo",(char*)"Esperanto",
+ (char*)"es",(char*)"Spanish",
+ (char*)"et",(char*)"Estonian",
+ (char*)"eu",(char*)"Basque",
+ (char*)"fa",(char*)"Persian",
+ (char*)"ff",(char*)"Fulah",
+ (char*)"fi",(char*)"Finnish",
+ (char*)"fj",(char*)"Fijian",
+ (char*)"fo",(char*)"Faroese",
+ (char*)"fr",(char*)"French",
+ (char*)"fy",(char*)"WesternFrisian",
+ (char*)"ga",(char*)"Irish",
+ (char*)"gd",(char*)"Gaelic",
+ (char*)"gl",(char*)"Galician",
+ (char*)"gn",(char*)"Guaraní",
+ (char*)"gu",(char*)"Gujarati",
+ (char*)"gv",(char*)"Manx",
+ (char*)"ha",(char*)"Hausa",
+ (char*)"he",(char*)"ModernHebrew",
+ (char*)"hi",(char*)"Hindi",
+ (char*)"ho",(char*)"HiriMotu",
+ (char*)"hr",(char*)"Croatian",
+ (char*)"ht",(char*)"Haitian",
+ (char*)"hu",(char*)"Hungarian",
+ (char*)"hy",(char*)"Armenian",
+ (char*)"hz",(char*)"Herero",
+ (char*)"ia",(char*)"Interlingua",
+ (char*)"id",(char*)"Indonesian",
+ (char*)"ie",(char*)"Interlingue",
+ (char*)"ig",(char*)"Igbo",
+ (char*)"ii",(char*)"SichuanYi",
+ (char*)"ik",(char*)"Inupiaq",
+ (char*)"io",(char*)"Ido",
+ (char*)"is",(char*)"Icelandic",
+ (char*)"it",(char*)"Italian",
+ (char*)"iu",(char*)"Inuktitut",
+ (char*)"ja",(char*)"Japanese",
+ (char*)"jv",(char*)"Javanese",
+ (char*)"ka",(char*)"Georgian",
+ (char*)"kg",(char*)"Kongo",
+ (char*)"ki",(char*)"Kikuyu",
+ (char*)"kj",(char*)"Kwanyama",
+ (char*)"kk",(char*)"Kazakh",
+ (char*)"kl",(char*)"Kalaallisut",
+ (char*)"km",(char*)"CentralKhmer",
+ (char*)"kn",(char*)"Kannada",
+ (char*)"ko",(char*)"Korean",
+ (char*)"kr",(char*)"Kanuri",
+ (char*)"ks",(char*)"Kashmiri",
+ (char*)"ku",(char*)"Kurdish",
+ (char*)"kv",(char*)"Komi",
+ (char*)"kw",(char*)"Cornish",
+ (char*)"ky",(char*)"Kirghiz",
+ (char*)"la",(char*)"Latin",
+ (char*)"lb",(char*)"Luxembourgish",
+ (char*)"lg",(char*)"Ganda",
+ (char*)"li",(char*)"Limburgish",
+ (char*)"ln",(char*)"Lingala",
+ (char*)"lo",(char*)"Lao",
+ (char*)"lt",(char*)"Lithuanian",
+ (char*)"lu",(char*)"Luba-Katanga",
+ (char*)"lv",(char*)"Latvian",
+ (char*)"mg",(char*)"Malagasy",
+ (char*)"mh",(char*)"Marshallese",
+ (char*)"mi",(char*)"Maori",
+ (char*)"mk",(char*)"Macedonian",
+ (char*)"ml",(char*)"Malayalam",
+ (char*)"mn",(char*)"Mongolian",
+ (char*)"mr",(char*)"Marathi",
+ (char*)"ms",(char*)"Malay",
+ (char*)"mt",(char*)"Maltese",
+ (char*)"my",(char*)"Burmese",
+ (char*)"na",(char*)"Nauru",
+ (char*)"nb",(char*)"NorwegianBokmal",
+ (char*)"nd",(char*)"NorthNdebele",
+ (char*)"ne",(char*)"Nepali",
+ (char*)"ng",(char*)"Ndonga",
+ (char*)"nl",(char*)"Dutch/Flemish",
+ (char*)"nn",(char*)"NorwegianNynorsk",
+ (char*)"no",(char*)"Norwegian",
+ (char*)"nr",(char*)"SouthNdebele",
+ (char*)"nv",(char*)"Navajo/Navaho",
+ (char*)"ny",(char*)"Nyanja",
+ (char*)"oc",(char*)"Occitan",
+ (char*)"oj",(char*)"Ojibwa",
+ (char*)"om",(char*)"Oromo",
+ (char*)"or",(char*)"Oriya",
+ (char*)"os",(char*)"Ossetian",
+ (char*)"pa",(char*)"Panjabi",
+ (char*)"pi",(char*)"Pali",
+ (char*)"pl",(char*)"Polish",
+ (char*)"ps",(char*)"Pashto/Pushto",
+ (char*)"pt",(char*)"Portuguese",
+ (char*)"qu",(char*)"Quechua",
+ (char*)"rm",(char*)"Romansh",
+ (char*)"rn",(char*)"Rundi",
+ (char*)"ro",(char*)"Romanian",
+ (char*)"ru",(char*)"Russian",
+ (char*)"rw",(char*)"Kinyarwanda",
+ (char*)"sa",(char*)"Sanskrit",
+ (char*)"sc",(char*)"Sardinian",
+ (char*)"sd",(char*)"Sindhi",
+ (char*)"se",(char*)"NorthernSami",
+ (char*)"sg",(char*)"Sango",
+ (char*)"si",(char*)"Sinhala",
+ (char*)"sk",(char*)"Slovak",
+ (char*)"sl",(char*)"Slovene",
+ (char*)"sm",(char*)"Samoan",
+ (char*)"sn",(char*)"Shona",
+ (char*)"so",(char*)"Somali",
+ (char*)"sq",(char*)"Albanian",
+ (char*)"sr",(char*)"Serbian",
+ (char*)"ss",(char*)"Swati",
+ (char*)"st",(char*)"SouthernSotho",
+ (char*)"su",(char*)"Sundanese",
+ (char*)"sv",(char*)"Swedish",
+ (char*)"sw",(char*)"Swahili",
+ (char*)"ta",(char*)"Tamil",
+ (char*)"te",(char*)"Telugu",
+ (char*)"tg",(char*)"Tajik",
+ (char*)"th",(char*)"Thai",
+ (char*)"ti",(char*)"Tigrinya",
+ (char*)"tk",(char*)"Turkmen",
+ (char*)"tl",(char*)"Tagalog",
+ (char*)"tn",(char*)"Tswana",
+ (char*)"to",(char*)"Tonga",
+ (char*)"tr",(char*)"Turkish",
+ (char*)"ts",(char*)"Tsonga",
+ (char*)"tt",(char*)"Tatar",
+ (char*)"tw",(char*)"Twi",
+ (char*)"ty",(char*)"Tahitian",
+ (char*)"ug",(char*)"Uighur",
+ (char*)"uk",(char*)"Ukrainian",
+ (char*)"ur",(char*)"Urdu",
+ (char*)"uz",(char*)"Uzbek",
+ (char*)"ve",(char*)"Venda",
+ (char*)"vi",(char*)"Vietnamese",
+ (char*)"vo",(char*)"Volapük",
+ (char*)"wa",(char*)"Walloon",
+ (char*)"wo",(char*)"Wolof",
+ (char*)"xh",(char*)"Xhosa",
+ (char*)"yi",(char*)"Yiddish",
+ (char*)"yo",(char*)"Yoruba",
+ (char*)"za",(char*)"Zhuang",
+ (char*)"zh",(char*)"Chinese",
+ (char*)"zu",(char*)"Zulu"
+};
+//#define LANGUAGE_CODES_RAW_SIZE ((__LINE__ - 1 - LANGUAGE_CODES_RAW_START_LINE) * 2)
+#define LANGUAGE_CODES_RAW_SIZE 368
+lggHunSpell_Wrapper::lggHunSpell_Wrapper()
+{
+ highlightInRed=false;
+ //languageCodes(begin(languageCodesraw), end(languageCodesraw));
+}
+lggHunSpell_Wrapper::~lggHunSpell_Wrapper(){}
+std::string lggHunSpell_Wrapper::getCorrectPath(std::string file)
+{
+ //finds out if it is in user dir, if not, takes it from app dir
+ std::string dicpath1(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries", file).c_str());
+ if(!gDirUtilp->fileExists(dicpath1))
+ dicpath1=gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "dictionaries", file).c_str();
+
+ return dicpath1;
+}
+void lggHunSpell_Wrapper::setNewDictionary(std::string newDict)
+{
+
+ llinfos << "Setting new base dictionary long name is-> " << newDict.c_str() << llendl;
+
+ currentBaseDic=newDict;
+
+ //expecting a full name comming in
+ newDict = fullName2DictName(newDict);
+
+ if(myHunspell)delete myHunspell;
+
+ std::string dicaffpath=getCorrectPath(newDict+".aff");
+ std::string dicdicpath=getCorrectPath(newDict+".dic");
+
+ llinfos << "Setting new base dictionary -> " << dicaffpath.c_str() << llendl;
+
+ myHunspell = new Hunspell(dicaffpath.c_str(),dicdicpath.c_str());
+ llinfos << "Adding custom dictionary " << llendl;
+ createCustomDic();
+ addDictionary("emerald_custom");
+ std::vector toInstall = getInstalledDicts();
+ for(int i =0;i<(int)toInstall.size();i++)
+ addDictionary(toInstall[i]);
+
+
+}
+void lggHunSpell_Wrapper::createCustomDic()
+{
+ std::string filename(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,
+ "dictionaries", "emerald_custom.dic"));
+ if(!gDirUtilp->fileExists(filename))
+ {
+ llofstream export_file;
+ export_file.open(filename);
+ std::string sizePart("1\nLordGregGreg\n");
+ export_file.write(sizePart.c_str(),sizePart.length());
+ export_file.close();
+ }
+}
+void lggHunSpell_Wrapper::addWordToCustomDictionary(std::string wordToAdd)
+{
+ if(!myHunspell)return;
+ myHunspell->add(wordToAdd.c_str());
+ std::string filename(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries", "emerald_custom.dic"));
+ std::vector lines;
+ if(gDirUtilp->fileExists(filename))
+ {
+ //get words already there..
+ llifstream importer(filename);
+ std::string line;
+ if(getline( importer, line ))//ignored the size
+ {
+ while( getline( importer, line ) ) lines.push_back(line);
+ }
+ importer.close();
+ }
+ llofstream export_file;
+ export_file.open(filename);
+ std::string sizePart(llformat("%i",(int)(lines.size()+1))+"\n");
+ export_file.write(sizePart.c_str(),sizePart.length());
+ for(int i=0;i<(int)lines.size();i++)
+ export_file.write(std::string(lines[i]+"\n").c_str(),lines[i].length()+1);
+ //LLStringUtil::toLower(wordToAdd);
+ wordToAdd=wordToAdd+std::string("\n");
+ export_file.write(wordToAdd.c_str(),wordToAdd.length());
+ //export_file << std::hex << 10 ;
+ export_file.close();
+}
+BOOL lggHunSpell_Wrapper::isSpelledRight(std::string wordToCheck)
+{
+ if(!myHunspell)return TRUE;
+ if(wordToCheck.length()<3)return TRUE;
+ return myHunspell->spell(wordToCheck.c_str());
+}
+std::vector lggHunSpell_Wrapper::getSuggestionList(std::string badWord)
+{
+ std::vector toReturn;
+ if(!myHunspell)return toReturn;
+ char ** suggestionList;
+ int numberOfSuggestions = myHunspell->suggest(&suggestionList, badWord.c_str());
+ if(numberOfSuggestions <= 0)
+ return toReturn;
+ for (int i = 0; i < numberOfSuggestions; i++)
+ {
+ std::string tempSugg(suggestionList[i]);
+ toReturn.push_back(tempSugg);
+ }
+ myHunspell->free_list(&suggestionList,numberOfSuggestions);
+ return toReturn;
+}
+void lggHunSpell_Wrapper::debugTest(std::string testWord)
+{
+ llinfos << "Testing to see if " << testWord.c_str() << " is spelled correct" << llendl;
+
+ if( isSpelledRight(testWord))
+ {
+ llinfos << testWord.c_str() << " is spelled correctly" << llendl;
+ }else
+ {
+ llinfos << testWord.c_str() << " is not spelled correctly, getting suggestions" << llendl;
+ std::vector suggList;
+ suggList.clear();
+ suggList = getSuggestionList(testWord);
+ llinfos << "Got suggestions.. " << llendl;
+
+ for(int i = 0; i<(int)suggList.size();i++)
+ {
+ llinfos << "Suggestion for " << testWord.c_str() << ":" << suggList[i].c_str() << llendl;
+ }
+
+ }
+
+}
+void lggHunSpell_Wrapper::initSettings()
+{
+ glggHunSpell = new lggHunSpell_Wrapper();
+ glggHunSpell->processSettings();
+}
+void lggHunSpell_Wrapper::processSettings()
+{
+ //expects everything to already be in saved settings
+ //this will also reload and read the installed dicts
+ setNewDictionary(gSavedSettings.getString("EmeraldSpellBase"));
+ highlightInRed= gSavedSettings.getBOOL("EmeraldSpellDisplay");
+
+}
+void lggHunSpell_Wrapper::addDictionary(std::string additionalDictionary)
+{
+ if(!myHunspell)return;
+ if(additionalDictionary=="")return;
+ //expecting a full name here
+ std::string dicpath=getCorrectPath(fullName2DictName(additionalDictionary)+".dic");
+ if(gDirUtilp->fileExists(dicpath))
+ {
+ llinfos << "Adding additional dictionary -> " << dicpath.c_str() << llendl;
+ myHunspell->add_dic(dicpath.c_str());
+ }
+}
+std::string lggHunSpell_Wrapper::dictName2FullName(std::string dictName)
+{
+ if(dictName==std::string(""))return std::string("");
+ std::string countryCode="";
+ std::string languageCode="";
+ //remove extension
+ dictName = dictName.substr(0,dictName.find("."));
+ //break it up by - or _
+ S32 breakPoint = dictName.find("-");
+ if(breakPoint==std::string::npos)
+ breakPoint = dictName.find("_");
+ if(breakPoint==std::string::npos)
+ {
+ //no country code given
+ languageCode=dictName;
+ }else
+ {
+ languageCode=dictName.substr(0,breakPoint);
+ countryCode=dictName.substr(breakPoint+1);
+ }
+ //get long language code
+ for(int i =0;i lggHunSpell_Wrapper::getDicts()
+{
+ std::vector names;
+ std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "dictionaries", ""));
+ bool found = true;
+ while(found)
+ {
+ std::string name;
+ found = gDirUtilp->getNextFileInDir(path_name, "*.aff", name, false);
+ if(found)
+ {
+ names.push_back(dictName2FullName(name));
+ }
+ }
+ path_name=gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries", "");
+ found=true;
+ while(found)
+ {
+ std::string name;
+ found = gDirUtilp->getNextFileInDir(path_name, "*.aff", name, false);
+ if(found)
+ {
+ names.push_back(dictName2FullName(name));
+ }
+ }
+
+ return names;
+}
+std::vector lggHunSpell_Wrapper::getExtraDicts()
+{
+ std::vector names;
+ std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "dictionaries", ""));
+ bool found = true;
+ while(found)
+ {
+ std::string name;
+ found = gDirUtilp->getNextFileInDir(path_name, "*.dic", name, false);
+ if(found)
+ {
+ names.push_back(dictName2FullName(name));
+ }
+ }
+ path_name=gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries", "");
+ found=true;
+ while(found)
+ {
+ std::string name;
+ found = gDirUtilp->getNextFileInDir(path_name, "*.dic", name, false);
+ if(found)
+ {
+ names.push_back(dictName2FullName(name));
+ }
+ }
+ return names;
+}
+std::vector lggHunSpell_Wrapper::getInstalledDicts()
+{
+ std::vector toReturn;
+ //expecting short names to be stored...
+ std::vector shortNames = CSV2VEC(gSavedSettings.getString("EmeraldSpellInstalled"));
+ for(int i =0;i<(int)shortNames.size();i++)
+ toReturn.push_back(dictName2FullName(shortNames[i]));
+ return toReturn;
+}
+std::vector lggHunSpell_Wrapper::getAvailDicts()
+{
+ std::vector toReturn;
+ std::vector dics = getExtraDicts();
+ std::vector installedDics = getInstalledDicts();
+ for(int i =0;i<(int)dics.size();i++)
+ {
+ bool found = false;
+ for(int j=0;j<(int)installedDics.size();j++)
+ {
+ if(0==LLStringUtil::compareInsensitive(dics[i],installedDics[j]))
+ found=true;//this dic is already installed
+ }
+ if(0==LLStringUtil::compareInsensitive(dics[i],currentBaseDic))
+ found=true;
+ if(0==LLStringUtil::compareInsensitive(dics[i],"Emerald (CUSTOM)"))
+ found=true;
+ if(!found)toReturn.push_back(dics[i]);
+ }
+ return toReturn;
+}
+std::vector lggHunSpell_Wrapper::CSV2VEC(std::string csv)
+{
+ std::vector toReturn;
+ boost::regex re(",");
+ boost::sregex_token_iterator i(csv.begin(), csv.end(), re, -1);
+ boost::sregex_token_iterator j;
+ while(i != j)
+ toReturn.push_back(*i++);
+ return toReturn;
+}
+std::string lggHunSpell_Wrapper::VEC2CSV(std::vector vec)
+{
+ std::string toReturn="";
+ if(vec.size()<1)return toReturn;
+ for(int i = 0;i<(int)vec.size();i++)
+ toReturn+=vec[i]+",";
+ return toReturn.erase(toReturn.length()-1);
+}
+void lggHunSpell_Wrapper::addButton(std::string selection)
+{
+ if(selection=="")return;
+ addDictionary(selection);
+ std::vector alreadyInstalled = CSV2VEC(gSavedSettings.getString("EmeraldSpellInstalled"));
+ alreadyInstalled.push_back(fullName2DictName(selection));
+ gSavedSettings.setString("EmeraldSpellInstalled",VEC2CSV(alreadyInstalled));
+}
+void lggHunSpell_Wrapper::removeButton(std::string selection)
+{
+ if(selection=="")return;
+ std::vector newInstalledDics;
+ std::vector currentlyInstalled = getInstalledDicts();
+ for(int i =0;i<(int)currentlyInstalled.size();i++)
+ {
+ if(0!=LLStringUtil::compareInsensitive(selection,currentlyInstalled[i]))
+ newInstalledDics.push_back(fullName2DictName(currentlyInstalled[i]));
+ }
+ gSavedSettings.setString("EmeraldSpellInstalled",VEC2CSV(newInstalledDics));
+ processSettings();
+}
+void lggHunSpell_Wrapper::newDictSelection(std::string selection)
+{
+ currentBaseDic=selection;
+ gSavedSettings.setString("EmeraldSpellBase",selection);
+ //better way to do this would be to check and see if there is a installed conflict
+ //and then only remove that one.. messy
+ gSavedSettings.setString("EmeraldSpellInstalled","en_sl");
+ processSettings();
+}
+void lggHunSpell_Wrapper::getMoreButton(void * data)
+{
+ std::vector shortNames;
+ std::vector longNames;
+ LLSD response = LLHTTPClient::blockingGet("http://www.modularsystems.sl/app/dics/dic_list.xml");
+ if(response.has("body"))
+ {
+ const LLSD &dict_list = response["body"];
+ if(dict_list.has("isComplete"))
+ {
+ LLSD dics = dict_list["data"];
+ for(int i = 0; i < dics.size(); i++)
+ {
+ std::string dicFullName = dictName2FullName(dics[i].asString());
+ longNames.push_back(dicFullName);
+ shortNames.push_back(fullName2DictName(dicFullName));
+ }
+ LggDicDownload::show(true,shortNames,longNames, data);
+ }
+ }
+}
+void lggHunSpell_Wrapper::editCustomButton()
+{
+ std::string dicdicpath(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries", std::string("emerald_custom.dic")).c_str());
+
+ std::vector lines;
+
+ if(!gDirUtilp->fileExists(dicdicpath))
+ {
+ createCustomDic();
+ //glggHunSpell->addWordToCustomDictionary("temp");
+ }
+
+ gViewerWindow->getWindow()->ShellEx(dicdicpath);
+}
+
+void lggHunSpell_Wrapper::setNewHighlightSetting( BOOL highlight )
+{
+ highlightInRed=highlight;
+}
diff --git a/linden/indra/newview/lgghunspell_wrapper.h b/linden/indra/newview/lgghunspell_wrapper.h
new file mode 100644
index 0000000..348f479
--- /dev/null
+++ b/linden/indra/newview/lgghunspell_wrapper.h
@@ -0,0 +1,74 @@
+/* Copyright (C) 2009 LordGregGreg Back
+
+ This 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 is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the viewer; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ 02111-1307, USA. */
+
+#ifndef ASPELL_WRAPPER
+#define ASPELL_WRAPPER 1
+
+#if LL_WINDOWS
+#include "hunspell/hunspelldll.h"
+#else
+#include "hunspell/hunspell.hxx"
+#endif
+
+class lggHunSpell_Wrapper
+{
+
+public:
+ static Hunspell * myHunspell;
+
+ BOOL highlightInRed;
+
+ static void initSettings();
+ void processSettings();
+
+ std::vector getAvailDicts();
+ std::vector getInstalledDicts();
+ std::vector getDicts();
+ std::vector getExtraDicts();
+ void addDictionary(std::string additionalDictionary);
+ void addWordToCustomDictionary(std::string wordToAdd);
+ void addButton(std::string selection);
+ void removeButton(std::string selection);
+ void editCustomButton();
+ void newDictSelection(std::string selection);
+ void getMoreButton(void * data);
+ static std::string dictName2FullName(std::string dictName);
+ static std::string fullName2DictName(std::string fullName);
+ void setNewDictionary(std::string newDict);
+ void setNewHighlightSetting(BOOL highlight);
+ BOOL isSpelledRight(std::string wordToCheck);
+ std::vector getSuggestionList(std::string badWord);
+ S32 findNextError(std::string haystack, int startAt);
+
+ std::vector CSV2VEC(std::string csv);
+ std::string VEC2CSV(std::vector vec);
+
+private:
+ void createCustomDic();
+ std::string getCorrectPath(std::string file);
+ lggHunSpell_Wrapper();
+ ~lggHunSpell_Wrapper();
+
+ void debugTest(std::string testWord);//prints out debug about testing the word
+ std::string currentBaseDic;
+ //std::vector languageCodes;
+ //std::vector countryCodes;
+};
+
+extern lggHunSpell_Wrapper *glggHunSpell; // the singleton hunspell wrapper
+
+#endif
diff --git a/linden/indra/newview/llprefsadvanced.cpp b/linden/indra/newview/llprefsadvanced.cpp
index 56c72c4..4ae093e 100644
--- a/linden/indra/newview/llprefsadvanced.cpp
+++ b/linden/indra/newview/llprefsadvanced.cpp
@@ -37,12 +37,19 @@
#include "llviewercontrol.h"
#include "llviewermenu.h"
#include "llvoavatar.h"
+#include "lgghunspell_wrapper.h"
+#include "llcombobox.h"
#include "lluictrlfactory.h"
+LLPrefsAdvanced* LLPrefsAdvanced::sInstance;
+
LLPrefsAdvanced::LLPrefsAdvanced()
{
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_preferences_advanced.xml");
+ if(sInstance)delete sInstance;
+ sInstance = this;
+
childSetCommitCallback("speed_rez_check", onCommitCheckBox, this);
childSetAction("reset_btn", onClickResetPrefs, this);
@@ -51,6 +58,18 @@ LLPrefsAdvanced::LLPrefsAdvanced()
LLPrefsAdvanced::~LLPrefsAdvanced()
{
// Children all cleaned up by default view destructor.
+ sInstance = NULL;
+}
+
+void LLPrefsAdvanced::initHelpBtn(const std::string& name, const std::string& xml_alert)
+{
+ childSetAction(name, onClickHelp, new std::string(xml_alert));
+}
+
+void LLPrefsAdvanced::onClickHelp(void* data)
+{
+ std::string* xml_alert = (std::string*)data;
+ LLNotifications::instance().add(*xml_alert);
}
BOOL LLPrefsAdvanced::postBuild()
@@ -77,6 +96,15 @@ BOOL LLPrefsAdvanced::postBuild()
LLComboBox* crash_behavior_combobox = getChild("crash_behavior_combobox");
crash_behavior_combobox->setCurrentByIndex(gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING));
+ getChild("EmeraldSpellBase")->setCommitCallback(onSpellBaseComboBoxCommit);
+ getChild("EmSpell_EditCustom")->setClickedCallback(onSpellEditCustom, this);
+ getChild("EmSpell_GetMore")->setClickedCallback(onSpellGetMore, this);
+ getChild("EmSpell_Add")->setClickedCallback(onSpellAdd, this);
+ getChild("EmSpell_Remove")->setClickedCallback(onSpellRemove, this);
+
+
+ initHelpBtn("EmeraldHelp_SpellCheck", "EmeraldHelp_SpellCheck");
+
refresh();
return TRUE;
@@ -180,6 +208,44 @@ void LLPrefsAdvanced::refresh()
childDisable("speed_rez_interval_spinner");
childDisable("speed_rez_seconds_text");
}
+
+ LLComboBox* comboBox = getChild("EmeraldSpellBase");
+ if(comboBox != NULL)
+ {
+ comboBox->removeall();
+ std::vector names = glggHunSpell->getDicts();
+ for(int i=0; i<(int)names.size(); i++)
+ {
+ comboBox->add(names[i]);
+ }
+ comboBox->setSimple(gSavedSettings.getString("EmeraldSpellBase"));
+ }
+ comboBox = getChild("EmSpell_Avail");
+ if(comboBox != NULL)
+ {
+ comboBox->removeall();
+
+ comboBox->add("");
+ std::vector names = glggHunSpell->getAvailDicts();
+ for(int i=0; i<(int)names.size(); i++)
+ {
+ comboBox->add(names[i]);
+ }
+ comboBox->setSimple(std::string(""));
+ }
+ comboBox = getChild("EmSpell_Installed");
+ if(comboBox != NULL)
+ {
+ comboBox->removeall();
+
+ comboBox->add("");
+ std::vector names = glggHunSpell->getInstalledDicts();
+ for(int i=0; i<(int)names.size(); i++)
+ {
+ comboBox->add(names[i]);
+ }
+ comboBox->setSimple(std::string(""));
+ }
}
//static
@@ -206,3 +272,43 @@ bool LLPrefsAdvanced::callbackReset(const LLSD& notification, const LLSD& respon
}
return false;
}
+
+void LLPrefsAdvanced::onSpellAdd(void* data)
+{
+ LLPrefsAdvanced* panel = (LLPrefsAdvanced*)data;
+ if(panel)
+ {
+ glggHunSpell->addButton(panel->childGetValue("EmSpell_Avail").asString());
+ }
+ panel->refresh();
+}
+void LLPrefsAdvanced::onSpellRemove(void* data)
+{
+ LLPrefsAdvanced* panel = (LLPrefsAdvanced*)data;
+ if(panel)
+ {
+ glggHunSpell->removeButton(panel->childGetValue("EmSpell_Installed").asString());
+ }
+ panel->refresh();
+}
+void LLPrefsAdvanced::onSpellGetMore(void* data)
+{
+ glggHunSpell->getMoreButton(data);
+}
+void LLPrefsAdvanced::onSpellEditCustom(void* data)
+{
+ glggHunSpell->editCustomButton();
+}
+void LLPrefsAdvanced::onSpellBaseComboBoxCommit(LLUICtrl* ctrl, void* userdata)
+{
+
+ LLComboBox* box = (LLComboBox*)ctrl;
+ if(box)
+ {
+ glggHunSpell->newDictSelection(box->getValue().asString());
+ //LLPanelEmerald* panel = (LLPanelEmerald*)userdata;//box->getParent();
+ if(sInstance)sInstance->refresh();
+ }
+ //LLPanelEmerald* panel = (LLPanelEmerald*)userdata;
+ //if(panel)panel->refresh();
+}
\ No newline at end of file
diff --git a/linden/indra/newview/llprefsadvanced.h b/linden/indra/newview/llprefsadvanced.h
index efd0d40..4bf2ff1 100644
--- a/linden/indra/newview/llprefsadvanced.h
+++ b/linden/indra/newview/llprefsadvanced.h
@@ -46,10 +46,22 @@ public:
void refresh();
private:
+ static LLPrefsAdvanced* sInstance;
+
static void onCommitCheckBox(LLUICtrl* ctrl, void* user_data);
static void onClickResetPrefs(void* user_data);
static bool callbackReset(const LLSD& notification, const LLSD& response, LLPrefsAdvanced *self);
+
+ static void onSpellAdd(void* data);
+ static void onSpellRemove(void* data);
+ static void onSpellGetMore(void* data);
+ static void onSpellEditCustom(void* data);
+ static void onSpellBaseComboBoxCommit(LLUICtrl* ctrl, void* userdata);
+
+protected:
+ void initHelpBtn(const std::string& name, const std::string& xml_alert);
+ static void onClickHelp(void* data);
};
#endif // LLPREFSADVANCED_H
diff --git a/linden/indra/newview/llstartup.cpp b/linden/indra/newview/llstartup.cpp
index 301e67c..a514e53 100644
--- a/linden/indra/newview/llstartup.cpp
+++ b/linden/indra/newview/llstartup.cpp
@@ -187,6 +187,7 @@
#include "llagentlanguage.h"
#include "viewerversion.h"
+#include "lgghunspell_wrapper.h"
#include "jcfloater_animation_list.h"
#include "jcfloaterareasearch.h"
@@ -400,7 +401,9 @@ bool idle_startup()
// Initialize stuff that doesn't need data from simulators
//
-// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.1d
+ glggHunSpell->initSettings();
+
+// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.1d
if ( (gSavedSettings.controlExists(RLV_SETTING_MAIN)) && (gSavedSettings.getBOOL(RLV_SETTING_MAIN)) )
rlv_handler_t::setEnabled(TRUE);
// [/RLVa:KB]
@@ -961,6 +964,9 @@ bool idle_startup()
std::string user_windlight_days_path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/days", ""));
LLFile::mkdir(user_windlight_days_path_name.c_str());
+ std::string dictionariesFolder(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries",""));
+ LLFile::mkdir(dictionariesFolder.c_str());
+
if (show_connect_box)
{
diff --git a/linden/indra/newview/lltranslate.cpp b/linden/indra/newview/lltranslate.cpp
new file mode 100644
index 0000000..625e543
--- /dev/null
+++ b/linden/indra/newview/lltranslate.cpp
@@ -0,0 +1,136 @@
+/**
+* @file lltranslate.cpp
+* @brief Functions for translating text via Google Translate.
+*
+* $LicenseInfo:firstyear=2009&license=viewergpl$
+*
+* Copyright (c) 2009, Linden Research, Inc.
+*
+* Second Life Viewer Source Code
+* The source code in this file ("Source Code") is provided by Linden Lab
+* to you under the terms of the GNU General Public License, version 2.0
+* ("GPL"), unless you have obtained a separate licensing agreement
+* ("Other License"), formally executed by you and Linden Lab. Terms of
+* the GPL can be found in doc/GPL-license.txt in this distribution, or
+* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+*
+* There are special exceptions to the terms and conditions of the GPL as
+* it is applied to this Source Code. View the full text of the exception
+* in the file doc/FLOSS-exception.txt in this software distribution, or
+* online at
+* http://secondlifegrid.net/programs/open_source/licensing/flossexception
+*
+* By copying, modifying or distributing this software, you acknowledge
+* that you have read and understood your obligations described above,
+* and agree to abide by those obligations.
+*
+* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+* COMPLETENESS OR PERFORMANCE.
+* $/LicenseInfo$
+*/
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llbufferstream.h"
+#include "lltranslate.h"
+#include "llui.h"
+#include "llversionviewer.h"
+#include "llviewercontrol.h"
+
+// These two are concatenated with the language specifiers to form a complete Google Translate URL
+const char* LLTranslate::m_GoogleURL = "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=";
+const char* LLTranslate::m_GoogleLangSpec = "&langpair=";
+float LLTranslate::m_GoogleTimeout = 10;
+
+LLSD LLTranslate::m_Header;
+// These constants are for the GET header.
+const char* LLTranslate::m_AcceptHeader = "Accept";
+const char* LLTranslate::m_AcceptType = "text/plain";
+const char* LLTranslate::m_AgentHeader = "User-Agent";
+
+// These constants are in the JSON returned from Google
+const char* LLTranslate::m_GoogleData = "responseData";
+const char* LLTranslate::m_GoogleTranslation = "translatedText";
+const char* LLTranslate::m_GoogleLanguage = "detectedSourceLanguage";
+
+//static
+void LLTranslate::translateMessage(LLHTTPClient::ResponderPtr &result, const std::string &fromLang, const std::string &toLang, const std::string &mesg)
+{
+ std::string url;
+ getTranslateUrl(url, fromLang, toLang, mesg);
+
+ std::string user_agent = llformat("%s %d.%d.%d (%d)",
+ gSavedSettings.getString("VersionChannelName").c_str(),
+ LL_VERSION_MAJOR,
+ LL_VERSION_MINOR,
+ LL_VERSION_PATCH,
+ LL_VERSION_BUILD );
+
+ if (!m_Header.size())
+ {
+ m_Header.insert(m_AcceptHeader, LLSD(m_AcceptType));
+ m_Header.insert(m_AgentHeader, LLSD(user_agent));
+ }
+
+ LLHTTPClient::get(url, result, m_Header, m_GoogleTimeout);
+}
+
+//static
+void LLTranslate::getTranslateUrl(std::string &translateUrl, const std::string &fromLang, const std::string &toLang, const std::string &mesg)
+{
+ std::string escaped_mesg = curl_escape(mesg.c_str(), mesg.size());
+
+ translateUrl = m_GoogleURL
+ + escaped_mesg + m_GoogleLangSpec
+ + fromLang // 'from' language; empty string for auto
+ + "%7C" // |
+ + toLang; // 'to' language
+}
+
+//static
+void LLTranslate::stringReplaceAll(std::string& context, const std::string& from, const std::string& to)
+{
+ size_t lookHere = 0;
+ size_t foundHere;
+
+ while((foundHere = context.find(from, lookHere))
+ != std::string::npos) {
+ context.replace(foundHere, from.size(), to);
+ lookHere = foundHere + to.size();
+ }
+}
+
+//static
+BOOL LLTranslate::parseGoogleTranslate(const std::string result, std::string &translation, std::string &detectedLanguage)
+{
+ Json::Value root;
+ Json::Reader reader;
+ BOOL parsingSuccessful = reader.parse(result, root );
+ if ( !parsingSuccessful )
+ {
+ LL_WARNS("JSON") << reader.getFormatedErrorMessages() << LL_ENDL;
+ return FALSE;
+ }
+
+ translation = root[m_GoogleData].get(m_GoogleTranslation, "").asString();
+ detectedLanguage = root[m_GoogleData].get(m_GoogleLanguage, "").asString();
+ return TRUE;
+}
+
+//static
+std::string LLTranslate::getTranslateLanguage()
+{
+ std::string language = "en";
+ if (LLUI::sConfigGroup)
+ {
+ language = LLUI::sConfigGroup->getString("TranslateLanguage");
+ if (language.empty() || language == "default")
+ {
+ language = LLUI::getLanguage();
+ }
+ }
+ language = language.substr(0,2);
+ return language;
+}
+
diff --git a/linden/indra/newview/lltranslate.h b/linden/indra/newview/lltranslate.h
new file mode 100644
index 0000000..2723c43
--- /dev/null
+++ b/linden/indra/newview/lltranslate.h
@@ -0,0 +1,125 @@
+/**
+* @file lltranslate.h
+* @brief Human language translation class and JSON response receiver.
+*
+* $LicenseInfo:firstyear=2009&license=viewergpl$
+*
+* Copyright (c) 2009, Linden Research, Inc.
+*
+* Second Life Viewer Source Code
+* The source code in this file ("Source Code") is provided by Linden Lab
+* to you under the terms of the GNU General Public License, version 2.0
+* ("GPL"), unless you have obtained a separate licensing agreement
+* ("Other License"), formally executed by you and Linden Lab. Terms of
+* the GPL can be found in doc/GPL-license.txt in this distribution, or
+* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+*
+* There are special exceptions to the terms and conditions of the GPL as
+* it is applied to this Source Code. View the full text of the exception
+* in the file doc/FLOSS-exception.txt in this software distribution, or
+* online at
+* http://secondlifegrid.net/programs/open_source/licensing/flossexception
+*
+* By copying, modifying or distributing this software, you acknowledge
+* that you have read and understood your obligations described above,
+* and agree to abide by those obligations.
+*
+* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+* COMPLETENESS OR PERFORMANCE.
+* $/LicenseInfo$
+*/
+
+#ifndef LL_LLTRANSLATE_H
+#define LL_LLTRANSLATE_H
+
+#include "llhttpclient.h"
+#include "llbufferstream.h"
+#include "jsoncpp/reader.h"
+
+class LLTranslate
+{
+public :
+ class TranslationReceiver: public LLHTTPClient::Responder
+ {
+ protected:
+ TranslationReceiver(const std::string &fromLang, const std::string &toLang)
+ : m_fromLang(fromLang),
+ m_toLang(toLang)
+ {
+ }
+
+ virtual void handleResponse(const std::string &translation, const std::string &recognizedLang) {}
+ virtual void handleFailure() {};
+
+ public:
+ ~TranslationReceiver()
+ {
+ }
+
+ virtual void error(U32 status, const std::string& reason)
+ {
+ LL_WARNS("Translate") << "URL Request error: " << reason << LL_ENDL;
+ handleFailure();
+ }
+
+ virtual void completedRaw(
+ U32 status,
+ const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+ {
+ LLBufferStream istr(channels, buffer.get());
+
+ std::stringstream strstrm;
+ strstrm << istr.rdbuf();
+ const std::string result = strstrm.str();
+
+ std::string translation;
+ std::string detectedLanguage;
+
+ if (!parseGoogleTranslate(result, translation, detectedLanguage))
+ {
+ handleFailure();
+ return;
+ }
+
+ // Fix up the response
+ stringReplaceAll( translation, "<","<");
+ stringReplaceAll( translation, ">",">");
+ stringReplaceAll( translation, ""","\"");
+ stringReplaceAll( translation, "'","'");
+ stringReplaceAll( translation, "&","&");
+ stringReplaceAll( translation, "'","'");
+
+ handleResponse(translation, detectedLanguage);
+ }
+
+ protected:
+ const std::string m_toLang;
+ const std::string m_fromLang;
+ };
+
+ static void translateMessage(LLHTTPClient::ResponderPtr &result, const std::string &fromLang, const std::string &toLang, const std::string &mesg);
+ static float m_GoogleTimeout;
+ static std::string getTranslateLanguage();
+
+private:
+ static void getTranslateUrl(std::string &translateUrl, const std::string &fromLang, const std::string &toLang, const std::string &text);
+ static void stringReplaceAll(std::string& context, const std::string& from, const std::string& to);
+ static BOOL parseGoogleTranslate(const std::string result, std::string &translation, std::string &detectedLanguage);
+
+ static LLSD m_Header;
+ static const char* m_GoogleURL;
+ static const char* m_GoogleLangSpec;
+ static const char* m_AcceptHeader;
+ static const char* m_AcceptType;
+ static const char* m_AgentHeader;
+ static const char* m_UserAgent;
+
+ static const char* m_GoogleData;
+ static const char* m_GoogleTranslation;
+ static const char* m_GoogleLanguage;
+};
+
+#endif
diff --git a/linden/indra/newview/llviewermessage.cpp b/linden/indra/newview/llviewermessage.cpp
index 45280e4..45fd772 100755
--- a/linden/indra/newview/llviewermessage.cpp
+++ b/linden/indra/newview/llviewermessage.cpp
@@ -138,6 +138,7 @@
#include "llfloaterworldmap.h"
#include "llviewerdisplay.h"
#include "llkeythrottle.h"
+#include "lltranslate.h"
#include "panelradarentry.h"
@@ -2698,6 +2699,83 @@ void process_decline_callingcard(LLMessageSystem* msg, void**)
LLNotifications::instance().add("CallingCardDeclined");
}
+class ChatTranslationReceiver : public LLTranslate::TranslationReceiver
+{
+public :
+ ChatTranslationReceiver(const std::string &fromLang, const std::string &toLang, LLChat *chat,
+ const BOOL history)
+ : LLTranslate::TranslationReceiver(fromLang, toLang),
+ m_chat(chat),
+ m_history(history)
+ {
+ }
+
+ static boost::intrusive_ptr build(const std::string &fromLang, const std::string &toLang, LLChat *chat, const BOOL history)
+ {
+ return boost::intrusive_ptr(new ChatTranslationReceiver(fromLang, toLang, chat, history));
+ }
+
+protected:
+ void handleResponse(const std::string &translation, const std::string &detectedLanguage)
+ {
+ if (m_toLang != detectedLanguage)
+ m_chat->mText += " (" + translation + ")";
+
+ add_floater_chat(*m_chat, m_history);
+
+ delete m_chat;
+ }
+
+ void handleFailure()
+ {
+ LLTranslate::TranslationReceiver::handleFailure();
+
+ m_chat->mText += " (?)";
+
+ add_floater_chat(*m_chat, m_history);
+
+ delete m_chat;
+ }
+
+private:
+ LLChat *m_chat;
+ const BOOL m_history;
+};
+
+void add_floater_chat(const LLChat &chat, const BOOL history)
+{
+ if (history)
+ {
+ // just add to history
+ LLFloaterChat::addChatHistory(chat);
+ }
+ else
+ {
+ // show on screen and add to history
+ LLFloaterChat::addChat(chat, FALSE, FALSE);
+ }
+}
+
+void check_translate_chat(const std::string &mesg, LLChat &chat, const BOOL history)
+{
+ const bool translate = LLUI::sConfigGroup->getBOOL("TranslateChat");
+
+ if (translate && chat.mSourceType != CHAT_SOURCE_SYSTEM)
+ {
+ // fromLang hardcoded to "" (autodetection) pending implementation of
+ // SVC-4879
+ const std::string &fromLang = "";
+ const std::string &toLang = LLTranslate::getTranslateLanguage();
+ LLChat *newChat = new LLChat(chat);
+
+ LLHTTPClient::ResponderPtr result = ChatTranslationReceiver::build(fromLang, toLang, newChat, history);
+ LLTranslate::translateMessage(result, fromLang, toLang, mesg);
+ }
+ else
+ {
+ add_floater_chat(chat, history);
+ }
+}
void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
{
@@ -3061,12 +3139,12 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
&& (is_linden || !is_busy || is_owned_by_me))
{
// show on screen and add to history
- LLFloaterChat::addChat(chat, FALSE, FALSE);
+ check_translate_chat(mesg, chat, FALSE);
}
else
{
// just add to chat history
- LLFloaterChat::addChatHistory(chat);
+ check_translate_chat(mesg, chat, TRUE);
}
}
}
diff --git a/linden/indra/newview/llviewermessage.h b/linden/indra/newview/llviewermessage.h
index c920f85..1a6c03b 100644
--- a/linden/indra/newview/llviewermessage.h
+++ b/linden/indra/newview/llviewermessage.h
@@ -36,6 +36,7 @@
#include "llinstantmessage.h"
#include "lltransactiontypes.h"
#include "lluuid.h"
+#include "llchat.h"
#include "stdenums.h"
#include "llfloaterbump.h"
//
@@ -74,6 +75,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data);
void process_script_question(LLMessageSystem *msg, void **user_data);
void process_chat_from_simulator(LLMessageSystem *mesgsys, void **user_data);
+void add_floater_chat(const LLChat &chat, const BOOL history);
+void check_translate_chat(const std::string &mesg, LLChat &chat, const BOOL history);
+
//void process_agent_to_new_region(LLMessageSystem *mesgsys, void **user_data);
void send_agent_update(BOOL force_send, BOOL send_reliable = FALSE);
void process_object_update(LLMessageSystem *mesgsys, void **user_data);
diff --git a/linden/indra/newview/llviewertexteditor.cpp b/linden/indra/newview/llviewertexteditor.cpp
index 0e16282..981c9bc 100644
--- a/linden/indra/newview/llviewertexteditor.cpp
+++ b/linden/indra/newview/llviewertexteditor.cpp
@@ -943,6 +943,7 @@ BOOL LLViewerTextEditor::handleMouseUp(S32 x, S32 y, MASK mask)
BOOL LLViewerTextEditor::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
BOOL handled = childrenHandleRightMouseDown(x, y, mask) != NULL;
+ if(!handled)handled = LLTextEditor::handleRightMouseDown(x, y, mask);
// *TODO: Add right click menus for SLURLs
// if(! handled)
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_dictionaries.xml b/linden/indra/newview/skins/default/xui/en-us/floater_dictionaries.xml
new file mode 100644
index 0000000..f0564ed
--- /dev/null
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_dictionaries.xml
@@ -0,0 +1,15 @@
+
+
+
+Below is a list of additional dictionaries that can
+be downloaded from the Modular Systems website.
+
+Please select the dictionary you wish to have available
+for install, and then press the download button.
+
+
+
\ No newline at end of file
diff --git a/linden/indra/newview/skins/default/xui/en-us/notifications.xml b/linden/indra/newview/skins/default/xui/en-us/notifications.xml
index 7395c62..40b05c2 100644
--- a/linden/indra/newview/skins/default/xui/en-us/notifications.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/notifications.xml
@@ -7053,11 +7053,20 @@ Note: To comply with the Second Life Terms of Service, Imprudence did not downlo
+To Spell Check a word, right click on it and choose its replacement.
+You may choose a base dictionary which stores the language style and basic words
+You may also choose to install other word lists by choosing them from the list and "Install"
+
+
+
This region is broadcasting custom sky and water settings.
-
Apply this region's settings? ("Ignore" will ignore all region settings until you leave this region.)
+
+ TranslateLanguage
+
+ Comment
+ Translate Language specifier
+ Persist
+ 1
+ Type
+ String
+ Value
+ default
+
+ TranslateChat
+
+ Comment
+ Translate incoming chat messages
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 0
+
LastFeatureVersion
Comment
--
cgit v1.1
From 86acaec2979f6903d93d0cc277d380a2ec012b00 Mon Sep 17 00:00:00 2001
From: Patrick Sapinski
Date: Tue, 24 Aug 2010 14:40:28 -0400
Subject: updated chatbar command line and added the necessary settings and
hooks to use it
---
linden/indra/llmath/llvolume.h | 3 +
linden/indra/newview/app_settings/settings.xml | 225 +++++
linden/indra/newview/chatbar_as_cmdline.cpp | 958 +++++++++++++++++++++
linden/indra/newview/llchatbar.cpp | 3 +
linden/indra/newview/llinventorymodel.cpp | 22 +
linden/indra/newview/llinventorymodel.h | 2 +
linden/indra/newview/llprefsadvanced.cpp | 27 +
linden/indra/newview/llprefsadvanced.h | 2 +
.../xui/en-us/panel_preferences_advanced.xml | 109 +++
9 files changed, 1351 insertions(+)
create mode 100644 linden/indra/newview/chatbar_as_cmdline.cpp
(limited to 'linden/indra')
diff --git a/linden/indra/llmath/llvolume.h b/linden/indra/llmath/llvolume.h
index e55fe52..2b1c60d 100644
--- a/linden/indra/llmath/llvolume.h
+++ b/linden/indra/llmath/llvolume.h
@@ -154,6 +154,9 @@ const U8 LL_PCODE_PATH_IGNORE = 0x00;
const U8 LL_PCODE_PATH_MIN = 0x01; // min/max needs to be >> 4 of real min/max
const U8 LL_PCODE_PATH_LINE = 0x10;
const U8 LL_PCODE_PATH_CIRCLE = 0x20;
+//<-- Working33 by Gregory Maurer
+const U8 LL_PCODE_PATH_CIRCLE_33 = 0x21;
+//Working33 -->
const U8 LL_PCODE_PATH_CIRCLE2 = 0x30;
const U8 LL_PCODE_PATH_TEST = 0x40;
const U8 LL_PCODE_PATH_FLEXIBLE = 0x80;
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index d45eac2..42565b3 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -1299,6 +1299,231 @@
+
+
+ EmeraldCmdLine
+
+ Comment
+ Enable usage of chat bar as a command line
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 1
+
+ EmeraldCmdLineMapToKeepPos
+
+ Comment
+ Whether to use current local pos on tp to the new sim
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 0
+
+ EmeraldCmdLineAO
+
+ Comment
+ Turn AO on/off
+ Persist
+ 1
+ Type
+ String
+ Value
+ cao
+
+ EmeraldCmdLineAutocorrect
+
+ Comment
+ Command for adding new entries to autocorrect
+ Persist
+ 1
+ Type
+ String
+ Value
+ /addac
+
+ EmeraldCmdLineMedia
+
+ Comment
+ Chat command for setting a media url
+ Persist
+ 1
+ Type
+ String
+ Value
+ /media
+
+ EmeraldCmdLineMusic
+
+ Comment
+ Chat command for setting a music url
+ Persist
+ 1
+ Type
+ String
+ Value
+ /music
+
+ EmeraldCmdLineClearChat
+
+ Comment
+ Clear chat hsitory to stop lag from chat spam
+ Persist
+ 1
+ Type
+ String
+ Value
+ clrchat
+
+ EmeraldCmdLineHeight
+
+ Comment
+ Teleport to height function command
+ Persist
+ 1
+ Type
+ String
+ Value
+ gth
+
+ EmeraldCmdLinePos
+
+ Comment
+ Teleport to position function command
+ Persist
+ 1
+ Type
+ String
+ Value
+ gtp
+
+ EmeraldCmdLineGround
+
+ Comment
+ Teleport to ground function command
+ Persist
+ 1
+ Type
+ String
+ Value
+ flr
+
+ EmeraldCmdLineTeleportHome
+
+ Comment
+ Teleport to home function command
+ Persist
+ 1
+ Type
+ String
+ Value
+ tph
+
+ EmeraldCmdLineRezPlatform
+
+ Comment
+ Rez a platform underneath you
+ Persist
+ 1
+ Type
+ String
+ Value
+ rezplat
+
+ EmeraldCmdLinePlatformSize
+
+ Comment
+ How wide the rezzed platform will appear to be.
+ Persist
+ 1
+ Type
+ F32
+ Value
+ 30
+
+ EmeraldCmdLineMapTo
+
+ Comment
+ Teleport to a region by name rapidly
+ Persist
+ 1
+ Type
+ String
+ Value
+ mapto
+
+ EmeraldCmdLineDrawDistance
+
+ Comment
+ Change draw distance quickly
+ Persist
+ 1
+ Type
+ String
+ Value
+ dd
+
+ EmeraldCmdTeleportToCam
+
+ Comment
+ Teleport to your camera
+ Persist
+ 1
+ Type
+ String
+ Value
+ tp2cam
+
+ EmeraldCmdLineKeyToName
+
+ Comment
+ Use a fast key to name querry
+ Persist
+ 1
+ Type
+ String
+ Value
+ key2name
+
+ EmeraldCmdLineOfferTp
+
+ Comment
+ Offer a teleport to target avatar
+ Persist
+ 1
+ Type
+ String
+ Value
+ offertp
+
+ EmeraldCmdLineCalc
+
+ Comment
+ Calculates an expression
+ Persist
+ 1
+ Type
+ String
+ Value
+ calc
+
+ EmeraldCmdLineTP2
+
+ Comment
+ Teleport to a person by name, partials work.
+ Persist
+ 1
+ Type
+ String
+ Value
+ tp2
+
+
+
+
EmeraldEnableAutoCorrect
diff --git a/linden/indra/newview/chatbar_as_cmdline.cpp b/linden/indra/newview/chatbar_as_cmdline.cpp
new file mode 100644
index 0000000..3e1d817
--- /dev/null
+++ b/linden/indra/newview/chatbar_as_cmdline.cpp
@@ -0,0 +1,958 @@
+/* Copyright (c) 2010
+ *
+ * Modular Systems All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. 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.
+ * 3. Neither the name Modular Systems 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 MODULAR SYSTEMS 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 MODULAR SYSTEMS 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 "llviewerprecompiledheaders.h"
+
+#include "chatbar_as_cmdline.h"
+
+#include "llcalc.h"
+
+#include "llchatbar.h"
+#include "llagent.h"
+#include "stdtypes.h"
+#include "llviewerregion.h"
+#include "llworld.h"
+#include "lluuid.h"
+#include "llviewercontrol.h"
+
+#include "material_codes.h"
+#include "llvolume.h"
+#include "object_flags.h"
+#include "llvolumemessage.h"
+#include "llurldispatcher.h"
+#include "llworld.h"
+#include "llworldmap.h"
+//KOW #include "floateravatarlist.h"
+#include "floaterao.h"
+#include "llviewerobjectlist.h"
+#include "llviewertexteditor.h"
+#include "llvoavatar.h"
+#include "lltooldraganddrop.h"
+#include "llinventorymodel.h"
+#include "llselectmgr.h"
+
+#include
+
+#include
+
+#include "llchat.h"
+
+#include "llfloaterchat.h"
+#include "llviewerparcelmgr.h"
+#include "llviewerparcelmedia.h"
+#include "llparcel.h"
+#include "audioengine.h"
+#include "llviewerparcelmediaautoplay.h"
+#include "lloverlaybar.h"
+//KOW #include "lggautocorrectfloater.h"
+#include "lggautocorrect.h"
+
+//#define JC_PROFILE_GSAVED
+
+void cmdline_printchat(std::string message);
+void cmdline_rezplat(bool use_saved_value = true, F32 visual_radius = 30.0);
+void cmdline_tp2name(std::string target);
+
+LLUUID cmdline_partial_name2key(std::string name);
+
+
+
+LLViewerInventoryItem::item_array_t findInventoryInFolder(const std::string& ifolder)
+{
+ LLUUID folder = gInventory.findCategoryByName(ifolder);
+ LLViewerInventoryCategory::cat_array_t cats;
+ LLViewerInventoryItem::item_array_t items;
+ //ObjectContentNameMatches objectnamematches(ifolder);
+ gInventory.collectDescendents(folder,cats,items,FALSE);//,objectnamematches);
+
+ return items;
+}
+
+class JCZface : public LLEventTimer
+{
+public:
+ JCZface(std::stack stack, LLUUID dest, F32 pause) : LLEventTimer( pause )
+ {
+ cmdline_printchat("initialized");
+ instack = stack;
+ indest = dest;
+ }
+ ~JCZface()
+ {
+ cmdline_printchat("deinitialized");
+ }
+ BOOL tick()
+ {
+ LLViewerInventoryItem* subj = instack.top();
+ instack.pop();
+ LLViewerObject *objectp = gObjectList.findObject(indest);
+ if(objectp)
+ {
+ cmdline_printchat(std::string("dropping ")+subj->getName());
+ LLToolDragAndDrop::dropInventory(objectp,subj,LLToolDragAndDrop::SOURCE_AGENT,gAgent.getID());
+ return (instack.size() == 0);
+ }else
+ {
+ cmdline_printchat("object lost");
+ return TRUE;
+ }
+ }
+
+
+private:
+ std::stack instack;
+ LLUUID indest;
+};
+
+class JCZtake : public LLEventTimer
+{
+public:
+ BOOL mRunning;
+
+ JCZtake(const LLUUID& target) : LLEventTimer(1.25f), mTarget(target), mRunning(FALSE), mCountdown(5)
+ {
+ cmdline_printchat("Ztake initialised.");
+ }
+ ~JCZtake()
+ {
+ cmdline_printchat("Ztake shutdown.");
+ }
+ BOOL tick()
+ {
+ {
+ LLMessageSystem *msg = gMessageSystem;
+ for(LLObjectSelection::iterator itr=LLSelectMgr::getInstance()->getSelection()->begin();
+ itr!=LLSelectMgr::getInstance()->getSelection()->end();++itr)
+ {
+ LLSelectNode* node = (*itr);
+ LLViewerObject* object = node->getObject();
+ U32 localid=object->getLocalID();
+ if(mDonePrims.find(localid) == mDonePrims.end())
+ {
+ mDonePrims.insert(localid);
+ std::string name = llformat("%ix%ix%i",(int)object->getScale().mV[VX],(int)object->getScale().mV[VY],(int)object->getScale().mV[VZ]);
+ msg->newMessageFast(_PREHASH_ObjectName);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_ObjectData);
+ msg->addU32Fast(_PREHASH_LocalID, localid);
+ msg->addStringFast(_PREHASH_Name, name);
+ gAgent.sendReliableMessage();
+ mToTake.push_back(localid);
+ }
+ }
+
+ if(mCountdown > 0) {
+ cmdline_printchat(llformat("%i...", mCountdown--));
+ }
+ else if(mToTake.size() > 0) {
+ msg->newMessageFast(_PREHASH_DeRezObject);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_AgentBlock);
+ msg->addUUIDFast(_PREHASH_GroupID, LLUUID::null);
+ msg->addU8Fast(_PREHASH_Destination, 4);
+ msg->addUUIDFast(_PREHASH_DestinationID, mTarget);
+ LLUUID rand;
+ rand.generate();
+ msg->addUUIDFast(_PREHASH_TransactionID, rand);
+ msg->addU8Fast(_PREHASH_PacketCount, 1);
+ msg->addU8Fast(_PREHASH_PacketNumber, 0);
+ msg->nextBlockFast(_PREHASH_ObjectData);
+ msg->addU32Fast(_PREHASH_ObjectLocalID, mToTake[0]);
+ gAgent.sendReliableMessage();
+ mToTake.erase(mToTake.begin());
+ if(mToTake.size() % 10 == 0) {
+ if(mToTake.size() == 0) {
+ cmdline_printchat("Ztake done! (You might want to try \"ztake off\")");
+ } else {
+ cmdline_printchat(llformat("Ztake: %i left to take.", mToTake.size()));
+ }
+ }
+ }
+
+ }
+ return mRunning;
+ }
+
+private:
+ std::set mDonePrims;
+ std::vector mToTake;
+ LLUUID mTarget;
+ int mCountdown;
+};
+
+JCZtake *ztake;
+
+void invrepair()
+{
+ LLViewerInventoryCategory::cat_array_t cats;
+ LLViewerInventoryItem::item_array_t items;
+ //ObjectContentNameMatches objectnamematches(ifolder);
+ gInventory.collectDescendents(gAgent.getInventoryRootID(),cats,items,FALSE);//,objectnamematches);
+}
+
+/*static BOOL *sEmeraldCmdLine;
+static std::string *sEmeraldCmdLinePos;
+static std::string *sEmeraldCmdLineDrawDistance;
+static std::string *sEmeraldCmdTeleportToCam;
+static std::string *sEmeraldCmdLineAO;
+static std::string *sEmeraldCmdLineKeyToName;
+static std::string *sEmeraldCmdLineOfferTp;
+static std::string *sEmeraldCmdLineGround;
+static std::string *sEmeraldCmdLineHeight;
+static std::string *sEmeraldCmdLineTeleportHome;
+static std::string *sEmeraldCmdLineRezPlatform;
+static std::string *sEmeraldCmdLineMapTo;
+static BOOL *sEmeraldCmdLineMapToKeepPos;
+static std::string *sEmeraldCmdLineCalc;
+static std::string *sEmeraldCmdLineTP2;
+static std::string *sEmeraldCmdLineClearChat;
+static F32 *sEmeraldCmdLinePlatformSize;*/
+
+/*
+class another_rebind_group
+{
+
+}
+
+template
+class another_rebind
+{
+ T *mVal;
+ static std::map > instances;
+
+
+
+};
+*/
+
+
+#ifdef JC_PROFILE_GSAVED
+std::map get_gsaved_calls();
+#endif
+
+bool cmd_line_chat(std::string revised_text, EChatType type)
+{
+ static BOOL *sEmeraldCmdLine = rebind_llcontrol("EmeraldCmdLine", &gSavedSettings, true);
+ static std::string *sEmeraldCmdLinePos = rebind_llcontrol("EmeraldCmdLinePos", &gSavedSettings, true);
+ static std::string *sEmeraldCmdLineDrawDistance = rebind_llcontrol("EmeraldCmdLineDrawDistance", &gSavedSettings, true);
+ static std::string *sEmeraldCmdTeleportToCam = rebind_llcontrol("EmeraldCmdTeleportToCam", &gSavedSettings, true);
+ static std::string *sEmeraldCmdLineAO = rebind_llcontrol("EmeraldCmdLineAO", &gSavedSettings, true);
+ static std::string *sEmeraldCmdLineKeyToName = rebind_llcontrol("EmeraldCmdLineKeyToName", &gSavedSettings, true);
+ static std::string *sEmeraldCmdLineOfferTp = rebind_llcontrol("EmeraldCmdLineOfferTp", &gSavedSettings, true);
+ static std::string *sEmeraldCmdLineGround = rebind_llcontrol("EmeraldCmdLineGround", &gSavedSettings, true);
+ static std::string *sEmeraldCmdLineHeight = rebind_llcontrol("EmeraldCmdLineHeight", &gSavedSettings, true);
+ static std::string *sEmeraldCmdLineTeleportHome = rebind_llcontrol("EmeraldCmdLineTeleportHome", &gSavedSettings, true);
+ static std::string *sEmeraldCmdLineRezPlatform = rebind_llcontrol("EmeraldCmdLineRezPlatform", &gSavedSettings, true);
+ static std::string *sEmeraldCmdLineMapTo = rebind_llcontrol("EmeraldCmdLineMapTo", &gSavedSettings, true);
+ static BOOL *sEmeraldCmdLineMapToKeepPos = rebind_llcontrol("EmeraldCmdLineMapToKeepPos", &gSavedSettings, true);
+ static std::string *sEmeraldCmdLineCalc = rebind_llcontrol("EmeraldCmdLineCalc", &gSavedSettings, true);
+ static std::string *sEmeraldCmdLineTP2 = rebind_llcontrol("EmeraldCmdLineTP2", &gSavedSettings, true);
+ static std::string *sEmeraldCmdLineClearChat = rebind_llcontrol("EmeraldCmdLineClearChat", &gSavedSettings, true);
+ static std::string *sEmeraldCmdLineMedia = rebind_llcontrol("EmeraldCmdLineMedia", &gSavedSettings, true);
+ static std::string *sEmeraldCmdLineMusic = rebind_llcontrol("EmeraldCmdLineMusic", &gSavedSettings, true);
+ static std::string *sEmeraldCmdLineAutocorrect = rebind_llcontrol("EmeraldCmdLineAutocorrect", &gSavedSettings, true);
+ //static std::string *sEmeraldCmdUndeform = rebind_llcontrol("EmeraldCmdUndeform", &gSavedSettings, true);
+ //gSavedSettings.getString("EmeraldCmdUndeform")
+
+ if(*sEmeraldCmdLine)
+ {
+ std::istringstream i(revised_text);
+ std::string command;
+ i >> command;
+ if(command != "")
+ {
+ if(command == *sEmeraldCmdLinePos)
+ {
+ F32 x,y,z;
+ if (i >> x)
+ {
+ if (i >> y)
+ {
+ if (i >> z)
+ {
+ LLVector3 agentPos = gAgent.getPositionAgent();
+ LLViewerRegion* agentRegionp = gAgent.getRegion();
+ if(agentRegionp)
+ {
+ LLVector3 targetPos(x,y,z);
+ LLVector3d pos_global = from_region_handle(agentRegionp->getHandle());
+ pos_global += LLVector3d((F64)targetPos.mV[0],(F64)targetPos.mV[1],(F64)targetPos.mV[2]);
+ gAgent.teleportViaLocation(pos_global);
+ return false;
+ }
+ }
+ }
+ }
+ }
+ else if(command == *sEmeraldCmdLineDrawDistance)
+ {
+ int drawDist;
+ if(i >> drawDist)
+ {
+ gSavedSettings.setF32("RenderFarClip", drawDist);
+ gAgent.mDrawDistance=drawDist;
+ char buffer[DB_IM_MSG_BUF_SIZE * 2];
+ snprintf(buffer,sizeof(buffer),"Draw distance set to: %dm",drawDist);
+ cmdline_printchat(std::string(buffer));
+ return false;
+ }
+ }
+ else if(command == *sEmeraldCmdTeleportToCam)
+ {
+ gAgent.teleportViaLocation(gAgent.getCameraPositionGlobal());
+ return false;
+ }
+ /*else if(command == *sEmeraldCmdUndeform)
+ {
+ llinfos << "UNDEFORM: Do you feel your bones cracking back into place?" << llendl;
+ gAgent.getAvatarObject()->undeform();
+ return false;
+ }*/ //what the fuck is this shit, thought it would be something useful like repairing the skeleton but its some shitty playing of inworld anims
+ else if(command == *sEmeraldCmdLineMedia)
+ {
+ std::string url;
+ std::string type;
+
+ if(i >> url)
+ {
+ if(i >> type)
+ {
+ LLParcel *parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+ parcel->setMediaURL(url);
+ parcel->setMediaType(type);
+ LLViewerParcelMedia::play(parcel);
+ LLViewerParcelMediaAutoPlay::playStarted();
+ return false;
+ }
+ }
+ }
+ else if(command == *sEmeraldCmdLineMusic)
+ {
+ std::string status;
+ if(i >> status)
+ {
+ if(!gOverlayBar->musicPlaying())
+ {
+ gOverlayBar->toggleMusicPlay(gOverlayBar);
+ }
+ gAudiop->startInternetStream(status);
+ return false;
+ }
+ }
+ else if(command == *sEmeraldCmdLineAO)
+ {
+ std::string status;
+ if(i >> status)
+ {
+ if (status == "on" )
+ {
+ gSavedPerAccountSettings.setBOOL("AOEnabled",TRUE);
+// LLFloaterAO::init();
+ LLFloaterAO::run();
+ }
+ else if (status == "off" )
+ {
+ gSavedPerAccountSettings.setBOOL("AOEnabled",FALSE);
+ LLFloaterAO::run();
+ }
+ else if (status == "sit" )
+ {
+ gSavedPerAccountSettings.setBOOL("AOSitsEnabled",!gSavedPerAccountSettings.getBOOL("AOSitsEnabled"));
+ }
+ }
+ return false;
+ }
+ else if(command == *sEmeraldCmdLineKeyToName)
+ {
+ LLUUID targetKey;
+ if(i >> targetKey)
+ {
+ std::string object_name;
+ gCacheName->getFullName(targetKey, object_name);
+ char buffer[DB_IM_MSG_BUF_SIZE * 2];
+ snprintf(buffer,sizeof(buffer),"%s: (%s)",targetKey.asString().c_str(), object_name.c_str());
+ cmdline_printchat(std::string(buffer));
+ }
+ return false;
+ }
+ else if(command == "/touch")
+ {
+ LLUUID targetKey;
+ if(i >> targetKey)
+ {
+ LLViewerObject* myObject = gObjectList.findObject(targetKey);
+ char buffer[DB_IM_MSG_BUF_SIZE * 2];
+
+ if (!myObject)
+ {
+ snprintf(buffer,sizeof(buffer),"Object with key %s not found!",targetKey.asString().c_str());
+ cmdline_printchat(std::string(buffer));
+ return false;
+ }
+
+ LLMessageSystem *msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_ObjectGrab);
+ msg->nextBlockFast( _PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast( _PREHASH_ObjectData);
+ msg->addU32Fast( _PREHASH_LocalID, myObject->mLocalID);
+ msg->addVector3Fast(_PREHASH_GrabOffset, LLVector3::zero );
+ msg->nextBlock("SurfaceInfo");
+ msg->addVector3("UVCoord", LLVector3::zero);
+ msg->addVector3("STCoord", LLVector3::zero);
+ msg->addS32Fast(_PREHASH_FaceIndex, 0);
+ msg->addVector3("Position", myObject->getPosition());
+ msg->addVector3("Normal", LLVector3::zero);
+ msg->addVector3("Binormal", LLVector3::zero);
+ msg->sendMessage( myObject->getRegion()->getHost());
+
+ // *NOTE: Hope the packets arrive safely and in order or else
+ // there will be some problems.
+ // *TODO: Just fix this bad assumption.
+ msg->newMessageFast(_PREHASH_ObjectDeGrab);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_ObjectData);
+ msg->addU32Fast(_PREHASH_LocalID, myObject->mLocalID);
+ msg->nextBlock("SurfaceInfo");
+ msg->addVector3("UVCoord", LLVector3::zero);
+ msg->addVector3("STCoord", LLVector3::zero);
+ msg->addS32Fast(_PREHASH_FaceIndex, 0);
+ msg->addVector3("Position", myObject->getPosition());
+ msg->addVector3("Normal", LLVector3::zero);
+ msg->addVector3("Binormal", LLVector3::zero);
+ msg->sendMessage(myObject->getRegion()->getHost());
+ snprintf(buffer,sizeof(buffer),"Touched object with key %s",targetKey.asString().c_str());
+ cmdline_printchat(std::string(buffer));
+ }
+ return false;
+ }
+ else if(command == "/siton")
+ {
+ LLUUID targetKey;
+ if(i >> targetKey)
+ {
+ LLViewerObject* myObject = gObjectList.findObject(targetKey);
+ char buffer[DB_IM_MSG_BUF_SIZE * 2];
+
+ if (!myObject)
+ {
+ snprintf(buffer,sizeof(buffer),"Object with key %s not found!",targetKey.asString().c_str());
+ cmdline_printchat(std::string(buffer));
+ return false;
+ }
+ LLMessageSystem *msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_AgentRequestSit);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_TargetObject);
+ msg->addUUIDFast(_PREHASH_TargetID, targetKey);
+ msg->addVector3Fast(_PREHASH_Offset, LLVector3::zero);
+ gAgent.getRegion()->sendReliableMessage();
+
+ snprintf(buffer,sizeof(buffer),"Sat on object with key %s",targetKey.asString().c_str());
+ cmdline_printchat(std::string(buffer));
+ }
+ return false;
+ }
+ else if(command == "/standup")
+ {
+ gAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
+ cmdline_printchat(std::string("Standing up"));
+ return false;
+ }
+ else if(command == *sEmeraldCmdLineOfferTp)
+ {
+ std::string avatarKey;
+// llinfos << "CMD DEBUG 0 " << command << " " << avatarName << llendl;
+ if(i >> avatarKey)
+ {
+// llinfos << "CMD DEBUG 0 afterif " << command << " " << avatarName << llendl;
+ LLUUID tempUUID;
+ if(LLUUID::parseUUID(avatarKey, &tempUUID))
+ {
+ char buffer[DB_IM_MSG_BUF_SIZE * 2];
+ LLDynamicArray ids;
+ ids.push_back(tempUUID);
+ std::string tpMsg="Join me!";
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_StartLure);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_Info);
+ msg->addU8Fast(_PREHASH_LureType, (U8)0);
+
+ msg->addStringFast(_PREHASH_Message, tpMsg);
+ for(LLDynamicArray::iterator itr = ids.begin(); itr != ids.end(); ++itr)
+ {
+ msg->nextBlockFast(_PREHASH_TargetData);
+ msg->addUUIDFast(_PREHASH_TargetID, *itr);
+ }
+ gAgent.sendReliableMessage();
+ snprintf(buffer,sizeof(buffer),"Offered TP to key %s",tempUUID.asString().c_str());
+ cmdline_printchat(std::string(buffer));
+ return false;
+ }
+ }
+ }
+
+ else if(command == *sEmeraldCmdLineGround)
+ {
+ LLVector3 agentPos = gAgent.getPositionAgent();
+ U64 agentRegion = gAgent.getRegion()->getHandle();
+ LLVector3 targetPos(agentPos.mV[0],agentPos.mV[1],LLWorld::getInstance()->resolveLandHeightAgent(agentPos));
+ LLVector3d pos_global = from_region_handle(agentRegion);
+ pos_global += LLVector3d((F64)targetPos.mV[0],(F64)targetPos.mV[1],(F64)targetPos.mV[2]);
+ gAgent.teleportViaLocation(pos_global);
+ return false;
+ }else if(command == *sEmeraldCmdLineHeight)
+ {
+ F32 z;
+ if(i >> z)
+ {
+ LLVector3 agentPos = gAgent.getPositionAgent();
+ U64 agentRegion = gAgent.getRegion()->getHandle();
+ LLVector3 targetPos(agentPos.mV[0],agentPos.mV[1],z);
+ LLVector3d pos_global = from_region_handle(agentRegion);
+ pos_global += LLVector3d((F64)targetPos.mV[0],(F64)targetPos.mV[1],(F64)targetPos.mV[2]);
+ gAgent.teleportViaLocation(pos_global);
+ return false;
+ }
+ }else if(command == *sEmeraldCmdLineTeleportHome)
+ {
+ gAgent.teleportHome();
+ return false;
+ }else if(command == *sEmeraldCmdLineRezPlatform)
+ {
+ F32 width;
+ if (i >> width) cmdline_rezplat(false, width);
+ else cmdline_rezplat();
+ return false;
+ }else if(command == *sEmeraldCmdLineMapTo)
+ {
+ if (revised_text.length() > command.length() + 1) //Typing this command with no argument was causing a crash. -Madgeek
+ {
+ LLVector3d agentPos = gAgent.getPositionGlobal();
+ S32 agent_x = llround( (F32)fmod( agentPos.mdV[VX], (F64)REGION_WIDTH_METERS ) );
+ S32 agent_y = llround( (F32)fmod( agentPos.mdV[VY], (F64)REGION_WIDTH_METERS ) );
+ S32 agent_z = llround( (F32)agentPos.mdV[VZ] );
+ std::string region_name = LLWeb::escapeURL(revised_text.substr(command.length()+1));
+ std::string url;
+
+ if(!*sEmeraldCmdLineMapToKeepPos)
+ {
+ agent_x = 128;
+ agent_y = 128;
+ agent_z = 0;
+ }
+
+ url = llformat("secondlife:///app/teleport/%s/%d/%d/%d",region_name.c_str(),agent_x,agent_y,agent_z);
+ LLURLDispatcher::dispatch(url, NULL, true);
+ }
+ return false;
+ }else if(command == *sEmeraldCmdLineCalc)//Cryogenic Blitz
+ {
+ bool success;
+ F32 result = 0.f;
+ if(revised_text.length() > command.length() + 1)
+ {
+
+ std::string expr = revised_text.substr(command.length()+1);
+ LLStringUtil::toUpper(expr);
+ success = LLCalc::getInstance()->evalString(expr, result);
+
+ std::string out;
+
+ if (!success)
+ {
+ out = "Calculation Failed";
+ }
+ else
+ {
+ // Replace the expression with the result
+ std::ostringstream result_str;
+ result_str << expr;
+ result_str << " = ";
+ result_str << result;
+ out = result_str.str();
+ }
+ cmdline_printchat(out);
+ return false;
+ }
+ }else if(command == *sEmeraldCmdLineTP2)
+ {
+ if (revised_text.length() > command.length() + 1) //Typing this command with no argument was causing a crash. -Madgeek
+ {
+ std::string name = revised_text.substr(command.length()+1);
+ cmdline_tp2name(name);
+ }
+ return false;
+ } /*
+ else if(revised_text == "/ac")
+ {
+ lggAutoCorrectFloaterStart::show(TRUE,NULL);
+ cmdline_printchat("Displaying AutoCorrection Floater.");
+ return false;
+ } */
+ else if(command == *sEmeraldCmdLineAutocorrect)
+ {
+ if (revised_text.length() <= command.length() + 1) //KOW: verify that we have params
+ {
+ cmdline_printchat("No parameter specified, correct usage is "+
+ *sEmeraldCmdLineAutocorrect+" list Name|wrong word|right word.");
+ return false;
+ }
+
+ std::string info = revised_text.substr((*sEmeraldCmdLineAutocorrect).length()+1);
+ //addac list name|wrong word|right word
+ int bar = info.find("|");
+ if (bar==std::string::npos)
+ {
+ cmdline_printchat("Wrong usage, correct usage is "+
+ *sEmeraldCmdLineAutocorrect+" list name|wrong word|right word.");
+ return false;
+ }
+
+
+ std::string listName = info.substr(0,bar);
+ info = info.substr(bar+1);
+
+ bar = info.find("|");
+ if (bar==std::string::npos)
+ {
+ cmdline_printchat("Wrong usage, correct usage is"+
+ *sEmeraldCmdLineAutocorrect+" list name|wrong word|right word.");
+ return false;
+ }
+
+ std::string wrong = info.substr(0,bar);
+ std::string right = info.substr(bar+1);
+ if(LGGAutoCorrect::getInstance()->addEntryToList(wrong,right,listName))
+ {
+ cmdline_printchat("Added "+wrong+"=>"+right+" to the "+listName+" list.");
+ LGGAutoCorrect::getInstance()->save();
+ return false;
+ }
+ else
+ cmdline_printchat("Invalid list specified, the default list is 'Custom'.");
+
+
+ }
+// else if (revised_text=="/reform")
+// {
+// cmdline_printchat("Reforming avatar.");
+//
+// gAgent.getAvatarObject()->initClass();
+// gAgent.getAvatarObject()->buildCharacter();
+// //gAgent.getAvatarObject()->loadAvatar();
+// return false;
+// }
+ else if(command == *sEmeraldCmdLineClearChat)
+ {
+ LLFloaterChat* chat = LLFloaterChat::getInstance(LLSD());
+ if(chat)
+ {
+ LLViewerTextEditor* history_editor = chat->getChild("Chat History Editor");
+ LLViewerTextEditor* history_editor_with_mute = chat->getChild("Chat History Editor with mute");
+ history_editor->clear();
+ history_editor_with_mute->clear();
+ return false;
+ }
+ }
+ else if(command == "zdrop")
+ {
+ cmdline_printchat("Zdrop running");
+ std::string lolfolder;
+ if(i >> lolfolder)
+ {
+ cmdline_printchat("Looking for folder");
+ std::stack lolstack;
+ LLDynamicArray > lolinv = findInventoryInFolder(lolfolder);
+ for(LLDynamicArray >::iterator it = lolinv.begin(); it != lolinv.end(); ++it)
+ {
+ LLViewerInventoryItem* item = *it;
+ lolstack.push(item);
+ }
+
+ if(lolstack.size())
+ {
+ std::string loldest;
+ if(i >> loldest)
+ {
+ cmdline_printchat("Found destination");
+ LLUUID sdest = LLUUID(loldest);
+ new JCZface(lolstack, sdest, 2.5f);
+ }
+ }
+ else
+ {
+ cmdline_printchat("Couldn't find folder.");
+ }
+ }
+ }
+ else if(command == "ztake")
+ {
+ std::string setting;
+ if(i >> setting)
+ {
+ if(setting == "on")
+ {
+ if(ztake != NULL)
+ {
+ cmdline_printchat("You're already doing that, I think.");
+ }
+ else
+ {
+ std::string folder_name;
+ if(i >> folder_name)
+ {
+ LLUUID folder = gInventory.findCategoryByName(folder_name);
+ if(folder.notNull())
+ {
+ ztake = new JCZtake(folder);
+ }
+ else
+ {
+ cmdline_printchat(llformat("You can't see any %s here!", folder_name.c_str()));
+ }
+ }
+ else
+ {
+ cmdline_printchat("What do you want to put the objects in?");
+ }
+ }
+ }
+ else if(setting == "off")
+ {
+ if(ztake == NULL)
+ {
+ cmdline_printchat("You weren't doing that anyway, were you?");
+ }
+ else
+ {
+ ztake->mRunning = TRUE;
+ delete ztake;
+ ztake = NULL;
+ }
+ }
+ else
+ {
+ cmdline_printchat(llformat("I don't know the word \"%s\".", setting.c_str()));
+ }
+ return false;
+ }
+ else
+ {
+ cmdline_printchat("I beg your pardon?");
+ }
+ return false;
+ }
+ else if(command == "invrepair")
+ {
+ invrepair();
+ }
+#ifdef JC_PROFILE_GSAVED
+ else if(command == "gsavedprofile")
+ {
+ int count = 0;
+ int top = 0;
+ if(i >> top)
+ {
+ cmdline_printchat("printing top " + llformat("%d", top) + " calls");
+ std::map data = get_gsaved_calls();
+
+ std::multimap flip;
+ for(std::map::iterator iter = data.begin(); iter != data.end(); ++iter )
+ {
+ flip.insert(std::pair(iter->second,iter->first));
+ }
+ for(std::multimap::reverse_iterator iter = flip.rbegin(); iter != flip.rend() && count < top; ++iter)
+ {
+ cmdline_printchat(iter->second + " = " + llformat("%d", iter->first) + " calls");
+ count += 1;
+ }
+ }
+ }else if(command == "gsavedcalls")
+ {
+ std::string name;
+ if(i >> name)
+ {
+ std::map data = get_gsaved_calls();
+ if(data.find(name) != data.end())
+ {
+ cmdline_printchat(llformat("%d", data[name])+" calls for "+name);
+ }else
+ {
+ cmdline_printchat("no entry for "+name);
+ }
+ }
+ }
+#endif
+ }
+ }
+ return true;
+}
+
+//case insensative search for avatar in draw distance
+//TODO: make this use the avatar list floaters list so we have EVERYONE
+// even if they are out of draw distance.
+LLUUID cmdline_partial_name2key(std::string partial_name)
+{
+ std::vector avatars;
+ std::string av_name;
+ LLStringUtil::toLower(partial_name);
+ LLWorld::getInstance()->getAvatars(&avatars);
+ typedef std::vector::const_iterator av_iter;
+// bool has_avatarlist = (LLFloaterAvatarList::getInstance() ? true : false);
+// if(has_avatarlist)
+// LLFloaterAvatarList::getInstance()->updateAvatarList();
+ for(av_iter i = avatars.begin(); i != avatars.end(); ++i)
+ {
+// if(has_avatarlist)
+// {
+// LLAvatarListEntry* entry = LLFloaterAvatarList::getInstance()->getAvatarEntry(*i);
+// if(entry)
+// {
+// av_name = entry->getName();
+// }
+// }
+ if (av_name.empty() && !gCacheName->getFullName(*i, av_name))
+ {
+ LLViewerObject *obj = gObjectList.findObject(*i);
+ if(obj)
+ {
+ LLVOAvatar* avatarp = dynamic_cast(obj);
+ av_name = avatarp->getFullname();
+ }
+ }
+ LLStringUtil::toLower(av_name);
+ if(strstr(av_name.c_str(), partial_name.c_str()))
+ {
+ return *i;
+ }
+ }
+ return LLUUID::null;
+}
+
+
+
+void cmdline_tp2name(std::string target)
+{
+ LLUUID avkey = cmdline_partial_name2key(target);
+ if(avkey.isNull())
+ {
+ cmdline_printchat("Avatar not found.");
+ return;
+ }
+// LLFloaterAvatarList* avlist = LLFloaterAvatarList::getInstance();
+ LLViewerObject* obj = gObjectList.findObject(avkey);
+ if(obj)
+ {
+ LLVector3d pos = obj->getPositionGlobal();
+ pos.mdV[VZ] += 2.0;
+ gAgent.teleportViaLocation(pos);
+ }
+/* else if(avlist)
+ {
+ LLAvatarListEntry* entry = avlist->getAvatarEntry(avkey);
+ if(entry)
+ {
+ LLVector3d pos = entry->getPosition();
+ pos.mdV[VZ] += 2.0;
+ gAgent.teleportViaLocation(pos);
+ }
+ } */
+}
+
+void cmdline_rezplat(bool use_saved_value, F32 visual_radius) //cmdline_rezplat() will still work... just will use the saved value
+{
+ LLVector3 agentPos = gAgent.getPositionAgent()+(gAgent.getVelocity()*(F32)0.333);
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_ObjectAdd);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID());
+ msg->nextBlockFast(_PREHASH_ObjectData);
+ msg->addU8Fast(_PREHASH_PCode, LL_PCODE_VOLUME);
+ msg->addU8Fast(_PREHASH_Material, LL_MCODE_METAL);
+
+ if(agentPos.mV[2] > 4096.0)msg->addU32Fast(_PREHASH_AddFlags, FLAGS_CREATE_SELECTED);
+ else msg->addU32Fast(_PREHASH_AddFlags, 0);
+
+ LLVolumeParams volume_params;
+
+ volume_params.setType( LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_CIRCLE_33 );
+ volume_params.setRatio ( 2, 2 );
+ volume_params.setShear ( 0, 0 );
+ volume_params.setTaper(2.0f,2.0f);
+ volume_params.setTaperX(0.f);
+ volume_params.setTaperY(0.f);
+
+ LLVolumeMessage::packVolumeParams(&volume_params, msg);
+ LLVector3 rezpos = agentPos - LLVector3(0.0f,0.0f,2.5f);
+ LLQuaternion rotation;
+ rotation.setQuat(90.f * DEG_TO_RAD, LLVector3::y_axis);
+
+ static F32 *sEmeraldCmdLinePlatformSize = rebind_llcontrol("EmeraldCmdLinePlatformSize", &gSavedSettings, true);
+
+ if (use_saved_value) visual_radius = *sEmeraldCmdLinePlatformSize;
+ F32 realsize = visual_radius / 3.0f;
+ if (realsize < 0.01f) realsize = 0.01f;
+ else if (realsize > 10.0f) realsize = 10.0f;
+
+ msg->addVector3Fast(_PREHASH_Scale, LLVector3(0.01f,realsize,realsize) );
+ msg->addQuatFast(_PREHASH_Rotation, rotation );
+ msg->addVector3Fast(_PREHASH_RayStart, rezpos );
+ msg->addVector3Fast(_PREHASH_RayEnd, rezpos );
+ msg->addU8Fast(_PREHASH_BypassRaycast, (U8)1 );
+ msg->addU8Fast(_PREHASH_RayEndIsIntersection, (U8)FALSE );
+ msg->addU8Fast(_PREHASH_State, 0);
+ msg->addUUIDFast(_PREHASH_RayTargetID, LLUUID::null );
+ msg->sendReliable(gAgent.getRegionHost());
+}
+
+void cmdline_printchat(std::string message)
+{
+ LLChat chat;
+ chat.mText = message;
+ chat.mSourceType = CHAT_SOURCE_SYSTEM;
+ LLFloaterChat::addChat(chat, FALSE, FALSE);
+}
+
diff --git a/linden/indra/newview/llchatbar.cpp b/linden/indra/newview/llchatbar.cpp
index 3c977dd..dc67448 100644
--- a/linden/indra/newview/llchatbar.cpp
+++ b/linden/indra/newview/llchatbar.cpp
@@ -69,6 +69,7 @@
#include "llui.h"
#include "lluictrlfactory.h"
+#include "chatbar_as_cmdline.h"
//
// Globals
@@ -457,6 +458,8 @@ void LLChatBar::sendChat( EChatType type )
utf8_revised_text = utf8str_trim(utf8_revised_text);
if (!utf8_revised_text.empty())
+
+ if (!utf8_revised_text.empty() && cmd_line_chat(utf8_revised_text, type))
{
// Chat with animation
sendChatFromViewer(utf8_revised_text, type, TRUE);
diff --git a/linden/indra/newview/llinventorymodel.cpp b/linden/indra/newview/llinventorymodel.cpp
index aaaa1dd..c066a04 100644
--- a/linden/indra/newview/llinventorymodel.cpp
+++ b/linden/indra/newview/llinventorymodel.cpp
@@ -361,6 +361,28 @@ LLUUID LLInventoryModel::findCatUUID(LLAssetType::EType preferred_type)
return LLUUID::null;
}
+LLUUID LLInventoryModel::findCategoryByName(std::string name)
+{
+ LLUUID root_id = gAgent.getInventoryRootID();
+ if(root_id.notNull())
+ {
+ cat_array_t* cats = NULL;
+ cats = get_ptr_in_map(mParentChildCategoryTree, root_id);
+ if(cats)
+ {
+ S32 count = cats->count();
+ for(S32 i = 0; i < count; ++i)
+ {
+ if(cats->get(i)->getName() == name)
+ {
+ return cats->get(i)->getUUID();
+ }
+ }
+ }
+ }
+ return LLUUID::null;
+}
+
// Convenience function to create a new category. You could call
// updateCategory() with a newly generated UUID category, but this
// version will take care of details like what the name should be
diff --git a/linden/indra/newview/llinventorymodel.h b/linden/indra/newview/llinventorymodel.h
index 74a2ec7..fee509b 100644
--- a/linden/indra/newview/llinventorymodel.h
+++ b/linden/indra/newview/llinventorymodel.h
@@ -312,6 +312,8 @@ public:
LLAssetType::EType preferred_type,
const std::string& name);
+ LLUUID findCategoryByName(std::string name);
+
// methods to load up inventory skeleton & meat. These are used
// during authentication. return true if everything parsed.
typedef std::map response_t;
diff --git a/linden/indra/newview/llprefsadvanced.cpp b/linden/indra/newview/llprefsadvanced.cpp
index 4ae093e..3c4af02 100644
--- a/linden/indra/newview/llprefsadvanced.cpp
+++ b/linden/indra/newview/llprefsadvanced.cpp
@@ -96,6 +96,22 @@ BOOL LLPrefsAdvanced::postBuild()
LLComboBox* crash_behavior_combobox = getChild("crash_behavior_combobox");
crash_behavior_combobox->setCurrentByIndex(gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING));
+ childSetCommitCallback("EmeraldCmdLinePos", onCommitApplyControl);
+ childSetCommitCallback("EmeraldCmdLineGround", onCommitApplyControl);
+ childSetCommitCallback("EmeraldCmdLineHeight", onCommitApplyControl);
+ childSetCommitCallback("EmeraldCmdLineTeleportHome", onCommitApplyControl);
+ childSetCommitCallback("EmeraldCmdLineRezPlatform", onCommitApplyControl);
+ childSetCommitCallback("EmeraldCmdLineMapTo", onCommitApplyControl);
+ childSetCommitCallback("EmeraldCmdLineCalc", onCommitApplyControl);
+
+ childSetCommitCallback("EmeraldCmdLineDrawDistance", onCommitApplyControl);
+ childSetCommitCallback("EmeraldCmdTeleportToCam", onCommitApplyControl);
+ childSetCommitCallback("EmeraldCmdLineKeyToName", onCommitApplyControl);
+ childSetCommitCallback("EmeraldCmdLineOfferTp", onCommitApplyControl);
+ childSetCommitCallback("EmeraldCmdLineTP2", onCommitApplyControl);
+ childSetCommitCallback("EmeraldCmdLineAO", onCommitApplyControl);
+ childSetCommitCallback("EmeraldCmdLineClearChat", onCommitApplyControl);
+
getChild("EmeraldSpellBase")->setCommitCallback(onSpellBaseComboBoxCommit);
getChild("EmSpell_EditCustom")->setClickedCallback(onSpellEditCustom, this);
getChild("EmSpell_GetMore")->setClickedCallback(onSpellGetMore, this);
@@ -273,6 +289,17 @@ bool LLPrefsAdvanced::callbackReset(const LLSD& notification, const LLSD& respon
return false;
}
+//workaround for lineeditor dumbness in regards to control_name
+void LLPrefsAdvanced::onCommitApplyControl(LLUICtrl* caller, void* user_data)
+{
+ LLLineEditor* line = (LLLineEditor*)caller;
+ if(line)
+ {
+ LLControlVariable *var = line->findControl(line->getControlName());
+ if(var)var->setValue(line->getValue());
+ }
+}
+
void LLPrefsAdvanced::onSpellAdd(void* data)
{
LLPrefsAdvanced* panel = (LLPrefsAdvanced*)data;
diff --git a/linden/indra/newview/llprefsadvanced.h b/linden/indra/newview/llprefsadvanced.h
index 4bf2ff1..f5fba10 100644
--- a/linden/indra/newview/llprefsadvanced.h
+++ b/linden/indra/newview/llprefsadvanced.h
@@ -53,6 +53,8 @@ private:
static bool callbackReset(const LLSD& notification, const LLSD& response, LLPrefsAdvanced *self);
+ static void onCommitApplyControl(LLUICtrl* caller, void* user_data);
+
static void onSpellAdd(void* data);
static void onSpellRemove(void* data);
static void onSpellGetMore(void* data);
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
index 669f0e2..d0a0c21 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
@@ -125,6 +125,115 @@
tool_tip="Reset all preferences to their default values (requires a restart)" />
+
+
+
+ Teleport within sim (usage: cmd x y z)
+
+ Teleport to ground (usage: cmd)
+
+ Teleport to altitude (usage: cmd z)
+
+ Teleport home (usage: cmd)
+
+ Rez a platform (usage: cmd 0 - 30)
+
+
+ Teleport to sim x (usage: cmd simname)
+
+
+ Calc. expressions (usage: cmd SIN(2+2))
+
+ Add autocorrect word(cmd list|bad|good)
+
+
+ Change Draw Distance (usage: cmd meters)
+
+ Teleport to cam position (usage: cmd)
+
+ Get avatar name from key (usage: cmd key)
+
+ Offer teleport to avatar (usage: cmd key)
+
+ Teleport to avatar (usage: cmd name)
+
+ Turn AO on/off (usage: cmd on/off)
+
+ Clear the chat history (usage: cmd)
+
+ Set the media url (usage: cmd url type)
+
+ Set the music stream url (usage: cmd url)
+
+
+
Value
0
+ EmeraldAutoCorrectCount
+
+ Comment
+ How many words have been auto replaced.
+ Persist
+ 1
+ Type
+ S32
+ Value
+ 0
+
EmeraldTranslateReplace
Comment
@@ -1581,7 +1592,7 @@
Value
English (United States of America)
-
+
RestrainedLife
diff --git a/linden/indra/newview/chatbar_as_cmdline.cpp b/linden/indra/newview/chatbar_as_cmdline.cpp
index 3e1d817..61e4ef4 100644
--- a/linden/indra/newview/chatbar_as_cmdline.cpp
+++ b/linden/indra/newview/chatbar_as_cmdline.cpp
@@ -72,7 +72,7 @@
#include "audioengine.h"
#include "llviewerparcelmediaautoplay.h"
#include "lloverlaybar.h"
-//KOW #include "lggautocorrectfloater.h"
+#include "lggautocorrectfloater.h"
#include "lggautocorrect.h"
//#define JC_PROFILE_GSAVED
@@ -623,13 +623,13 @@ bool cmd_line_chat(std::string revised_text, EChatType type)
cmdline_tp2name(name);
}
return false;
- } /*
+ }
else if(revised_text == "/ac")
{
lggAutoCorrectFloaterStart::show(TRUE,NULL);
cmdline_printchat("Displaying AutoCorrection Floater.");
return false;
- } */
+ }
else if(command == *sEmeraldCmdLineAutocorrect)
{
if (revised_text.length() <= command.length() + 1) //KOW: verify that we have params
diff --git a/linden/indra/newview/lggautocorrectfloater.cpp b/linden/indra/newview/lggautocorrectfloater.cpp
new file mode 100644
index 0000000..9d68b25
--- /dev/null
+++ b/linden/indra/newview/lggautocorrectfloater.cpp
@@ -0,0 +1,444 @@
+/* Copyright (c) 2009
+*
+* Greg Hendrickson (LordGregGreg Back). All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or
+* without modification, are permitted provided that the following
+* conditions are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* 2. 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.
+* 3. Neither the name Modular Systems 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 MODULAR SYSTEMS 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 MODULAR SYSTEMS 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 "llviewerprecompiledheaders.h"
+
+#include "lggautocorrectfloater.h"
+
+#include "llagentdata.h"
+#include "llcommandhandler.h"
+#include "llfloater.h"
+#include "lluictrlfactory.h"
+#include "llagent.h"
+#include "llpanel.h"
+#include "llbutton.h"
+#include "llcolorswatch.h"
+#include "llcombobox.h"
+#include "llview.h"
+#include "llprefsadvanced.h"
+#include "llhttpclient.h"
+#include "llbufferstream.h"
+#include "llcheckboxctrl.h"
+#include "llviewercontrol.h"
+
+#include "llui.h"
+#include "llcontrol.h"
+#include "llscrolllistctrl.h"
+#include "llscrollingpanellist.h"
+#include "lggautocorrect.h"
+#include "llfilepicker.h"
+#include "llfile.h"
+#include "llsdserialize.h"
+#include "llfloaterchat.h"
+#include "llchat.h"
+#include "llviewerinventory.h"
+#include "llinventorymodel.h"
+#include "llhost.h"
+#include "llassetstorage.h"
+#include "roles_constants.h"
+#include "llviewertexteditor.h"
+#include
+
+#include
+
+class lggAutoCorrectFloater;
+class lggAutoCorrectFloater : public LLFloater, public LLFloaterSingleton
+{
+public:
+ lggAutoCorrectFloater(const LLSD& seed);
+ virtual ~lggAutoCorrectFloater();
+ BOOL postBuild(void);
+ void setData(void * data);
+ void updateEnabledStuff();
+ void updateNamesList();
+ void updateListControlsEnabled(BOOL selected);
+ void updateItemsList();
+
+
+ LLScrollListCtrl *namesList;
+
+ LLScrollListCtrl *entryList;
+ LLPrefsAdvanced * empanel;
+private:
+ static lggAutoCorrectFloater* sInstance;
+ static JCInvDropTarget* mNotecardDropTarget;
+ static void onBoxCommitEnabled(LLUICtrl* caller, void* user_data);
+ static void onEntrySettingChange(LLUICtrl* caller, void* user_data);
+ static void onSelectName(LLUICtrl* caller, void* user_data);
+ static void ResponseItemDrop(LLViewerInventoryItem* item);
+ static void onNotecardLoadComplete(LLVFS *vfs,const LLUUID& asset_uuid,LLAssetType::EType type,void* user_data, S32 status, LLExtStat ext_status);
+
+
+ static void deleteEntry(void* data);
+ static void addEntry(void* data);
+ static void exportList(void* data);
+ static void removeList(void* data);
+ static void loadList(void* data);
+
+};
+
+
+
+JCInvDropTarget * lggAutoCorrectFloater::mNotecardDropTarget;
+lggAutoCorrectFloater* lggAutoCorrectFloater::sInstance;
+
+lggAutoCorrectFloater::~lggAutoCorrectFloater()
+{
+ sInstance = NULL;
+ delete mNotecardDropTarget;
+ mNotecardDropTarget = NULL;
+}
+lggAutoCorrectFloater::lggAutoCorrectFloater(const LLSD& seed)
+{
+ LLUICtrlFactory::getInstance()->buildFloater(this, "floater_autocorrect.xml");
+
+ if (getRect().mLeft == 0
+ && getRect().mBottom == 0)
+ {
+ center();
+ }
+ if(sInstance)delete sInstance;
+ sInstance = this;
+
+}
+
+BOOL lggAutoCorrectFloater::postBuild(void)
+{
+
+ namesList = getChild("em_ac_list_name");
+ entryList = getChild("em_ac_list_entry");
+
+ childSetCommitCallback("em_ac_enable",onBoxCommitEnabled);
+
+ childSetCommitCallback("em_ac_list_enabled",onEntrySettingChange);
+ childSetCommitCallback("em_ac_list_show",onEntrySettingChange);
+ childSetCommitCallback("em_ac_list_style",onEntrySettingChange);
+ childSetCommitCallback("em_ac_priority",onEntrySettingChange);
+
+
+
+ updateEnabledStuff();
+ updateNamesList();
+
+
+ namesList->setCommitOnSelectionChange(TRUE);
+ childSetCommitCallback("em_ac_list_name", onSelectName, this);
+
+ childSetAction("em_ac_deletelist",removeList,this);
+ childSetAction("em_ac_rementry",deleteEntry,this);
+ childSetAction("em_ac_exportlist",exportList,this);
+ childSetAction("em_ac_addentry",addEntry,this);
+ childSetAction("em_ac_loadlist",loadList,this);
+
+ LLView *target_view = getChild("em_ac_notecard_target");
+ if(target_view)
+ {
+ if (mNotecardDropTarget)//shouldn't happen
+ {
+ delete mNotecardDropTarget;
+ }
+ mNotecardDropTarget = new JCInvDropTarget("drop target", target_view->getRect(), ResponseItemDrop);//, mAvatarID);
+ addChild(mNotecardDropTarget);
+ }
+ return true;
+}
+void lggAutoCorrectFloater::ResponseItemDrop(LLViewerInventoryItem* item)
+{
+ if(item)
+ {
+ if (gAgent.allowOperation(PERM_COPY, item->getPermissions(),GP_OBJECT_MANIPULATE) || gAgent.isGodlike())
+ {
+ if(!item->getAssetUUID().isNull())
+ gAssetStorage->getInvItemAsset(LLHost::invalid,
+ gAgent.getID(),
+ gAgent.getSessionID(),
+ item->getPermissions().getOwner(),
+ LLUUID::null,
+ item->getUUID(),
+ item->getAssetUUID(),
+ item->getType(),
+ &onNotecardLoadComplete,
+ (void*)item,
+ TRUE);
+ gSavedSettings.setBOOL("EmeraldEnableAutoCorrect",true);
+
+ }
+ }
+}
+void lggAutoCorrectFloater::onNotecardLoadComplete(LLVFS *vfs,const LLUUID& asset_uuid,LLAssetType::EType type,void* user_data, S32 status, LLExtStat ext_status)
+{
+ if(status == LL_ERR_NOERR)
+ {
+ S32 size = vfs->getSize(asset_uuid, type);
+ U8* buffer = new U8[size];
+ vfs->getData(asset_uuid, type, buffer, 0, size);
+
+ if(type == LLAssetType::AT_NOTECARD)
+ {
+ LLViewerTextEditor* edit = new LLViewerTextEditor("",LLRect(0,0,0,0),S32_MAX,"");
+ if(edit->importBuffer((char*)buffer, (S32)size))
+ {
+ llinfos << "decode success" << llendl;
+ std::string card = edit->getText();
+ edit->die();
+ LLSD info;
+ std::istringstream ins; // Declare an input string stream.
+ ins.str(card); // Specify string to read.
+
+ LLSDSerialize::fromXML(info,ins);
+
+ LGGAutoCorrect::getInstance()->addCorrectionList(info);
+ llinfos << "read success" << llendl;
+ sInstance->updateEnabledStuff();
+ }
+ else
+ {
+ llinfos << "decode error" << llendl;
+ }
+ }
+ }
+ else
+ {
+ llinfos << "read error" << llendl;
+ }
+}
+
+
+void lggAutoCorrectFloater::onSelectName(LLUICtrl* ctrl, void* user_data)
+{
+ sInstance->updateItemsList();
+}
+void lggAutoCorrectFloater::updateItemsList()
+{
+ entryList->deleteAllItems();
+ if((namesList->getAllSelected().size())<=0)
+ {
+
+ updateListControlsEnabled(FALSE);
+ return;
+ }
+
+ updateListControlsEnabled(TRUE);
+ std::string listName= namesList->getFirstSelected()->getColumn(0)->getValue().asString();
+
+ LLSD listData = LGGAutoCorrect::getInstance()->getAutoCorrectEntries(listName);
+ childSetValue("em_ac_list_enabled",listData["enabled"].asBoolean());
+ childSetValue("em_ac_list_style",listData["wordStyle"].asBoolean());
+ childSetValue("em_ac_list_show",listData["announce"].asBoolean());
+ childSetValue("em_ac_text_name",listName);
+ childSetValue("em_ac_text_author",listData["author"]);
+ childSetValue("em_ac_priority",listData["priority"]);
+ static S32 *countAuto= rebind_llcontrol("EmeraldAutoCorrectCount", &gSavedSettings, true);
+ childSetValue("em_ac_stats",*countAuto);
+
+ LLSD autoCorrects = listData["data"];
+ LLSD::map_const_iterator loc_it = autoCorrects.beginMap();
+ LLSD::map_const_iterator loc_end = autoCorrects.endMap();
+ for ( ; loc_it != loc_end; ++loc_it)
+ {
+ const std::string& wrong = (*loc_it).first;
+ const std::string& right = (*loc_it).second;
+
+ //std::string lentry(wrong+"=>"+right);
+
+ LLSD element;
+ element["id"] = wrong;
+ LLSD& s_column = element["columns"][0];
+ s_column["column"] = "Search";
+ s_column["value"] = wrong;
+ s_column["font"] = "SANSSERIF";
+ LLSD& r_column = element["columns"][1];
+ r_column["column"] = "Replace";
+ r_column["value"] = right;
+ r_column["font"] = "SANSSERIF";
+
+ entryList->addElement(element, ADD_BOTTOM);
+ }
+
+}
+void lggAutoCorrectFloater::updateNamesList()
+{
+ namesList->deleteAllItems();
+ static BOOL *enabledd = rebind_llcontrol("EmeraldEnableAutoCorrect", &gSavedSettings, true);
+ if(!(*enabledd))
+ {
+ updateItemsList();
+ return;
+ }
+ static S32 *countAuto= rebind_llcontrol("EmeraldAutoCorrectCount", &gSavedSettings, true);
+ childSetValue("em_ac_stats",*countAuto);
+ LLSD autoCorrects = LGGAutoCorrect::getInstance()->getAutoCorrects();
+ LLSD::map_const_iterator loc_it = autoCorrects.beginMap();
+ LLSD::map_const_iterator loc_end = autoCorrects.endMap();
+ for ( ; loc_it != loc_end; ++loc_it)
+ {
+ const std::string& listName = (*loc_it).first;
+
+ LLSD element;
+ element["id"] = listName;
+ LLSD& friend_column = element["columns"][0];
+ friend_column["column"] = "Entries";
+ friend_column["value"] = listName;
+ friend_column["font"] = "SANSSERIF";
+ const LLSD& loc_map = (*loc_it).second;
+ if(loc_map["enabled"].asBoolean())
+ friend_column["font-style"] = "BOLD";
+ else
+ friend_column["font-style"] = "NORMAL";
+ if(namesList)
+ namesList->addElement(element, ADD_BOTTOM);
+ }
+ updateItemsList();
+}
+void lggAutoCorrectFloater::updateListControlsEnabled(BOOL selected)
+{
+
+ childSetEnabled("em_ac_text1",selected);
+ childSetEnabled("em_ac_text2",selected);
+ childSetEnabled("em_ac_text_name",selected);
+ childSetEnabled("em_ac_text_author",selected);
+ childSetEnabled("em_ac_list_enabled",selected);
+ childSetEnabled("em_ac_list_show",selected);
+ childSetEnabled("em_ac_list_style",selected);
+ childSetEnabled("em_ac_deletelist",selected);
+ childSetEnabled("em_ac_exportlist",selected);
+ childSetEnabled("em_ac_addentry",selected);
+ childSetEnabled("em_ac_rementry",selected);
+ childSetEnabled("em_ac_priority",selected);
+
+}
+void lggAutoCorrectFloater::updateEnabledStuff()
+{
+ static BOOL *enabledd = rebind_llcontrol("EmeraldEnableAutoCorrect", &gSavedSettings, true);
+ if(!(*enabledd))
+ {
+ getChild("em_ac_enable")->setEnabledColor(LLColor4(1.0f,0.0f,0.0f,1.0f));
+ }else
+ {
+ getChild("em_ac_enable")->setEnabledColor(LLUI::sColorsGroup->getColor( "LabelTextColor" ));
+ }
+
+ childSetEnabled("em_ac_list_name",*enabledd);
+ childSetEnabled("em_ac_list_entry",*enabledd);
+ updateListControlsEnabled(*enabledd);
+ updateNamesList();
+ LGGAutoCorrect::getInstance()->save();
+
+}
+void lggAutoCorrectFloater::setData(void * data)
+{
+ empanel = (LLPrefsAdvanced*)data;
+}
+void lggAutoCorrectFloater::onBoxCommitEnabled(LLUICtrl* caller, void* user_data)
+{
+ sInstance->updateEnabledStuff();
+}
+void lggAutoCorrectFloater::onEntrySettingChange(LLUICtrl* caller, void* user_data)
+{
+ std::string listName= sInstance->namesList->getFirstSelected()->getColumn(0)->getValue().asString();
+ LGGAutoCorrect::getInstance()->setListEnabled(listName,sInstance->childGetValue("em_ac_list_enabled").asBoolean());
+ LGGAutoCorrect::getInstance()->setListAnnounceeState(listName,sInstance->childGetValue("em_ac_list_show").asBoolean());
+ LGGAutoCorrect::getInstance()->setListStyle(listName,sInstance->childGetValue("em_ac_list_style").asBoolean());
+ LGGAutoCorrect::getInstance()->setListPriority(listName,sInstance->childGetValue("em_ac_priority").asInteger());
+
+ //sInstance->updateEnabledStuff();
+ sInstance->updateItemsList();
+ LGGAutoCorrect::getInstance()->save();
+}
+void lggAutoCorrectFloater::deleteEntry(void* data)
+{
+ std::string listName= sInstance->namesList->getFirstSelected()->getColumn(0)->getValue().asString();
+
+ if((sInstance->entryList->getAllSelected().size())>0)
+ {
+ std::string wrong= sInstance->entryList->getFirstSelected()->getColumn(0)->getValue().asString();
+ LGGAutoCorrect::getInstance()->removeEntryFromList(wrong,listName);
+ sInstance->updateItemsList();
+ LGGAutoCorrect::getInstance()->save();
+ }
+}
+void lggAutoCorrectFloater::loadList(void* data)
+{
+ LLFilePicker& picker = LLFilePicker::instance();
+
+ if(!picker.getOpenFile( LLFilePicker::FFLOAD_XML) )
+ {return;
+ }
+ llifstream file;
+ file.open(picker.getFirstFile().c_str());
+ LLSD blankllsd;
+ if (file.is_open())
+ {
+ LLSDSerialize::fromXMLDocument(blankllsd, file);
+ }
+ file.close();
+ gSavedSettings.setBOOL("EmeraldEnableAutoCorrect",true);
+ LGGAutoCorrect::getInstance()->addCorrectionList(blankllsd);
+ sInstance->updateEnabledStuff();
+}
+void lggAutoCorrectFloater::removeList(void* data)
+{
+ std::string listName= sInstance->namesList->getFirstSelected()->getColumn(0)->getValue().asString();
+ LGGAutoCorrect::getInstance()->removeCorrectionList(listName);
+ sInstance->updateEnabledStuff();
+
+}
+void lggAutoCorrectFloater::exportList(void *data)
+{
+ std::string listName= sInstance->namesList->getFirstSelected()->getColumn(0)->getValue().asString();
+
+ LLFilePicker& picker = LLFilePicker::instance();
+
+ if(!picker.getSaveFile( LLFilePicker::FFSAVE_XML) )
+ {return;
+ }
+ llofstream file;
+ file.open(picker.getFirstFile().c_str());
+ LLSDSerialize::toPrettyXML(LGGAutoCorrect::getInstance()->exportList(listName), file);
+ file.close();
+}
+void lggAutoCorrectFloater::addEntry(void* data)
+{
+ std::string listName= sInstance->namesList->getFirstSelected()->getColumn(0)->getValue().asString();
+ LLChat chat;
+ chat.mText = "To add an entry, please type in chat \""+gSavedSettings.getString("EmeraldCmdLineAutocorrect")+" "+listName+"|wrongWord|rightWord\"";
+ chat.mSourceType = CHAT_SOURCE_SYSTEM;
+ LLFloaterChat::addChat(chat, FALSE, FALSE);
+}
+
+void lggAutoCorrectFloaterStart::show(BOOL showin,void * data)
+{
+ if(showin)
+ {
+ lggAutoCorrectFloater* dic_floater = lggAutoCorrectFloater::showInstance();
+ dic_floater->setData(data);
+ }
+}
diff --git a/linden/indra/newview/lggautocorrectfloater.h b/linden/indra/newview/lggautocorrectfloater.h
new file mode 100644
index 0000000..fbb7abb
--- /dev/null
+++ b/linden/indra/newview/lggautocorrectfloater.h
@@ -0,0 +1,40 @@
+/* Copyright (c) 2009
+*
+* Greg Hendrickson (LordGregGreg Back). All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or
+* without modification, are permitted provided that the following
+* conditions are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* 2. 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.
+* 3. Neither the name Modular Systems 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 MODULAR SYSTEMS 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 MODULAR SYSTEMS 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 "llview.h"
+#include "llviewerinventory.h"
+
+
+class lggAutoCorrectFloaterStart
+{
+ public:
+ static void show( BOOL showw , void * data);
+};
+
diff --git a/linden/indra/newview/llprefsadvanced.cpp b/linden/indra/newview/llprefsadvanced.cpp
index 3c4af02..a3efa38 100644
--- a/linden/indra/newview/llprefsadvanced.cpp
+++ b/linden/indra/newview/llprefsadvanced.cpp
@@ -38,10 +38,81 @@
#include "llviewermenu.h"
#include "llvoavatar.h"
#include "lgghunspell_wrapper.h"
+#include "lggautocorrectfloater.h"
#include "llcombobox.h"
#include "lluictrlfactory.h"
+////////begin drop utility/////////////
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class JCInvDropTarget
+//
+// This handy class is a simple way to drop something on another
+// view. It handles drop events, always setting itself to the size of
+// its parent.
+//
+// altered to support a callback so i can slap it in things and it just return the item to a func of my choice
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+
+
+JCInvDropTarget::JCInvDropTarget(const std::string& name, const LLRect& rect,
+ void (*callback)(LLViewerInventoryItem*)) :
+LLView(name, rect, NOT_MOUSE_OPAQUE, FOLLOWS_ALL),
+mDownCallback(callback)
+{
+}
+
+JCInvDropTarget::~JCInvDropTarget()
+{
+}
+
+void JCInvDropTarget::doDrop(EDragAndDropType cargo_type, void* cargo_data)
+{
+ llinfos << "JCInvDropTarget::doDrop()" << llendl;
+}
+
+BOOL JCInvDropTarget::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg)
+{
+ BOOL handled = FALSE;
+ if(getParent())
+ {
+ handled = TRUE;
+ // check the type
+ //switch(cargo_type)
+ //{
+ //case DAD_ANIMATION:
+ //{
+ LLViewerInventoryItem* inv_item = (LLViewerInventoryItem*)cargo_data;
+ if(gInventory.getItem(inv_item->getUUID()))
+ {
+ *accept = ACCEPT_YES_COPY_SINGLE;
+ if(drop)
+ {
+ //printchat("accepted");
+ mDownCallback(inv_item);
+ }
+ }
+ else
+ {
+ *accept = ACCEPT_NO;
+ }
+ // break;
+ //}
+ //default:
+ // *accept = ACCEPT_NO;
+ // break;
+ //}
+ }
+ return handled;
+}
+////////end drop utility///////////////
+
LLPrefsAdvanced* LLPrefsAdvanced::sInstance;
LLPrefsAdvanced::LLPrefsAdvanced()
@@ -118,6 +189,7 @@ BOOL LLPrefsAdvanced::postBuild()
getChild("EmSpell_Add")->setClickedCallback(onSpellAdd, this);
getChild("EmSpell_Remove")->setClickedCallback(onSpellRemove, this);
+ getChild("ac_button")->setClickedCallback(onAutoCorrectButton,this);
initHelpBtn("EmeraldHelp_SpellCheck", "EmeraldHelp_SpellCheck");
@@ -338,4 +410,9 @@ void LLPrefsAdvanced::onSpellBaseComboBoxCommit(LLUICtrl* ctrl, void* userdata)
}
//LLPanelEmerald* panel = (LLPanelEmerald*)userdata;
//if(panel)panel->refresh();
+}
+
+void LLPrefsAdvanced::onAutoCorrectButton(void * data)
+{
+ lggAutoCorrectFloaterStart::show(TRUE,data);
}
\ No newline at end of file
diff --git a/linden/indra/newview/llprefsadvanced.h b/linden/indra/newview/llprefsadvanced.h
index f5fba10..6a15fba 100644
--- a/linden/indra/newview/llprefsadvanced.h
+++ b/linden/indra/newview/llprefsadvanced.h
@@ -32,6 +32,26 @@
#define LLPREFSADVANCED_H
#include "llpanel.h"
+#include "llviewerinventory.h"
+
+class JCInvDropTarget : public LLView
+{
+public:
+ JCInvDropTarget(const std::string& name, const LLRect& rect, void (*callback)(LLViewerInventoryItem*));
+ ~JCInvDropTarget();
+
+ void doDrop(EDragAndDropType cargo_type, void* cargo_data);
+
+ //
+ // LLView functionality
+ virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg);
+protected:
+ void (*mDownCallback)(LLViewerInventoryItem*);
+};
class LLPrefsAdvanced : public LLPanel
{
@@ -60,6 +80,7 @@ private:
static void onSpellGetMore(void* data);
static void onSpellEditCustom(void* data);
static void onSpellBaseComboBoxCommit(LLUICtrl* ctrl, void* userdata);
+ static void onAutoCorrectButton(void * data);
protected:
void initHelpBtn(const std::string& name, const std::string& xml_alert);
diff --git a/linden/indra/newview/llstartup.cpp b/linden/indra/newview/llstartup.cpp
index a514e53..b76c5be 100644
--- a/linden/indra/newview/llstartup.cpp
+++ b/linden/indra/newview/llstartup.cpp
@@ -204,6 +204,8 @@
#include "hippoGridManager.h"
#include "hippoLimits.h"
+
+#include "lggautocorrect.h"
//
// exported globals
//
@@ -403,6 +405,8 @@ bool idle_startup()
glggHunSpell->initSettings();
+ LGGAutoCorrect::getInstance()->loadFromDisk();
+
// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.1d
if ( (gSavedSettings.controlExists(RLV_SETTING_MAIN)) && (gSavedSettings.getBOOL(RLV_SETTING_MAIN)) )
rlv_handler_t::setEnabled(TRUE);
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_autocorrect.xml b/linden/indra/newview/skins/default/xui/en-us/floater_autocorrect.xml
new file mode 100644
index 0000000..d11b5ed
--- /dev/null
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_autocorrect.xml
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+ Drop a Notecard here
+ to load from it.
+
+
+ List Name List Entries
+
+
+
+
+
+ List Name
+ Author:
+
+ Author Name
+
+
+
+
+
+
+
+
+
+
+ Words automatically corrected:
+
+ Count
+
+
+
\ No newline at end of file
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
index d0a0c21..bf261c6 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
@@ -270,6 +270,8 @@
To spellcheck, right click a misspelled word
(red or not) and click on its replacement
+
--
cgit v1.1
From 179461237035e443f80bacf1f3c58dac41b9f089 Mon Sep 17 00:00:00 2001
From: Patrick Sapinski
Date: Tue, 24 Aug 2010 21:20:22 -0400
Subject: added missing help notification for chatbar_as_cmdline
---
.../newview/skins/default/xui/en-us/notifications.xml | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/notifications.xml b/linden/indra/newview/skins/default/xui/en-us/notifications.xml
index 40b05c2..4bb2274 100644
--- a/linden/indra/newview/skins/default/xui/en-us/notifications.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/notifications.xml
@@ -7053,10 +7053,19 @@ Note: To comply with the Second Life Terms of Service, Imprudence did not downlo
+ icon="alertmodal.tga"
+ label="Emerald Help"
+ name="EmeraldHelp_CmdLine"
+ type="alertmodal">
+Various Options For Command Line features.
+To use a command, type it in your chat bar (Local chat) and press enter.
+
+
+
To Spell Check a word, right click on it and choose its replacement.
You may choose a base dictionary which stores the language style and basic words
You may also choose to install other word lists by choosing them from the list and "Install"
--
cgit v1.1
From fa642f9a3806a0c6e69bf27e37a4d3d4d99009ca Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Mon, 30 Aug 2010 19:27:49 -0700
Subject: Added missing chatbar_as_cmdline.h file
---
linden/indra/newview/chatbar_as_cmdline.h | 36 +++++++++++++++++++++++++++++++
1 file changed, 36 insertions(+)
create mode 100644 linden/indra/newview/chatbar_as_cmdline.h
(limited to 'linden/indra')
diff --git a/linden/indra/newview/chatbar_as_cmdline.h b/linden/indra/newview/chatbar_as_cmdline.h
new file mode 100644
index 0000000..01abfd0
--- /dev/null
+++ b/linden/indra/newview/chatbar_as_cmdline.h
@@ -0,0 +1,36 @@
+/* Copyright (c) 2009
+ *
+ * Modular Systems All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. 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.
+ * 3. Neither the name Modular Systems Ltd 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 MODULAR SYSTEMS LTD 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 MODULAR SYSTEMS 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 "llviewerprecompiledheaders.h"
+
+#include "llchatbar.h"
+
+bool cmd_line_chat(std::string revised_text, EChatType type);
--
cgit v1.1
From e0e982b0f96ea5a3e8e7bff00ea1004f9c349ccc Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Mon, 30 Aug 2010 19:55:44 -0700
Subject: Fixed bad merge in lltexteditor.cpp
---
linden/indra/llui/lltexteditor.cpp | 77 +++++++++++---------------------------
1 file changed, 21 insertions(+), 56 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/llui/lltexteditor.cpp b/linden/indra/llui/lltexteditor.cpp
index be6d3ef..51f7ad6 100644
--- a/linden/indra/llui/lltexteditor.cpp
+++ b/linden/indra/llui/lltexteditor.cpp
@@ -5007,69 +5007,35 @@ BOOL LLTextEditor::findHTML(const std::string &line, S32 *begin, S32 *end, std::
{
S32 strpos, strpos2;
- url = line.substr(*begin,*end - *begin);
- std::string slurlID = "slurl.com/secondlife/";
- strpos = url.find(slurlID);
-
- if (strpos < 0)
- {
- slurlID="maps.secondlife.com/secondlife/";
- strpos = url.find(slurlID);
- }
-
- if (strpos < 0)
+ // Is this try here still needed considering the changes to LLTextEditor::findHTMLToken? - MC
+ try
{
- slurlID="secondlife://";
+ url = line.substr(*begin,*end - *begin);
+ std::string slurlID = "slurl.com/secondlife/";
strpos = url.find(slurlID);
- }
-
- if (strpos < 0)
- {
- slurlID="sl://";
- strpos = url.find(slurlID);
- }
-
- if (strpos >= 0)
- {
- strpos+=slurlID.length();
- while ( ( strpos2=url.find("/",strpos) ) == -1 )
- {
- if ((*end+2) >= (S32)line.length() || line.substr(*end,1) != " " )
- {
- matched=FALSE;
- break;
- }
-
- strpos = (*end + 1) - *begin;
-
- *end = findHTMLToken(line,(*begin + strpos),FALSE);
- url = line.substr(*begin,*end - *begin);
- }
- }
-
if (strpos < 0)
- {
+ {
slurlID="maps.secondlife.com/secondlife/";
strpos = url.find(slurlID);
}
-
- if (strpos < 0)
- {
+
+ if (strpos < 0)
+ {
slurlID="secondlife://";
strpos = url.find(slurlID);
- }
-
- if (strpos < 0)
- {
+ }
+
+ if (strpos < 0)
+ {
slurlID="sl://";
strpos = url.find(slurlID);
- }
-
- if (strpos >= 0)
- {
+ }
+
+ if (strpos >= 0)
+ {
strpos+=slurlID.length();
-
+
while ( ( strpos2=url.find("/",strpos) ) == -1 )
{
if ((*end+2) >= (S32)line.length() || line.substr(*end,1) != " " )
@@ -5077,19 +5043,18 @@ BOOL LLTextEditor::findHTML(const std::string &line, S32 *begin, S32 *end, std::
matched=FALSE;
break;
}
-
+
strpos = (*end + 1) - *begin;
-
+
*end = findHTMLToken(line,(*begin + strpos),FALSE);
url = line.substr(*begin,*end - *begin);
}
- }
-
+ }
}
catch ( std::out_of_range outOfRange )
{
- LL_WARNS("TextEditor") << "got std::out_of_range exception \"" << line << "\"" << LL_ENDL;
+ llwarns << "got std::out_of_range exception \"" << line << "\"" << llendl;
}
}
--
cgit v1.1
From 128a12f22fb053ebfa21fb7366a84543db1342ca Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Mon, 30 Aug 2010 21:14:50 -0700
Subject: Fixed linking error with chat as command line
---
linden/indra/newview/floaterao.cpp | 13 ++-----------
1 file changed, 2 insertions(+), 11 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/floaterao.cpp b/linden/indra/newview/floaterao.cpp
index 4214e21..cfad0fb 100644
--- a/linden/indra/newview/floaterao.cpp
+++ b/linden/indra/newview/floaterao.cpp
@@ -19,8 +19,7 @@
#include "llcheckboxctrl.h"
#include "llcombobox.h"
#include "llspinctrl.h"
-// Uncomment and use instead if we ever add the chatbar as a command line - MC
-//#include "chatbar_as_cmdline.h"
+#include "chatbar_as_cmdline.h"
#include "llfloaterchat.h"
#include "llfirstuse.h"
@@ -35,15 +34,7 @@
#include "llboost.h"
#include
-// Uncomment and use instead if we ever add the chatbar as a command line - MC
-//void cmdline_printchat(std::string message);
-void cmdline_printchat(std::string message)
-{
- LLChat chat;
- chat.mText = message;
- chat.mSourceType = CHAT_SOURCE_SYSTEM;
- LLFloaterChat::addChat(chat, FALSE, FALSE);
-}
+void cmdline_printchat(std::string message);
AOInvTimer* gAOInvTimer = NULL;
--
cgit v1.1
From 8b4047234b884929b0db9941023b2b642d16053a Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Tue, 31 Aug 2010 12:39:58 -0700
Subject: Changed dictionary links from modularsystems.sl to
imprudenceviewer.org
---
linden/indra/newview/lggdicdownload.cpp | 4 ++--
linden/indra/newview/lgghunspell_wrapper.cpp | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/lggdicdownload.cpp b/linden/indra/newview/lggdicdownload.cpp
index 7011312..bd383e2 100644
--- a/linden/indra/newview/lggdicdownload.cpp
+++ b/linden/indra/newview/lggdicdownload.cpp
@@ -128,8 +128,8 @@ void lggDicDownloadFloater::onClickDownload(void* data)
{
index--;
std::string newDict(self->sNames[index]);
- LLHTTPClient::get("http://www.modularsystems.sl/app/dics/"+newDict+".aff", new EmeraldDicDownloader(self,newDict+".aff"));
- LLHTTPClient::get("http://www.modularsystems.sl/app/dics/"+newDict+".dic", new EmeraldDicDownloader(NULL,newDict+".dic"));
+ LLHTTPClient::get("http://www.imprudenceviewer.org/app/dics/"+newDict+".aff", new EmeraldDicDownloader(self,newDict+".aff"));
+ LLHTTPClient::get("http://www.imprudenceviewer.org/app/dics/"+newDict+".dic", new EmeraldDicDownloader(NULL,newDict+".dic"));
LLButton* butt = self->getChild("Emerald_dic_download");
if(butt)
diff --git a/linden/indra/newview/lgghunspell_wrapper.cpp b/linden/indra/newview/lgghunspell_wrapper.cpp
index 36ad94a..ff5a3d0 100644
--- a/linden/indra/newview/lgghunspell_wrapper.cpp
+++ b/linden/indra/newview/lgghunspell_wrapper.cpp
@@ -847,7 +847,7 @@ void lggHunSpell_Wrapper::getMoreButton(void * data)
{
std::vector shortNames;
std::vector longNames;
- LLSD response = LLHTTPClient::blockingGet("http://www.modularsystems.sl/app/dics/dic_list.xml");
+ LLSD response = LLHTTPClient::blockingGet("http://www.imprudenceviewer.org/app/dics/dic_list.xml");
if(response.has("body"))
{
const LLSD &dict_list = response["body"];
--
cgit v1.1
From 3e1f8f058a32f00320e560480dc93b62a3ce7619 Mon Sep 17 00:00:00 2001
From: Patrick Sapinski
Date: Wed, 1 Sep 2010 00:52:51 -0400
Subject: automatic translation feature
---
linden/indra/newview/llfloaterchat.cpp | 22 +++++++
linden/indra/newview/llfloaterchat.h | 2 +
linden/indra/newview/llprefschat.cpp | 11 ++++
linden/indra/newview/llviewercontrol.cpp | 31 ++++++++-
.../default/xui/en-us/floater_chat_history.xml | 15 +++--
.../default/xui/en-us/panel_preferences_chat.xml | 75 ++++++++++++++++++++++
6 files changed, 148 insertions(+), 8 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llfloaterchat.cpp b/linden/indra/newview/llfloaterchat.cpp
index b14930b..f7ff3f9 100644
--- a/linden/indra/newview/llfloaterchat.cpp
+++ b/linden/indra/newview/llfloaterchat.cpp
@@ -108,6 +108,8 @@ LLFloaterChat::LLFloaterChat(const LLSD& seed)
LLUICtrlFactory::getInstance()->buildFloater(this,"floater_chat_history.xml",&getFactoryMap(),no_open);
childSetCommitCallback("show mutes",onClickToggleShowMute,this); //show mutes
+ childSetCommitCallback("translate chat",onClickToggleTranslateChat,this);
+ childSetValue("translate chat", gSavedSettings.getBOOL("TranslateChat"));
childSetVisible("Chat History Editor with mute",FALSE);
childSetAction("toggle_active_speakers_btn", onClickToggleActiveSpeakers, this);
setDefaultBtn("Chat");
@@ -429,6 +431,26 @@ void LLFloaterChat::onClickToggleShowMute(LLUICtrl* caller, void *data)
}
}
+// Update the "TranslateChat" pref after "translate chat" checkbox is toggled in
+// the "Local Chat" floater.
+//static
+void LLFloaterChat::onClickToggleTranslateChat(LLUICtrl* caller, void *data)
+{
+ LLFloaterChat* floater = (LLFloaterChat*)data;
+
+ BOOL translate_chat = floater->getChild("translate chat")->get();
+ gSavedSettings.setBOOL("TranslateChat", translate_chat);
+}
+
+// Update the "translate chat" checkbox after the "TranslateChat" pref is set in
+// some other place (e.g. prefs dialog).
+//static
+void LLFloaterChat::updateSettings()
+{
+ BOOL translate_chat = gSavedSettings.getBOOL("TranslateChat");
+ LLFloaterChat::getInstance(LLSD())->getChild("translate chat")->set(translate_chat);
+}
+
// Put a line of chat in all the right places
void LLFloaterChat::addChat(const LLChat& chat,
BOOL from_instant_message,
diff --git a/linden/indra/newview/llfloaterchat.h b/linden/indra/newview/llfloaterchat.h
index e2bb54c..f894675 100644
--- a/linden/indra/newview/llfloaterchat.h
+++ b/linden/indra/newview/llfloaterchat.h
@@ -65,6 +65,7 @@ public:
virtual void onVisibilityChange(BOOL cur_visibility);
virtual void setMinimized(BOOL);
void updateConsoleVisibility();
+ void updateSettings();
static void setHistoryCursorAndScrollToEnd();
@@ -77,6 +78,7 @@ public:
static void onClickMute(void *data);
static void onClickToggleShowMute(LLUICtrl* caller, void *data);
+ static void onClickToggleTranslateChat(LLUICtrl* caller, void *data);
static void onClickToggleActiveSpeakers(void* userdata);
static void chatFromLogFile(LLLogChat::ELogLineType type,std::string line, void* userdata);
static void loadHistory();
diff --git a/linden/indra/newview/llprefschat.cpp b/linden/indra/newview/llprefschat.cpp
index 2e08cac..b4614b8 100644
--- a/linden/indra/newview/llprefschat.cpp
+++ b/linden/indra/newview/llprefschat.cpp
@@ -76,6 +76,8 @@ private:
BOOL mChatChannel;
F32 mConsoleOpacity;
F32 mBubbleOpacity;
+ std::string mTranslateLanguage;
+ BOOL mTranslateChat;
};
LLPrefsChatImpl::LLPrefsChatImpl()
@@ -110,6 +112,8 @@ LLPrefsChatImpl::LLPrefsChatImpl()
childSetValue("toggle_channel_control", gSavedSettings.getBOOL("ChatChannelSelect"));
childSetValue("console_opacity", gSavedSettings.getF32("ConsoleBackgroundOpacity"));
childSetValue("bubble_chat_opacity", gSavedSettings.getF32("ChatBubbleOpacity"));
+ childSetValue("translate_language_combobox", gSavedSettings.getString("TranslateLanguage"));
+ childSetValue("translate_chat", gSavedSettings.getBOOL("TranslateChat"));
}
void LLPrefsChatImpl::refreshValues()
@@ -137,6 +141,8 @@ void LLPrefsChatImpl::refreshValues()
mChatChannel = gSavedSettings.getBOOL("ChatChannelSelect");
mConsoleOpacity = gSavedSettings.getF32("ConsoleBackgroundOpacity");
mBubbleOpacity = gSavedSettings.getF32("ChatBubbleOpacity");
+ mTranslateLanguage = gSavedSettings.getString("TranslateLanguage");
+ mTranslateChat = gSavedSettings.getBOOL("TranslateChat");
}
void LLPrefsChatImpl::cancel()
@@ -163,6 +169,8 @@ void LLPrefsChatImpl::cancel()
gSavedSettings.setBOOL("ChatChannelSelect", mChatChannel);
gSavedSettings.setF32("ConsoleBackgroundOpacity", mConsoleOpacity);
gSavedSettings.setF32("ChatBubbleOpacity", mBubbleOpacity);
+ gSavedSettings.setString("TranslateLanguage", mTranslateLanguage);
+ gSavedSettings.setBOOL("TranslateChat", mTranslateChat);
}
void LLPrefsChatImpl::apply()
@@ -194,6 +202,9 @@ void LLPrefsChatImpl::apply()
gSavedSettings.setF32("ConsoleBackgroundOpacity", childGetValue("console_opacity").asReal());
gSavedSettings.setF32("ChatBubbleOpacity", childGetValue("bubble_chat_opacity").asReal());
+ gSavedSettings.setString("TranslateLanguage", childGetValue("translate_language_combobox"));
+ gSavedSettings.setBOOL("TranslateChat", childGetValue("translate_chat"));
+
BOOL chan_check = childGetValue("toggle_channel_control");
gSavedSettings.setBOOL("ChatChannelSelect", chan_check);
if (mChatChannel != chan_check)
diff --git a/linden/indra/newview/llviewercontrol.cpp b/linden/indra/newview/llviewercontrol.cpp
index e1507d4..a73d0ab 100644
--- a/linden/indra/newview/llviewercontrol.cpp
+++ b/linden/indra/newview/llviewercontrol.cpp
@@ -71,6 +71,7 @@
#include "llrender.h"
#include "llmediamanager.h"
#include "llslider.h"
+#include "llfloaterchat.h"
#ifdef TOGGLE_HACKED_GODLIKE_VIEWER
@@ -485,6 +486,32 @@ bool handleVoiceClientPrefsChanged(const LLSD& newvalue)
return true;
}
+bool handleTranslateChatPrefsChanged(const LLSD& newvalue)
+{
+ LLFloaterChat* floaterp = LLFloaterChat::getInstance();
+
+ if(floaterp)
+ {
+ // update "translate chat" pref in "Local Chat" floater
+ floaterp->updateSettings();
+ }
+ return true;
+}
+
+// [RLVa:KB] - Checked: 2009-08-11 (RLVa-1.0.1h) | Added: RLVa-1.0.1h
+bool rlvHandleEnableLegacyNamingChanged(const LLSD& newvalue)
+{
+ rlv_handler_t::fLegacyNaming = newvalue.asBoolean();
+ return true;
+}
+
+bool rlvHandleShowNameTagsChanged(const LLSD& newvalue)
+{
+ RlvSettings::fShowNameTags = newvalue.asBoolean();
+ return true;
+}
+// [/RLVa:KB]
+
bool handleMediaDebugLevelChanged(const LLSD& newvalue)
{
LLMediaManager *mgr = LLMediaManager::getInstance();
@@ -663,7 +690,8 @@ void settings_setup_listeners()
gSavedSettings.getControl("LipSyncEnabled")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _1));
gSavedSettings.getControl("MediaDebugLevel")->getSignal()->connect(boost::bind(&handleMediaDebugLevelChanged, _1));
gSavedSettings.getControl("SliderScrollWheelMultiplier")->getSignal()->connect(boost::bind(&handleSliderScrollWheelMultiplierChanged, _1));
-
+ gSavedSettings.getControl("TranslateChat")->getSignal()->connect(boost::bind(&handleTranslateChatPrefsChanged, _1));
+
// [RLVa:KB] - Checked: 2009-08-11 (RLVa-1.0.1h) | Added: RLVa-1.0.1h
if (gSavedSettings.controlExists(RLV_SETTING_ENABLELEGACYNAMING))
gSavedSettings.getControl(RLV_SETTING_ENABLELEGACYNAMING)->getSignal()->connect(boost::bind(&rlvHandleEnableLegacyNamingChanged, _1));
@@ -751,7 +779,6 @@ template <> eControlType get_control_type(const LLSD& in, LLSD& out)
return TYPE_LLSD;
}
-
#if TEST_CACHED_CONTROL
#define DECL_LLCC(T, V) static LLCachedControl mySetting_##T("TestCachedControl"#T, V)
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml b/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml
index 54c146d..2e6fee4 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml
@@ -65,9 +65,9 @@
Control your camera
-
-
@@ -75,10 +75,13 @@
Gestures
-
-
+
+
+
+ Translate Chat:
+
+
+
+ Translate into this language:
+
+
+
+ System Default
+
+
+ English
+
+
+
+
+
+ Dansk (Danish)
+
+
+ Deutsch (German)
+
+
+ Español (Spanish)
+
+
+ Français (French)
+
+
+ Italiano (Italian)
+
+
+ Magyar (Hungarian)
+
+
+ Nederlands (Dutch)
+
+
+ Polski (Polish)
+
+
+ Portugués (Portuguese)
+
+
+ Đ ÑƒÑÑĐºĐ¸Đ¹ (Russian)
+
+
+ TĂ¼rkçe (Turkish)
+
+
+ Đ£ĐºÑ€Đ°Ñ—Đ½ÑÑŒĐºĐ° (Ukrainian)
+
+
+ ä¸æ–‡ (简体) (Chinese)
+
+
+ æ—¥æœ¬èª (Japanese)
+
+
+ í•œêµ́–´ (Korean)
+
+
--
cgit v1.1
From 588e1e67092db54ec813ddf6383b7d4a95459a29 Mon Sep 17 00:00:00 2001
From: Patrick Sapinski
Date: Wed, 1 Sep 2010 00:53:27 -0400
Subject: enabled help button for cmdline
---
linden/indra/newview/llprefsadvanced.cpp | 1 +
1 file changed, 1 insertion(+)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llprefsadvanced.cpp b/linden/indra/newview/llprefsadvanced.cpp
index a3efa38..4a4b299 100644
--- a/linden/indra/newview/llprefsadvanced.cpp
+++ b/linden/indra/newview/llprefsadvanced.cpp
@@ -191,6 +191,7 @@ BOOL LLPrefsAdvanced::postBuild()
getChild("ac_button")->setClickedCallback(onAutoCorrectButton,this);
+ initHelpBtn("EmeraldHelp_CmdLine", "EmeraldHelp_CmdLine");
initHelpBtn("EmeraldHelp_SpellCheck", "EmeraldHelp_SpellCheck");
refresh();
--
cgit v1.1
From 3ae1fe5627c48d7136aea5b7b882e493a97ed90c Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Wed, 1 Sep 2010 07:57:04 -0700
Subject: Fixed function duplication after merge
---
linden/indra/newview/llviewercontrol.cpp | 14 --------------
1 file changed, 14 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llviewercontrol.cpp b/linden/indra/newview/llviewercontrol.cpp
index a73d0ab..50224ad 100644
--- a/linden/indra/newview/llviewercontrol.cpp
+++ b/linden/indra/newview/llviewercontrol.cpp
@@ -498,20 +498,6 @@ bool handleTranslateChatPrefsChanged(const LLSD& newvalue)
return true;
}
-// [RLVa:KB] - Checked: 2009-08-11 (RLVa-1.0.1h) | Added: RLVa-1.0.1h
-bool rlvHandleEnableLegacyNamingChanged(const LLSD& newvalue)
-{
- rlv_handler_t::fLegacyNaming = newvalue.asBoolean();
- return true;
-}
-
-bool rlvHandleShowNameTagsChanged(const LLSD& newvalue)
-{
- RlvSettings::fShowNameTags = newvalue.asBoolean();
- return true;
-}
-// [/RLVa:KB]
-
bool handleMediaDebugLevelChanged(const LLSD& newvalue)
{
LLMediaManager *mgr = LLMediaManager::getInstance();
--
cgit v1.1
From 7c0ec207f7095df176ccf34d7ea03bcf52d34899 Mon Sep 17 00:00:00 2001
From: Patrick Sapinski
Date: Wed, 1 Sep 2010 00:54:00 -0400
Subject: increased preference panel size
---
.../newview/skins/default/xui/en-us/floater_preferences.xml | 12 ++++++------
.../skins/default/xui/en-us/panel_preferences_advanced.xml | 2 +-
2 files changed, 7 insertions(+), 7 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_preferences.xml b/linden/indra/newview/skins/default/xui/en-us/floater_preferences.xml
index 214db25..5b42e9f 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_preferences.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_preferences.xml
@@ -1,25 +1,25 @@
-
-
-
-
-
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
index bf261c6..b86d1c2 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
@@ -3,7 +3,7 @@
height="408" label="Advanced" left="102" mouse_opaque="true"
name="advanced_panel" width="517">
-
Rect
Value
- 0
- 85
- 300
- 0
+ 11
+ 459
+ 311
+ 173
PreviewClassifiedRect
@@ -8307,9 +8307,9 @@
Rect
Value
- 0
- 85
- 300
+ 0
+ 530
+ 420
0
diff --git a/linden/indra/newview/llfloateranimpreview.cpp b/linden/indra/newview/llfloateranimpreview.cpp
index a7d880e..ce7737d 100644
--- a/linden/indra/newview/llfloateranimpreview.cpp
+++ b/linden/indra/newview/llfloateranimpreview.cpp
@@ -326,6 +326,7 @@ BOOL LLFloaterAnimPreview::postBuild()
seconds_string = llformat(" - %.2f seconds", motionp->getDuration());
setTitle(mFilename + std::string(seconds_string));
+
}
else
{
@@ -371,6 +372,13 @@ BOOL LLFloaterAnimPreview::postBuild()
//-----------------------------------------------------------------------------
LLFloaterAnimPreview::~LLFloaterAnimPreview()
{
+ if (mMotionID.notNull() && mAnimPreview)
+ {
+ mAnimPreview->getDummyAvatar()->deactivateAllMotions();
+ mAnimPreview->getDummyAvatar()->removeMotion(mMotionID);
+ LLKeyframeDataCache::removeKeyframeData(mMotionID);
+ }
+
delete mAnimPreview;
mAnimPreview = NULL;
@@ -389,7 +397,7 @@ void LLFloaterAnimPreview::draw()
if (mMotionID.notNull() && mAnimPreview)
{
- gGL.color3f(1.f, 1.f, 1.f);
+/* gGL.color3f(1.f, 1.f, 1.f);
gGL.getTexUnit(0)->bind(mAnimPreview->getTexture());
@@ -407,7 +415,7 @@ void LLFloaterAnimPreview::draw()
gGL.end();
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
-
+*/
LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
if (!avatarp->areAnimationsPaused())
{
@@ -451,7 +459,7 @@ void LLFloaterAnimPreview::resetMotion()
mPauseRequest = NULL;
}
}
-
+/*
//-----------------------------------------------------------------------------
// handleMouseDown()
//-----------------------------------------------------------------------------
@@ -553,7 +561,7 @@ void LLFloaterAnimPreview::onMouseCaptureLost()
{
gViewerWindow->showCursor();
}
-
+*/
//-----------------------------------------------------------------------------
// onBtnPlay()
//-----------------------------------------------------------------------------
diff --git a/linden/indra/newview/llfloateranimpreview.h b/linden/indra/newview/llfloateranimpreview.h
index 639c927..eaab186 100644
--- a/linden/indra/newview/llfloateranimpreview.h
+++ b/linden/indra/newview/llfloateranimpreview.h
@@ -32,7 +32,7 @@
#ifndef LL_LLFLOATERANIMPREVIEW_H
#define LL_LLFLOATERANIMPREVIEW_H
-
+#include "llagent.h"
#include "llfloaternamedesc.h"
#include "lldynamictexture.h"
#include "llcharacter.h"
@@ -55,7 +55,10 @@ public:
void pan(F32 right, F32 up);
virtual BOOL needsUpdate() { return mNeedsUpdate; }
- LLVOAvatar* getDummyAvatar() { return mDummyAvatar; }
+// LLVOAvatar* getDummyAvatar() { return mDummyAvatar; }
+// HACK:don't get a dummy...
+ LLVOAvatar* getDummyAvatar() { return gAgent.getAvatarObject();}
+
protected:
BOOL mNeedsUpdate;
@@ -75,13 +78,13 @@ public:
virtual ~LLFloaterAnimPreview();
BOOL postBuild();
-
+/*
BOOL handleMouseDown(S32 x, S32 y, MASK mask);
BOOL handleMouseUp(S32 x, S32 y, MASK mask);
BOOL handleHover(S32 x, S32 y, MASK mask);
BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
void onMouseCaptureLost();
-
+*/
void refresh();
static void onBtnPlay(void*);
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_animation_preview.xml b/linden/indra/newview/skins/default/xui/en-us/floater_animation_preview.xml
index 1a7bdb0..e710d41 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_animation_preview.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_animation_preview.xml
@@ -1,7 +1,7 @@
+ can_resize="false" height="286" min_height="286" min_width="300"
+ name="Animation Preview" rect_control="PreviewAnimRect" title="" width="300">
Name:
--
cgit v1.1
From f15b542c19437670f7f0b6303ec7c259f778c43b Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Mon, 30 Aug 2010 14:21:00 +0200
Subject: Henri Beauchamp: polish up of the animation preview when uploading
---
linden/indra/newview/app_settings/settings.xml | 25 +-
linden/indra/newview/llfloateranimpreview.cpp | 459 +++++++++++++++++----
linden/indra/newview/llfloateranimpreview.h | 12 +-
.../xui/en-us/floater_animation_preview.xml | 9 +-
4 files changed, 406 insertions(+), 99 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index b1917ec..7071de2 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -518,6 +518,17 @@
Value
0
+ PreviewAnimInWorld
+
+ Comment
+ Play animation preview in-world when uploading
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 0
+
PrivateLookAtTarget
Comment
@@ -8243,10 +8254,10 @@
Rect
Value
- 11
- 459
- 311
- 173
+ 0
+ 85
+ 300
+ 0
PreviewClassifiedRect
@@ -8307,9 +8318,9 @@
Rect
Value
- 0
- 530
- 420
+ 0
+ 85
+ 300
0
diff --git a/linden/indra/newview/llfloateranimpreview.cpp b/linden/indra/newview/llfloateranimpreview.cpp
index ce7737d..da1d5fc 100644
--- a/linden/indra/newview/llfloateranimpreview.cpp
+++ b/linden/indra/newview/llfloateranimpreview.cpp
@@ -162,12 +162,27 @@ BOOL LLFloaterAnimPreview::postBuild()
return FALSE;
}
+ mInWorld = gSavedSettings.getBOOL("PreviewAnimInWorld");
+
childSetCommitCallback("name_form", onCommitName, this);
childSetLabelArg("ok_btn", "[UPLOADFEE]", gHippoGridManager->getConnectedGrid()->getUploadFee());
childSetAction("ok_btn", onBtnOK, this);
setDefaultBtn();
+ if (mInWorld)
+ {
+ r = getRect();
+ translate(0, 230);
+ reshape(r.getWidth(), r.getHeight() - 230);
+ childSetValue("bad_animation_text", getString("in_world"));
+ childShow("bad_animation_text");
+ }
+ else
+ {
+ childHide("bad_animation_text");
+ }
+
mPreviewRect.set(PREVIEW_HPAD,
PREVIEW_TEXTURE_HEIGHT,
getRect().getWidth() - PREVIEW_HPAD,
@@ -209,8 +224,6 @@ BOOL LLFloaterAnimPreview::postBuild()
r.set(r.mRight + PREVIEW_HPAD, y, getRect().getWidth() - PREVIEW_HPAD, y - BTN_HEIGHT);
//childSetCommitCallback("playback_slider", onSliderMove, this);
- childHide("bad_animation_text");
-
//childSetCommitCallback("preview_base_anim", onCommitBaseAnim, this);
//childSetValue("preview_base_anim", "Standing");
@@ -275,7 +288,14 @@ BOOL LLFloaterAnimPreview::postBuild()
// motion will be returned, but it will be in a load-pending state, as this is a new motion
// this motion will not request an asset transfer until next update, so we have a chance to
// load the keyframe data locally
- motionp = (LLKeyframeMotion*)mAnimPreview->getDummyAvatar()->createMotion(mMotionID);
+ if (mInWorld)
+ {
+ motionp = (LLKeyframeMotion*)gAgent.getAvatarObject()->createMotion(mMotionID);
+ }
+ else
+ {
+ motionp = (LLKeyframeMotion*)mAnimPreview->getDummyAvatar()->createMotion(mMotionID);
+ }
// create data buffer for keyframe initialization
S32 buffer_size = loaderp->getOutputSize();
@@ -293,24 +313,30 @@ BOOL LLFloaterAnimPreview::postBuild()
if (success)
{
setAnimCallbacks() ;
-
- const LLBBoxLocal &pelvis_bbox = motionp->getPelvisBBox();
- LLVector3 temp = pelvis_bbox.getCenter();
- // only consider XY?
- //temp.mV[VZ] = 0.f;
- F32 pelvis_offset = temp.magVec();
+ if (!mInWorld)
+ {
+ const LLBBoxLocal &pelvis_bbox = motionp->getPelvisBBox();
- temp = pelvis_bbox.getExtent();
- //temp.mV[VZ] = 0.f;
- F32 pelvis_max_displacement = pelvis_offset + (temp.magVec() * 0.5f) + 1.f;
-
- F32 camera_zoom = LLViewerCamera::getInstance()->getDefaultFOV() / (2.f * atan(pelvis_max_displacement / PREVIEW_CAMERA_DISTANCE));
-
- mAnimPreview->setZoom(camera_zoom);
+ LLVector3 temp = pelvis_bbox.getCenter();
+ // only consider XY?
+ //temp.mV[VZ] = 0.f;
+ F32 pelvis_offset = temp.magVec();
+
+ temp = pelvis_bbox.getExtent();
+ //temp.mV[VZ] = 0.f;
+ F32 pelvis_max_displacement = pelvis_offset + (temp.magVec() * 0.5f) + 1.f;
+
+ F32 camera_zoom = LLViewerCamera::getInstance()->getDefaultFOV() / (2.f * atan(pelvis_max_displacement / PREVIEW_CAMERA_DISTANCE));
+
+ mAnimPreview->setZoom(camera_zoom);
+ }
motionp->setName(childGetValue("name_form").asString());
- mAnimPreview->getDummyAvatar()->startMotion(mMotionID);
+ if (!mInWorld)
+ {
+ mAnimPreview->getDummyAvatar()->startMotion(mMotionID);
+ }
childSetMinValue("playback_slider", 0.0);
childSetMaxValue("playback_slider", 1.0);
@@ -326,7 +352,6 @@ BOOL LLFloaterAnimPreview::postBuild()
seconds_string = llformat(" - %.2f seconds", motionp->getDuration());
setTitle(mFilename + std::string(seconds_string));
-
}
else
{
@@ -372,13 +397,26 @@ BOOL LLFloaterAnimPreview::postBuild()
//-----------------------------------------------------------------------------
LLFloaterAnimPreview::~LLFloaterAnimPreview()
{
- if (mMotionID.notNull() && mAnimPreview)
+ if (mInWorld)
{
- mAnimPreview->getDummyAvatar()->deactivateAllMotions();
- mAnimPreview->getDummyAvatar()->removeMotion(mMotionID);
- LLKeyframeDataCache::removeKeyframeData(mMotionID);
+ LLVOAvatar* avatarp = gAgent.getAvatarObject();
+ if (avatarp)
+ {
+ if (mMotionID.notNull())
+ {
+ avatarp->stopMotion(mMotionID, TRUE);
+ avatarp->removeMotion(mMotionID);
+ }
+ avatarp->deactivateAllMotions();
+ avatarp->startMotion(ANIM_AGENT_HEAD_ROT);
+ avatarp->startMotion(ANIM_AGENT_EYE);
+ avatarp->startMotion(ANIM_AGENT_BODY_NOISE);
+ avatarp->startMotion(ANIM_AGENT_BREATHE_ROT);
+ avatarp->startMotion(ANIM_AGENT_HAND_MOTION);
+ avatarp->startMotion(ANIM_AGENT_PELVIS_FIX);
+ avatarp->startMotion(ANIM_AGENT_STAND, BASE_ANIM_TIME_OFFSET);
+ }
}
-
delete mAnimPreview;
mAnimPreview = NULL;
@@ -395,9 +433,9 @@ void LLFloaterAnimPreview::draw()
refresh();
- if (mMotionID.notNull() && mAnimPreview)
+ if (mMotionID.notNull() && mAnimPreview && !mInWorld)
{
-/* gGL.color3f(1.f, 1.f, 1.f);
+ gGL.color3f(1.f, 1.f, 1.f);
gGL.getTexUnit(0)->bind(mAnimPreview->getTexture());
@@ -415,7 +453,7 @@ void LLFloaterAnimPreview::draw()
gGL.end();
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
-*/
+
LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
if (!avatarp->areAnimationsPaused())
{
@@ -429,7 +467,20 @@ void LLFloaterAnimPreview::draw()
//-----------------------------------------------------------------------------
void LLFloaterAnimPreview::resetMotion()
{
- LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
+ LLVOAvatar* avatarp;
+ if (mInWorld)
+ {
+ avatarp = gAgent.getAvatarObject();
+ }
+ else
+ {
+ avatarp = mAnimPreview->getDummyAvatar();
+ }
+ if (!avatarp)
+ {
+ return;
+ }
+
BOOL paused = avatarp->areAnimationsPaused();
// *TODO: Fix awful casting hack
@@ -459,13 +510,13 @@ void LLFloaterAnimPreview::resetMotion()
mPauseRequest = NULL;
}
}
-/*
+
//-----------------------------------------------------------------------------
// handleMouseDown()
//-----------------------------------------------------------------------------
BOOL LLFloaterAnimPreview::handleMouseDown(S32 x, S32 y, MASK mask)
{
- if (mPreviewRect.pointInRect(x, y))
+ if (!mInWorld && mPreviewRect.pointInRect(x, y))
{
bringToFront( x, y );
gFocusMgr.setMouseCapture(this);
@@ -483,8 +534,11 @@ BOOL LLFloaterAnimPreview::handleMouseDown(S32 x, S32 y, MASK mask)
//-----------------------------------------------------------------------------
BOOL LLFloaterAnimPreview::handleMouseUp(S32 x, S32 y, MASK mask)
{
- gFocusMgr.setMouseCapture(FALSE);
- gViewerWindow->showCursor();
+ if (!mInWorld)
+ {
+ gFocusMgr.setMouseCapture(FALSE);
+ gViewerWindow->showCursor();
+ }
return LLFloater::handleMouseUp(x, y, mask);
}
@@ -493,6 +547,11 @@ BOOL LLFloaterAnimPreview::handleMouseUp(S32 x, S32 y, MASK mask)
//-----------------------------------------------------------------------------
BOOL LLFloaterAnimPreview::handleHover(S32 x, S32 y, MASK mask)
{
+ if (mInWorld)
+ {
+ return TRUE;
+ }
+
MASK local_mask = mask & ~MASK_ALT;
if (mAnimPreview && hasMouseCapture())
@@ -548,9 +607,11 @@ BOOL LLFloaterAnimPreview::handleHover(S32 x, S32 y, MASK mask)
//-----------------------------------------------------------------------------
BOOL LLFloaterAnimPreview::handleScrollWheel(S32 x, S32 y, S32 clicks)
{
- mAnimPreview->zoom((F32)clicks * -0.2f);
- mAnimPreview->requestUpdate();
-
+ if (!mInWorld)
+ {
+ mAnimPreview->zoom((F32)clicks * -0.2f);
+ mAnimPreview->requestUpdate();
+ }
return TRUE;
}
@@ -559,9 +620,12 @@ BOOL LLFloaterAnimPreview::handleScrollWheel(S32 x, S32 y, S32 clicks)
//-----------------------------------------------------------------------------
void LLFloaterAnimPreview::onMouseCaptureLost()
{
- gViewerWindow->showCursor();
+ if (!mInWorld)
+ {
+ gViewerWindow->showCursor();
+ }
}
-*/
+
//-----------------------------------------------------------------------------
// onBtnPlay()
//-----------------------------------------------------------------------------
@@ -571,9 +635,25 @@ void LLFloaterAnimPreview::onBtnPlay(void* user_data)
if (!previewp->getEnabled())
return;
- if (previewp->mMotionID.notNull() && previewp->mAnimPreview)
+ if (previewp->mMotionID.notNull())
{
- LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
+ LLVOAvatar* avatarp;
+ if (previewp->mInWorld)
+ {
+ if (!gAgent.getAvatarObject())
+ {
+ return;
+ }
+ avatarp = gAgent.getAvatarObject();
+ }
+ else
+ {
+ if (!previewp->mAnimPreview)
+ {
+ return;
+ }
+ avatarp = previewp->mAnimPreview->getDummyAvatar();
+ }
if(!avatarp->isMotionActive(previewp->mMotionID))
{
@@ -603,9 +683,25 @@ void LLFloaterAnimPreview::onBtnStop(void* user_data)
if (!previewp->getEnabled())
return;
- if (previewp->mMotionID.notNull() && previewp->mAnimPreview)
+ if (previewp->mMotionID.notNull())
{
- LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
+ LLVOAvatar* avatarp;
+ if (previewp->mInWorld)
+ {
+ if (!gAgent.getAvatarObject())
+ {
+ return;
+ }
+ avatarp = gAgent.getAvatarObject();
+ }
+ else
+ {
+ if (!previewp->mAnimPreview)
+ {
+ return;
+ }
+ avatarp = previewp->mAnimPreview->getDummyAvatar();
+ }
previewp->resetMotion();
previewp->mPauseRequest = avatarp->requestPause();
}
@@ -620,21 +716,33 @@ void LLFloaterAnimPreview::onSliderMove(LLUICtrl* ctrl, void*user_data)
if (!previewp->getEnabled())
return;
- if (previewp->mAnimPreview)
- {
- LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
- F32 slider_value = (F32)previewp->childGetValue("playback_slider").asReal();
- LLUUID base_id = previewp->mIDList[previewp->childGetValue("preview_base_anim").asString()];
- LLMotion* motionp = avatarp->findMotion(previewp->mMotionID);
- F32 duration = motionp->getDuration();// + motionp->getEaseOutDuration();
- F32 delta_time = duration * slider_value;
- avatarp->deactivateAllMotions();
- avatarp->startMotion(base_id, delta_time + BASE_ANIM_TIME_OFFSET);
- avatarp->startMotion(previewp->mMotionID, delta_time);
- previewp->mPauseRequest = avatarp->requestPause();
- previewp->refresh();
+ LLVOAvatar* avatarp;
+ if (previewp->mInWorld)
+ {
+ if (!gAgent.getAvatarObject())
+ {
+ return;
+ }
+ avatarp = gAgent.getAvatarObject();
}
-
+ else
+ {
+ if (!previewp->mAnimPreview)
+ {
+ return;
+ }
+ avatarp = previewp->mAnimPreview->getDummyAvatar();
+ }
+ F32 slider_value = (F32)previewp->childGetValue("playback_slider").asReal();
+ LLUUID base_id = previewp->mIDList[previewp->childGetValue("preview_base_anim").asString()];
+ LLMotion* motionp = avatarp->findMotion(previewp->mMotionID);
+ F32 duration = motionp->getDuration();// + motionp->getEaseOutDuration();
+ F32 delta_time = duration * slider_value;
+ avatarp->deactivateAllMotions();
+ avatarp->startMotion(base_id, delta_time + BASE_ANIM_TIME_OFFSET);
+ avatarp->startMotion(previewp->mMotionID, delta_time);
+ previewp->mPauseRequest = avatarp->requestPause();
+ previewp->refresh();
}
//-----------------------------------------------------------------------------
@@ -646,24 +754,37 @@ void LLFloaterAnimPreview::onCommitBaseAnim(LLUICtrl* ctrl, void* data)
if (!previewp->getEnabled())
return;
- if (previewp->mAnimPreview)
+ LLVOAvatar* avatarp;
+ if (previewp->mInWorld)
{
- LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
+ if (!gAgent.getAvatarObject())
+ {
+ return;
+ }
+ avatarp = gAgent.getAvatarObject();
+ }
+ else
+ {
+ if (!previewp->mAnimPreview)
+ {
+ return;
+ }
+ avatarp = previewp->mAnimPreview->getDummyAvatar();
+ }
- BOOL paused = avatarp->areAnimationsPaused();
+ BOOL paused = avatarp->areAnimationsPaused();
- // stop all other possible base motions
- avatarp->stopMotion(ANIM_AGENT_STAND, TRUE);
- avatarp->stopMotion(ANIM_AGENT_WALK, TRUE);
- avatarp->stopMotion(ANIM_AGENT_SIT, TRUE);
- avatarp->stopMotion(ANIM_AGENT_HOVER, TRUE);
+ // stop all other possible base motions
+ avatarp->stopMotion(ANIM_AGENT_STAND, TRUE);
+ avatarp->stopMotion(ANIM_AGENT_WALK, TRUE);
+ avatarp->stopMotion(ANIM_AGENT_SIT, TRUE);
+ avatarp->stopMotion(ANIM_AGENT_HOVER, TRUE);
- previewp->resetMotion();
+ previewp->resetMotion();
- if (!paused)
- {
- previewp->mPauseRequest = NULL;
- }
+ if (!paused)
+ {
+ previewp->mPauseRequest = NULL;
}
}
@@ -676,7 +797,23 @@ void LLFloaterAnimPreview::onCommitLoop(LLUICtrl* ctrl, void* data)
if (!previewp->getEnabled())
return;
- LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
+ LLVOAvatar* avatarp;
+ if (previewp->mInWorld)
+ {
+ if (!gAgent.getAvatarObject())
+ {
+ return;
+ }
+ avatarp = gAgent.getAvatarObject();
+ }
+ else
+ {
+ if (!previewp->mAnimPreview)
+ {
+ return;
+ }
+ avatarp = previewp->mAnimPreview->getDummyAvatar();
+ }
LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(previewp->mMotionID);
if (motionp)
@@ -696,7 +833,23 @@ void LLFloaterAnimPreview::onCommitLoopIn(LLUICtrl* ctrl, void* data)
if (!previewp->getEnabled())
return;
- LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
+ LLVOAvatar* avatarp;
+ if (previewp->mInWorld)
+ {
+ if (!gAgent.getAvatarObject())
+ {
+ return;
+ }
+ avatarp = gAgent.getAvatarObject();
+ }
+ else
+ {
+ if (!previewp->mAnimPreview)
+ {
+ return;
+ }
+ avatarp = previewp->mAnimPreview->getDummyAvatar();
+ }
LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(previewp->mMotionID);
if (motionp)
@@ -717,7 +870,23 @@ void LLFloaterAnimPreview::onCommitLoopOut(LLUICtrl* ctrl, void* data)
if (!previewp->getEnabled())
return;
- LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
+ LLVOAvatar* avatarp;
+ if (previewp->mInWorld)
+ {
+ if (!gAgent.getAvatarObject())
+ {
+ return;
+ }
+ avatarp = gAgent.getAvatarObject();
+ }
+ else
+ {
+ if (!previewp->mAnimPreview)
+ {
+ return;
+ }
+ avatarp = previewp->mAnimPreview->getDummyAvatar();
+ }
LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(previewp->mMotionID);
if (motionp)
@@ -738,7 +907,23 @@ void LLFloaterAnimPreview::onCommitName(LLUICtrl* ctrl, void* data)
if (!previewp->getEnabled())
return;
- LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
+ LLVOAvatar* avatarp;
+ if (previewp->mInWorld)
+ {
+ if (!gAgent.getAvatarObject())
+ {
+ return;
+ }
+ avatarp = gAgent.getAvatarObject();
+ }
+ else
+ {
+ if (!previewp->mAnimPreview)
+ {
+ return;
+ }
+ avatarp = previewp->mAnimPreview->getDummyAvatar();
+ }
LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(previewp->mMotionID);
if (motionp)
@@ -782,7 +967,23 @@ void LLFloaterAnimPreview::onCommitPriority(LLUICtrl* ctrl, void* data)
if (!previewp->getEnabled())
return;
- LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
+ LLVOAvatar* avatarp;
+ if (previewp->mInWorld)
+ {
+ if (!gAgent.getAvatarObject())
+ {
+ return;
+ }
+ avatarp = gAgent.getAvatarObject();
+ }
+ else
+ {
+ if (!previewp->mAnimPreview)
+ {
+ return;
+ }
+ avatarp = previewp->mAnimPreview->getDummyAvatar();
+ }
LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(previewp->mMotionID);
motionp->setPriority(llfloor((F32)previewp->childGetValue("priority").asReal()));
@@ -797,7 +998,23 @@ void LLFloaterAnimPreview::onCommitEaseIn(LLUICtrl* ctrl, void* data)
if (!previewp->getEnabled())
return;
- LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
+ LLVOAvatar* avatarp;
+ if (previewp->mInWorld)
+ {
+ if (!gAgent.getAvatarObject())
+ {
+ return;
+ }
+ avatarp = gAgent.getAvatarObject();
+ }
+ else
+ {
+ if (!previewp->mAnimPreview)
+ {
+ return;
+ }
+ avatarp = previewp->mAnimPreview->getDummyAvatar();
+ }
LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(previewp->mMotionID);
motionp->setEaseIn((F32)previewp->childGetValue("ease_in_time").asReal());
@@ -813,7 +1030,23 @@ void LLFloaterAnimPreview::onCommitEaseOut(LLUICtrl* ctrl, void* data)
if (!previewp->getEnabled())
return;
- LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
+ LLVOAvatar* avatarp;
+ if (previewp->mInWorld)
+ {
+ if (!gAgent.getAvatarObject())
+ {
+ return;
+ }
+ avatarp = gAgent.getAvatarObject();
+ }
+ else
+ {
+ if (!previewp->mAnimPreview)
+ {
+ return;
+ }
+ avatarp = previewp->mAnimPreview->getDummyAvatar();
+ }
LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(previewp->mMotionID);
motionp->setEaseOut((F32)previewp->childGetValue("ease_out_time").asReal());
@@ -829,7 +1062,23 @@ BOOL LLFloaterAnimPreview::validateEaseIn(LLUICtrl* spin, void* data)
if (!previewp->getEnabled())
return FALSE;
- LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
+ LLVOAvatar* avatarp;
+ if (previewp->mInWorld)
+ {
+ if (!gAgent.getAvatarObject())
+ {
+ return FALSE;
+ }
+ avatarp = gAgent.getAvatarObject();
+ }
+ else
+ {
+ if (!previewp->mAnimPreview)
+ {
+ return FALSE;
+ }
+ avatarp = previewp->mAnimPreview->getDummyAvatar();
+ }
LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(previewp->mMotionID);
if (!motionp->getLoop())
@@ -851,7 +1100,23 @@ BOOL LLFloaterAnimPreview::validateEaseOut(LLUICtrl* spin, void* data)
if (!previewp->getEnabled())
return FALSE;
- LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
+ LLVOAvatar* avatarp;
+ if (previewp->mInWorld)
+ {
+ if (!gAgent.getAvatarObject())
+ {
+ return FALSE;
+ }
+ avatarp = gAgent.getAvatarObject();
+ }
+ else
+ {
+ if (!previewp->mAnimPreview)
+ {
+ return FALSE;
+ }
+ avatarp = previewp->mAnimPreview->getDummyAvatar();
+ }
LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(previewp->mMotionID);
if (!motionp->getLoop())
@@ -936,9 +1201,20 @@ void LLFloaterAnimPreview::refresh()
}
else
{
- childHide("bad_animation_text");
+ if (!mInWorld)
+ {
+ childHide("bad_animation_text");
+ }
mPlayButton->setEnabled(TRUE);
- LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
+ LLVOAvatar* avatarp;
+ if (mInWorld)
+ {
+ avatarp = gAgent.getAvatarObject();
+ }
+ else
+ {
+ avatarp = mAnimPreview->getDummyAvatar();
+ }
if (avatarp->isMotionActive(mMotionID))
{
mStopButton->setEnabled(TRUE);
@@ -971,7 +1247,10 @@ void LLFloaterAnimPreview::refresh()
mStopButton->setEnabled(TRUE); // stop also resets, leave enabled.
}
childEnable("ok_btn");
- mAnimPreview->requestUpdate();
+ if (!mInWorld)
+ {
+ mAnimPreview->requestUpdate();
+ }
}
}
@@ -983,9 +1262,17 @@ void LLFloaterAnimPreview::onBtnOK(void* userdata)
LLFloaterAnimPreview* floaterp = (LLFloaterAnimPreview*)userdata;
if (!floaterp->getEnabled()) return;
- if (floaterp->mAnimPreview)
+ if ((!floaterp->mInWorld && floaterp->mAnimPreview) || (floaterp->mInWorld && gAgent.getAvatarObject()))
{
- LLKeyframeMotion* motionp = (LLKeyframeMotion*)floaterp->mAnimPreview->getDummyAvatar()->findMotion(floaterp->mMotionID);
+ LLKeyframeMotion* motionp;
+ if (floaterp->mInWorld)
+ {
+ motionp = (LLKeyframeMotion*)gAgent.getAvatarObject()->findMotion(floaterp->mMotionID);
+ }
+ else
+ {
+ motionp = (LLKeyframeMotion*)floaterp->mAnimPreview->getDummyAvatar()->findMotion(floaterp->mMotionID);
+ }
S32 file_size = motionp->getFileSize();
U8* buffer = new U8[file_size];
@@ -1024,7 +1311,15 @@ void LLFloaterAnimPreview::onBtnOK(void* userdata)
delete [] buffer;
// clear out cache for motion data
- floaterp->mAnimPreview->getDummyAvatar()->removeMotion(floaterp->mMotionID);
+ if (floaterp->mInWorld)
+ {
+ gAgent.getAvatarObject()->removeMotion(floaterp->mMotionID);
+ gAgent.getAvatarObject()->deactivateAllMotions();
+ }
+ else
+ {
+ floaterp->mAnimPreview->getDummyAvatar()->removeMotion(floaterp->mMotionID);
+ }
LLKeyframeDataCache::removeKeyframeData(floaterp->mMotionID);
}
diff --git a/linden/indra/newview/llfloateranimpreview.h b/linden/indra/newview/llfloateranimpreview.h
index eaab186..e8f79e2 100644
--- a/linden/indra/newview/llfloateranimpreview.h
+++ b/linden/indra/newview/llfloateranimpreview.h
@@ -32,7 +32,7 @@
#ifndef LL_LLFLOATERANIMPREVIEW_H
#define LL_LLFLOATERANIMPREVIEW_H
-#include "llagent.h"
+
#include "llfloaternamedesc.h"
#include "lldynamictexture.h"
#include "llcharacter.h"
@@ -55,10 +55,7 @@ public:
void pan(F32 right, F32 up);
virtual BOOL needsUpdate() { return mNeedsUpdate; }
-// LLVOAvatar* getDummyAvatar() { return mDummyAvatar; }
-// HACK:don't get a dummy...
- LLVOAvatar* getDummyAvatar() { return gAgent.getAvatarObject();}
-
+ LLVOAvatar* getDummyAvatar() { return mDummyAvatar; }
protected:
BOOL mNeedsUpdate;
@@ -78,13 +75,13 @@ public:
virtual ~LLFloaterAnimPreview();
BOOL postBuild();
-/*
+
BOOL handleMouseDown(S32 x, S32 y, MASK mask);
BOOL handleMouseUp(S32 x, S32 y, MASK mask);
BOOL handleHover(S32 x, S32 y, MASK mask);
BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
void onMouseCaptureLost();
-*/
+
void refresh();
static void onBtnPlay(void*);
@@ -127,6 +124,7 @@ protected:
LLAssetID mMotionID;
LLTransactionID mTransactionID;
BOOL mEnabled;
+ BOOL mInWorld;
LLAnimPauseRequest mPauseRequest;
std::map mIDList;
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_animation_preview.xml b/linden/indra/newview/skins/default/xui/en-us/floater_animation_preview.xml
index e710d41..f2c5d34 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_animation_preview.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_animation_preview.xml
@@ -1,7 +1,7 @@
+ can_resize="false" height="556" min_height="256" min_width="300"
+ name="Animation Preview" title="" width="300">
Name:
@@ -180,7 +180,7 @@
-
+
Unable to read animation file.
We recommend BVH files exported from Poser 4.
@@ -202,4 +202,7 @@ Maximum animation length is [MAX_LENGTH] seconds.
[STATUS]
+
+ The animation preview is played on your avatar.
+
--
cgit v1.1
From 5b53beea343018111fa40d56c08c46fd2b48966d Mon Sep 17 00:00:00 2001
From: Patrick Sapinski
Date: Wed, 1 Sep 2010 13:06:35 -0400
Subject: fixed button position on preferences floater
---
linden/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml
index b0dd026..c2b8c2b 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml
@@ -101,8 +101,8 @@
font="SansSerifSmall" height="16" initial_value="false"
label="Include date with timestamps" left="148" mouse_opaque="true"
name="log_date_timestamp" radio_style="false" width="237" />
-
face_list;
- bool local_sculptmap;
-
-};
-
-/* texture picker defines */
-
-#define LOCAL_TEXTURE_PICKER_NAME "texture picker"
-#define LOCAL_TEXTURE_PICKER_LIST_NAME "local_name_list"
-#define LOCAL_TEXTURE_PICKER_RECURSE true
-#define LOCAL_TEXTURE_PICKER_CREATEIFMISSING true
-
-
-/*=======================================*/
-/* LocalBitmap: unit class */
-/*=======================================*/
-/*
- The basic unit class responsible for
- containing one loaded local texture.
-*/
-
-class LocalBitmap
-{
- public:
- LocalBitmap(std::string filename);
- virtual ~LocalBitmap(void);
- friend class LocalAssetBrowser;
-
- public: /* [enums, typedefs, etc] */
- enum link_status
- {
- LINK_UNKNOWN, /* default fallback */
- LINK_ON,
- LINK_OFF,
- LINK_BROKEN,
- LINK_UPDATING /* currently redundant, but left in case necessary later. */
- };
-
- enum extension_type
- {
- IMG_EXTEN_BMP,
- IMG_EXTEN_TGA,
- IMG_EXTEN_JPG,
- IMG_EXTEN_PNG
- };
-
- enum bitmap_type
- {
- TYPE_TEXTURE = 0,
- TYPE_SCULPT = 1,
- TYPE_LAYER = 2
- };
-
- public: /* [information query functions] */
- std::string getShortName(void);
- std::string getFileName(void);
- LLUUID getID(void);
- LLSD getLastModified(void);
- std::string getLinkStatus(void);
- bool getUpdateBool(void);
- void setType( S32 );
- bool getIfValidBool(void);
- S32 getType(void);
- void getDebugInfo(void);
-
- private: /* [maintenence functions] */
- void updateSelf(void);
- bool decodeSelf(LLImageRaw* rawimg);
- void setUpdateBool(void);
-
- LocalBitmap* getThis(void);
- std::vector getFaceUsesThis(LLDrawable*);
- std::vector getUsingObjects(bool seek_by_type = true,
- bool seek_textures = false, bool seek_sculptmaps = false);
-
- protected: /* [basic properties] */
- std::string shortname;
- std::string filename;
- extension_type extension;
- LLUUID id;
- LLSD last_modified;
- link_status linkstatus;
- bool keep_updating;
- bool valid;
- S32 bitmap_type;
- bool sculpt_dirty;
- bool volume_dirty;
-};
-
-/*=======================================*/
-/* LocalAssetBrowser: main class */
-/*=======================================*/
-/*
- Responsible for internal workings.
- Instantiated at the top of the source file.
- Sits in memory until the viewer is closed.
-
-*/
-
-
-class LocalAssetBrowser
-{
- public:
- LocalAssetBrowser();
- virtual ~LocalAssetBrowser();
- friend class FloaterLocalAssetBrowser;
- friend class LocalAssetBrowserTimer;
- static void UpdateTextureCtrlList(LLScrollListCtrl*);
- static void setLayerUpdated(bool toggle) { mLayerUpdated = toggle; }
- static void setSculptUpdated(bool toggle) { mSculptUpdated = toggle; }
- static void AddBitmap(void);
- static void DelBitmap( std::vector, S32 column = BITMAPLIST_COL_ID );
-
- /* UpdateTextureCtrlList was made public cause texturectrl requests it once on spawn
- ( added: when it's own add/remove funcs are used. )
- i've made it update on spawn instead of on pressing 'local' because the former does it once,
- the latter - each time the button's pressed. */
-
- private:
- static void onChangeHappened(void);
- static void onUpdateBool(LLUUID);
- static void onSetType(LLUUID, S32);
- static LocalBitmap* GetBitmapUnit(LLUUID);
- static bool IsDoingUpdates(void);
- static void PingTimer(void);
- static void PerformTimedActions(void);
- static void PerformSculptUpdates(LocalBitmap*);
-
- protected:
- static std::vector loaded_bitmaps;
- typedef std::vector::iterator local_list_iter;
- static bool mLayerUpdated;
- static bool mSculptUpdated;
-};
-
-/*==================================================*/
-/* FloaterLocalAssetBrowser : interface class */
-/*==================================================*/
-/*
- Responsible for talking to the user.
- Instantiated by user request.
- Destroyed when the floater is closed.
-
-*/
-class FloaterLocalAssetBrowser : public LLFloater
-{
-public:
- FloaterLocalAssetBrowser();
- virtual ~FloaterLocalAssetBrowser();
- static void show(void*);
-
-
-
-private:
- /* Widget related callbacks */
- // Button callback declarations
- static void onClickAdd(void* userdata);
- static void onClickDel(void* userdata);
- static void onClickMore(void* userdata);
- static void onClickLess(void* userdata);
- static void onClickUpload(void* userdata);
-
- // ScrollList callback declarations
- static void onChooseBitmapList(LLUICtrl* ctrl, void* userdata);
-
- // Checkbox callback declarations
- static void onClickUpdateChkbox(LLUICtrl* ctrl, void* userdata);
-
- // Combobox type select
- static void onCommitTypeCombo(LLUICtrl* ctrl, void* userdata);
-
- // Widgets
- LLButton* mAddBtn;
- LLButton* mDelBtn;
- LLButton* mUploadBtn;
-
- LLScrollListCtrl* mBitmapList;
- LLScrollListCtrl* mUsedList;
- LLTextureCtrl* mTextureView;
- LLCheckBoxCtrl* mUpdateChkBox;
-
- LLLineEditor* mPathTxt;
- LLLineEditor* mUUIDTxt;
- LLLineEditor* mNameTxt;
-
- LLTextBox* mLinkTxt;
- LLTextBox* mTimeTxt;
- LLComboBox* mTypeComboBox;
-
- LLTextBox* mCaptionPathTxt;
- LLTextBox* mCaptionUUIDTxt;
- LLTextBox* mCaptionLinkTxt;
- LLTextBox* mCaptionNameTxt;
- LLTextBox* mCaptionTimeTxt;
-
- /* static pointer to self, wai? oh well. */
- static FloaterLocalAssetBrowser* sLFInstance;
-
- // non-widget functions
- static void UpdateRightSide(void);
-
-public:
- static void UpdateBitmapScrollList(void);
-
-
-};
-
-/*==================================================*/
-/* LocalAssetBrowserTimer : timer class */
-/*==================================================*/
-/*
- A small, simple timer class inheriting from
- LLEventTimer, responsible for pinging the
- LocalAssetBrowser class to perform it's
- updates / checks / etc.
-
-*/
-class LocalAssetBrowserTimer : public LLEventTimer
-{
- public:
- LocalAssetBrowserTimer();
- ~LocalAssetBrowserTimer();
- virtual BOOL tick();
- void start();
- void stop();
- bool isRunning();
-};
-
-#endif
-
--
cgit v1.1
From 7552a5c396edd41ea77b17b109abd38b187c9a18 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Wed, 1 Sep 2010 10:26:37 -0700
Subject: Fixing bad file extension capital, part 2: revenge of the file
---
linden/indra/newview/floaterlocalassetbrowse.h | 302 +++++++++++++++++++++++++
1 file changed, 302 insertions(+)
create mode 100644 linden/indra/newview/floaterlocalassetbrowse.h
(limited to 'linden/indra')
diff --git a/linden/indra/newview/floaterlocalassetbrowse.h b/linden/indra/newview/floaterlocalassetbrowse.h
new file mode 100644
index 0000000..e02a7d3
--- /dev/null
+++ b/linden/indra/newview/floaterlocalassetbrowse.h
@@ -0,0 +1,302 @@
+/**
+* @file floaterlocalassetbrowse.h
+* @brief Local texture support
+*
+* $LicenseInfo:firstyear=2009&license=viewergpl$
+*
+* 2010, original author Vaalith Jinn
+*
+* Imprudence Viewer Source Code
+* The source code in this file ("Source Code") is provided to you
+* under the terms of the GNU General Public License, version 2.0
+* ("GPL"). Terms of the GPL can be found in doc/GPL-license.txt in
+* this distribution, or online at
+* http://secondlifegrid.net/programs/open_source/licensing/gplv2
+*
+* There are special exceptions to the terms and conditions of the GPL as
+* it is applied to this Source Code. View the full text of the exception
+* in the file doc/FLOSS-exception.txt in this software distribution, or
+* online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+*
+* By copying, modifying or distributing this software, you acknowledge
+* that you have read and understood your obligations described above,
+* and agree to abide by those obligations.
+*
+* ALL SOURCE CODE IS PROVIDED "AS IS." THE AUTHOR MAKES NO
+* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+* COMPLETENESS OR PERFORMANCE.
+* $/LicenseInfo$
+*/
+
+/* Local Asset Browser: header
+
+tag: vaa emerald local_asset_browser
+
+*/
+
+
+#ifndef VAA_LOCALBROWSER
+#define VAA_LOCALBROWSER
+
+#include "llfloater.h"
+#include "llscrolllistctrl.h"
+#include "lltexturectrl.h"
+#include "lldrawable.h"
+
+
+/*=======================================*/
+/* Global structs / enums / defines */
+/*=======================================*/
+
+#define LF_FLOATER_EXPAND_WIDTH 735
+#define LF_FLOATER_CONTRACT_WIDTH 415
+#define LF_FLOATER_HEIGHT 260
+
+#define LOCAL_USE_MIPMAPS true
+#define LOCAL_DISCARD_LEVEL 0
+#define NO_IMAGE LLUUID::null
+
+#define TIMER_HEARTBEAT 3.0
+
+#define SLAM_FOR_DEBUG true
+
+enum bitmaplist_cols
+{
+ BITMAPLIST_COL_NAME,
+ BITMAPLIST_COL_ID
+};
+
+/* upload & sculpt update related */
+struct affected_object
+{
+ LLViewerObject* object;
+ std::vector face_list;
+ bool local_sculptmap;
+
+};
+
+/* texture picker defines */
+
+#define LOCAL_TEXTURE_PICKER_NAME "texture picker"
+#define LOCAL_TEXTURE_PICKER_LIST_NAME "local_name_list"
+#define LOCAL_TEXTURE_PICKER_RECURSE true
+#define LOCAL_TEXTURE_PICKER_CREATEIFMISSING true
+
+
+/*=======================================*/
+/* LocalBitmap: unit class */
+/*=======================================*/
+/*
+ The basic unit class responsible for
+ containing one loaded local texture.
+*/
+
+class LocalBitmap
+{
+ public:
+ LocalBitmap(std::string filename);
+ virtual ~LocalBitmap(void);
+ friend class LocalAssetBrowser;
+
+ public: /* [enums, typedefs, etc] */
+ enum link_status
+ {
+ LINK_UNKNOWN, /* default fallback */
+ LINK_ON,
+ LINK_OFF,
+ LINK_BROKEN,
+ LINK_UPDATING /* currently redundant, but left in case necessary later. */
+ };
+
+ enum extension_type
+ {
+ IMG_EXTEN_BMP,
+ IMG_EXTEN_TGA,
+ IMG_EXTEN_JPG,
+ IMG_EXTEN_PNG
+ };
+
+ enum bitmap_type
+ {
+ TYPE_TEXTURE = 0,
+ TYPE_SCULPT = 1,
+ TYPE_LAYER = 2
+ };
+
+ public: /* [information query functions] */
+ std::string getShortName(void);
+ std::string getFileName(void);
+ LLUUID getID(void);
+ LLSD getLastModified(void);
+ std::string getLinkStatus(void);
+ bool getUpdateBool(void);
+ void setType( S32 );
+ bool getIfValidBool(void);
+ S32 getType(void);
+ void getDebugInfo(void);
+
+ private: /* [maintenence functions] */
+ void updateSelf(void);
+ bool decodeSelf(LLImageRaw* rawimg);
+ void setUpdateBool(void);
+
+ LocalBitmap* getThis(void);
+ std::vector getFaceUsesThis(LLDrawable*);
+ std::vector getUsingObjects(bool seek_by_type = true,
+ bool seek_textures = false, bool seek_sculptmaps = false);
+
+ protected: /* [basic properties] */
+ std::string shortname;
+ std::string filename;
+ extension_type extension;
+ LLUUID id;
+ LLSD last_modified;
+ link_status linkstatus;
+ bool keep_updating;
+ bool valid;
+ S32 bitmap_type;
+ bool sculpt_dirty;
+ bool volume_dirty;
+};
+
+/*=======================================*/
+/* LocalAssetBrowser: main class */
+/*=======================================*/
+/*
+ Responsible for internal workings.
+ Instantiated at the top of the source file.
+ Sits in memory until the viewer is closed.
+
+*/
+
+
+class LocalAssetBrowser
+{
+ public:
+ LocalAssetBrowser();
+ virtual ~LocalAssetBrowser();
+ friend class FloaterLocalAssetBrowser;
+ friend class LocalAssetBrowserTimer;
+ static void UpdateTextureCtrlList(LLScrollListCtrl*);
+ static void setLayerUpdated(bool toggle) { mLayerUpdated = toggle; }
+ static void setSculptUpdated(bool toggle) { mSculptUpdated = toggle; }
+ static void AddBitmap(void);
+ static void DelBitmap( std::vector, S32 column = BITMAPLIST_COL_ID );
+
+ /* UpdateTextureCtrlList was made public cause texturectrl requests it once on spawn
+ ( added: when it's own add/remove funcs are used. )
+ i've made it update on spawn instead of on pressing 'local' because the former does it once,
+ the latter - each time the button's pressed. */
+
+ private:
+ static void onChangeHappened(void);
+ static void onUpdateBool(LLUUID);
+ static void onSetType(LLUUID, S32);
+ static LocalBitmap* GetBitmapUnit(LLUUID);
+ static bool IsDoingUpdates(void);
+ static void PingTimer(void);
+ static void PerformTimedActions(void);
+ static void PerformSculptUpdates(LocalBitmap*);
+
+ protected:
+ static std::vector loaded_bitmaps;
+ typedef std::vector::iterator local_list_iter;
+ static bool mLayerUpdated;
+ static bool mSculptUpdated;
+};
+
+/*==================================================*/
+/* FloaterLocalAssetBrowser : interface class */
+/*==================================================*/
+/*
+ Responsible for talking to the user.
+ Instantiated by user request.
+ Destroyed when the floater is closed.
+
+*/
+class FloaterLocalAssetBrowser : public LLFloater
+{
+public:
+ FloaterLocalAssetBrowser();
+ virtual ~FloaterLocalAssetBrowser();
+ static void show(void*);
+
+
+
+private:
+ /* Widget related callbacks */
+ // Button callback declarations
+ static void onClickAdd(void* userdata);
+ static void onClickDel(void* userdata);
+ static void onClickMore(void* userdata);
+ static void onClickLess(void* userdata);
+ static void onClickUpload(void* userdata);
+
+ // ScrollList callback declarations
+ static void onChooseBitmapList(LLUICtrl* ctrl, void* userdata);
+
+ // Checkbox callback declarations
+ static void onClickUpdateChkbox(LLUICtrl* ctrl, void* userdata);
+
+ // Combobox type select
+ static void onCommitTypeCombo(LLUICtrl* ctrl, void* userdata);
+
+ // Widgets
+ LLButton* mAddBtn;
+ LLButton* mDelBtn;
+ LLButton* mUploadBtn;
+
+ LLScrollListCtrl* mBitmapList;
+ LLScrollListCtrl* mUsedList;
+ LLTextureCtrl* mTextureView;
+ LLCheckBoxCtrl* mUpdateChkBox;
+
+ LLLineEditor* mPathTxt;
+ LLLineEditor* mUUIDTxt;
+ LLLineEditor* mNameTxt;
+
+ LLTextBox* mLinkTxt;
+ LLTextBox* mTimeTxt;
+ LLComboBox* mTypeComboBox;
+
+ LLTextBox* mCaptionPathTxt;
+ LLTextBox* mCaptionUUIDTxt;
+ LLTextBox* mCaptionLinkTxt;
+ LLTextBox* mCaptionNameTxt;
+ LLTextBox* mCaptionTimeTxt;
+
+ /* static pointer to self, wai? oh well. */
+ static FloaterLocalAssetBrowser* sLFInstance;
+
+ // non-widget functions
+ static void UpdateRightSide(void);
+
+public:
+ static void UpdateBitmapScrollList(void);
+
+
+};
+
+/*==================================================*/
+/* LocalAssetBrowserTimer : timer class */
+/*==================================================*/
+/*
+ A small, simple timer class inheriting from
+ LLEventTimer, responsible for pinging the
+ LocalAssetBrowser class to perform it's
+ updates / checks / etc.
+
+*/
+class LocalAssetBrowserTimer : public LLEventTimer
+{
+ public:
+ LocalAssetBrowserTimer();
+ ~LocalAssetBrowserTimer();
+ virtual BOOL tick();
+ void start();
+ void stop();
+ bool isRunning();
+};
+
+#endif
+
--
cgit v1.1
From b2b8a6b924a93794821a1a20f4dd965400e53688 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Wed, 1 Sep 2010 17:34:49 -0700
Subject: Moved chatbar commandline options into their own window, cleaned up
more stuff
---
linden/indra/newview/CMakeLists.txt | 2 +
linden/indra/newview/app_settings/settings.xml | 40 +++----
linden/indra/newview/chatbar_as_cmdline.cpp | 129 ++++++++++-----------
linden/indra/newview/floatercommandline.cpp | 84 ++++++++++++++
linden/indra/newview/floatercommandline.h | 55 +++++++++
linden/indra/newview/lggautocorrectfloater.cpp | 9 +-
linden/indra/newview/llprefsadvanced.cpp | 111 ++----------------
linden/indra/newview/llprefsadvanced.h | 22 +---
.../default/xui/en-us/floater_command_line.xml | 108 +++++++++++++++++
.../skins/default/xui/en-us/notifications.xml | 12 +-
.../xui/en-us/panel_preferences_advanced.xml | 117 ++-----------------
11 files changed, 364 insertions(+), 325 deletions(-)
create mode 100644 linden/indra/newview/floatercommandline.cpp
create mode 100644 linden/indra/newview/floatercommandline.h
create mode 100644 linden/indra/newview/skins/default/xui/en-us/floater_command_line.xml
(limited to 'linden/indra')
diff --git a/linden/indra/newview/CMakeLists.txt b/linden/indra/newview/CMakeLists.txt
index 1a900c4..c047a0f 100644
--- a/linden/indra/newview/CMakeLists.txt
+++ b/linden/indra/newview/CMakeLists.txt
@@ -78,6 +78,7 @@ set(viewer_SOURCE_FILES
emeraldboobutils.cpp
floaterao.cpp
floaterbusy.cpp
+ floatercommandline.cpp
floatergriddefault.cpp
floatergridmanager.cpp
floaterlocalassetbrowse.cpp
@@ -514,6 +515,7 @@ set(viewer_HEADER_FILES
emeraldboobutils.h
floaterao.h
floaterbusy.h
+ floatercommandline.h
floatergriddefault.h
floatergridmanager.h
floaterlocalassetbrowse.h
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index 7071de2..f096811 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -1312,7 +1312,7 @@
- EmeraldCmdLine
+ CmdLineChatbarEnabled
Comment
Enable usage of chat bar as a command line
@@ -1323,7 +1323,7 @@
Value
1
- EmeraldCmdLineMapToKeepPos
+ CmdLineChatbarMapToKeepPos
Comment
Whether to use current local pos on tp to the new sim
@@ -1334,7 +1334,7 @@
Value
0
- EmeraldCmdLineAO
+ CmdLineChatbarAO
Comment
Turn AO on/off
@@ -1345,7 +1345,7 @@
Value
cao
- EmeraldCmdLineAutocorrect
+ CmdLineChatbarAutocorrect
Comment
Command for adding new entries to autocorrect
@@ -1356,7 +1356,7 @@
Value
/addac
- EmeraldCmdLineMedia
+ CmdLineChatbarMedia
Comment
Chat command for setting a media url
@@ -1367,7 +1367,7 @@
Value
/media
- EmeraldCmdLineMusic
+ CmdLineChatbarMusic
Comment
Chat command for setting a music url
@@ -1378,7 +1378,7 @@
Value
/music
- EmeraldCmdLineClearChat
+ CmdLineChatbarClearChat
Comment
Clear chat hsitory to stop lag from chat spam
@@ -1389,7 +1389,7 @@
Value
clrchat
- EmeraldCmdLineHeight
+ CmdLineChatbarHeight
Comment
Teleport to height function command
@@ -1400,7 +1400,7 @@
Value
gth
- EmeraldCmdLinePos
+ CmdLineChatbarPos
Comment
Teleport to position function command
@@ -1411,7 +1411,7 @@
Value
gtp
- EmeraldCmdLineGround
+ CmdLineChatbarGround
Comment
Teleport to ground function command
@@ -1422,7 +1422,7 @@
Value
flr
- EmeraldCmdLineTeleportHome
+ CmdLineChatbarTeleportHome
Comment
Teleport to home function command
@@ -1433,7 +1433,7 @@
Value
tph
- EmeraldCmdLineRezPlatform
+ CmdLineChatbarRezPlatform
Comment
Rez a platform underneath you
@@ -1444,7 +1444,7 @@
Value
rezplat
- EmeraldCmdLinePlatformSize
+ CmdLineChatbarPlatformSize
Comment
How wide the rezzed platform will appear to be.
@@ -1455,7 +1455,7 @@
Value
30
- EmeraldCmdLineMapTo
+ CmdLineChatbarMapTo
Comment
Teleport to a region by name rapidly
@@ -1466,7 +1466,7 @@
Value
mapto
- EmeraldCmdLineDrawDistance
+ CmdLineChatbarDrawDistance
Comment
Change draw distance quickly
@@ -1477,7 +1477,7 @@
Value
dd
- EmeraldCmdTeleportToCam
+ CmdLineChatbarTeleportToCam
Comment
Teleport to your camera
@@ -1488,7 +1488,7 @@
Value
tp2cam
- EmeraldCmdLineKeyToName
+ CmdLineChatbarKeyToName
Comment
Use a fast key to name querry
@@ -1499,7 +1499,7 @@
Value
key2name
- EmeraldCmdLineOfferTp
+ CmdLineChatbarOfferTp
Comment
Offer a teleport to target avatar
@@ -1510,7 +1510,7 @@
Value
offertp
- EmeraldCmdLineCalc
+ CmdLineChatbarCalc
Comment
Calculates an expression
@@ -1521,7 +1521,7 @@
Value
calc
- EmeraldCmdLineTP2
+ CmdLineChatbarTP2
Comment
Teleport to a person by name, partials work.
diff --git a/linden/indra/newview/chatbar_as_cmdline.cpp b/linden/indra/newview/chatbar_as_cmdline.cpp
index 61e4ef4..4e23b8a 100644
--- a/linden/indra/newview/chatbar_as_cmdline.cpp
+++ b/linden/indra/newview/chatbar_as_cmdline.cpp
@@ -50,7 +50,6 @@
#include "llurldispatcher.h"
#include "llworld.h"
#include "llworldmap.h"
-//KOW #include "floateravatarlist.h"
#include "floaterao.h"
#include "llviewerobjectlist.h"
#include "llviewertexteditor.h"
@@ -222,23 +221,23 @@ void invrepair()
gInventory.collectDescendents(gAgent.getInventoryRootID(),cats,items,FALSE);//,objectnamematches);
}
-/*static BOOL *sEmeraldCmdLine;
-static std::string *sEmeraldCmdLinePos;
-static std::string *sEmeraldCmdLineDrawDistance;
-static std::string *sEmeraldCmdTeleportToCam;
-static std::string *sEmeraldCmdLineAO;
-static std::string *sEmeraldCmdLineKeyToName;
-static std::string *sEmeraldCmdLineOfferTp;
-static std::string *sEmeraldCmdLineGround;
-static std::string *sEmeraldCmdLineHeight;
-static std::string *sEmeraldCmdLineTeleportHome;
-static std::string *sEmeraldCmdLineRezPlatform;
-static std::string *sEmeraldCmdLineMapTo;
-static BOOL *sEmeraldCmdLineMapToKeepPos;
-static std::string *sEmeraldCmdLineCalc;
-static std::string *sEmeraldCmdLineTP2;
-static std::string *sEmeraldCmdLineClearChat;
-static F32 *sEmeraldCmdLinePlatformSize;*/
+/*static BOOL *sCmdLineChatbarEnabled;
+static std::string *sCmdLineChatbarPos;
+static std::string *sCmdLineChatbarDrawDistance;
+static std::string *sCmdLineChatbarTeleportToCam;
+static std::string *sCmdLineChatbarAO;
+static std::string *sCmdLineChatbarKeyToName;
+static std::string *sCmdLineChatbarOfferTp;
+static std::string *sCmdLineChatbarGround;
+static std::string *sCmdLineChatbarHeight;
+static std::string *sCmdLineChatbarTeleportHome;
+static std::string *sCmdLineChatbarRezPlatform;
+static std::string *sCmdLineChatbarMapTo;
+static BOOL *sCmdLineChatbarMapToKeepPos;
+static std::string *sCmdLineChatbarCalc;
+static std::string *sCmdLineChatbarTP2;
+static std::string *sCmdLineChatbarClearChat;
+static F32 *sCmdLineChatbarPlatformSize;*/
/*
class another_rebind_group
@@ -264,36 +263,36 @@ std::map get_gsaved_calls();
bool cmd_line_chat(std::string revised_text, EChatType type)
{
- static BOOL *sEmeraldCmdLine = rebind_llcontrol("EmeraldCmdLine", &gSavedSettings, true);
- static std::string *sEmeraldCmdLinePos = rebind_llcontrol("EmeraldCmdLinePos", &gSavedSettings, true);
- static std::string *sEmeraldCmdLineDrawDistance = rebind_llcontrol("EmeraldCmdLineDrawDistance", &gSavedSettings, true);
- static std::string *sEmeraldCmdTeleportToCam = rebind_llcontrol("EmeraldCmdTeleportToCam", &gSavedSettings, true);
- static std::string *sEmeraldCmdLineAO = rebind_llcontrol("EmeraldCmdLineAO", &gSavedSettings, true);
- static std::string *sEmeraldCmdLineKeyToName = rebind_llcontrol("EmeraldCmdLineKeyToName", &gSavedSettings, true);
- static std::string *sEmeraldCmdLineOfferTp = rebind_llcontrol("EmeraldCmdLineOfferTp", &gSavedSettings, true);
- static std::string *sEmeraldCmdLineGround = rebind_llcontrol("EmeraldCmdLineGround", &gSavedSettings, true);
- static std::string *sEmeraldCmdLineHeight = rebind_llcontrol("EmeraldCmdLineHeight", &gSavedSettings, true);
- static std::string *sEmeraldCmdLineTeleportHome = rebind_llcontrol("EmeraldCmdLineTeleportHome", &gSavedSettings, true);
- static std::string *sEmeraldCmdLineRezPlatform = rebind_llcontrol("EmeraldCmdLineRezPlatform", &gSavedSettings, true);
- static std::string *sEmeraldCmdLineMapTo = rebind_llcontrol("EmeraldCmdLineMapTo", &gSavedSettings, true);
- static BOOL *sEmeraldCmdLineMapToKeepPos = rebind_llcontrol("EmeraldCmdLineMapToKeepPos", &gSavedSettings, true);
- static std::string *sEmeraldCmdLineCalc = rebind_llcontrol("EmeraldCmdLineCalc", &gSavedSettings, true);
- static std::string *sEmeraldCmdLineTP2 = rebind_llcontrol("EmeraldCmdLineTP2", &gSavedSettings, true);
- static std::string *sEmeraldCmdLineClearChat = rebind_llcontrol("EmeraldCmdLineClearChat", &gSavedSettings, true);
- static std::string *sEmeraldCmdLineMedia = rebind_llcontrol("EmeraldCmdLineMedia", &gSavedSettings, true);
- static std::string *sEmeraldCmdLineMusic = rebind_llcontrol("EmeraldCmdLineMusic", &gSavedSettings, true);
- static std::string *sEmeraldCmdLineAutocorrect = rebind_llcontrol("EmeraldCmdLineAutocorrect", &gSavedSettings, true);
- //static std::string *sEmeraldCmdUndeform = rebind_llcontrol("EmeraldCmdUndeform", &gSavedSettings, true);
- //gSavedSettings.getString("EmeraldCmdUndeform")
+ static BOOL *sCmdLineChatbarEnabled = rebind_llcontrol("CmdLineChatbarEnabled", &gSavedSettings, true);
+ static std::string *sCmdLineChatbarPos = rebind_llcontrol("CmdLineChatbarPos", &gSavedSettings, true);
+ static std::string *sCmdLineChatbarDrawDistance = rebind_llcontrol("CmdLineChatbarDrawDistance", &gSavedSettings, true);
+ static std::string *sCmdLineChatbarTeleportToCam = rebind_llcontrol("CmdLineChatbarTeleportToCam", &gSavedSettings, true);
+ static std::string *sCmdLineChatbarAO = rebind_llcontrol("CmdLineChatbarAO", &gSavedSettings, true);
+ static std::string *sCmdLineChatbarKeyToName = rebind_llcontrol("CmdLineChatbarKeyToName", &gSavedSettings, true);
+ static std::string *sCmdLineChatbarOfferTp = rebind_llcontrol("CmdLineChatbarOfferTp", &gSavedSettings, true);
+ static std::string *sCmdLineChatbarGround = rebind_llcontrol("CmdLineChatbarGround", &gSavedSettings, true);
+ static std::string *sCmdLineChatbarHeight = rebind_llcontrol("CmdLineChatbarHeight", &gSavedSettings, true);
+ static std::string *sCmdLineChatbarTeleportHome = rebind_llcontrol("CmdLineChatbarTeleportHome", &gSavedSettings, true);
+ static std::string *sCmdLineChatbarRezPlatform = rebind_llcontrol("CmdLineChatbarRezPlatform", &gSavedSettings, true);
+ static std::string *sCmdLineChatbarMapTo = rebind_llcontrol("CmdLineChatbarMapTo", &gSavedSettings, true);
+ static BOOL *sCmdLineChatbarMapToKeepPos = rebind_llcontrol("CmdLineChatbarMapToKeepPos", &gSavedSettings, true);
+ static std::string *sCmdLineChatbarCalc = rebind_llcontrol("CmdLineChatbarCalc", &gSavedSettings, true);
+ static std::string *sCmdLineChatbarTP2 = rebind_llcontrol("CmdLineChatbarTP2", &gSavedSettings, true);
+ static std::string *sCmdLineChatbarClearChat = rebind_llcontrol("CmdLineChatbarClearChat", &gSavedSettings, true);
+ static std::string *sCmdLineChatbarMedia = rebind_llcontrol("CmdLineChatbarMedia", &gSavedSettings, true);
+ static std::string *sCmdLineChatbarMusic = rebind_llcontrol("CmdLineChatbarMusic", &gSavedSettings, true);
+ static std::string *sCmdLineChatbarAutocorrect = rebind_llcontrol("CmdLineChatbarAutocorrect", &gSavedSettings, true);
+ //static std::string *sCmdLineChatbarUndeform = rebind_llcontrol("CmdLineChatbarUndeform", &gSavedSettings, true);
+ //gSavedSettings.getString("CmdLineChatbarUndeform")
- if(*sEmeraldCmdLine)
+ if(*sCmdLineChatbarEnabled)
{
std::istringstream i(revised_text);
std::string command;
i >> command;
if(command != "")
{
- if(command == *sEmeraldCmdLinePos)
+ if(command == *sCmdLineChatbarPos)
{
F32 x,y,z;
if (i >> x)
@@ -316,7 +315,7 @@ bool cmd_line_chat(std::string revised_text, EChatType type)
}
}
}
- else if(command == *sEmeraldCmdLineDrawDistance)
+ else if(command == *sCmdLineChatbarDrawDistance)
{
int drawDist;
if(i >> drawDist)
@@ -329,18 +328,18 @@ bool cmd_line_chat(std::string revised_text, EChatType type)
return false;
}
}
- else if(command == *sEmeraldCmdTeleportToCam)
+ else if(command == *sCmdLineChatbarTeleportToCam)
{
gAgent.teleportViaLocation(gAgent.getCameraPositionGlobal());
return false;
}
- /*else if(command == *sEmeraldCmdUndeform)
+ /*else if(command == *sCmdLineChatbarUndeform)
{
llinfos << "UNDEFORM: Do you feel your bones cracking back into place?" << llendl;
gAgent.getAvatarObject()->undeform();
return false;
}*/ //what the fuck is this shit, thought it would be something useful like repairing the skeleton but its some shitty playing of inworld anims
- else if(command == *sEmeraldCmdLineMedia)
+ else if(command == *sCmdLineChatbarMedia)
{
std::string url;
std::string type;
@@ -358,7 +357,7 @@ bool cmd_line_chat(std::string revised_text, EChatType type)
}
}
}
- else if(command == *sEmeraldCmdLineMusic)
+ else if(command == *sCmdLineChatbarMusic)
{
std::string status;
if(i >> status)
@@ -371,7 +370,7 @@ bool cmd_line_chat(std::string revised_text, EChatType type)
return false;
}
}
- else if(command == *sEmeraldCmdLineAO)
+ else if(command == *sCmdLineChatbarAO)
{
std::string status;
if(i >> status)
@@ -394,7 +393,7 @@ bool cmd_line_chat(std::string revised_text, EChatType type)
}
return false;
}
- else if(command == *sEmeraldCmdLineKeyToName)
+ else if(command == *sCmdLineChatbarKeyToName)
{
LLUUID targetKey;
if(i >> targetKey)
@@ -496,7 +495,7 @@ bool cmd_line_chat(std::string revised_text, EChatType type)
cmdline_printchat(std::string("Standing up"));
return false;
}
- else if(command == *sEmeraldCmdLineOfferTp)
+ else if(command == *sCmdLineChatbarOfferTp)
{
std::string avatarKey;
// llinfos << "CMD DEBUG 0 " << command << " " << avatarName << llendl;
@@ -532,7 +531,7 @@ bool cmd_line_chat(std::string revised_text, EChatType type)
}
}
- else if(command == *sEmeraldCmdLineGround)
+ else if(command == *sCmdLineChatbarGround)
{
LLVector3 agentPos = gAgent.getPositionAgent();
U64 agentRegion = gAgent.getRegion()->getHandle();
@@ -541,7 +540,7 @@ bool cmd_line_chat(std::string revised_text, EChatType type)
pos_global += LLVector3d((F64)targetPos.mV[0],(F64)targetPos.mV[1],(F64)targetPos.mV[2]);
gAgent.teleportViaLocation(pos_global);
return false;
- }else if(command == *sEmeraldCmdLineHeight)
+ }else if(command == *sCmdLineChatbarHeight)
{
F32 z;
if(i >> z)
@@ -554,17 +553,17 @@ bool cmd_line_chat(std::string revised_text, EChatType type)
gAgent.teleportViaLocation(pos_global);
return false;
}
- }else if(command == *sEmeraldCmdLineTeleportHome)
+ }else if(command == *sCmdLineChatbarTeleportHome)
{
gAgent.teleportHome();
return false;
- }else if(command == *sEmeraldCmdLineRezPlatform)
+ }else if(command == *sCmdLineChatbarRezPlatform)
{
F32 width;
if (i >> width) cmdline_rezplat(false, width);
else cmdline_rezplat();
return false;
- }else if(command == *sEmeraldCmdLineMapTo)
+ }else if(command == *sCmdLineChatbarMapTo)
{
if (revised_text.length() > command.length() + 1) //Typing this command with no argument was causing a crash. -Madgeek
{
@@ -575,7 +574,7 @@ bool cmd_line_chat(std::string revised_text, EChatType type)
std::string region_name = LLWeb::escapeURL(revised_text.substr(command.length()+1));
std::string url;
- if(!*sEmeraldCmdLineMapToKeepPos)
+ if(!*sCmdLineChatbarMapToKeepPos)
{
agent_x = 128;
agent_y = 128;
@@ -586,7 +585,7 @@ bool cmd_line_chat(std::string revised_text, EChatType type)
LLURLDispatcher::dispatch(url, NULL, true);
}
return false;
- }else if(command == *sEmeraldCmdLineCalc)//Cryogenic Blitz
+ }else if(command == *sCmdLineChatbarCalc)//Cryogenic Blitz
{
bool success;
F32 result = 0.f;
@@ -615,7 +614,7 @@ bool cmd_line_chat(std::string revised_text, EChatType type)
cmdline_printchat(out);
return false;
}
- }else if(command == *sEmeraldCmdLineTP2)
+ }else if(command == *sCmdLineChatbarTP2)
{
if (revised_text.length() > command.length() + 1) //Typing this command with no argument was causing a crash. -Madgeek
{
@@ -630,22 +629,22 @@ bool cmd_line_chat(std::string revised_text, EChatType type)
cmdline_printchat("Displaying AutoCorrection Floater.");
return false;
}
- else if(command == *sEmeraldCmdLineAutocorrect)
+ else if(command == *sCmdLineChatbarAutocorrect)
{
if (revised_text.length() <= command.length() + 1) //KOW: verify that we have params
{
cmdline_printchat("No parameter specified, correct usage is "+
- *sEmeraldCmdLineAutocorrect+" list Name|wrong word|right word.");
+ *sCmdLineChatbarAutocorrect+" list Name|wrong word|right word.");
return false;
}
- std::string info = revised_text.substr((*sEmeraldCmdLineAutocorrect).length()+1);
+ std::string info = revised_text.substr((*sCmdLineChatbarAutocorrect).length()+1);
//addac list name|wrong word|right word
int bar = info.find("|");
if (bar==std::string::npos)
{
cmdline_printchat("Wrong usage, correct usage is "+
- *sEmeraldCmdLineAutocorrect+" list name|wrong word|right word.");
+ *sCmdLineChatbarAutocorrect+" list name|wrong word|right word.");
return false;
}
@@ -657,7 +656,7 @@ bool cmd_line_chat(std::string revised_text, EChatType type)
if (bar==std::string::npos)
{
cmdline_printchat("Wrong usage, correct usage is"+
- *sEmeraldCmdLineAutocorrect+" list name|wrong word|right word.");
+ *sCmdLineChatbarAutocorrect+" list name|wrong word|right word.");
return false;
}
@@ -683,7 +682,7 @@ bool cmd_line_chat(std::string revised_text, EChatType type)
// //gAgent.getAvatarObject()->loadAvatar();
// return false;
// }
- else if(command == *sEmeraldCmdLineClearChat)
+ else if(command == *sCmdLineChatbarClearChat)
{
LLFloaterChat* chat = LLFloaterChat::getInstance(LLSD());
if(chat)
@@ -930,9 +929,9 @@ void cmdline_rezplat(bool use_saved_value, F32 visual_radius) //cmdline_rezplat(
LLQuaternion rotation;
rotation.setQuat(90.f * DEG_TO_RAD, LLVector3::y_axis);
- static F32 *sEmeraldCmdLinePlatformSize = rebind_llcontrol("EmeraldCmdLinePlatformSize", &gSavedSettings, true);
+ static F32 *sCmdLineChatbarPlatformSize = rebind_llcontrol("CmdLineChatbarPlatformSize", &gSavedSettings, true);
- if (use_saved_value) visual_radius = *sEmeraldCmdLinePlatformSize;
+ if (use_saved_value) visual_radius = *sCmdLineChatbarPlatformSize;
F32 realsize = visual_radius / 3.0f;
if (realsize < 0.01f) realsize = 0.01f;
else if (realsize > 10.0f) realsize = 10.0f;
diff --git a/linden/indra/newview/floatercommandline.cpp b/linden/indra/newview/floatercommandline.cpp
new file mode 100644
index 0000000..a700b62
--- /dev/null
+++ b/linden/indra/newview/floatercommandline.cpp
@@ -0,0 +1,84 @@
+/**
+* @file floatercommandline.cpp
+* @brief change chatbar as a commandline preferences in Imprudence
+*
+* $LicenseInfo:firstyear=2009&license=viewergpl$
+*
+* Copyright (c) 2010, McCabe Maxsted
+*
+* Imprudence Viewer Source Code
+* The source code in this file ("Source Code") is provided to you
+* under the terms of the GNU General Public License, version 2.0
+* ("GPL"). Terms of the GPL can be found in doc/GPL-license.txt in
+* this distribution, or online at
+* http://secondlifegrid.net/programs/open_source/licensing/gplv2
+*
+* There are special exceptions to the terms and conditions of the GPL as
+* it is applied to this Source Code. View the full text of the exception
+* in the file doc/FLOSS-exception.txt in this software distribution, or
+* online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+*
+* By copying, modifying or distributing this software, you acknowledge
+* that you have read and understood your obligations described above,
+* and agree to abide by those obligations.
+*
+* ALL SOURCE CODE IS PROVIDED "AS IS." THE AUTHOR MAKES NO
+* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+* COMPLETENESS OR PERFORMANCE.
+* $/LicenseInfo$
+*/
+
+#include "llviewerprecompiledheaders.h"
+
+#include "floatercommandline.h"
+
+#include "lluictrlfactory.h"
+#include "llviewercontrol.h"
+
+FloaterCommandLine::FloaterCommandLine(const LLSD& seed) : LLFloater("floater_command_line")
+{
+ LLUICtrlFactory::getInstance()->buildFloater(this, "floater_command_line.xml");
+}
+
+FloaterCommandLine::~FloaterCommandLine()
+{
+}
+
+BOOL FloaterCommandLine::postBuild()
+{
+ childSetAction("Help_CmdLine", onClickHelp, this);
+
+ childSetCommitCallback("CmdLineChatbarPos", onCommitApplyControl);
+ childSetCommitCallback("CmdLineChatbarGround", onCommitApplyControl);
+ childSetCommitCallback("CmdLineChatbarHeight", onCommitApplyControl);
+ childSetCommitCallback("CmdLineChatbarTeleportHome", onCommitApplyControl);
+ childSetCommitCallback("CmdLineChatbarRezPlatform", onCommitApplyControl);
+ childSetCommitCallback("CmdLineChatbarMapTo", onCommitApplyControl);
+ childSetCommitCallback("CmdLineChatbarCalc", onCommitApplyControl);
+
+ childSetCommitCallback("CmdLineChatbarDrawDistance", onCommitApplyControl);
+ childSetCommitCallback("CmdLineChatbarTeleportToCam", onCommitApplyControl);
+ childSetCommitCallback("CmdLineChatbarKeyToName", onCommitApplyControl);
+ childSetCommitCallback("CmdLineChatbarOfferTp", onCommitApplyControl);
+ childSetCommitCallback("CmdLineChatbarTP2", onCommitApplyControl);
+ childSetCommitCallback("CmdLineChatbarAO", onCommitApplyControl);
+ childSetCommitCallback("CmdLineChatbarClearChat", onCommitApplyControl);
+
+ return TRUE;
+}
+
+//workaround for lineeditor dumbness in regards to control_name
+void FloaterCommandLine::onCommitApplyControl(LLUICtrl* caller, void* user_data)
+{
+ LLLineEditor* line = (LLLineEditor*)caller;
+ if(line)
+ {
+ LLControlVariable *var = line->findControl(line->getControlName());
+ if(var)var->setValue(line->getValue());
+ }
+}
+
+void FloaterCommandLine::onClickHelp(void* data)
+{
+ LLNotifications::instance().add("Help_CmdLine");
+}
diff --git a/linden/indra/newview/floatercommandline.h b/linden/indra/newview/floatercommandline.h
new file mode 100644
index 0000000..9d140eb
--- /dev/null
+++ b/linden/indra/newview/floatercommandline.h
@@ -0,0 +1,55 @@
+/**
+* @file floatercommandline.h
+* @brief change chatbar as a commandline preferences in Imprudence
+*
+* $LicenseInfo:firstyear=2009&license=viewergpl$
+*
+* Copyright (c) 2010, McCabe Maxsted
+*
+* Imprudence Viewer Source Code
+* The source code in this file ("Source Code") is provided to you
+* under the terms of the GNU General Public License, version 2.0
+* ("GPL"). Terms of the GPL can be found in doc/GPL-license.txt in
+* this distribution, or online at
+* http://secondlifegrid.net/programs/open_source/licensing/gplv2
+*
+* There are special exceptions to the terms and conditions of the GPL as
+* it is applied to this Source Code. View the full text of the exception
+* in the file doc/FLOSS-exception.txt in this software distribution, or
+* online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+*
+* By copying, modifying or distributing this software, you acknowledge
+* that you have read and understood your obligations described above,
+* and agree to abide by those obligations.
+*
+* ALL SOURCE CODE IS PROVIDED "AS IS." THE AUTHOR MAKES NO
+* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+* COMPLETENESS OR PERFORMANCE.
+* $/LicenseInfo$
+*/
+
+#ifndef FLOATERCOMMANDLINE_H
+#define FLOATERCOMMANDLINE_H
+
+#include "llfloater.h"
+
+class FloaterCommandLine : public LLFloater, public LLFloaterSingleton
+{
+public:
+ FloaterCommandLine(const LLSD& seed);
+ virtual ~FloaterCommandLine();
+
+ BOOL postBuild();
+
+ //void apply();
+ //void cancel();
+
+private:
+ //static void onClickOK(void* userdata);
+ //static void onClickCancel(void* userdata);
+ static void onCommitApplyControl(LLUICtrl* caller, void* user_data);
+
+ static void onClickHelp(void* data);
+};
+
+#endif // FLOATERCOMMANDLINE_H
diff --git a/linden/indra/newview/lggautocorrectfloater.cpp b/linden/indra/newview/lggautocorrectfloater.cpp
index 9d68b25..1690eaf 100644
--- a/linden/indra/newview/lggautocorrectfloater.cpp
+++ b/linden/indra/newview/lggautocorrectfloater.cpp
@@ -49,6 +49,7 @@
#include "llcheckboxctrl.h"
#include "llviewercontrol.h"
+#include "floaterbusy.h" // InvDropTarget
#include "llui.h"
#include "llcontrol.h"
#include "llscrolllistctrl.h"
@@ -89,7 +90,7 @@ public:
LLPrefsAdvanced * empanel;
private:
static lggAutoCorrectFloater* sInstance;
- static JCInvDropTarget* mNotecardDropTarget;
+ static InvDropTarget* mNotecardDropTarget;
static void onBoxCommitEnabled(LLUICtrl* caller, void* user_data);
static void onEntrySettingChange(LLUICtrl* caller, void* user_data);
static void onSelectName(LLUICtrl* caller, void* user_data);
@@ -107,7 +108,7 @@ private:
-JCInvDropTarget * lggAutoCorrectFloater::mNotecardDropTarget;
+InvDropTarget * lggAutoCorrectFloater::mNotecardDropTarget;
lggAutoCorrectFloater* lggAutoCorrectFloater::sInstance;
lggAutoCorrectFloater::~lggAutoCorrectFloater()
@@ -165,7 +166,7 @@ BOOL lggAutoCorrectFloater::postBuild(void)
{
delete mNotecardDropTarget;
}
- mNotecardDropTarget = new JCInvDropTarget("drop target", target_view->getRect(), ResponseItemDrop);//, mAvatarID);
+ mNotecardDropTarget = new InvDropTarget("drop target", target_view->getRect(), ResponseItemDrop);//, mAvatarID);
addChild(mNotecardDropTarget);
}
return true;
@@ -429,7 +430,7 @@ void lggAutoCorrectFloater::addEntry(void* data)
{
std::string listName= sInstance->namesList->getFirstSelected()->getColumn(0)->getValue().asString();
LLChat chat;
- chat.mText = "To add an entry, please type in chat \""+gSavedSettings.getString("EmeraldCmdLineAutocorrect")+" "+listName+"|wrongWord|rightWord\"";
+ chat.mText = "To add an entry, please type in chat \""+gSavedSettings.getString("CmdLineChatbarAutocorrect")+" "+listName+"|wrongWord|rightWord\"";
chat.mSourceType = CHAT_SOURCE_SYSTEM;
LLFloaterChat::addChat(chat, FALSE, FALSE);
}
diff --git a/linden/indra/newview/llprefsadvanced.cpp b/linden/indra/newview/llprefsadvanced.cpp
index 4a4b299..7fa694c 100644
--- a/linden/indra/newview/llprefsadvanced.cpp
+++ b/linden/indra/newview/llprefsadvanced.cpp
@@ -32,6 +32,7 @@
#include "llcombobox.h"
+#include "floatercommandline.h"
#include "llagent.h"
#include "llprefsadvanced.h"
#include "llviewercontrol.h"
@@ -43,76 +44,6 @@
#include "lluictrlfactory.h"
-////////begin drop utility/////////////
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class JCInvDropTarget
-//
-// This handy class is a simple way to drop something on another
-// view. It handles drop events, always setting itself to the size of
-// its parent.
-//
-// altered to support a callback so i can slap it in things and it just return the item to a func of my choice
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-
-
-
-JCInvDropTarget::JCInvDropTarget(const std::string& name, const LLRect& rect,
- void (*callback)(LLViewerInventoryItem*)) :
-LLView(name, rect, NOT_MOUSE_OPAQUE, FOLLOWS_ALL),
-mDownCallback(callback)
-{
-}
-
-JCInvDropTarget::~JCInvDropTarget()
-{
-}
-
-void JCInvDropTarget::doDrop(EDragAndDropType cargo_type, void* cargo_data)
-{
- llinfos << "JCInvDropTarget::doDrop()" << llendl;
-}
-
-BOOL JCInvDropTarget::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg)
-{
- BOOL handled = FALSE;
- if(getParent())
- {
- handled = TRUE;
- // check the type
- //switch(cargo_type)
- //{
- //case DAD_ANIMATION:
- //{
- LLViewerInventoryItem* inv_item = (LLViewerInventoryItem*)cargo_data;
- if(gInventory.getItem(inv_item->getUUID()))
- {
- *accept = ACCEPT_YES_COPY_SINGLE;
- if(drop)
- {
- //printchat("accepted");
- mDownCallback(inv_item);
- }
- }
- else
- {
- *accept = ACCEPT_NO;
- }
- // break;
- //}
- //default:
- // *accept = ACCEPT_NO;
- // break;
- //}
- }
- return handled;
-}
-////////end drop utility///////////////
-
LLPrefsAdvanced* LLPrefsAdvanced::sInstance;
LLPrefsAdvanced::LLPrefsAdvanced()
@@ -124,6 +55,7 @@ LLPrefsAdvanced::LLPrefsAdvanced()
childSetCommitCallback("speed_rez_check", onCommitCheckBox, this);
childSetAction("reset_btn", onClickResetPrefs, this);
+ childSetAction("command_line_btn", onClickCommandLine, this);
}
LLPrefsAdvanced::~LLPrefsAdvanced()
@@ -160,6 +92,7 @@ BOOL LLPrefsAdvanced::postBuild()
childSetValue("allow_mupose", gSavedSettings.getBOOL("AllowMUpose"));
childSetValue("auto_close_ooc", gSavedSettings.getBOOL("AutoCloseOOC"));
childSetValue("shadows_check", gSavedSettings.getBOOL("ShadowsEnabled"));
+ childSetValue("command_line_check", gSavedSettings.getBOOL("CmdLineChatbarEnabled"));
childSetValue("lightshare_combo",
LLSD((S32)gSavedSettings.getU32("LightShareAllowed")));
@@ -167,22 +100,6 @@ BOOL LLPrefsAdvanced::postBuild()
LLComboBox* crash_behavior_combobox = getChild("crash_behavior_combobox");
crash_behavior_combobox->setCurrentByIndex(gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING));
- childSetCommitCallback("EmeraldCmdLinePos", onCommitApplyControl);
- childSetCommitCallback("EmeraldCmdLineGround", onCommitApplyControl);
- childSetCommitCallback("EmeraldCmdLineHeight", onCommitApplyControl);
- childSetCommitCallback("EmeraldCmdLineTeleportHome", onCommitApplyControl);
- childSetCommitCallback("EmeraldCmdLineRezPlatform", onCommitApplyControl);
- childSetCommitCallback("EmeraldCmdLineMapTo", onCommitApplyControl);
- childSetCommitCallback("EmeraldCmdLineCalc", onCommitApplyControl);
-
- childSetCommitCallback("EmeraldCmdLineDrawDistance", onCommitApplyControl);
- childSetCommitCallback("EmeraldCmdTeleportToCam", onCommitApplyControl);
- childSetCommitCallback("EmeraldCmdLineKeyToName", onCommitApplyControl);
- childSetCommitCallback("EmeraldCmdLineOfferTp", onCommitApplyControl);
- childSetCommitCallback("EmeraldCmdLineTP2", onCommitApplyControl);
- childSetCommitCallback("EmeraldCmdLineAO", onCommitApplyControl);
- childSetCommitCallback("EmeraldCmdLineClearChat", onCommitApplyControl);
-
getChild("EmeraldSpellBase")->setCommitCallback(onSpellBaseComboBoxCommit);
getChild("EmSpell_EditCustom")->setClickedCallback(onSpellEditCustom, this);
getChild("EmSpell_GetMore")->setClickedCallback(onSpellGetMore, this);
@@ -191,7 +108,6 @@ BOOL LLPrefsAdvanced::postBuild()
getChild("ac_button")->setClickedCallback(onAutoCorrectButton,this);
- initHelpBtn("EmeraldHelp_CmdLine", "EmeraldHelp_CmdLine");
initHelpBtn("EmeraldHelp_SpellCheck", "EmeraldHelp_SpellCheck");
refresh();
@@ -277,6 +193,8 @@ void LLPrefsAdvanced::apply()
build_pie_menus();
}
+ gSavedSettings.setBOOL("CmdLineChatbarEnabled", childGetValue("command_line_check").asBoolean());
+
LLComboBox* crash_behavior_combobox = getChild("crash_behavior_combobox");
gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, crash_behavior_combobox->getCurrentIndex());
}
@@ -362,17 +280,6 @@ bool LLPrefsAdvanced::callbackReset(const LLSD& notification, const LLSD& respon
return false;
}
-//workaround for lineeditor dumbness in regards to control_name
-void LLPrefsAdvanced::onCommitApplyControl(LLUICtrl* caller, void* user_data)
-{
- LLLineEditor* line = (LLLineEditor*)caller;
- if(line)
- {
- LLControlVariable *var = line->findControl(line->getControlName());
- if(var)var->setValue(line->getValue());
- }
-}
-
void LLPrefsAdvanced::onSpellAdd(void* data)
{
LLPrefsAdvanced* panel = (LLPrefsAdvanced*)data;
@@ -416,4 +323,10 @@ void LLPrefsAdvanced::onSpellBaseComboBoxCommit(LLUICtrl* ctrl, void* userdata)
void LLPrefsAdvanced::onAutoCorrectButton(void * data)
{
lggAutoCorrectFloaterStart::show(TRUE,data);
-}
\ No newline at end of file
+}
+
+void LLPrefsAdvanced::onClickCommandLine(void* data)
+{
+ FloaterCommandLine::getInstance()->open();
+ FloaterCommandLine::getInstance()->center();
+}
diff --git a/linden/indra/newview/llprefsadvanced.h b/linden/indra/newview/llprefsadvanced.h
index 6a15fba..84a7854 100644
--- a/linden/indra/newview/llprefsadvanced.h
+++ b/linden/indra/newview/llprefsadvanced.h
@@ -34,25 +34,6 @@
#include "llpanel.h"
#include "llviewerinventory.h"
-class JCInvDropTarget : public LLView
-{
-public:
- JCInvDropTarget(const std::string& name, const LLRect& rect, void (*callback)(LLViewerInventoryItem*));
- ~JCInvDropTarget();
-
- void doDrop(EDragAndDropType cargo_type, void* cargo_data);
-
- //
- // LLView functionality
- virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg);
-protected:
- void (*mDownCallback)(LLViewerInventoryItem*);
-};
-
class LLPrefsAdvanced : public LLPanel
{
public:
@@ -70,11 +51,10 @@ private:
static void onCommitCheckBox(LLUICtrl* ctrl, void* user_data);
static void onClickResetPrefs(void* user_data);
+ static void onClickCommandLine(void* data);
static bool callbackReset(const LLSD& notification, const LLSD& response, LLPrefsAdvanced *self);
- static void onCommitApplyControl(LLUICtrl* caller, void* user_data);
-
static void onSpellAdd(void* data);
static void onSpellRemove(void* data);
static void onSpellGetMore(void* data);
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_command_line.xml b/linden/indra/newview/skins/default/xui/en-us/floater_command_line.xml
new file mode 100644
index 0000000..35f47b5
--- /dev/null
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_command_line.xml
@@ -0,0 +1,108 @@
+
+
+ Teleport within sim (usage: cmd x y z)
+
+ Teleport to ground (usage: cmd)
+
+ Teleport to altitude (usage: cmd z)
+
+ Teleport home (usage: cmd)
+
+ Rez a platform (usage: cmd 0 - 30)
+
+
+ Teleport to sim x (usage: cmd simname)
+
+
+ Calc. expressions (usage: cmd SIN(2+2))
+
+ Add autocorrect word(cmd list|bad|good)
+
+
+ Change Draw Distance (usage: cmd meters)
+
+ Teleport to cam position (usage: cmd)
+
+ Get avatar name from key (usage: cmd key)
+
+ Offer teleport to avatar (usage: cmd key)
+
+ Teleport to avatar (usage: cmd name)
+
+ Turn AO on/off (usage: cmd on/off)
+
+ Clear the chat history (usage: cmd)
+
+ Set the media url (usage: cmd url type)
+
+ Set the music stream url (usage: cmd url)
+
+
+
\ No newline at end of file
diff --git a/linden/indra/newview/skins/default/xui/en-us/notifications.xml b/linden/indra/newview/skins/default/xui/en-us/notifications.xml
index 4bb2274..9952d25 100644
--- a/linden/indra/newview/skins/default/xui/en-us/notifications.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/notifications.xml
@@ -7053,12 +7053,12 @@ Note: To comply with the Second Life Terms of Service, Imprudence did not downlo
-Various Options For Command Line features.
-To use a command, type it in your chat bar (Local chat) and press enter.
+ icon="alert.tga"
+ name="Help_CmdLine"
+ type="alert">
+Various options for command line features.
+
+To use a command, type it in your chat bar (Local Chat) and press enter.
+
+
-
-
-
-
-
- Teleport within sim (usage: cmd x y z)
-
- Teleport to ground (usage: cmd)
-
- Teleport to altitude (usage: cmd z)
-
- Teleport home (usage: cmd)
-
- Rez a platform (usage: cmd 0 - 30)
-
-
- Teleport to sim x (usage: cmd simname)
-
-
- Calc. expressions (usage: cmd SIN(2+2))
-
- Add autocorrect word(cmd list|bad|good)
-
-
- Change Draw Distance (usage: cmd meters)
-
- Teleport to cam position (usage: cmd)
-
- Get avatar name from key (usage: cmd key)
-
- Offer teleport to avatar (usage: cmd key)
-
- Teleport to avatar (usage: cmd name)
-
- Turn AO on/off (usage: cmd on/off)
-
- Clear the chat history (usage: cmd)
-
- Set the media url (usage: cmd url type)
-
- Set the music stream url (usage: cmd url)
-
-
--
cgit v1.1
From 56708c7c1182708814558493c47de9a421e78fe1 Mon Sep 17 00:00:00 2001
From: Patrick Sapinski
Date: Wed, 1 Sep 2010 13:39:52 -0400
Subject: useful batch files
---
linden/indra/develop.py clean.bat | 2 ++
linden/indra/develop.py.bat | 2 ++
2 files changed, 4 insertions(+)
create mode 100644 linden/indra/develop.py clean.bat
create mode 100644 linden/indra/develop.py.bat
(limited to 'linden/indra')
diff --git a/linden/indra/develop.py clean.bat b/linden/indra/develop.py clean.bat
new file mode 100644
index 0000000..24c6822
--- /dev/null
+++ b/linden/indra/develop.py clean.bat
@@ -0,0 +1,2 @@
+develop.py clean
+pause
\ No newline at end of file
diff --git a/linden/indra/develop.py.bat b/linden/indra/develop.py.bat
new file mode 100644
index 0000000..753ef25
--- /dev/null
+++ b/linden/indra/develop.py.bat
@@ -0,0 +1,2 @@
+develop.py
+pause
\ No newline at end of file
--
cgit v1.1
From 7c284acc13f41fd135c5f379a642b1442c273063 Mon Sep 17 00:00:00 2001
From: Patrick Sapinski
Date: Wed, 1 Sep 2010 13:40:51 -0400
Subject: autocorrect defaults for spellchecker
---
.../newview/app_settings/settings_autocorrect.xml | 8331 ++++++++++++++++++++
1 file changed, 8331 insertions(+)
create mode 100644 linden/indra/newview/app_settings/settings_autocorrect.xml
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/settings_autocorrect.xml b/linden/indra/newview/app_settings/settings_autocorrect.xml
new file mode 100644
index 0000000..be89d02
--- /dev/null
+++ b/linden/indra/newview/app_settings/settings_autocorrect.xml
@@ -0,0 +1,8331 @@
+
+
+ Custom
+
+ announce
+ 0
+ author
+ You
+ data
+
+ enabled
+ 1
+ priority
+ 10
+ wordStyle
+ 1
+
+ Abbreviations
+
+ announce
+ 0
+ author
+ Wulf
+ data
+
+ afk
+ (Away from Keyboard)
+ atm
+ at the moment
+ bbl
+ (Be back later)
+ brb
+ (Be Right Back)
+ gtg
+ Got to go
+ nm
+ Not much
+ np
+ No problem
+ nvm
+ Nevermind
+ tc
+ Take care
+ thx
+ Thanks
+ ttyl
+ Talk to you later
+ ty
+ Thank you
+ tyvm
+ Thank you very much
+ wb
+ Welcome back
+ yw
+ You're Welcome
+
+ enabled
+ 0
+ priority
+ 4
+ wordStyle
+ 1
+
+ Spelling Corrections
+
+ announce
+ 0
+ author
+ LordGregGreg / Wikipedia
+ data
+
+ Amercia
+ America
+ Bernouilli
+ Bernoulli
+ Blitzkreig
+ Blitzkrieg
+ Bonnano
+ Bonanno
+ Brasillian
+ Brazilian
+ Britian
+ Britain
+ Brittish
+ British
+ Buddah
+ Buddha
+ Buddist
+ Buddhist
+ Cambrige
+ Cambridge
+ Capetown
+ Cape Town
+ Carmalite
+ Carmelite
+ Carnagie
+ Carnegie
+ Carnagie-Mellon
+ Carnegie-Mellon
+ Carnigie
+ Carnegie
+ Carnigie-Mellon
+ Carnegie-Mellon
+ Carribbean
+ Caribbean
+ Carribean
+ Caribbean
+ Carthagian
+ Carthaginian
+ Cataline
+ Catiline
+ Ceasar
+ Caesar
+ Celcius
+ Celsius
+ Champange
+ Champagne
+ Cincinatti
+ Cincinnati
+ Cincinnatti
+ Cincinnati
+ Conneticut
+ Connecticut
+ Dardenelles
+ Dardanelles
+ Dravadian
+ Dravidian
+ Enlish
+ English
+ Europian
+ European
+ Europians
+ Europeans
+ Eurpean
+ European
+ Eurpoean
+ European
+ Farenheit
+ Fahrenheit
+ Febuary
+ February
+ Feburary
+ February
+ Flemmish
+ Flemish
+ Formalhaut
+ Fomalhaut
+ Foundland
+ Newfoundland
+ Fransiscan
+ Franciscan
+ Fransiscans
+ Franciscans
+ Galations
+ Galatians
+ Gameboy
+ Game Boy
+ Ghandi
+ Gandhi
+ Godounov
+ Godunov
+ Gothenberg
+ Gothenburg
+ Gottleib
+ Gottlieb
+ Guaduloupe
+ Guadalupe
+ Guadulupe
+ Guadalupe
+ Guatamala
+ Guatemala
+ Guatamalan
+ Guatemalan
+ Guilia
+ Giulia
+ Guilio
+ Giulio
+ Guiness
+ Guinness
+ Guiseppe
+ Giuseppe
+ Habsbourg
+ Habsburg
+ Hallowean
+ Halloween
+ Heidelburg
+ Heidelberg
+ Ihaca
+ Ithaca
+ Israelies
+ Israelis
+ Janurary
+ January
+ Januray
+ January
+ Japanes
+ Japanese
+ Johanine
+ Johannine
+ Jospeh
+ Joseph
+ Juadaism
+ Judaism
+ Juadism
+ Judaism
+ Lybia
+ Libya
+ Malcom
+ Malcolm
+ Massachussets
+ Massachusetts
+ Massachussetts
+ Massachusetts
+ Mediteranean
+ Mediterranean
+ Michagan
+ Michigan
+ Misouri
+ Missouri
+ Missisipi
+ Mississippi
+ Missisippi
+ Mississippi
+ Monserrat
+ Montserrat
+ Montnana
+ Montana
+ Morisette
+ Morissette
+ Morrisette
+ Morissette
+ Mythraic
+ Mithraic
+ Naploeon
+ Napoleon
+ Napolean
+ Napoleon
+ Napoleonian
+ Napoleonic
+ Nazereth
+ Nazareth
+ Newyorker
+ New Yorker
+ Novermber
+ November
+ Nullabour
+ Nullarbor
+ Nuremburg
+ Nuremberg
+ Palistian
+ Palestinian
+ Palistinian
+ Palestinian
+ Palistinians
+ Palestinians
+ Papanicalou
+ Papanicolaou
+ Peloponnes
+ Peloponnesus
+ Pennyslvania
+ Pennsylvania
+ Pharoah
+ Pharaoh
+ Philipines
+ Philippines
+ Phillipine
+ Philippine
+ Phillipines
+ Philippines
+ Phillippines
+ Philippines
+ Phonecian
+ Phoenecian
+ Portugese
+ Portuguese
+ Postdam
+ Potsdam
+ Premonasterians
+ Premonstratensians
+ Pucini
+ Puccini
+ Puertorrican
+ Puerto Rican
+ Puertorricans
+ Puerto Ricans
+ Queenland
+ Queensland
+ Rockerfeller
+ Rockefeller
+ Russion
+ Russian
+ Sanhedrim
+ Sanhedrin
+ Saterday
+ Saturday
+ Saterdays
+ Saturdays
+ Sionist
+ Zionist
+ Sionists
+ Zionists
+ Sixtin
+ Sistine
+ Skagerak
+ Skagerrak
+ Tolkein
+ Tolkien
+ Tuscon
+ Tucson
+ Ukranian
+ Ukrainian
+ UnitesStates
+ UnitedStates
+ Yementite
+ Yemenite
+ abandonned
+ abandoned
+ aberation
+ aberration
+ abilties
+ abilities
+ abilty
+ ability
+ abondon
+ abandon
+ abondoned
+ abandoned
+ abondoning
+ abandoning
+ abondons
+ abandons
+ aborigene
+ aborigine
+ abortificant
+ abortifacient
+ abreviate
+ abbreviate
+ abreviated
+ abbreviated
+ abreviation
+ abbreviation
+ abritrary
+ arbitrary
+ absail
+ abseil
+ absailing
+ abseiling
+ absense
+ absence
+ absolutly
+ absolutely
+ absorbsion
+ absorption
+ absorbtion
+ absorption
+ abundacies
+ abundances
+ abundancies
+ abundances
+ abundunt
+ abundant
+ abutts
+ abuts
+ acadamy
+ academy
+ acadmic
+ academic
+ accademic
+ academic
+ accademy
+ academy
+ acccused
+ accused
+ accelleration
+ acceleration
+ accension
+ ascension
+ acceptence
+ acceptance
+ acceptible
+ acceptable
+ accessable
+ accessible
+ accidentaly
+ accidentally
+ accidently
+ accidentally
+ acclimitization
+ acclimatization
+ accomadate
+ accommodate
+ accomadated
+ accommodated
+ accomadates
+ accommodates
+ accomadating
+ accommodating
+ accomadation
+ accommodation
+ accomadations
+ accommodations
+ accomdate
+ accommodate
+ accomodate
+ accommodate
+ accomodated
+ accommodated
+ accomodates
+ accommodates
+ accomodating
+ accommodating
+ accomodation
+ accommodation
+ accomodations
+ accommodations
+ accompanyed
+ accompanied
+ accordeon
+ accordion
+ accordian
+ accordion
+ accoring
+ according
+ accoustic
+ acoustic
+ accquainted
+ acquainted
+ accrediation
+ accreditation
+ accredidation
+ accreditation
+ accross
+ across
+ accussed
+ accused
+ acedemic
+ academic
+ acheive
+ achieve
+ acheived
+ achieved
+ acheivement
+ achievement
+ acheivements
+ achievements
+ acheives
+ achieves
+ acheiving
+ achieving
+ acheivment
+ achievement
+ acheivments
+ achievements
+ achievment
+ achievement
+ achievments
+ achievements
+ achivement
+ achievement
+ achivements
+ achievements
+ acknowldeged
+ acknowledged
+ acknowledgeing
+ acknowledging
+ ackward
+ awkward
+ acommodate
+ accommodate
+ acomplish
+ accomplish
+ acomplished
+ accomplished
+ acomplishment
+ accomplishment
+ acomplishments
+ accomplishments
+ acording
+ according
+ acordingly
+ accordingly
+ acquaintence
+ acquaintance
+ acquaintences
+ acquaintances
+ acquiantence
+ acquaintance
+ acquiantences
+ acquaintances
+ acquited
+ acquitted
+ activites
+ activities
+ activly
+ actively
+ actualy
+ actually
+ acuracy
+ accuracy
+ acused
+ accused
+ acustom
+ accustom
+ acustommed
+ accustomed
+ adavanced
+ advanced
+ adbandon
+ abandon
+ additinally
+ additionally
+ additionaly
+ additionally
+ additonal
+ additional
+ additonally
+ additionally
+ addmission
+ admission
+ addopt
+ adopt
+ addopted
+ adopted
+ addoptive
+ adoptive
+ addres
+ address
+ addresable
+ addressable
+ addresed
+ addressed
+ addresing
+ addressing
+ addressess
+ addresses
+ addtion
+ addition
+ addtional
+ additional
+ adecuate
+ adequate
+ adequit
+ adequate
+ adhearing
+ adhering
+ adherance
+ adherence
+ admendment
+ amendment
+ admininistrative
+ administrative
+ adminstered
+ administered
+ adminstrate
+ administrate
+ adminstration
+ administration
+ adminstrative
+ administrative
+ adminstrator
+ administrator
+ admissability
+ admissibility
+ admissable
+ admissible
+ admited
+ admitted
+ admitedly
+ admittedly
+ adn
+ and
+ adolecent
+ adolescent
+ adquire
+ acquire
+ adquired
+ acquired
+ adquires
+ acquires
+ adquiring
+ acquiring
+ adres
+ address
+ adresable
+ addressable
+ adresing
+ addressing
+ adress
+ address
+ adressable
+ addressable
+ adressed
+ addressed
+ adressing
+ addressing
+ adventrous
+ adventurous
+ advertisment
+ advertisement
+ advertisments
+ advertisements
+ advesary
+ adversary
+ adviced
+ advised
+ aeriel
+ aerial
+ aeriels
+ aerials
+ afair
+ affair
+ afficianados
+ aficionados
+ afficionado
+ aficionado
+ afficionados
+ aficionados
+ affilate
+ affiliate
+ affilliate
+ affiliate
+ affort
+ afford
+ aforememtioned
+ aforementioned
+ againnst
+ against
+ agains
+ against
+ agaisnt
+ against
+ aganist
+ against
+ aggaravates
+ aggravates
+ aggreed
+ agreed
+ aggreement
+ agreement
+ aggregious
+ egregious
+ aggresive
+ aggressive
+ agian
+ again
+ agianst
+ against
+ agin
+ again
+ agina
+ again
+ aginst
+ against
+ agravate
+ aggravate
+ agre
+ agree
+ agred
+ agreed
+ agreeement
+ agreement
+ agreemnt
+ agreement
+ agregate
+ aggregate
+ agregates
+ aggregates
+ agreing
+ agreeing
+ agression
+ aggression
+ agressive
+ aggressive
+ agressively
+ aggressively
+ agressor
+ aggressor
+ agricuture
+ agriculture
+ agrieved
+ aggrieved
+ ahev
+ have
+ ahppen
+ happen
+ ahve
+ have
+ aicraft
+ aircraft
+ aiport
+ airport
+ airbourne
+ airborne
+ aircaft
+ aircraft
+ aircrafts
+ aircraft
+ airporta
+ airports
+ airrcraft
+ aircraft
+ aisian
+ asian
+ albiet
+ albeit
+ alchohol
+ alcohol
+ alchoholic
+ alcoholic
+ alchol
+ alcohol
+ alcholic
+ alcoholic
+ alcohal
+ alcohol
+ alcoholical
+ alcoholic
+ aledge
+ allege
+ aledged
+ alleged
+ aledges
+ alleges
+ alege
+ allege
+ aleged
+ alleged
+ alegience
+ allegiance
+ algebraical
+ algebraic
+ algorhitms
+ algorithms
+ algoritm
+ algorithm
+ algoritms
+ algorithms
+ alientating
+ alienating
+ alledge
+ allege
+ alledged
+ alleged
+ alledgedly
+ allegedly
+ alledges
+ alleges
+ allegedely
+ allegedly
+ allegedy
+ allegedly
+ allegely
+ allegedly
+ allegence
+ allegiance
+ allegience
+ allegiance
+ allign
+ align
+ alligned
+ aligned
+ alliviate
+ alleviate
+ allopone
+ allophone
+ allopones
+ allophones
+ allready
+ already
+ allthough
+ although
+ alltime
+ all-time
+ alltogether
+ altogether
+ almsot
+ almost
+ alochol
+ alcohol
+ alomst
+ almost
+ alot
+ a lot
+ alotted
+ allotted
+ alowed
+ allowed
+ alowing
+ allowing
+ alreayd
+ already
+ alse
+ else
+ alsot
+ also
+ alternitives
+ alternatives
+ altho
+ although
+ althought
+ although
+ altough
+ although
+ alusion
+ allusion
+ alwasy
+ always
+ alwyas
+ always
+ amalgomated
+ amalgamated
+ amatuer
+ amateur
+ amature
+ armature
+ amendmant
+ amendment
+ amerliorate
+ ameliorate
+ amke
+ make
+ amking
+ making
+ ammend
+ amend
+ ammended
+ amended
+ ammendment
+ amendment
+ ammendments
+ amendments
+ ammount
+ amount
+ ammused
+ amused
+ amoung
+ among
+ amoungst
+ amongst
+ amung
+ among
+ amunition
+ ammunition
+ analagous
+ analogous
+ analitic
+ analytic
+ analogeous
+ analogous
+ anarchim
+ anarchism
+ anarchistm
+ anarchism
+ anbd
+ and
+ ancestory
+ ancestry
+ ancilliary
+ ancillary
+ androgenous
+ androgynous
+ androgeny
+ androgyny
+ anihilation
+ annihilation
+ aniversary
+ anniversary
+ annoint
+ anoint
+ annointed
+ anointed
+ annointing
+ anointing
+ annoints
+ anoints
+ annouced
+ announced
+ annualy
+ annually
+ annuled
+ annulled
+ anohter
+ another
+ anomolies
+ anomalies
+ anomolous
+ anomalous
+ anomoly
+ anomaly
+ anonimity
+ anonymity
+ anounced
+ announced
+ anouncement
+ announcement
+ ansalisation
+ nasalisation
+ ansalization
+ nasalization
+ ansestors
+ ancestors
+ antartic
+ antarctic
+ anthromorphization
+ anthropomorphization
+ anthropolgist
+ anthropologist
+ anthropolgy
+ anthropology
+ anual
+ annual
+ anulled
+ annulled
+ anwsered
+ answered
+ anyhwere
+ anywhere
+ anyother
+ any other
+ anytying
+ anything
+ aparent
+ apparent
+ aparment
+ apartment
+ apenines
+ apennines
+ aplication
+ application
+ aplied
+ applied
+ apolegetics
+ apologetics
+ apon
+ apron
+ apparant
+ apparent
+ apparantly
+ apparently
+ appart
+ apart
+ appartment
+ apartment
+ appartments
+ apartments
+ appealling
+ appealing
+ appeareance
+ appearance
+ appearence
+ appearance
+ appearences
+ appearances
+ apperance
+ appearance
+ apperances
+ appearances
+ appereance
+ appearance
+ appereances
+ appearances
+ applicaiton
+ application
+ applicaitons
+ applications
+ appologies
+ apologies
+ appology
+ apology
+ apprearance
+ appearance
+ apprieciate
+ appreciate
+ approachs
+ approaches
+ appropiate
+ appropriate
+ appropraite
+ appropriate
+ appropropiate
+ appropriate
+ approproximate
+ approximate
+ approxamately
+ approximately
+ approxiately
+ approximately
+ approximitely
+ approximately
+ aprehensive
+ apprehensive
+ apropriate
+ appropriate
+ aproximate
+ approximate
+ aproximately
+ approximately
+ aquaduct
+ aqueduct
+ aquaintance
+ acquaintance
+ aquainted
+ acquainted
+ aquiantance
+ acquaintance
+ aquire
+ acquire
+ aquired
+ acquired
+ aquiring
+ acquiring
+ aquisition
+ acquisition
+ aquitted
+ acquitted
+ aranged
+ arranged
+ arangement
+ arrangement
+ arbitarily
+ arbitrarily
+ arbitary
+ arbitrary
+ archaelogists
+ archaeologists
+ archaelogy
+ archaeology
+ archaoelogy
+ archaeology
+ archaology
+ archaeology
+ archeaologist
+ archaeologist
+ archeaologists
+ archaeologists
+ archetect
+ architect
+ archetects
+ architects
+ archetectural
+ architectural
+ archetecturally
+ architecturally
+ archetecture
+ architecture
+ archiac
+ archaic
+ archictect
+ architect
+ archimedian
+ archimedean
+ architecht
+ architect
+ architechturally
+ architecturally
+ architechture
+ architecture
+ architechtures
+ architectures
+ architectual
+ architectural
+ archtype
+ archetype
+ archtypes
+ archetypes
+ aready
+ already
+ areodynamics
+ aerodynamics
+ argubly
+ arguably
+ arguement
+ argument
+ arguements
+ arguments
+ arised
+ arose
+ arival
+ arrival
+ armamant
+ armament
+ armistace
+ armistice
+ arogant
+ arrogant
+ arogent
+ arrogant
+ aroud
+ around
+ arrangment
+ arrangement
+ arrangments
+ arrangements
+ arround
+ around
+ artical
+ article
+ artice
+ article
+ articel
+ article
+ artifical
+ artificial
+ artifically
+ artificially
+ artillary
+ artillery
+ arund
+ around
+ asetic
+ ascetic
+ asfar
+ as far
+ asign
+ assign
+ aslo
+ also
+ asociated
+ associated
+ asorbed
+ absorbed
+ asphyxation
+ asphyxiation
+ assasin
+ assassin
+ assasinate
+ assassinate
+ assasinated
+ assassinated
+ assasinates
+ assassinates
+ assasination
+ assassination
+ assasinations
+ assassinations
+ assasined
+ assassinated
+ assasins
+ assassins
+ assassintation
+ assassination
+ assemple
+ assemble
+ assertation
+ assertion
+ asside
+ aside
+ assisnate
+ assassinate
+ assit
+ assist
+ assitant
+ assistant
+ assocation
+ association
+ assoicate
+ associate
+ assoicated
+ associated
+ assoicates
+ associates
+ assosication
+ assassination
+ asssassans
+ assassins
+ assualt
+ assault
+ assualted
+ assaulted
+ assymetric
+ asymmetric
+ assymetrical
+ asymmetrical
+ asteriod
+ asteroid
+ asthetic
+ aesthetic
+ asthetical
+ aesthetical
+ asthetically
+ aesthetically
+ asume
+ assume
+ aswell
+ as well
+ atain
+ attain
+ atempting
+ attempting
+ atheistical
+ atheistic
+ athenean
+ athenian
+ atheneans
+ athenians
+ athiesm
+ atheism
+ athiest
+ atheist
+ atorney
+ attorney
+ atribute
+ attribute
+ atributed
+ attributed
+ atributes
+ attributes
+ attaindre
+ attainder
+ attemp
+ attempt
+ attemped
+ attempted
+ attemt
+ attempt
+ attemted
+ attempted
+ attemting
+ attempting
+ attemts
+ attempts
+ attendence
+ attendance
+ attendent
+ attendant
+ attendents
+ attendants
+ attened
+ attended
+ attension
+ attention
+ attitide
+ attitude
+ attributred
+ attributed
+ attrocities
+ atrocities
+ audeince
+ audience
+ auromated
+ automated
+ austrailia
+ Australia
+ austrailian
+ Australian
+ auther
+ author
+ authobiographic
+ autobiographic
+ authobiography
+ autobiography
+ authorative
+ authoritative
+ authorites
+ authorities
+ authorithy
+ authority
+ authoritiers
+ authorities
+ authoritive
+ authoritative
+ authrorities
+ authorities
+ autochtonous
+ autochthonous
+ autoctonous
+ autochthonous
+ automaticly
+ automatically
+ automibile
+ automobile
+ automonomous
+ autonomous
+ autor
+ author
+ autority
+ authority
+ auxilary
+ auxiliary
+ auxillaries
+ auxiliaries
+ auxillary
+ auxiliary
+ auxilliaries
+ auxiliaries
+ auxilliary
+ auxiliary
+ availabe
+ available
+ availablity
+ availability
+ availaible
+ available
+ availble
+ available
+ availiable
+ available
+ availible
+ available
+ avalable
+ available
+ avalance
+ avalanche
+ avaliable
+ available
+ avation
+ aviation
+ avengence
+ a vengeance
+ averageed
+ averaged
+ avilable
+ available
+ awared
+ awarded
+ awya
+ away
+ baceause
+ because
+ backgorund
+ background
+ backrounds
+ backgrounds
+ bakc
+ back
+ banannas
+ bananas
+ bandwith
+ bandwidth
+ bankrupcy
+ bankruptcy
+ banruptcy
+ bankruptcy
+ baout
+ about
+ basicaly
+ basically
+ basicly
+ basically
+ bcak
+ back
+ beachead
+ beachhead
+ beacuse
+ because
+ beastiality
+ bestiality
+ beatiful
+ beautiful
+ beaurocracy
+ bureaucracy
+ beaurocratic
+ bureaucratic
+ beautyfull
+ beautiful
+ becamae
+ became
+ becames
+ becomes
+ becasue
+ because
+ beccause
+ because
+ becomeing
+ becoming
+ becomming
+ becoming
+ becouse
+ because
+ becuase
+ because
+ bedore
+ before
+ befoer
+ before
+ beggin
+ begin
+ begginer
+ beginner
+ begginers
+ beginners
+ beggining
+ beginning
+ begginings
+ beginnings
+ beggins
+ begins
+ begining
+ beginning
+ beginnig
+ beginning
+ behavour
+ behavior
+ beleagured
+ beleaguered
+ beleif
+ belief
+ beleive
+ believe
+ beleived
+ believed
+ beleives
+ believes
+ beleiving
+ believing
+ beligum
+ belgium
+ belive
+ believe
+ belived
+ believed
+ belives
+ believes
+ belligerant
+ belligerent
+ bellweather
+ bellwether
+ bemusemnt
+ bemusement
+ beneficary
+ beneficiary
+ beng
+ being
+ benificial
+ beneficial
+ benifit
+ benefit
+ benifits
+ benefits
+ bergamont
+ bergamot
+ beseige
+ besiege
+ beseiged
+ besieged
+ beseiging
+ besieging
+ betwen
+ between
+ beween
+ between
+ bewteen
+ between
+ bilateraly
+ bilaterally
+ billingualism
+ bilingualism
+ binominal
+ binomial
+ bizzare
+ bizarre
+ blaim
+ blame
+ blaimed
+ blamed
+ blessure
+ blessing
+ bodydbuilder
+ bodybuilder
+ bombardement
+ bombardment
+ bombarment
+ bombardment
+ bondary
+ boundary
+ borke
+ broke
+ boundry
+ boundary
+ bouyancy
+ buoyancy
+ bouyant
+ buoyant
+ boyant
+ buoyant
+ breakthough
+ breakthrough
+ breakthroughts
+ breakthroughs
+ breif
+ brief
+ breifly
+ briefly
+ brethen
+ brethren
+ bretheren
+ brethren
+ briliant
+ brilliant
+ brillant
+ brilliant
+ brimestone
+ brimstone
+ broacasted
+ broadcast
+ broadacasting
+ broadcasting
+ broady
+ broadly
+ buisness
+ business
+ buisnessman
+ businessman
+ buoancy
+ buoyancy
+ burried
+ buried
+ busineses
+ businesses
+ busness
+ business
+ bussiness
+ business
+ caculater
+ calculator
+ cacuses
+ caucuses
+ cahracters
+ characters
+ calaber
+ caliber
+ calculater
+ calculator
+ calculs
+ calculus
+ calenders
+ calendars
+ caligraphy
+ calligraphy
+ caluclate
+ calculate
+ caluclated
+ calculated
+ caluculate
+ calculate
+ caluculated
+ calculated
+ calulate
+ calculate
+ calulated
+ calculated
+ calulater
+ calculator
+ camoflage
+ camouflage
+ campain
+ campaign
+ campains
+ campaigns
+ candadate
+ candidate
+ candiate
+ candidate
+ candidiate
+ candidate
+ cannister
+ canister
+ cannisters
+ canisters
+ cannnot
+ cannot
+ cannonical
+ canonical
+ cannotation
+ connotation
+ cannotations
+ connotations
+ cant
+ can't
+ caost
+ coast
+ caperbility
+ capability
+ capible
+ capable
+ captial
+ capital
+ captued
+ captured
+ capturd
+ captured
+ carachter
+ character
+ caracterized
+ characterized
+ carcas
+ carcass
+ carefull
+ careful
+ careing
+ caring
+ carismatic
+ charismatic
+ carnege
+ carnage
+ carnige
+ carnage
+ carniverous
+ carnivorous
+ carreer
+ career
+ carrers
+ careers
+ cartdridge
+ cartridge
+ carthographer
+ cartographer
+ cartilege
+ cartilage
+ cartilidge
+ cartilage
+ cartrige
+ cartridge
+ casette
+ cassette
+ casion
+ caisson
+ cassawory
+ cassowary
+ cassowarry
+ cassowary
+ casulaties
+ casualties
+ casulaty
+ casualty
+ catagories
+ categories
+ catagorized
+ categorized
+ catagory
+ category
+ catapillar
+ caterpillar
+ catapillars
+ caterpillars
+ catapiller
+ caterpillar
+ catapillers
+ caterpillars
+ catepillar
+ caterpillar
+ catepillars
+ caterpillars
+ catergorize
+ categorize
+ catergorized
+ categorized
+ caterpilar
+ caterpillar
+ caterpilars
+ caterpillars
+ caterpiller
+ caterpillar
+ caterpillers
+ caterpillars
+ cathlic
+ catholic
+ catholocism
+ catholicism
+ catterpilar
+ caterpillar
+ catterpilars
+ caterpillars
+ catterpillar
+ caterpillar
+ catterpillars
+ caterpillars
+ cattleship
+ battleship
+ causalities
+ casualties
+ cellpading
+ cellpadding
+ cementary
+ cemetery
+ cemetarey
+ cemetery
+ cemetaries
+ cemeteries
+ cemetary
+ cemetery
+ cencus
+ census
+ censur
+ censor
+ cententenial
+ centennial
+ centruies
+ centuries
+ centruy
+ century
+ ceratin
+ certain
+ cerimonial
+ ceremonial
+ cerimonies
+ ceremonies
+ cerimonious
+ ceremonious
+ cerimony
+ ceremony
+ ceromony
+ ceremony
+ certainity
+ certainty
+ certian
+ certain
+ chalenging
+ challenging
+ challange
+ challenge
+ challanged
+ challenged
+ challege
+ challenge
+ changable
+ changeable
+ charachter
+ character
+ charachters
+ characters
+ charactersistic
+ characteristic
+ charactor
+ character
+ charactors
+ characters
+ charasmatic
+ charismatic
+ charaterized
+ characterized
+ chariman
+ chairman
+ charistics
+ characteristics
+ cheif
+ chief
+ cheifs
+ chiefs
+ chemcial
+ chemical
+ chemcially
+ chemically
+ chemestry
+ chemistry
+ chemicaly
+ chemically
+ childbird
+ childbirth
+ childen
+ children
+ choosen
+ chosen
+ chracter
+ character
+ chuch
+ church
+ churchs
+ churches
+ circulaton
+ circulation
+ circumsicion
+ circumcision
+ circut
+ circuit
+ ciricuit
+ circuit
+ ciriculum
+ curriculum
+ civillian
+ civilian
+ claer
+ clear
+ claerer
+ clearer
+ claerly
+ clearly
+ claimes
+ claims
+ clas
+ class
+ clasic
+ classic
+ clasical
+ classical
+ clasically
+ classically
+ cleareance
+ clearance
+ clera
+ clear
+ clincial
+ clinical
+ clinicaly
+ clinically
+ cmo
+ com
+ cmoputer
+ computer
+ co-incided
+ coincided
+ coctail
+ cocktail
+ coform
+ conform
+ cognizent
+ cognizant
+ coincedentally
+ coincidentally
+ colaborations
+ collaborations
+ colateral
+ collateral
+ colelctive
+ collective
+ collaberative
+ collaborative
+ collecton
+ collection
+ collegue
+ colleague
+ collegues
+ colleagues
+ collonade
+ colonnade
+ collonies
+ colonies
+ collony
+ colony
+ collosal
+ colossal
+ colonizators
+ colonizers
+ comander
+ commander
+ comando
+ commando
+ comandos
+ commandos
+ comany
+ company
+ comapany
+ company
+ comback
+ comeback
+ combanations
+ combinations
+ combinatins
+ combinations
+ combusion
+ combustion
+ comdemnation
+ condemnation
+ comemmorates
+ commemorates
+ comemoretion
+ commemoration
+ comision
+ commission
+ comisioned
+ commissioned
+ comisioner
+ commissioner
+ comisioning
+ commissioning
+ comisions
+ commissions
+ comission
+ commission
+ comissioned
+ commissioned
+ comissioner
+ commissioner
+ comissioning
+ commissioning
+ comissions
+ commissions
+ comited
+ committed
+ comiting
+ committing
+ comitted
+ committed
+ comittee
+ committee
+ comitting
+ committing
+ commandoes
+ commandos
+ commedic
+ comedic
+ commemerative
+ commemorative
+ commemmorate
+ commemorate
+ commemmorating
+ commemorating
+ commerical
+ commercial
+ commerically
+ commercially
+ commericial
+ commercial
+ commericially
+ commercially
+ commerorative
+ commemorative
+ comming
+ coming
+ comminication
+ communication
+ commision
+ commission
+ commisioned
+ commissioned
+ commisioner
+ commissioner
+ commisioning
+ commissioning
+ commisions
+ commissions
+ commited
+ committed
+ commitee
+ committee
+ commiting
+ committing
+ committe
+ committee
+ committment
+ commitment
+ committments
+ commitments
+ commmemorated
+ commemorated
+ commongly
+ commonly
+ commonweath
+ commonwealth
+ commuications
+ communications
+ commuinications
+ communications
+ communciation
+ communication
+ communiation
+ communication
+ communites
+ communities
+ compability
+ compatibility
+ comparision
+ comparison
+ comparisions
+ comparisons
+ comparitive
+ comparative
+ comparitively
+ comparatively
+ compatabilities
+ compatibilities
+ compatability
+ compatibility
+ compatable
+ compatible
+ compatablities
+ compatibilities
+ compatablity
+ compatibility
+ compatiable
+ compatible
+ compatiblities
+ compatibilities
+ compatiblity
+ compatibility
+ compeitions
+ competitions
+ compensantion
+ compensation
+ competance
+ competence
+ competant
+ competent
+ competative
+ competitive
+ competion
+ competition
+ competitiion
+ competition
+ competive
+ competitive
+ competiveness
+ competitiveness
+ comphrehensive
+ comprehensive
+ compitent
+ competent
+ completedthe
+ completed the
+ completelyl
+ completely
+ completetion
+ completion
+ complier
+ compiler
+ componant
+ component
+ comprable
+ comparable
+ comprimise
+ compromise
+ compulsary
+ compulsory
+ compulsery
+ compulsory
+ computarized
+ computerized
+ concensus
+ consensus
+ concider
+ consider
+ concidered
+ considered
+ concidering
+ considering
+ conciders
+ considers
+ concieted
+ conceited
+ concieved
+ conceived
+ concious
+ conscious
+ conciously
+ consciously
+ conciousness
+ consciousness
+ condamned
+ condemned
+ condemmed
+ condemned
+ condidtion
+ condition
+ condidtions
+ conditions
+ conditionsof
+ conditions of
+ conected
+ connected
+ conection
+ connection
+ conesencus
+ consensus
+ confidental
+ confidential
+ confidentally
+ confidentially
+ confids
+ confides
+ configureable
+ configurable
+ confortable
+ comfortable
+ congradulations
+ congratulations
+ congresional
+ congressional
+ conived
+ connived
+ conjecutre
+ conjecture
+ conjuction
+ conjunction
+ conotations
+ connotations
+ conquerd
+ conquered
+ conquerer
+ conqueror
+ conquerers
+ conquerors
+ conqured
+ conquered
+ conscent
+ consent
+ consciouness
+ consciousness
+ consdider
+ consider
+ consdidered
+ considered
+ consdiered
+ considered
+ consectutive
+ consecutive
+ consenquently
+ consequently
+ consentrate
+ concentrate
+ consentrated
+ concentrated
+ consentrates
+ concentrates
+ consept
+ concept
+ consequentually
+ consequently
+ consequeseces
+ consequences
+ consern
+ concern
+ conserned
+ concerned
+ conserning
+ concerning
+ conservitive
+ conservative
+ consiciousness
+ consciousness
+ consicousness
+ consciousness
+ considerd
+ considered
+ consideres
+ considered
+ consious
+ conscious
+ consistant
+ consistent
+ consistantly
+ consistently
+ consituencies
+ constituencies
+ consituency
+ constituency
+ consituted
+ constituted
+ consitution
+ constitution
+ consitutional
+ constitutional
+ consolodate
+ consolidate
+ consolodated
+ consolidated
+ consonent
+ consonant
+ consonents
+ consonants
+ consorcium
+ consortium
+ conspiracys
+ conspiracies
+ conspiriator
+ conspirator
+ constaints
+ constraints
+ constanly
+ constantly
+ constarnation
+ consternation
+ constatn
+ constant
+ constinually
+ continually
+ constituant
+ constituent
+ constituants
+ constituents
+ constituion
+ constitution
+ constituional
+ constitutional
+ consttruction
+ construction
+ constuction
+ construction
+ consulant
+ consultant
+ consumate
+ consummate
+ consumated
+ consummated
+ contaiminate
+ contaminate
+ containes
+ contains
+ contamporaries
+ contemporaries
+ contamporary
+ contemporary
+ contempoary
+ contemporary
+ contemporaneus
+ contemporaneous
+ contempory
+ contemporary
+ contendor
+ contender
+ contibute
+ contribute
+ contibuted
+ contributed
+ contibutes
+ contributes
+ contigent
+ contingent
+ contined
+ continued
+ continous
+ continuous
+ continously
+ continuously
+ continueing
+ continuing
+ contravercial
+ controversial
+ contraversy
+ controversy
+ contributer
+ contributor
+ contributers
+ contributors
+ contritutions
+ contributions
+ controled
+ controlled
+ controling
+ controlling
+ controll
+ control
+ controlls
+ controls
+ controvercial
+ controversial
+ controvercy
+ controversy
+ controveries
+ controversies
+ controversal
+ controversial
+ controversey
+ controversy
+ controvertial
+ controversial
+ controvery
+ controversy
+ contruction
+ construction
+ conveinent
+ convenient
+ convenant
+ covenant
+ convential
+ conventional
+ convertables
+ convertibles
+ convertion
+ conversion
+ conveyer
+ conveyor
+ conviced
+ convinced
+ convienient
+ convenient
+ coordiantion
+ coordination
+ coorperations
+ corporations
+ copmetitors
+ competitors
+ coputer
+ computer
+ copywrite
+ copyright
+ coridal
+ cordial
+ cornmitted
+ committed
+ corosion
+ corrosion
+ corparate
+ corporate
+ corperations
+ corporations
+ correcters
+ correctors
+ correponding
+ corresponding
+ correposding
+ corresponding
+ correspondant
+ correspondent
+ correspondants
+ correspondents
+ corridoors
+ corridors
+ corrispond
+ correspond
+ corrispondant
+ correspondent
+ corrispondants
+ correspondents
+ corrisponded
+ corresponded
+ corrisponding
+ corresponding
+ corrisponds
+ corresponds
+ costitution
+ constitution
+ coucil
+ council
+ counries
+ countries
+ countains
+ contains
+ countires
+ countries
+ coururier
+ courier
+ coverted
+ converted
+ cpoy
+ copy
+ creaeted
+ created
+ creedence
+ credence
+ critereon
+ criterion
+ criterias
+ criteria
+ criticists
+ critics
+ critising
+ criticising
+ critisising
+ criticising
+ critisism
+ criticism
+ critisisms
+ criticisms
+ critisize
+ criticise
+ critisized
+ criticised
+ critisizes
+ criticises
+ critisizing
+ criticising
+ critized
+ criticized
+ critizing
+ criticizing
+ crockodiles
+ crocodiles
+ crowm
+ crown
+ crtical
+ critical
+ crticised
+ criticised
+ crucifiction
+ crucifixion
+ crusies
+ cruises
+ crystalisation
+ crystallisation
+ culiminating
+ culminating
+ cumulatative
+ cumulative
+ curch
+ church
+ curcuit
+ circuit
+ currenly
+ currently
+ curriculem
+ curriculum
+ cxan
+ cyan
+ cyclinder
+ cylinder
+ dacquiri
+ daiquiri
+ dael
+ deal
+ dalmation
+ dalmatian
+ damenor
+ demeanor
+ dammage
+ damage
+ daugher
+ daughter
+ debateable
+ debatable
+ decendant
+ descendant
+ decendants
+ descendants
+ decendent
+ descendant
+ decendents
+ descendants
+ decideable
+ decidable
+ decidely
+ decidedly
+ decieved
+ deceived
+ decison
+ decision
+ decomissioned
+ decommissioned
+ decomposit
+ decompose
+ decomposited
+ decomposed
+ decompositing
+ decomposing
+ decomposits
+ decomposes
+ decress
+ decrees
+ decribe
+ describe
+ decribed
+ described
+ decribes
+ describes
+ decribing
+ describing
+ dectect
+ detect
+ defendent
+ defendant
+ defendents
+ defendants
+ deffensively
+ defensively
+ deffine
+ define
+ deffined
+ defined
+ definance
+ defiance
+ definate
+ definite
+ definately
+ definitely
+ definatly
+ definitely
+ definetly
+ definitely
+ definining
+ defining
+ definit
+ definite
+ definitly
+ definitely
+ definiton
+ definition
+ defintion
+ definition
+ degrate
+ degrade
+ delagates
+ delegates
+ delapidated
+ dilapidated
+ delerious
+ delirious
+ delevopment
+ development
+ deliberatly
+ deliberately
+ delusionally
+ delusively
+ demenor
+ demeanor
+ demographical
+ demographic
+ demolision
+ demolition
+ demorcracy
+ democracy
+ demostration
+ demonstration
+ denegrating
+ denigrating
+ densly
+ densely
+ deparment
+ department
+ deparmental
+ departmental
+ deparments
+ departments
+ dependance
+ dependence
+ dependancy
+ dependency
+ dependant
+ dependent
+ deram
+ dream
+ deriviated
+ derived
+ derivitive
+ derivative
+ derogitory
+ derogatory
+ descendands
+ descendants
+ descibed
+ described
+ descision
+ decision
+ descisions
+ decisions
+ descriibes
+ describes
+ descripters
+ descriptors
+ descripton
+ description
+ desctruction
+ destruction
+ descuss
+ discuss
+ desgined
+ designed
+ deside
+ decide
+ desigining
+ designing
+ desinations
+ destinations
+ desintegrated
+ disintegrated
+ desintegration
+ disintegration
+ desireable
+ desirable
+ desitned
+ destined
+ desktiop
+ desktop
+ desorder
+ disorder
+ desoriented
+ disoriented
+ desparate
+ desperate
+ despict
+ depict
+ despiration
+ desperation
+ dessicated
+ desiccated
+ dessigned
+ designed
+ destablized
+ destabilized
+ destory
+ destroy
+ detailled
+ detailed
+ detatched
+ detached
+ deteoriated
+ deteriorated
+ deteriate
+ deteriorate
+ deterioriating
+ deteriorating
+ determinining
+ determining
+ detremental
+ detrimental
+ devasted
+ devastated
+ develope
+ develop
+ developement
+ development
+ developped
+ developed
+ develpment
+ development
+ devels
+ delves
+ devestated
+ devastated
+ devestating
+ devastating
+ devide
+ divide
+ devided
+ divided
+ devistating
+ devastating
+ devolopement
+ development
+ diablical
+ diabolical
+ diamons
+ diamonds
+ diaster
+ disaster
+ dichtomy
+ dichotomy
+ diconnects
+ disconnects
+ dicover
+ discover
+ dicovered
+ discovered
+ dicovering
+ discovering
+ dicovers
+ discovers
+ dicovery
+ discovery
+ dicussed
+ discussed
+ didnt
+ didn't
+ diea
+ idea
+ dieing
+ dying
+ dieties
+ deities
+ diety
+ deity
+ diferent
+ different
+ diferrent
+ different
+ differentiatiations
+ differentiations
+ differnt
+ different
+ difficulity
+ difficulty
+ diffrent
+ different
+ dificulties
+ difficulties
+ dificulty
+ difficulty
+ dimenions
+ dimensions
+ dimention
+ dimension
+ dimentional
+ dimensional
+ dimentions
+ dimensions
+ dimesnional
+ dimensional
+ diminuitive
+ diminutive
+ dimunitive
+ diminutive
+ diosese
+ diocese
+ diphtong
+ diphthong
+ diphtongs
+ diphthongs
+ diplomancy
+ diplomacy
+ dipthong
+ diphthong
+ dipthongs
+ diphthongs
+ dirived
+ derived
+ disagreeed
+ disagreed
+ disapeared
+ disappeared
+ disapointing
+ disappointing
+ disappearred
+ disappeared
+ disaproval
+ disapproval
+ disasterous
+ disastrous
+ disatisfaction
+ dissatisfaction
+ disatisfied
+ dissatisfied
+ disatrous
+ disastrous
+ discontentment
+ discontent
+ discribe
+ describe
+ discribed
+ described
+ discribes
+ describes
+ discribing
+ describing
+ disctinction
+ distinction
+ disctinctive
+ distinctive
+ disemination
+ dissemination
+ disenchanged
+ disenchanted
+ disiplined
+ disciplined
+ disobediance
+ disobedience
+ disobediant
+ disobedient
+ disolved
+ dissolved
+ disover
+ discover
+ dispair
+ despair
+ disparingly
+ disparagingly
+ dispence
+ dispense
+ dispenced
+ dispensed
+ dispencing
+ dispensing
+ dispicable
+ despicable
+ dispite
+ despite
+ dispostion
+ disposition
+ disproportiate
+ disproportionate
+ disputandem
+ disputandum
+ disricts
+ districts
+ dissagreement
+ disagreement
+ dissapear
+ disappear
+ dissapearance
+ disappearance
+ dissapeared
+ disappeared
+ dissapearing
+ disappearing
+ dissapears
+ disappears
+ dissappear
+ disappear
+ dissappears
+ disappears
+ dissappointed
+ disappointed
+ dissarray
+ disarray
+ dissobediance
+ disobedience
+ dissobediant
+ disobedient
+ dissobedience
+ disobedience
+ dissobedient
+ disobedient
+ distiction
+ distinction
+ distingish
+ distinguish
+ distingished
+ distinguished
+ distingishes
+ distinguishes
+ distingishing
+ distinguishing
+ distingquished
+ distinguished
+ distrubution
+ distribution
+ distruction
+ destruction
+ distructive
+ destructive
+ ditributed
+ distributed
+ diversed
+ diverged
+ divice
+ device
+ divison
+ division
+ divisons
+ divisions
+ doccument
+ document
+ doccumented
+ documented
+ doccuments
+ documents
+ docrines
+ doctrines
+ doctines
+ doctrines
+ documenatry
+ documentary
+ doens
+ does
+ doesnt
+ doesn't
+ doign
+ doing
+ dominaton
+ domination
+ dominent
+ dominant
+ dominiant
+ dominant
+ donig
+ doing
+ dont
+ don't
+ dosen't
+ doesn't
+ doub
+ doubt
+ doulbe
+ double
+ dowloads
+ downloads
+ dramtic
+ dramatic
+ draughtman
+ draughtsman
+ dreasm
+ dreams
+ driectly
+ directly
+ drnik
+ drink
+ druming
+ drumming
+ drummless
+ drumless
+ dupicate
+ duplicate
+ durig
+ during
+ durring
+ during
+ duting
+ during
+ dyas
+ dryas
+ eahc
+ each
+ ealier
+ earlier
+ earlies
+ earliest
+ earnt
+ earned
+ ecclectic
+ eclectic
+ eceonomy
+ economy
+ ecidious
+ deciduous
+ eclispe
+ eclipse
+ ecomonic
+ economic
+ ect
+ etc
+ eearly
+ early
+ efel
+ evil
+ effeciency
+ efficiency
+ effecient
+ efficient
+ effeciently
+ efficiently
+ efficency
+ efficiency
+ efficent
+ efficient
+ efficently
+ efficiently
+ efford
+ effort
+ effords
+ efforts
+ effulence
+ effluence
+ eigth
+ eight
+ eiter
+ either
+ elction
+ election
+ electic
+ electric
+ electon
+ electron
+ electrial
+ electrical
+ electricly
+ electrically
+ electricty
+ electricity
+ elementay
+ elementary
+ eleminated
+ eliminated
+ eleminating
+ eliminating
+ eles
+ eels
+ eletricity
+ electricity
+ elicided
+ elicited
+ eligable
+ eligible
+ elimentary
+ elementary
+ ellected
+ elected
+ elphant
+ elephant
+ embarass
+ embarrass
+ embarassed
+ embarrassed
+ embarassing
+ embarrassing
+ embarassment
+ embarrassment
+ embargos
+ embargoes
+ embarras
+ embarrass
+ embarrased
+ embarrassed
+ embarrasing
+ embarrassing
+ embarrasment
+ embarrassment
+ embezelled
+ embezzled
+ emblamatic
+ emblematic
+ eminate
+ emanate
+ eminated
+ emanated
+ emision
+ emission
+ emited
+ emitted
+ emiting
+ emitting
+ emition
+ emission
+ emmediately
+ immediately
+ emmigrated
+ immigrated
+ emminently
+ eminently
+ emmisaries
+ emissaries
+ emmisarries
+ emissaries
+ emmisarry
+ emissary
+ emmisary
+ emissary
+ emmision
+ emission
+ emmisions
+ emissions
+ emmited
+ emitted
+ emmiting
+ emitting
+ emmitted
+ emitted
+ emmitting
+ emitting
+ emnity
+ enmity
+ emperical
+ empirical
+ emphaised
+ emphasised
+ emphsis
+ emphasis
+ emphysyma
+ emphysema
+ emprisoned
+ imprisoned
+ enameld
+ enameled
+ enchancement
+ enhancement
+ encouraing
+ encouraging
+ encryptiion
+ encryption
+ encylopedia
+ encyclopedia
+ endevors
+ endeavors
+ endevour
+ endeavour
+ endig
+ ending
+ endolithes
+ endoliths
+ enduce
+ induce
+ ened
+ need
+ enflamed
+ inflamed
+ enforceing
+ enforcing
+ engagment
+ engagement
+ engeneer
+ engineer
+ engeneering
+ engineering
+ engieneer
+ engineer
+ engieneers
+ engineers
+ enlargment
+ enlargement
+ enlargments
+ enlargements
+ enourmous
+ enormous
+ enourmously
+ enormously
+ ensconsed
+ ensconced
+ entaglements
+ entanglements
+ enteratinment
+ entertainment
+ enthusiatic
+ enthusiastic
+ entitity
+ entity
+ entitlied
+ entitled
+ entrepeneur
+ entrepreneur
+ entrepeneurs
+ entrepreneurs
+ enviorment
+ environment
+ enviormental
+ environmental
+ enviormentally
+ environmentally
+ enviorments
+ environments
+ enviornment
+ environment
+ enviornmental
+ environmental
+ enviornmentalist
+ environmentalist
+ enviornmentally
+ environmentally
+ enviornments
+ environments
+ enviroment
+ environment
+ enviromental
+ environmental
+ enviromentalist
+ environmentalist
+ enviromentally
+ environmentally
+ enviroments
+ environments
+ envolutionary
+ evolutionary
+ envrionments
+ environments
+ enxt
+ next
+ epidsodes
+ episodes
+ epsiode
+ episode
+ equialent
+ equivalent
+ equilibium
+ equilibrium
+ equilibrum
+ equilibrium
+ equiped
+ equipped
+ equippment
+ equipment
+ equitorial
+ equatorial
+ equivelant
+ equivalent
+ equivelent
+ equivalent
+ equivilant
+ equivalent
+ equivilent
+ equivalent
+ equivlalent
+ equivalent
+ erally
+ really
+ eratic
+ erratic
+ eratically
+ erratically
+ eraticly
+ erratically
+ errupted
+ erupted
+ esential
+ essential
+ esitmated
+ estimated
+ esle
+ else
+ especialy
+ especially
+ essencial
+ essential
+ essense
+ essence
+ essentail
+ essential
+ essentialy
+ essentially
+ essentual
+ essential
+ essesital
+ essential
+ estabishes
+ establishes
+ establising
+ establishing
+ ethnocentricm
+ ethnocentrism
+ ethose
+ those
+ evenhtually
+ eventually
+ eventally
+ eventually
+ eventhough
+ even though
+ eventially
+ eventually
+ eventualy
+ eventually
+ everthing
+ everything
+ everytime
+ every time
+ everyting
+ everything
+ eveyr
+ every
+ evidentally
+ evidently
+ exagerate
+ exaggerate
+ exagerated
+ exaggerated
+ exagerates
+ exaggerates
+ exagerating
+ exaggerating
+ exagerrate
+ exaggerate
+ exagerrated
+ exaggerated
+ exagerrates
+ exaggerates
+ exagerrating
+ exaggerating
+ examinated
+ examined
+ exampt
+ exempt
+ exapansion
+ expansion
+ excact
+ exact
+ excange
+ exchange
+ excecute
+ execute
+ excecuted
+ executed
+ excecutes
+ executes
+ excecuting
+ executing
+ excecution
+ execution
+ excedded
+ exceeded
+ excelent
+ excellent
+ excell
+ excel
+ excellance
+ excellence
+ excellant
+ excellent
+ excells
+ excels
+ excercise
+ exercise
+ exchanching
+ exchanging
+ excisted
+ existed
+ exculsivly
+ exclusively
+ execising
+ exercising
+ exection
+ execution
+ exectued
+ executed
+ exeedingly
+ exceedingly
+ exelent
+ excellent
+ exellent
+ excellent
+ exemple
+ example
+ exept
+ except
+ exeptional
+ exceptional
+ exerbate
+ exacerbate
+ exerbated
+ exacerbated
+ exerciese
+ exercises
+ exerpt
+ excerpt
+ exerpts
+ excerpts
+ exersize
+ exercise
+ exerternal
+ external
+ exhalted
+ exalted
+ exhibtion
+ exhibition
+ exibition
+ exhibition
+ exibitions
+ exhibitions
+ exicting
+ exciting
+ exinct
+ extinct
+ existance
+ existence
+ existant
+ existent
+ existince
+ existence
+ exliled
+ exiled
+ exludes
+ excludes
+ exmaple
+ example
+ exonorate
+ exonerate
+ exoskelaton
+ exoskeleton
+ expalin
+ explain
+ expatriot
+ expatriate
+ expeced
+ expected
+ expecially
+ especially
+ expeditonary
+ expeditionary
+ expeiments
+ experiments
+ expell
+ expel
+ expells
+ expels
+ experiance
+ experience
+ experianced
+ experienced
+ expiditions
+ expeditions
+ expierence
+ experience
+ explaination
+ explanation
+ explaning
+ explaining
+ explictly
+ explicitly
+ exploititive
+ exploitative
+ explotation
+ exploitation
+ expropiated
+ expropriated
+ expropiation
+ expropriation
+ exressed
+ expressed
+ extemely
+ extremely
+ extention
+ extension
+ extentions
+ extensions
+ extered
+ exerted
+ extermist
+ extremist
+ extint
+ extinct
+ extradiction
+ extradition
+ extraterrestial
+ extraterrestrial
+ extraterrestials
+ extraterrestrials
+ extravagent
+ extravagant
+ extrememly
+ extremely
+ extremeophile
+ extremophile
+ extremly
+ extremely
+ extrordinarily
+ extraordinarily
+ extrordinary
+ extraordinary
+ eyar
+ year
+ eyars
+ years
+ eyasr
+ years
+ faciliate
+ facilitate
+ faciliated
+ facilitated
+ faciliates
+ facilitates
+ facilites
+ facilities
+ facillitate
+ facilitate
+ facinated
+ fascinated
+ facist
+ fascist
+ familes
+ families
+ familliar
+ familiar
+ famoust
+ famous
+ fanatism
+ fanaticism
+ fatc
+ fact
+ faught
+ fought
+ favoutrable
+ favourable
+ feasable
+ feasible
+ fedreally
+ federally
+ feromone
+ pheromone
+ fertily
+ fertility
+ fianite
+ finite
+ fianlly
+ finally
+ ficticious
+ fictitious
+ fictious
+ fictitious
+ fidn
+ find
+ fiercly
+ fiercely
+ fightings
+ fighting
+ filiament
+ filament
+ fimilies
+ families
+ finacial
+ financial
+ finaly
+ finally
+ financialy
+ financially
+ firends
+ friends
+ firts
+ first
+ fisionable
+ fissionable
+ flamable
+ flammable
+ flawess
+ flawless
+ fleed
+ fled
+ florescent
+ fluorescent
+ flourescent
+ fluorescent
+ flourine
+ fluorine
+ fluorish
+ flourish
+ follwoing
+ following
+ folowing
+ following
+ fomed
+ formed
+ fomr
+ from
+ fonetic
+ phonetic
+ fontrier
+ fontier
+ foootball
+ football
+ forbad
+ forbade
+ forbiden
+ forbidden
+ foreward
+ foreword
+ forfiet
+ forfeit
+ forhead
+ forehead
+ foriegn
+ foreign
+ formallize
+ formalize
+ formallized
+ formalized
+ formaly
+ formally
+ formelly
+ formerly
+ formidible
+ formidable
+ formost
+ foremost
+ forsaw
+ foresaw
+ forseeable
+ foreseeable
+ fortelling
+ foretelling
+ forunner
+ forerunner
+ foucs
+ focus
+ foudn
+ found
+ fougth
+ fought
+ foundaries
+ foundries
+ foundary
+ foundry
+ fourties
+ forties
+ fourty
+ forty
+ fouth
+ fourth
+ foward
+ forward
+ freind
+ friend
+ freindly
+ friendly
+ frequentily
+ frequently
+ frome
+ from
+ fromed
+ formed
+ froniter
+ frontier
+ fucntion
+ function
+ fucntioning
+ functioning
+ fufill
+ fulfill
+ fufilled
+ fulfilled
+ fulfiled
+ fulfilled
+ fullfill
+ fulfill
+ fullfilled
+ fulfilled
+ fundametal
+ fundamental
+ fundametals
+ fundamentals
+ funguses
+ fungi
+ funtion
+ function
+ furuther
+ further
+ futher
+ further
+ futhermore
+ furthermore
+ galatic
+ galactic
+ gallaxies
+ galaxies
+ galvinized
+ galvanized
+ ganerate
+ generate
+ ganes
+ games
+ ganster
+ gangster
+ garantee
+ guarantee
+ garanteed
+ guaranteed
+ garantees
+ guarantees
+ garnison
+ garrison
+ gaurantee
+ guarantee
+ gauranteed
+ guaranteed
+ gaurantees
+ guarantees
+ gaurd
+ guard
+ gaurentee
+ guarantee
+ gaurenteed
+ guaranteed
+ gaurentees
+ guarantees
+ geneological
+ genealogical
+ geneologies
+ genealogies
+ geneology
+ genealogy
+ generaly
+ generally
+ generatting
+ generating
+ genialia
+ genitalia
+ geographicial
+ geographical
+ geometrician
+ geometer
+ geometricians
+ geometers
+ gerat
+ great
+ glight
+ flight
+ gnawwed
+ gnawed
+ godess
+ goddess
+ godesses
+ goddesses
+ gogin
+ going
+ goign
+ going
+ gonig
+ going
+ gouvener
+ governor
+ govement
+ government
+ govenment
+ government
+ govenrment
+ government
+ goverance
+ governance
+ goverment
+ government
+ govermental
+ governmental
+ governer
+ governor
+ governmnet
+ government
+ govorment
+ government
+ govormental
+ governmental
+ govornment
+ government
+ gracefull
+ graceful
+ graet
+ great
+ grafitti
+ graffiti
+ gramatically
+ grammatically
+ grammaticaly
+ grammatically
+ grammer
+ grammar
+ grat
+ great
+ gratuitious
+ gratuitous
+ greatful
+ grateful
+ greatfully
+ gratefully
+ greif
+ grief
+ gridles
+ griddles
+ gropu
+ group
+ grwo
+ grow
+ guage
+ gauge
+ guarentee
+ guarantee
+ guarenteed
+ guaranteed
+ guarentees
+ guarantees
+ guerilla
+ guerrilla
+ guerillas
+ guerrillas
+ guerrila
+ guerrilla
+ guerrilas
+ guerrillas
+ guidence
+ guidance
+ gunanine
+ guanine
+ gurantee
+ guarantee
+ guranteed
+ guaranteed
+ gurantees
+ guarantees
+ guttaral
+ guttural
+ gutteral
+ guttural
+ habaeus
+ habeas
+ habeus
+ habeas
+ haemorrage
+ haemorrhage
+ haev
+ have
+ halp
+ help
+ hapen
+ happen
+ hapened
+ happened
+ hapening
+ happening
+ happend
+ happened
+ happended
+ happened
+ happenned
+ happened
+ harased
+ harassed
+ harases
+ harasses
+ harasment
+ harassment
+ harasments
+ harassments
+ harassement
+ harassment
+ harras
+ harass
+ harrased
+ harassed
+ harrases
+ harasses
+ harrasing
+ harassing
+ harrasment
+ harassment
+ harrasments
+ harassments
+ harrassed
+ harassed
+ harrasses
+ harassed
+ harrassing
+ harassing
+ harrassment
+ harassment
+ harrassments
+ harassments
+ hasnt
+ hasn't
+ haviest
+ heaviest
+ headquarer
+ headquarter
+ headquater
+ headquarter
+ headquatered
+ headquartered
+ headquaters
+ headquarters
+ healthercare
+ healthcare
+ heared
+ heard
+ heathy
+ healthy
+ heigher
+ higher
+ heirarchy
+ hierarchy
+ heiroglyphics
+ hieroglyphics
+ helment
+ helmet
+ helpfull
+ helpful
+ helpped
+ helped
+ hemmorhage
+ hemorrhage
+ herad
+ heard
+ heridity
+ heredity
+ heroe
+ hero
+ heros
+ heroes
+ hertiage
+ heritage
+ hertzs
+ hertz
+ hesistant
+ hesitant
+ heterogenous
+ heterogeneous
+ hieght
+ height
+ hierachical
+ hierarchical
+ hierachies
+ hierarchies
+ hierachy
+ hierarchy
+ hierarcical
+ hierarchical
+ hierarcy
+ hierarchy
+ hieroglph
+ hieroglyph
+ hieroglphs
+ hieroglyphs
+ higer
+ higher
+ higest
+ highest
+ higway
+ highway
+ hillarious
+ hilarious
+ himselv
+ himself
+ hinderance
+ hindrance
+ hinderence
+ hindrance
+ hindrence
+ hindrance
+ hipopotamus
+ hippopotamus
+ hismelf
+ himself
+ histocompatability
+ histocompatibility
+ historicians
+ historians
+ hitsingles
+ hit singles
+ holliday
+ holiday
+ homestate
+ home state
+ homogeneize
+ homogenize
+ homogeneized
+ homogenized
+ honory
+ honorary
+ horrifing
+ horrifying
+ hosited
+ hoisted
+ hospitible
+ hospitable
+ hounour
+ honour
+ housr
+ hours
+ howver
+ however
+ hsitorians
+ historians
+ hstory
+ history
+ hten
+ then
+ htere
+ there
+ htey
+ they
+ htikn
+ think
+ hting
+ thing
+ htink
+ think
+ htis
+ this
+ humer
+ humor
+ humerous
+ humorous
+ huminoid
+ humanoid
+ humoural
+ humoral
+ humurous
+ humorous
+ husban
+ husband
+ hvae
+ have
+ hvaing
+ having
+ hvea
+ have
+ hwihc
+ which
+ hwile
+ while
+ hwole
+ whole
+ hydogen
+ hydrogen
+ hydropile
+ hydrophile
+ hydropilic
+ hydrophilic
+ hydropobe
+ hydrophobe
+ hydropobic
+ hydrophobic
+ hygeine
+ hygiene
+ hypocracy
+ hypocrisy
+ hypocrasy
+ hypocrisy
+ hypocricy
+ hypocrisy
+ hypocrit
+ hypocrite
+ hypocrits
+ hypocrites
+ iconclastic
+ iconoclastic
+ idaeidae
+ idea
+ idaes
+ ideas
+ idealogies
+ ideologies
+ idealogy
+ ideology
+ identicial
+ identical
+ identifers
+ identifiers
+ ideosyncratic
+ idiosyncratic
+ idesa
+ ideas
+ idiosyncracy
+ idiosyncrasy
+ illegimacy
+ illegitimacy
+ illegitmate
+ illegitimate
+ illess
+ illness
+ illiegal
+ illegal
+ illution
+ illusion
+ ilness
+ illness
+ ilogical
+ illogical
+ imagenary
+ imaginary
+ imagin
+ imagine
+ imaginery
+ imaginary
+ imcomplete
+ incomplete
+ imediately
+ immediately
+ imense
+ immense
+ immediatley
+ immediately
+ immediatly
+ immediately
+ immidately
+ immediately
+ immidiately
+ immediately
+ immitate
+ imitate
+ immitated
+ imitated
+ immitating
+ imitating
+ immitator
+ imitator
+ immunosupressant
+ immunosuppressant
+ impecabbly
+ impeccably
+ impedence
+ impedance
+ implamenting
+ implementing
+ impliment
+ implement
+ implimented
+ implemented
+ imploys
+ employs
+ importamt
+ important
+ imprioned
+ imprisoned
+ imprisonned
+ imprisoned
+ improvision
+ improvisation
+ improvments
+ improvements
+ inablility
+ inability
+ inaccessable
+ inaccessible
+ inadiquate
+ inadequate
+ inadquate
+ inadequate
+ inadvertant
+ inadvertent
+ inadvertantly
+ inadvertently
+ inagurated
+ inaugurated
+ inaguration
+ inauguration
+ inappropiate
+ inappropriate
+ inaugures
+ inaugurates
+ inbalance
+ imbalance
+ inbalanced
+ imbalanced
+ inbetween
+ between
+ incarcirated
+ incarcerated
+ incidentially
+ incidentally
+ incidently
+ incidentally
+ inclreased
+ increased
+ includ
+ include
+ includng
+ including
+ incompatabilities
+ incompatibilities
+ incompatability
+ incompatibility
+ incompatable
+ incompatible
+ incompatablities
+ incompatibilities
+ incompatablity
+ incompatibility
+ incompatiblities
+ incompatibilities
+ incompatiblity
+ incompatibility
+ incompetance
+ incompetence
+ incompetant
+ incompetent
+ incomptable
+ incompatible
+ incomptetent
+ incompetent
+ inconsistant
+ inconsistent
+ incoroporated
+ incorporated
+ incorperation
+ incorporation
+ incorportaed
+ incorporated
+ incorprates
+ incorporates
+ incorruptable
+ incorruptible
+ incramentally
+ incrementally
+ increadible
+ incredible
+ incredable
+ incredible
+ inctroduce
+ introduce
+ inctroduced
+ introduced
+ incuding
+ including
+ incunabla
+ incunabula
+ indefinately
+ indefinitely
+ indefineable
+ undefinable
+ indefinitly
+ indefinitely
+ indentical
+ identical
+ indepedantly
+ independently
+ indepedence
+ independence
+ independance
+ independence
+ independant
+ independent
+ independantly
+ independently
+ independece
+ independence
+ independendet
+ independent
+ indespensable
+ indispensable
+ indespensible
+ indispensable
+ indictement
+ indictment
+ indigineous
+ indigenous
+ indipendence
+ independence
+ indipendent
+ independent
+ indipendently
+ independently
+ indispensible
+ indispensable
+ indisputible
+ indisputable
+ indisputibly
+ indisputably
+ indite
+ indict
+ individualy
+ individually
+ indpendent
+ independent
+ indpendently
+ independently
+ indulgue
+ indulge
+ indutrial
+ industrial
+ indviduals
+ individuals
+ inefficienty
+ inefficiently
+ inevatible
+ inevitable
+ inevitible
+ inevitable
+ inevititably
+ inevitably
+ infalability
+ infallibility
+ infallable
+ infallible
+ infectuous
+ infectious
+ infered
+ inferred
+ infilitrate
+ infiltrate
+ infilitrated
+ infiltrated
+ infilitration
+ infiltration
+ infinit
+ infinite
+ inflamation
+ inflammation
+ influencial
+ influential
+ influented
+ influenced
+ infomation
+ information
+ informtion
+ information
+ infrantryman
+ infantryman
+ infrigement
+ infringement
+ ingenius
+ ingenious
+ ingreediants
+ ingredients
+ inhabitans
+ inhabitants
+ inherantly
+ inherently
+ inheritence
+ inheritance
+ inital
+ initial
+ initally
+ initially
+ initation
+ initiation
+ initiaitive
+ initiative
+ inlcuding
+ including
+ inmigrant
+ immigrant
+ inmigrants
+ immigrants
+ innoculated
+ inoculated
+ inocence
+ innocence
+ inofficial
+ unofficial
+ inot
+ into
+ inpeach
+ impeach
+ inpolite
+ impolite
+ inprisonment
+ imprisonment
+ inproving
+ improving
+ insectiverous
+ insectivorous
+ insensative
+ insensitive
+ inseperable
+ inseparable
+ insistance
+ insistence
+ insitution
+ institution
+ insitutions
+ institutions
+ inspite
+ in spite
+ instade
+ instead
+ instatance
+ instance
+ institue
+ institute
+ instuction
+ instruction
+ instuments
+ instruments
+ instutionalized
+ institutionalized
+ instutions
+ intuitions
+ insurence
+ insurance
+ intelectual
+ intellectual
+ inteligence
+ intelligence
+ inteligent
+ intelligent
+ intenational
+ international
+ intented
+ intended
+ intepretation
+ interpretation
+ intepretator
+ interpretor
+ interational
+ international
+ interbread
+ interbreed
+ interchangable
+ interchangeable
+ interchangably
+ interchangeably
+ intercontinetal
+ intercontinental
+ intered
+ interred
+ interelated
+ interrelated
+ interferance
+ interference
+ interfereing
+ interfering
+ intergrated
+ integrated
+ intergration
+ integration
+ interm
+ interim
+ internation
+ international
+ interpet
+ interpret
+ interrim
+ interim
+ interrugum
+ interregnum
+ intertaining
+ entertaining
+ interupt
+ interrupt
+ intervines
+ intervenes
+ intevene
+ intervene
+ intial
+ initial
+ intially
+ initially
+ intrduced
+ introduced
+ intrest
+ interest
+ introdued
+ introduced
+ intruduced
+ introduced
+ intrument
+ instrument
+ intrumental
+ instrumental
+ intruments
+ instruments
+ intrusted
+ entrusted
+ intutive
+ intuitive
+ intutively
+ intuitively
+ inudstry
+ industry
+ inventer
+ inventor
+ invertibrates
+ invertebrates
+ investingate
+ investigate
+ involvment
+ involvement
+ irelevent
+ irrelevant
+ iresistable
+ irresistible
+ iresistably
+ irresistibly
+ iresistible
+ irresistible
+ iresistibly
+ irresistibly
+ iritable
+ irritable
+ iritated
+ irritated
+ ironicly
+ ironically
+ irregardless
+ regardless
+ irrelevent
+ irrelevant
+ irreplacable
+ irreplaceable
+ irresistable
+ irresistible
+ irresistably
+ irresistibly
+ isnt
+ isn't
+ issueing
+ issuing
+ itnroduced
+ introduced
+ iunior
+ junior
+ iwll
+ will
+ iwth
+ with
+ jaques
+ jacques
+ jeapardy
+ jeopardy
+ jewllery
+ jewellery
+ jouney
+ journey
+ journied
+ journeyed
+ journies
+ journeys
+ jstu
+ just
+ jsut
+ just
+ judical
+ judicial
+ judisuary
+ judiciary
+ juducial
+ judicial
+ juristiction
+ jurisdiction
+ juristictions
+ jurisdictions
+ kindergarden
+ kindergarten
+ klenex
+ kleenex
+ knifes
+ knives
+ knive
+ knife
+ knowlege
+ knowledge
+ knowlegeable
+ knowledgeable
+ knwo
+ know
+ knwos
+ knows
+ konw
+ know
+ konws
+ knows
+ kwno
+ know
+ labatory
+ laboratory
+ labratory
+ laboratory
+ laguage
+ language
+ laguages
+ languages
+ larg
+ large
+ largst
+ largest
+ larrry
+ larry
+ lastr
+ last
+ lattitude
+ latitude
+ launhed
+ launched
+ lavae
+ larvae
+ layed
+ laid
+ lazyness
+ laziness
+ leage
+ league
+ leanr
+ learn
+ leathal
+ lethal
+ lefted
+ left
+ legitamate
+ legitimate
+ legitmate
+ legitimate
+ leibnitz
+ leibniz
+ lenght
+ length
+ leran
+ learn
+ lerans
+ learns
+ leutenant
+ lieutenant
+ levetate
+ levitate
+ levetated
+ levitated
+ levetates
+ levitates
+ levetating
+ levitating
+ levle
+ level
+ liasion
+ liaison
+ liason
+ liaison
+ liasons
+ liaisons
+ libary
+ library
+ libell
+ libel
+ libguistic
+ linguistic
+ libguistics
+ linguistics
+ libitarianisn
+ libertarianism
+ lieing
+ lying
+ liek
+ like
+ liekd
+ liked
+ liesure
+ leisure
+ lieuenant
+ lieutenant
+ lieved
+ lived
+ liftime
+ lifetime
+ lightyear
+ light year
+ lightyears
+ light years
+ likelyhood
+ likelihood
+ linnaena
+ linnaean
+ lippizaner
+ lipizzaner
+ liquify
+ liquefy
+ liscense
+ license
+ lisence
+ license
+ lisense
+ license
+ listners
+ listeners
+ litature
+ literature
+ literaly
+ literally
+ literture
+ literature
+ littel
+ little
+ litterally
+ literally
+ liuke
+ like
+ livley
+ lively
+ lmits
+ limits
+ loev
+ love
+ lonelyness
+ loneliness
+ longitudonal
+ longitudinal
+ lonley
+ lonely
+ lonly
+ lonely
+ loosing
+ losing
+ lotharingen
+ lothringen
+ lsat
+ last
+ lukid
+ likud
+ lveo
+ love
+ lvoe
+ love
+ maching
+ machine
+ mackeral
+ mackerel
+ magasine
+ magazine
+ magincian
+ magician
+ magnificient
+ magnificent
+ magolia
+ magnolia
+ mailny
+ mainly
+ maintainance
+ maintenance
+ maintainence
+ maintenance
+ maintance
+ maintenance
+ maintenence
+ maintenance
+ maintinaing
+ maintaining
+ maintioned
+ mentioned
+ majoroty
+ majority
+ maked
+ marked
+ makse
+ makes
+ maltesian
+ Maltese
+ mamal
+ mammal
+ mamalian
+ mammalian
+ managable
+ manageable
+ managment
+ management
+ maneouvre
+ manoeuvre
+ maneouvred
+ manoeuvred
+ maneouvres
+ manoeuvres
+ maneouvring
+ manoeuvring
+ manisfestations
+ manifestations
+ manoeuverability
+ maneuverability
+ manouver
+ maneuver
+ manouverability
+ maneuverability
+ manouverable
+ maneuverable
+ manouvers
+ maneuvers
+ mantained
+ maintained
+ manuever
+ maneuver
+ manuevers
+ maneuvers
+ manufacturedd
+ manufactured
+ manufature
+ manufacture
+ manufatured
+ manufactured
+ manufaturing
+ manufacturing
+ manuver
+ maneuver
+ mariage
+ marriage
+ marjority
+ majority
+ markes
+ marks
+ marketting
+ marketing
+ marmelade
+ marmalade
+ marrage
+ marriage
+ marraige
+ marriage
+ marrtyred
+ martyred
+ marryied
+ married
+ massmedia
+ mass media
+ masterbation
+ masturbation
+ mataphysical
+ metaphysical
+ materalists
+ materialist
+ mathamatics
+ mathematics
+ mathematican
+ mathematician
+ mathematicas
+ mathematics
+ matheticians
+ mathematicians
+ mathmatically
+ mathematically
+ mathmatician
+ mathematician
+ mathmaticians
+ mathematicians
+ mccarthyst
+ mccarthyist
+ mchanics
+ mechanics
+ meaninng
+ meaning
+ mear
+ wear
+ mechandise
+ merchandise
+ medacine
+ medicine
+ medeival
+ medieval
+ medevial
+ medieval
+ mediciney
+ mediciny
+ medievel
+ medieval
+ mediterainnean
+ mediterranean
+ meerkrat
+ meerkat
+ melieux
+ milieux
+ membranaphone
+ membranophone
+ memeber
+ member
+ menally
+ mentally
+ meranda
+ Miranda
+ mercentile
+ mercantile
+ messanger
+ messenger
+ messenging
+ messaging
+ metalic
+ metallic
+ metalurgic
+ metallurgic
+ metalurgical
+ metallurgical
+ metalurgy
+ metallurgy
+ metamorphysis
+ metamorphosis
+ metaphoricial
+ metaphorical
+ meterologist
+ meteorologist
+ meterology
+ meteorology
+ methaphor
+ metaphor
+ methaphors
+ metaphors
+ micoscopy
+ microscopy
+ midwifes
+ midwives
+ mileau
+ milieu
+ milennia
+ millennia
+ milennium
+ millennium
+ mileu
+ milieu
+ miliary
+ military
+ milion
+ million
+ miliraty
+ military
+ millenia
+ millennia
+ millenial
+ millennial
+ millenialism
+ millennialism
+ millenium
+ millennium
+ millepede
+ millipede
+ millioniare
+ millionaire
+ millitary
+ military
+ millon
+ million
+ miltary
+ military
+ minature
+ miniature
+ minerial
+ mineral
+ miniscule
+ minuscule
+ ministery
+ ministry
+ minstries
+ ministries
+ minstry
+ ministry
+ minumum
+ minimum
+ mirrorred
+ mirrored
+ miscelaneous
+ miscellaneous
+ miscellanious
+ miscellaneous
+ miscellanous
+ miscellaneous
+ mischeivous
+ mischievous
+ mischevious
+ mischievous
+ mischievious
+ mischievous
+ misdameanor
+ misdemeanor
+ misdameanors
+ misdemeanors
+ misdemenor
+ misdemeanor
+ misdemenors
+ misdemeanors
+ misfourtunes
+ misfortunes
+ misile
+ missile
+ mispell
+ misspell
+ mispelled
+ misspelled
+ mispelling
+ misspelling
+ missen
+ mizzen
+ missle
+ missile
+ missonary
+ missionary
+ misterious
+ mysterious
+ mistery
+ mystery
+ misteryous
+ mysterious
+ mkae
+ make
+ mkaes
+ makes
+ mkaing
+ making
+ mkea
+ make
+ moderm
+ modem
+ modle
+ model
+ moent
+ moment
+ moeny
+ money
+ mohammedans
+ muslims
+ moil
+ soil
+ moleclues
+ molecules
+ momento
+ memento
+ monestaries
+ monasteries
+ monestary
+ monastery
+ monickers
+ monikers
+ monolite
+ monolithic
+ montains
+ mountains
+ montanous
+ mountainous
+ monts
+ months
+ montypic
+ monotypic
+ moreso
+ more so
+ morgage
+ mortgage
+ morroccan
+ moroccan
+ morrocco
+ morocco
+ morroco
+ morocco
+ mortage
+ mortgage
+ mosture
+ moisture
+ motiviated
+ motivated
+ mounth
+ month
+ movei
+ movie
+ movment
+ movement
+ mroe
+ more
+ mucuous
+ mucous
+ muder
+ murder
+ mudering
+ murdering
+ muhammadan
+ muslim
+ multicultralism
+ multiculturalism
+ multipled
+ multiplied
+ multiplers
+ multipliers
+ munbers
+ numbers
+ muncipalities
+ municipalities
+ muncipality
+ municipality
+ munnicipality
+ municipality
+ muscels
+ muscles
+ muscial
+ musical
+ muscician
+ musician
+ muscicians
+ musicians
+ mutiliated
+ mutilated
+ myraid
+ myriad
+ mysef
+ myself
+ mysogynist
+ misogynist
+ mysogyny
+ misogyny
+ mysterous
+ mysterious
+ naieve
+ naive
+ naturaly
+ naturally
+ naturely
+ naturally
+ naturual
+ natural
+ naturually
+ naturally
+ neccesarily
+ necessarily
+ neccesary
+ necessary
+ neccessarily
+ necessarily
+ neccessary
+ necessary
+ neccessities
+ necessities
+ necesarily
+ necessarily
+ necesary
+ necessary
+ necessiate
+ necessitate
+ neglible
+ negligible
+ negligable
+ negligible
+ negociate
+ negotiate
+ negociation
+ negotiation
+ negociations
+ negotiations
+ negotation
+ negotiation
+ neice
+ niece
+ neigborhood
+ neighborhood
+ neigbour
+ neighbour
+ neigbourhood
+ neighbourhood
+ neolitic
+ neolithic
+ nessasarily
+ necessarily
+ nessecary
+ necessary
+ nestin
+ nesting
+ neverthless
+ nevertheless
+ newletters
+ newsletters
+ nickle
+ nickel
+ nightfa;;
+ nightfall
+ nightime
+ nighttime
+ nineth
+ ninth
+ ninteenth
+ nineteenth
+ ninties
+ 1990s
+ ninty
+ ninety
+ nkow
+ know
+ nkwo
+ know
+ nmae
+ name
+ noncombatents
+ noncombatants
+ nonsence
+ nonsense
+ nontheless
+ nonetheless
+ noone
+ no one
+ norhern
+ northern
+ northen
+ northern
+ northereastern
+ northeastern
+ notabley
+ notably
+ noteable
+ notable
+ noteably
+ notably
+ noteriety
+ notoriety
+ noth
+ north
+ nothern
+ northern
+ noticable
+ noticeable
+ noticably
+ noticeably
+ noticeing
+ noticing
+ noticible
+ noticeable
+ notwhithstanding
+ notwithstanding
+ noveau
+ nouveau
+ nowdays
+ nowadays
+ nowe
+ now
+ nto
+ not
+ nucular
+ nuclear
+ nuculear
+ nuclear
+ nuisanse
+ nuisance
+ numberous
+ numerous
+ nusance
+ nuisance
+ nutritent
+ nutrient
+ nutritents
+ nutrients
+ nuturing
+ nurturing
+ obediance
+ obedience
+ obediant
+ obedient
+ obession
+ obsession
+ obssessed
+ obsessed
+ obstacal
+ obstacle
+ obstancles
+ obstacles
+ obstruced
+ obstructed
+ ocasion
+ occasion
+ ocasional
+ occasional
+ ocasionally
+ occasionally
+ ocasionaly
+ occasionally
+ ocasioned
+ occasioned
+ ocasions
+ occasions
+ ocassion
+ occasion
+ ocassional
+ occasional
+ ocassionally
+ occasionally
+ ocassionaly
+ occasionally
+ ocassioned
+ occasioned
+ ocassions
+ occasions
+ occaison
+ occasion
+ occassion
+ occasion
+ occassional
+ occasional
+ occassionally
+ occasionally
+ occassionaly
+ occasionally
+ occassioned
+ occasioned
+ occassions
+ occasions
+ occationally
+ occasionally
+ occour
+ occur
+ occurance
+ occurrence
+ occurances
+ occurrences
+ occured
+ occurred
+ occurence
+ occurrence
+ occurences
+ occurrences
+ occuring
+ occurring
+ occurr
+ occur
+ occurrance
+ occurrence
+ occurrances
+ occurrences
+ octohedra
+ octahedra
+ octohedral
+ octahedral
+ octohedron
+ octahedron
+ ocuntries
+ countries
+ ocuntry
+ country
+ ocurr
+ occur
+ ocurrance
+ occurrence
+ ocurred
+ occurred
+ ocurrence
+ occurrence
+ offcers
+ officers
+ offcially
+ officially
+ offereings
+ offerings
+ offical
+ official
+ offically
+ officially
+ officals
+ officials
+ officaly
+ officially
+ officialy
+ officially
+ offred
+ offered
+ oftenly
+ often
+ oging
+ going
+ omision
+ omission
+ omited
+ omitted
+ omiting
+ omitting
+ omlette
+ omelette
+ ommision
+ omission
+ ommited
+ omitted
+ ommiting
+ omitting
+ ommitted
+ omitted
+ ommitting
+ omitting
+ omniverous
+ omnivorous
+ omniverously
+ omnivorously
+ omre
+ more
+ onot
+ note
+ onxy
+ onyx
+ onyl
+ only
+ openess
+ openness
+ oponent
+ opponent
+ oportunity
+ opportunity
+ opose
+ oppose
+ oposite
+ opposite
+ oposition
+ opposition
+ oppenly
+ openly
+ oppinion
+ opinion
+ opponant
+ opponent
+ oppononent
+ opponent
+ oppositition
+ opposition
+ oppossed
+ opposed
+ opprotunity
+ opportunity
+ opression
+ oppression
+ opressive
+ oppressive
+ opthalmic
+ ophthalmic
+ opthalmologist
+ ophthalmologist
+ opthalmology
+ ophthalmology
+ opthamologist
+ ophthalmologist
+ optmizations
+ optimizations
+ optomism
+ optimism
+ orded
+ ordered
+ organim
+ organism
+ organistion
+ organisation
+ organiztion
+ organization
+ orgin
+ origin
+ orginal
+ original
+ orginally
+ originally
+ orginize
+ organise
+ oridinarily
+ ordinarily
+ origanaly
+ originally
+ originall
+ original
+ originaly
+ originally
+ originially
+ originally
+ originnally
+ originally
+ origional
+ original
+ orignally
+ originally
+ orignially
+ originally
+ otehr
+ other
+ oublisher
+ publisher
+ ouevre
+ oeuvre
+ oustanding
+ outstanding
+ overshaddowed
+ overshadowed
+ overthere
+ over there
+ overwelming
+ overwhelming
+ overwheliming
+ overwhelming
+ owrk
+ work
+ owudl
+ would
+ oxigen
+ oxygen
+ oximoron
+ oxymoron
+ p0enis
+ penis
+ paide
+ paid
+ paitience
+ patience
+ palce
+ place
+ paleolitic
+ paleolithic
+ paliamentarian
+ parliamentarian
+ pallete
+ palette
+ pamflet
+ pamphlet
+ pamplet
+ pamphlet
+ pantomine
+ pantomime
+ paralel
+ parallel
+ paralell
+ parallel
+ paralelly
+ parallelly
+ paralely
+ parallelly
+ parallely
+ parallelly
+ paranthesis
+ parenthesis
+ paraphenalia
+ paraphernalia
+ parellels
+ parallels
+ parituclar
+ particular
+ parliment
+ parliament
+ parrakeets
+ parakeets
+ parralel
+ parallel
+ parrallel
+ parallel
+ parrallell
+ parallel
+ parrallelly
+ parallelly
+ parrallely
+ parallelly
+ partialy
+ partially
+ particually
+ particularly
+ particualr
+ particular
+ particuarly
+ particularly
+ particularily
+ particularly
+ particulary
+ particularly
+ pary
+ party
+ pased
+ passed
+ pasengers
+ passengers
+ passerbys
+ passersby
+ pasttime
+ pastime
+ pastural
+ pastoral
+ paticular
+ particular
+ pattented
+ patented
+ pavillion
+ pavilion
+ payed
+ paid
+ pblisher
+ publisher
+ pbulisher
+ publisher
+ peacefuland
+ peaceful and
+ peageant
+ pageant
+ peculure
+ peculiar
+ pedestrain
+ pedestrian
+ peformed
+ performed
+ peice
+ piece
+ penatly
+ penalty
+ penerator
+ penetrator
+ penisula
+ peninsula
+ penisular
+ peninsular
+ penninsula
+ peninsula
+ penninsular
+ peninsular
+ pennisula
+ peninsula
+ pensinula
+ peninsula
+ peom
+ poem
+ peoms
+ poems
+ peopel
+ people
+ peotry
+ poetry
+ perade
+ parade
+ percepted
+ perceived
+ percieve
+ perceive
+ percieved
+ perceived
+ perenially
+ perennially
+ perfomance
+ performance
+ perfomers
+ performers
+ performence
+ performance
+ performes
+ performed
+ perhasp
+ perhaps
+ perheaps
+ perhaps
+ perhpas
+ perhaps
+ peripathetic
+ peripatetic
+ peristent
+ persistent
+ perjery
+ perjury
+ perjorative
+ pejorative
+ permanant
+ permanent
+ permenant
+ permanent
+ permenantly
+ permanently
+ permissable
+ permissible
+ perogative
+ prerogative
+ peronal
+ personal
+ perosnality
+ personality
+ perphas
+ perhaps
+ perpindicular
+ perpendicular
+ perseverence
+ perseverance
+ persistance
+ persistence
+ persistant
+ persistent
+ personel
+ personnel
+ personell
+ personnel
+ personnell
+ personnel
+ persuded
+ persuaded
+ persue
+ pursue
+ persued
+ pursued
+ persuing
+ pursuing
+ persuit
+ pursuit
+ persuits
+ pursuits
+ pertubation
+ perturbation
+ pertubations
+ perturbations
+ pessiary
+ pessary
+ petetion
+ petition
+ phenomenom
+ phenomenon
+ phenomenonal
+ phenomenal
+ phenomenonly
+ phenomenally
+ phenomonenon
+ phenomenon
+ phenomonon
+ phenomenon
+ phenonmena
+ phenomena
+ philisopher
+ philosopher
+ philisophical
+ philosophical
+ philisophy
+ philosophy
+ phillosophically
+ philosophically
+ philospher
+ philosopher
+ philosphies
+ philosophies
+ philosphy
+ philosophy
+ phongraph
+ phonograph
+ phylosophical
+ philosophical
+ physicaly
+ physically
+ piblisher
+ publisher
+ pich
+ pitch
+ pilgrimmage
+ pilgrimage
+ pilgrimmages
+ pilgrimages
+ pinapple
+ pineapple
+ pinnaple
+ pineapple
+ pinoneered
+ pioneered
+ plagarism
+ plagiarism
+ planation
+ plantation
+ planed
+ planned
+ plantiff
+ plaintiff
+ plateu
+ plateau
+ plausable
+ plausible
+ playright
+ playwright
+ playwrite
+ playwright
+ playwrites
+ playwrights
+ pleasent
+ pleasant
+ plebicite
+ plebiscite
+ plesant
+ pleasant
+ poenis
+ penis
+ poeoples
+ peoples
+ poety
+ poetry
+ poisin
+ poison
+ polical
+ political
+ polinator
+ pollinator
+ polinators
+ pollinators
+ politican
+ politician
+ politicans
+ politicians
+ poltical
+ political
+ polute
+ pollute
+ poluted
+ polluted
+ polutes
+ pollutes
+ poluting
+ polluting
+ polution
+ pollution
+ polyphonyic
+ polyphonic
+ polysaccaride
+ polysaccharide
+ polysaccharid
+ polysaccharide
+ pomegranite
+ pomegranate
+ pomotion
+ promotion
+ poportional
+ proportional
+ popoulation
+ population
+ popularaty
+ popularity
+ populare
+ popular
+ populer
+ popular
+ portait
+ portrait
+ portayed
+ portrayed
+ portraing
+ portraying
+ portuguease
+ portuguese
+ portugues
+ Portuguese
+ posess
+ possess
+ posessed
+ possessed
+ posesses
+ possesses
+ posessing
+ possessing
+ posession
+ possession
+ posessions
+ possessions
+ posion
+ poison
+ positon
+ position
+ possable
+ possible
+ possably
+ possibly
+ posseses
+ possesses
+ possesing
+ possessing
+ possesion
+ possession
+ possessess
+ possesses
+ possibile
+ possible
+ possibilty
+ possibility
+ possiblility
+ possibility
+ possiblilty
+ possibility
+ possiblities
+ possibilities
+ possiblity
+ possibility
+ possition
+ position
+ posthomous
+ posthumous
+ postion
+ position
+ postive
+ positive
+ potatos
+ potatoes
+ potrait
+ portrait
+ potrayed
+ portrayed
+ poulations
+ populations
+ poverful
+ powerful
+ poweful
+ powerful
+ powerfull
+ powerful
+ ppublisher
+ publisher
+ practial
+ practical
+ practially
+ practically
+ practicaly
+ practically
+ practicioner
+ practitioner
+ practicioners
+ practitioners
+ practicly
+ practically
+ practioner
+ practitioner
+ practioners
+ practitioners
+ prairy
+ prairie
+ prarie
+ prairie
+ praries
+ prairies
+ pratice
+ practice
+ preample
+ preamble
+ precedessor
+ predecessor
+ preceed
+ precede
+ preceeded
+ preceded
+ preceeding
+ preceding
+ preceeds
+ precedes
+ precentage
+ percentage
+ precice
+ precise
+ precisly
+ precisely
+ precurser
+ precursor
+ predecesors
+ predecessors
+ predicatble
+ predictable
+ predicitons
+ predictions
+ predomiantly
+ predominately
+ prefered
+ preferred
+ prefering
+ preferring
+ preferrably
+ preferably
+ pregancies
+ pregnancies
+ preiod
+ period
+ preliferation
+ proliferation
+ premeire
+ premiere
+ premeired
+ premiered
+ premillenial
+ premillennial
+ preminence
+ preeminence
+ premission
+ permission
+ preocupation
+ preoccupation
+ prepair
+ prepare
+ prepartion
+ preparation
+ prepatory
+ preparatory
+ preperation
+ preparation
+ preperations
+ preparations
+ preriod
+ period
+ presedential
+ presidential
+ presense
+ presence
+ presidenital
+ presidential
+ presidental
+ presidential
+ presitgious
+ prestigious
+ prespective
+ perspective
+ prestigeous
+ prestigious
+ prestigous
+ prestigious
+ presumabely
+ presumably
+ presumibly
+ presumably
+ pretection
+ protection
+ prevelant
+ prevalent
+ preverse
+ perverse
+ previvous
+ previous
+ pricipal
+ principal
+ priciple
+ principle
+ priestood
+ priesthood
+ primarly
+ primarily
+ primative
+ primitive
+ primatively
+ primitively
+ primatives
+ primitives
+ primordal
+ primordial
+ priveledges
+ privileges
+ privelege
+ privilege
+ priveleged
+ privileged
+ priveleges
+ privileges
+ privelige
+ privilege
+ priveliged
+ privileged
+ priveliges
+ privileges
+ privelleges
+ privileges
+ privilage
+ privilege
+ priviledge
+ privilege
+ priviledges
+ privileges
+ privledge
+ privilege
+ privte
+ private
+ probabilaty
+ probability
+ probablistic
+ probabilistic
+ probablly
+ probably
+ probalibity
+ probability
+ probaly
+ probably
+ probelm
+ problem
+ proccess
+ process
+ proccessing
+ processing
+ procede
+ proceed
+ proceded
+ proceeded
+ procedes
+ proceeds
+ procedger
+ procedure
+ proceding
+ proceeding
+ procedings
+ proceedings
+ proceedure
+ procedure
+ proces
+ process
+ processer
+ processor
+ proclaimation
+ proclamation
+ proclamed
+ proclaimed
+ proclaming
+ proclaiming
+ proclomation
+ proclamation
+ profesion
+ profession
+ profesor
+ professor
+ professer
+ professor
+ proffesed
+ professed
+ proffesion
+ profession
+ proffesional
+ professional
+ proffesor
+ professor
+ profilic
+ prolific
+ progessed
+ progressed
+ programable
+ programmable
+ progrom
+ program
+ progroms
+ programs
+ prohabition
+ prohibition
+ prologomena
+ prolegomena
+ prominance
+ prominence
+ prominant
+ prominent
+ prominantly
+ prominently
+ prominately
+ prominently
+ promiscous
+ promiscuous
+ promotted
+ promoted
+ pronomial
+ pronominal
+ pronouced
+ pronounced
+ pronounched
+ pronounced
+ pronounciation
+ pronunciation
+ proove
+ prove
+ prooved
+ proved
+ prophacy
+ prophecy
+ propietary
+ proprietary
+ propmted
+ prompted
+ propoganda
+ propaganda
+ propogate
+ propagate
+ propogates
+ propagates
+ propogation
+ propagation
+ propostion
+ proposition
+ propotions
+ proportions
+ propper
+ proper
+ propperly
+ properly
+ proprietory
+ proprietary
+ proseletyzing
+ proselytizing
+ protaganist
+ protagonist
+ protaganists
+ protagonists
+ protocal
+ protocol
+ protoganist
+ protagonist
+ protrayed
+ portrayed
+ protruberance
+ protuberance
+ protruberances
+ protuberances
+ prouncements
+ pronouncements
+ provacative
+ provocative
+ provded
+ provided
+ provicial
+ provincial
+ provinicial
+ provincial
+ provisiosn
+ provision
+ provisonal
+ provisional
+ proximty
+ proximity
+ pseudononymous
+ pseudonymous
+ pseudonyn
+ pseudonym
+ psuedo
+ pseudo
+ psycology
+ psychology
+ psyhic
+ psychic
+ pubilsher
+ publisher
+ pubisher
+ publisher
+ publiaher
+ publisher
+ publically
+ publicly
+ publicaly
+ publicly
+ publicher
+ publisher
+ publihser
+ publisher
+ publisehr
+ publisher
+ publiser
+ publisher
+ publisger
+ publisher
+ publisheed
+ published
+ publisherr
+ publisher
+ publishher
+ publisher
+ publishor
+ publisher
+ publishre
+ publisher
+ publissher
+ publisher
+ publlisher
+ publisher
+ publsiher
+ publisher
+ publusher
+ publisher
+ puchasing
+ purchasing
+ pulisher
+ publisher
+ pumkin
+ pumpkin
+ puplisher
+ publisher
+ puritannical
+ puritanical
+ purposedly
+ purposely
+ purpotedly
+ purportedly
+ pursuade
+ persuade
+ pursuaded
+ persuaded
+ pursuades
+ persuades
+ pususading
+ persuading
+ puting
+ putting
+ pwoer
+ power
+ pyscic
+ psychic
+ qtuie
+ quiet
+ quantaty
+ quantity
+ quantitiy
+ quantity
+ quarantaine
+ quarantine
+ questonable
+ questionable
+ quicklyu
+ quickly
+ quinessential
+ quintessential
+ quitted
+ quit
+ quizes
+ quizzes
+ qutie
+ quiet
+ rabinnical
+ rabbinical
+ racaus
+ raucous
+ radiactive
+ radioactive
+ radify
+ ratify
+ raelly
+ really
+ rarified
+ rarefied
+ reaccurring
+ recurring
+ reacing
+ reaching
+ reacll
+ recall
+ readmition
+ readmission
+ realitvely
+ relatively
+ realsitic
+ realistic
+ realtions
+ relations
+ realy
+ really
+ realyl
+ really
+ reasearch
+ research
+ rebiulding
+ rebuilding
+ rebllions
+ rebellions
+ rebounce
+ rebound
+ reccomend
+ recommend
+ reccomendations
+ recommendations
+ reccomended
+ recommended
+ reccomending
+ recommending
+ reccommend
+ recommend
+ reccommended
+ recommended
+ reccommending
+ recommending
+ reccuring
+ recurring
+ receeded
+ receded
+ receeding
+ receding
+ receivedfrom
+ received from
+ recepient
+ recipient
+ recepients
+ recipients
+ receving
+ receiving
+ rechargable
+ rechargeable
+ reched
+ reached
+ recide
+ reside
+ recided
+ resided
+ recident
+ resident
+ recidents
+ residents
+ reciding
+ residing
+ reciepents
+ recipients
+ reciept
+ receipt
+ recieve
+ receive
+ recieved
+ received
+ reciever
+ receiver
+ recievers
+ receivers
+ recieves
+ receives
+ recieving
+ receiving
+ recipiant
+ recipient
+ recipiants
+ recipients
+ recived
+ received
+ recivership
+ receivership
+ recogise
+ recognise
+ recogize
+ recognize
+ recomend
+ recommend
+ recomended
+ recommended
+ recomending
+ recommending
+ recomends
+ recommends
+ recommedations
+ recommendations
+ reconaissance
+ reconnaissance
+ reconcilation
+ reconciliation
+ reconized
+ recognized
+ reconnaisance
+ reconnaissance
+ reconnaissence
+ reconnaissance
+ recontructed
+ reconstructed
+ recordproducer
+ record producer
+ recquired
+ required
+ recrational
+ recreational
+ recrod
+ record
+ recuiting
+ recruiting
+ recuring
+ recurring
+ recurrance
+ recurrence
+ rediculous
+ ridiculous
+ reedeming
+ redeeming
+ reenforced
+ reinforced
+ refect
+ reflect
+ refedendum
+ referendum
+ referal
+ referral
+ referece
+ reference
+ refereces
+ references
+ refered
+ referred
+ referemce
+ reference
+ referemces
+ references
+ referencs
+ references
+ referenece
+ reference
+ refereneced
+ referenced
+ refereneces
+ references
+ referiang
+ referring
+ refering
+ referring
+ refernce
+ references
+ refernces
+ references
+ referrence
+ reference
+ referrences
+ references
+ referrs
+ refers
+ reffered
+ referred
+ refference
+ reference
+ reffering
+ referring
+ refrence
+ reference
+ refrences
+ references
+ refrers
+ refers
+ refridgeration
+ refrigeration
+ refridgerator
+ refrigerator
+ refromist
+ reformist
+ refusla
+ refusal
+ regardes
+ regards
+ regluar
+ regular
+ reguarly
+ regularly
+ regulaion
+ regulation
+ regulaotrs
+ regulators
+ regularily
+ regularly
+ rehersal
+ rehearsal
+ reicarnation
+ reincarnation
+ reigining
+ reigning
+ reknown
+ renown
+ reknowned
+ renowned
+ rela
+ real
+ relaly
+ really
+ relatiopnship
+ relationship
+ relativly
+ relatively
+ relected
+ reelected
+ releive
+ relieve
+ releived
+ relieved
+ releiver
+ reliever
+ releses
+ releases
+ relevence
+ relevance
+ relevent
+ relevant
+ reliablity
+ reliability
+ relient
+ reliant
+ religeous
+ religious
+ religous
+ religious
+ religously
+ religiously
+ relinqushment
+ relinquishment
+ relitavely
+ relatively
+ relized
+ realized
+ relpacement
+ replacement
+ remaing
+ remaining
+ remeber
+ remember
+ rememberable
+ memorable
+ rememberance
+ remembrance
+ remembrence
+ remembrance
+ remenant
+ remnant
+ remenicent
+ reminiscent
+ reminent
+ remnant
+ reminescent
+ reminiscent
+ reminscent
+ reminiscent
+ reminsicent
+ reminiscent
+ rendevous
+ rendezvous
+ rendezous
+ rendezvous
+ renedered
+ rende
+ renewl
+ renewal
+ rennovate
+ renovate
+ rennovated
+ renovated
+ rennovating
+ renovating
+ rennovation
+ renovation
+ rentors
+ renters
+ reoccurrence
+ recurrence
+ reorganision
+ reorganisation
+ repatition
+ repetition
+ repectively
+ respectively
+ repeition
+ repetition
+ repentence
+ repentance
+ repentent
+ repentant
+ repeteadly
+ repeatedly
+ repetion
+ repetition
+ repid
+ rapid
+ reponse
+ response
+ reponsible
+ responsible
+ reportadly
+ reportedly
+ represantative
+ representative
+ representive
+ representative
+ representives
+ representatives
+ reproducable
+ reproducible
+ reprtoire
+ repertoire
+ repsectively
+ respectively
+ reptition
+ repetition
+ requirment
+ requirement
+ requred
+ required
+ resaurant
+ restaurant
+ resembelance
+ resemblance
+ resembes
+ resembles
+ resemblence
+ resemblance
+ resevoir
+ reservoir
+ residental
+ residential
+ resignement
+ resignment
+ resistable
+ resistible
+ resistence
+ resistance
+ resistent
+ resistant
+ respectivly
+ respectively
+ responce
+ response
+ responibilities
+ responsibilities
+ responisble
+ responsible
+ responnsibilty
+ responsibility
+ responsability
+ responsibility
+ responsibile
+ responsible
+ responsibilites
+ responsibilities
+ responsiblities
+ responsibilities
+ responsiblity
+ responsibility
+ ressemblance
+ resemblance
+ ressemble
+ resemble
+ ressembled
+ resembled
+ ressemblence
+ resemblance
+ ressembling
+ resembling
+ resssurecting
+ resurrecting
+ ressurect
+ resurrect
+ ressurected
+ resurrected
+ ressurection
+ resurrection
+ ressurrection
+ resurrection
+ restarant
+ restaurant
+ restarants
+ restaurants
+ restaraunt
+ restaurant
+ restaraunteur
+ restaurateur
+ restaraunteurs
+ restaurateurs
+ restaraunts
+ restaurants
+ restauranteurs
+ restaurateurs
+ restauration
+ restoration
+ restauraunt
+ restaurant
+ resteraunt
+ restaurant
+ resteraunts
+ restaurants
+ resticted
+ restricted
+ restraunt
+ restraint
+ resturant
+ restaurant
+ resturants
+ restaurants
+ resturaunt
+ restaurant
+ resturaunts
+ restaurants
+ resurecting
+ resurrecting
+ retalitated
+ retaliated
+ retalitation
+ retaliation
+ retreive
+ retrieve
+ returnd
+ returned
+ revaluated
+ reevaluated
+ reveiw
+ review
+ reveral
+ reversal
+ reversable
+ reversible
+ revolutionar
+ revolutionary
+ rewitten
+ rewritten
+ rewriet
+ rewrite
+ rference
+ reference
+ rferences
+ references
+ rhymme
+ rhyme
+ rhythem
+ rhythm
+ rhythim
+ rhythm
+ rhytmic
+ rhythmic
+ rigourous
+ rigorous
+ rininging
+ ringing
+ rised
+ rose
+ rococco
+ rococo
+ rocord
+ record
+ roomate
+ roommate
+ rougly
+ roughly
+ rucuperate
+ recuperate
+ rudimentatry
+ rudimentary
+ rulle
+ rule
+ runing
+ running
+ runnung
+ running
+ russina
+ Russian
+ rwite
+ write
+ rythem
+ rhythm
+ rythim
+ rhythm
+ rythm
+ rhythm
+ rythmic
+ rhythmic
+ rythyms
+ rhythms
+ sacrafice
+ sacrifice
+ sacreligious
+ sacrilegious
+ sacrifical
+ sacrificial
+ saftey
+ safety
+ safty
+ safety
+ salery
+ salary
+ sanctionning
+ sanctioning
+ sandwhich
+ sandwich
+ santioned
+ sanctioned
+ sargant
+ sergeant
+ sargeant
+ sergeant
+ satelite
+ satellite
+ satelites
+ satellites
+ satisfactority
+ satisfactorily
+ satric
+ satiric
+ satrical
+ satirical
+ satrically
+ satirically
+ sattelite
+ satellite
+ sattelites
+ satellites
+ saught
+ sought
+ saveing
+ saving
+ saxaphone
+ saxophone
+ scaleable
+ scalable
+ scandanavia
+ Scandinavia
+ scaricity
+ scarcity
+ scavanged
+ scavenged
+ schedual
+ schedule
+ scholarhip
+ scholarship
+ scholarstic
+ scholastic
+ scientfic
+ scientific
+ scientifc
+ scientific
+ scientis
+ scientist
+ scince
+ science
+ scinece
+ science
+ scirpt
+ script
+ scoll
+ scroll
+ screenwrighter
+ screenwriter
+ scrutinity
+ scrutiny
+ scuptures
+ sculptures
+ seach
+ search
+ seached
+ searched
+ seaches
+ searches
+ secratary
+ secretary
+ secretery
+ secretary
+ sedereal
+ sidereal
+ seeked
+ sought
+ segementation
+ segmentation
+ seguoys
+ segues
+ seige
+ siege
+ seing
+ seeing
+ seinor
+ senior
+ seldomly
+ seldom
+ senarios
+ scenarios
+ senstive
+ sensitive
+ sensure
+ censure
+ seperate
+ separate
+ seperated
+ separated
+ seperately
+ separately
+ seperates
+ separates
+ seperating
+ separating
+ seperation
+ separation
+ seperatism
+ separatism
+ seperatist
+ separatist
+ sepina
+ subpoena
+ sergent
+ sergeant
+ settelement
+ settlement
+ settlment
+ settlement
+ severeal
+ several
+ severley
+ severely
+ severly
+ severely
+ sevice
+ service
+ shadasloo
+ shadaloo
+ shaddow
+ shadow
+ shadoloo
+ shadaloo
+ shamen
+ shaman
+ sheat
+ sheath
+ sheild
+ shield
+ sherif
+ sheriff
+ shineing
+ shining
+ shiped
+ shipped
+ shiping
+ shipping
+ shopkeeepers
+ shopkeepers
+ shorly
+ shortly
+ shortwhile
+ short while
+ shoudl
+ should
+ shoudln
+ shouldn't
+ shouldnt
+ shouldn't
+ shreak
+ shriek
+ shrinked
+ shrunk
+ sicne
+ since
+ sideral
+ sidereal
+ siezure
+ seizure
+ siezures
+ seizures
+ siginificant
+ significant
+ signficant
+ significant
+ signficiant
+ significant
+ signfies
+ signifies
+ signifantly
+ significantly
+ significently
+ significantly
+ signifigant
+ significant
+ signifigantly
+ significantly
+ signitories
+ signatories
+ signitory
+ signatory
+ similarily
+ similarly
+ similiar
+ similar
+ similiarity
+ similarity
+ similiarly
+ similarly
+ simmilar
+ similar
+ simpley
+ simply
+ simplier
+ simpler
+ simultanous
+ simultaneous
+ simultanously
+ simultaneously
+ sincerley
+ sincerely
+ singsog
+ singsong
+ sinse
+ since
+ skateing
+ skating
+ slaugterhouses
+ slaughterhouses
+ slighly
+ slightly
+ slowy
+ slowly
+ smae
+ same
+ smealting
+ smelting
+ smoe
+ some
+ sneeks
+ sneaks
+ snese
+ sneeze
+ socalism
+ socialism
+ socities
+ societies
+ soem
+ some
+ sofware
+ software
+ sohw
+ show
+ soilders
+ soldiers
+ solatary
+ solitary
+ soley
+ solely
+ soliders
+ soldiers
+ soliliquy
+ soliloquy
+ soluable
+ soluble
+ somene
+ someone
+ somtimes
+ sometimes
+ somwhere
+ somewhere
+ sophicated
+ sophisticated
+ sophmore
+ sophomore
+ sorceror
+ sorcerer
+ sorrounding
+ surrounding
+ sotry
+ story
+ sotyr
+ story
+ soudn
+ sound
+ soudns
+ sounds
+ sould
+ could
+ sountrack
+ soundtrack
+ sourth
+ south
+ sourthern
+ southern
+ souvenier
+ souvenir
+ souveniers
+ souvenirs
+ soveits
+ soviets
+ sovereignity
+ sovereignty
+ soverign
+ sovereign
+ soverignity
+ sovereignty
+ soverignty
+ sovereignty
+ spainish
+ Spanish
+ speach
+ speech
+ specfic
+ specific
+ speciallized
+ specialized
+ specifiying
+ specifying
+ speciman
+ specimen
+ spectauclar
+ spectacular
+ spectaulars
+ spectaculars
+ spectum
+ spectrum
+ speices
+ species
+ spendour
+ splendour
+ spermatozoan
+ spermatozoon
+ spoace
+ space
+ sponser
+ sponsor
+ sponsered
+ sponsored
+ spontanous
+ spontaneous
+ sponzored
+ sponsored
+ spoonfulls
+ spoonfuls
+ sppeches
+ speeches
+ spreaded
+ spread
+ sprech
+ speech
+ spred
+ spread
+ spriritual
+ spiritual
+ spritual
+ spiritual
+ sqaure
+ square
+ stablility
+ stability
+ stainlees
+ stainless
+ staion
+ station
+ standars
+ standards
+ stange
+ strange
+ startegic
+ strategic
+ startegies
+ strategies
+ startegy
+ strategy
+ stateman
+ statesman
+ statememts
+ statements
+ statment
+ statement
+ steriods
+ steroids
+ sterotypes
+ stereotypes
+ stilus
+ stylus
+ stingent
+ stringent
+ stiring
+ stirring
+ stirrs
+ stirs
+ stlye
+ style
+ stomache
+ stomach
+ stong
+ strong
+ stopry
+ story
+ storeis
+ stories
+ storise
+ stories
+ stornegst
+ strongest
+ stoyr
+ story
+ stpo
+ stop
+ stradegies
+ strategies
+ stradegy
+ strategy
+ strat
+ start
+ stratagically
+ strategically
+ streemlining
+ streamlining
+ stregth
+ strength
+ strenghen
+ strengthen
+ strenghened
+ strengthened
+ strenghening
+ strengthening
+ strenght
+ strength
+ strenghten
+ strengthen
+ strenghtened
+ strengthened
+ strenghtening
+ strengthening
+ strengtened
+ strengthened
+ strenous
+ strenuous
+ strictist
+ strictest
+ strikely
+ strikingly
+ strnad
+ strand
+ stroy
+ story
+ structual
+ structural
+ stubborness
+ stubbornness
+ stucture
+ structure
+ stuctured
+ structured
+ studdy
+ study
+ studing
+ studying
+ stuggling
+ struggling
+ sturcture
+ structure
+ subcatagories
+ subcategories
+ subcatagory
+ subcategory
+ subconsiously
+ subconsciously
+ subjudgation
+ subjugation
+ submachne
+ submachine
+ subpecies
+ subspecies
+ subsidary
+ subsidiary
+ subsiduary
+ subsidiary
+ subsquent
+ subsequent
+ subsquently
+ subsequently
+ substace
+ substance
+ substancial
+ substantial
+ substatial
+ substantial
+ substituded
+ substituted
+ substract
+ subtract
+ substracted
+ subtracted
+ substracting
+ subtracting
+ substraction
+ subtraction
+ substracts
+ subtracts
+ subtances
+ substances
+ subterranian
+ subterranean
+ suburburban
+ suburban
+ succceeded
+ succeeded
+ succcesses
+ successes
+ succedded
+ succeeded
+ succeded
+ succeeded
+ succeds
+ succeeds
+ succesful
+ successful
+ succesfully
+ successfully
+ succesfuly
+ successfully
+ succesion
+ succession
+ succesive
+ successive
+ successfull
+ successful
+ successully
+ successfully
+ succsess
+ success
+ succsessfull
+ successful
+ suceed
+ succeed
+ suceeded
+ succeeded
+ suceeding
+ succeeding
+ suceeds
+ succeeds
+ sucesful
+ successful
+ sucesfully
+ successfully
+ sucesfuly
+ successfully
+ sucesion
+ succession
+ sucess
+ success
+ sucesses
+ successes
+ sucessful
+ successful
+ sucessfull
+ successful
+ sucessfully
+ successfully
+ sucessfuly
+ successfully
+ sucession
+ succession
+ sucessive
+ successive
+ sucessor
+ successor
+ sucessot
+ successor
+ sucide
+ suicide
+ sucidial
+ suicidal
+ sufferage
+ suffrage
+ sufferred
+ suffered
+ sufferring
+ suffering
+ sufficent
+ sufficient
+ sufficently
+ sufficiently
+ sumary
+ summary
+ sunglases
+ sunglasses
+ suop
+ soup
+ superceeded
+ superseded
+ superintendant
+ superintendent
+ suphisticated
+ sophisticated
+ suplimented
+ supplemented
+ supose
+ suppose
+ suposed
+ supposed
+ suposedly
+ supposedly
+ suposes
+ supposes
+ suposing
+ supposing
+ supplamented
+ supplemented
+ suppliementing
+ supplementing
+ suppoed
+ supposed
+ supposingly
+ supposedly
+ suppy
+ supply
+ supress
+ suppress
+ supressed
+ suppressed
+ supresses
+ suppresses
+ supressing
+ suppressing
+ suprise
+ surprise
+ suprised
+ surprised
+ suprising
+ surprising
+ suprisingly
+ surprisingly
+ suprize
+ surprise
+ suprized
+ surprised
+ suprizing
+ surprising
+ suprizingly
+ surprisingly
+ surfce
+ surface
+ surley
+ surely
+ suround
+ surround
+ surounded
+ surrounded
+ surounding
+ surrounding
+ suroundings
+ surroundings
+ surounds
+ surrounds
+ surplanted
+ supplanted
+ surpress
+ suppress
+ surpressed
+ suppressed
+ surprize
+ surprise
+ surprized
+ surprised
+ surprizing
+ surprising
+ surprizingly
+ surprisingly
+ surrended
+ surrendered
+ surrepetitious
+ surreptitious
+ surrepetitiously
+ surreptitiously
+ surreptious
+ surreptitious
+ surreptiously
+ surreptitiously
+ surronded
+ surrounded
+ surrouded
+ surrounded
+ surrouding
+ surrounding
+ surrundering
+ surrendering
+ surveilence
+ surveillance
+ surveill
+ surveil
+ surveyer
+ surveyor
+ surviver
+ survivor
+ survivers
+ survivors
+ survivied
+ survived
+ suseptable
+ susceptible
+ suseptible
+ susceptible
+ suspention
+ suspension
+ swaer
+ swear
+ swaers
+ swears
+ swepth
+ swept
+ swiming
+ swimming
+ syas
+ says
+ symetrical
+ symmetrical
+ symetrically
+ symmetrically
+ symetry
+ symmetry
+ symettric
+ symmetric
+ symmetral
+ symmetric
+ symmetricaly
+ symmetrically
+ synagouge
+ synagogue
+ syncronization
+ synchronization
+ synonomous
+ synonymous
+ synonymns
+ synonyms
+ synphony
+ symphony
+ syphyllis
+ syphilis
+ sypmtoms
+ symptoms
+ syrap
+ syrup
+ sysmatically
+ systematically
+ sytem
+ system
+ sytle
+ style
+ tabacco
+ tobacco
+ tahn
+ than
+ taht
+ that
+ talekd
+ talked
+ targetted
+ targeted
+ targetting
+ targeting
+ tast
+ taste
+ tath
+ that
+ tattooes
+ tattoos
+ taxanomic
+ taxonomic
+ taxanomy
+ taxonomy
+ teached
+ taught
+ techician
+ technician
+ techicians
+ technicians
+ techiniques
+ techniques
+ technitian
+ technician
+ technnology
+ technology
+ technolgy
+ technology
+ teh
+ the
+ tehy
+ they
+ telelevision
+ television
+ televsion
+ television
+ telphony
+ telephony
+ temerature
+ temperature
+ tempalte
+ template
+ tempaltes
+ templates
+ temparate
+ temperate
+ temperarily
+ temporarily
+ temperment
+ temperament
+ tempertaure
+ temperature
+ temperture
+ temperature
+ temprary
+ temporary
+ tenacle
+ tentacle
+ tenacles
+ tentacles
+ tendacy
+ tendency
+ tendancies
+ tendencies
+ tendancy
+ tendency
+ tennisplayer
+ tennis player
+ tepmorarily
+ temporarily
+ terrestial
+ terrestrial
+ terriories
+ territories
+ terriory
+ territory
+ territorist
+ terrorist
+ territoy
+ territory
+ terroist
+ terrorist
+ testiclular
+ testicular
+ tghe
+ the
+ thast
+ that's
+ theather
+ theater
+ theese
+ these
+ theif
+ thief
+ theives
+ thieves
+ themselfs
+ themselves
+ themslves
+ themselves
+ ther
+ there
+ therafter
+ thereafter
+ therby
+ thereby
+ theri
+ their
+ theyre
+ they're
+ thgat
+ that
+ thge
+ the
+ thier
+ their
+ thign
+ thing
+ thigns
+ things
+ thigsn
+ things
+ thikn
+ think
+ thikning
+ thinking
+ thikns
+ thinks
+ thiunk
+ think
+ thn
+ then
+ thna
+ than
+ thne
+ then
+ thnig
+ thing
+ thnigs
+ things
+ thoughout
+ throughout
+ threatend
+ threatened
+ threatning
+ threatening
+ threee
+ three
+ threshhold
+ threshold
+ thrid
+ third
+ throrough
+ thorough
+ throughly
+ thoroughly
+ throught
+ throat
+ througout
+ throughout
+ thru
+ through
+ thsi
+ this
+ thsoe
+ those
+ thta
+ that
+ thyat
+ that
+ tiem
+ time
+ tihkn
+ think
+ tihs
+ this
+ timne
+ time
+ tiome
+ time
+ tje
+ the
+ tjhe
+ the
+ tjpanishad
+ upanishad
+ tkae
+ take
+ tkaes
+ takes
+ tkaing
+ taking
+ tlaking
+ talking
+ tobbaco
+ tobacco
+ todays
+ today's
+ todya
+ today
+ toghether
+ together
+ toke
+ took
+ tolerence
+ tolerance
+ tomatos
+ tomatoes
+ tommorow
+ tomorrow
+ tommorrow
+ tomorrow
+ tongiht
+ tonight
+ toriodal
+ toroidal
+ tormenters
+ tormentors
+ tornadoe
+ tornado
+ torpeados
+ torpedoes
+ torpedos
+ torpedoes
+ tothe
+ to the
+ toubles
+ troubles
+ tounge
+ tongue
+ tourch
+ torch
+ towords
+ towards
+ towrad
+ toward
+ tradionally
+ traditionally
+ traditionaly
+ traditionally
+ traditionnal
+ traditional
+ traditition
+ tradition
+ tradtionally
+ traditionally
+ trafficed
+ trafficked
+ trafficing
+ trafficking
+ trafic
+ traffic
+ trancendent
+ transcendent
+ trancending
+ transcending
+ tranform
+ transform
+ tranformed
+ transformed
+ transcendance
+ transcendence
+ transcendant
+ transcendent
+ transcendentational
+ transcendental
+ transcripting
+ transcribing
+ transending
+ transcending
+ transesxuals
+ transsexuals
+ transfered
+ transferred
+ transfering
+ transferring
+ transformaton
+ transformation
+ transistion
+ transition
+ translater
+ translator
+ translaters
+ translators
+ transmissable
+ transmissible
+ transporation
+ transportation
+ tremelo
+ tremolo
+ tremelos
+ tremolos
+ triguered
+ triggered
+ triology
+ trilogy
+ troling
+ trolling
+ troup
+ troupe
+ troups
+ troops
+ truely
+ truly
+ trustworthyness
+ trustworthiness
+ turnk
+ trunk
+ tust
+ trust
+ twelth
+ twelfth
+ twon
+ town
+ twpo
+ two
+ tyhat
+ that
+ tyhe
+ they
+ typcial
+ typical
+ typicaly
+ typically
+ tyranies
+ tyrannies
+ tyrany
+ tyranny
+ tyrranies
+ tyrannies
+ tyrrany
+ tyranny
+ ubiquitious
+ ubiquitous
+ ublisher
+ publisher
+ uise
+ use
+ ultimely
+ ultimately
+ unacompanied
+ unaccompanied
+ unahppy
+ unhappy
+ unanymous
+ unanimous
+ unathorised
+ unauthorised
+ unavailible
+ unavailable
+ unballance
+ unbalance
+ unbeknowst
+ unbeknownst
+ unbeleivable
+ unbelievable
+ uncertainity
+ uncertainty
+ unchallengable
+ unchallengeable
+ unchangable
+ unchangeable
+ uncompetive
+ uncompetitive
+ unconcious
+ unconscious
+ unconciousness
+ unconsciousness
+ unconfortability
+ discomfort
+ uncontitutional
+ unconstitutional
+ unconvential
+ unconventional
+ undecideable
+ undecidable
+ understoon
+ understood
+ undesireable
+ undesirable
+ undetecable
+ undetectable
+ undoubtely
+ undoubtedly
+ undreground
+ underground
+ uneccesary
+ unnecessary
+ unecessary
+ unnecessary
+ unequalities
+ inequalities
+ unforetunately
+ unfortunately
+ unforgetable
+ unforgettable
+ unforgiveable
+ unforgivable
+ unfortunatley
+ unfortunately
+ unfortunatly
+ unfortunately
+ unfourtunately
+ unfortunately
+ unihabited
+ uninhabited
+ unilateraly
+ unilaterally
+ unilatreal
+ unilateral
+ unilatreally
+ unilaterally
+ uninterruped
+ uninterrupted
+ uninterupted
+ uninterrupted
+ univeral
+ universal
+ univeristies
+ universities
+ univeristy
+ university
+ univerity
+ university
+ universtiy
+ university
+ univesities
+ universities
+ univesity
+ university
+ unkown
+ unknown
+ unlikey
+ unlikely
+ unmanouverable
+ unmaneuverable
+ unmistakeably
+ unmistakably
+ unneccesarily
+ unnecessarily
+ unneccesary
+ unnecessary
+ unneccessarily
+ unnecessarily
+ unneccessary
+ unnecessary
+ unnecesarily
+ unnecessarily
+ unnecesary
+ unnecessary
+ unoffical
+ unofficial
+ unoperational
+ nonoperational
+ unoticeable
+ unnoticeable
+ unplease
+ displease
+ unplesant
+ unpleasant
+ unprecendented
+ unprecedented
+ unprecidented
+ unprecedented
+ unrepentent
+ unrepentant
+ unrepetant
+ unrepentant
+ unrepetent
+ unrepentant
+ unsed
+ unused
+ unsubstanciated
+ unsubstantiated
+ unsuccesful
+ unsuccessful
+ unsuccesfully
+ unsuccessfully
+ unsuccessfull
+ unsuccessful
+ unsucesful
+ unsuccessful
+ unsucesfuly
+ unsuccessfully
+ unsucessful
+ unsuccessful
+ unsucessfull
+ unsuccessful
+ unsucessfully
+ unsuccessfully
+ unsuprised
+ unsurprised
+ unsuprising
+ unsurprising
+ unsuprisingly
+ unsurprisingly
+ unsuprized
+ unsurprised
+ unsuprizing
+ unsurprising
+ unsuprizingly
+ unsurprisingly
+ unsurprized
+ unsurprised
+ unsurprizing
+ unsurprising
+ unsurprizingly
+ unsurprisingly
+ untill
+ until
+ untranslateable
+ untranslatable
+ unuseable
+ unusable
+ unusuable
+ unusable
+ unviersity
+ university
+ unwarrented
+ unwarranted
+ unweildly
+ unwieldy
+ unwieldly
+ unwieldy
+ upcomming
+ upcoming
+ upgradded
+ upgraded
+ upto
+ up to
+ usally
+ usually
+ useage
+ usage
+ usefull
+ useful
+ usefuly
+ usefully
+ useing
+ using
+ usualy
+ usually
+ ususally
+ usually
+ vaccum
+ vacuum
+ vaccume
+ vacuum
+ vacinity
+ vicinity
+ vaguaries
+ vagaries
+ vaieties
+ varieties
+ vailidty
+ validity
+ valetta
+ valletta
+ valuble
+ valuable
+ valueable
+ valuable
+ varations
+ variations
+ varient
+ variant
+ variey
+ variety
+ varing
+ varying
+ varities
+ varieties
+ varity
+ variety
+ vasall
+ vassal
+ vasalls
+ vassals
+ vegatarian
+ vegetarian
+ vegitable
+ vegetable
+ vegitables
+ vegetables
+ vegtable
+ vegetable
+ vehicule
+ vehicle
+ vell
+ well
+ venemous
+ venomous
+ vengance
+ vengeance
+ vengence
+ vengeance
+ verfication
+ verification
+ verison
+ version
+ verisons
+ versions
+ vermillion
+ vermilion
+ versitilaty
+ versatility
+ versitlity
+ versatility
+ vetween
+ between
+ veyr
+ very
+ vigeur
+ vigor
+ vigilence
+ vigilance
+ vigourous
+ vigorous
+ villian
+ villain
+ villification
+ vilification
+ villify
+ vilify
+ villin
+ villain
+ vincinity
+ vicinity
+ violentce
+ violence
+ virtualy
+ virtually
+ virutal
+ virtual
+ virutally
+ virtually
+ visable
+ visible
+ visably
+ visibly
+ visting
+ visiting
+ vistors
+ visitors
+ vitories
+ victories
+ volcanoe
+ volcano
+ voleyball
+ volleyball
+ volontary
+ voluntary
+ volonteer
+ volunteer
+ volonteered
+ volunteered
+ volonteering
+ volunteering
+ volonteers
+ volunteers
+ volounteer
+ volunteer
+ volounteered
+ volunteered
+ volounteering
+ volunteering
+ volounteers
+ volunteers
+ volumne
+ volume
+ vreity
+ variety
+ vrey
+ very
+ vriety
+ variety
+ vulnerablility
+ vulnerability
+ vyer
+ very
+ vyre
+ very
+ waht
+ what
+ wanna
+ want to
+ warantee
+ warranty
+ wardobe
+ wardrobe
+ warrent
+ warrant
+ warrriors
+ warriors
+ wasnt
+ wasn't
+ wass
+ was
+ watn
+ want
+ wayword
+ wayward
+ weaponary
+ weaponry
+ weas
+ was
+ wehn
+ when
+ weild
+ wield
+ weilded
+ wielded
+ wendsay
+ Wednesday
+ wensday
+ Wednesday
+ wereabouts
+ whereabouts
+ whant
+ want
+ whants
+ wants
+ whcih
+ which
+ wheras
+ whereas
+ wherease
+ whereas
+ whereever
+ wherever
+ whic
+ which
+ whihc
+ which
+ whith
+ with
+ whlch
+ which
+ whn
+ when
+ wholey
+ wholly
+ wholy
+ holy
+ whta
+ what
+ whther
+ whether
+ wich
+ which
+ widesread
+ widespread
+ wief
+ wife
+ wierd
+ weird
+ wiew
+ view
+ wih
+ with
+ wiht
+ with
+ wille
+ will
+ willingless
+ willingness
+ wirting
+ writing
+ withdrawl
+ withdrawal
+ witheld
+ withheld
+ withh
+ with
+ withing
+ within
+ withold
+ withhold
+ witht
+ with
+ witn
+ with
+ wiull
+ will
+ wnat
+ want
+ wnated
+ wanted
+ wnats
+ wants
+ wohle
+ whole
+ wokr
+ work
+ wokring
+ working
+ wonderfull
+ wonderful
+ wordlwide
+ worldwide
+ workststion
+ workstation
+ worls
+ world
+ worstened
+ worsened
+ woudl
+ would
+ wresters
+ wrestlers
+ wriet
+ write
+ writen
+ written
+ wroet
+ wrote
+ wrok
+ work
+ wroking
+ working
+ wtih
+ with
+ wupport
+ support
+ xenophoby
+ xenophobia
+ yaching
+ yachting
+ yaer
+ year
+ yaerly
+ yearly
+ yaers
+ years
+ yatch
+ yacht
+ yearm
+ year
+ yeasr
+ years
+ yeild
+ yield
+ yeilding
+ yielding
+ yera
+ year
+ yeras
+ years
+ yersa
+ years
+ yotube
+ youtube
+ youseff
+ yousef
+ youself
+ yourself
+ ytou
+ you
+ yuo
+ you
+ zeebra
+ zebra
+
+ enabled
+ 1
+ priority
+ 5
+ wordStyle
+ 1
+
+
+
--
cgit v1.1
From bec5f7ceb211144a48b7ad33c8b6f3c5ed80c16b Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Wed, 1 Sep 2010 17:47:00 -0700
Subject: Fixed more messiness from merging in preferences > advanced
---
.../xui/en-us/panel_preferences_advanced.xml | 90 +++++++++++-----------
1 file changed, 46 insertions(+), 44 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
index a164f78..726fd26 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
@@ -19,22 +19,43 @@
label="Disable teleport screen" left="12" mouse_opaque="true"
name="disable_tp_screen_check" radio_style="false" width="217" />
+
+
+ label="Show client names in hovertip" left_delta="0" mouse_opaque="true"
+ name="client_name_hover_check" radio_style="false" width="160" />
+
+ Allow region WindLight settings (LightShare):
+
+
+
+ Never
+
+
+ Ask me every time
+
+
+ Always
+
+
-
@@ -67,43 +88,24 @@
mouse_opaque="true" name="language_is_public"
radio_style="false" tool_tip="This lets in-world objects know your preferred language."
width="256" />
-
-
- Allow region WindLight settings (LightShare):
-
-
-
- Never
-
-
- Ask me every time
-
-
- Always
-
-
-
-
-
-
-
+
+
+
+
-
-
@@ -128,7 +128,7 @@
-->
-
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml
index 1357eb5..7b4b809 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml
@@ -4,7 +4,7 @@
name="general_panel" width="517">
My Home
@@ -18,7 +18,7 @@
System Default
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_graphics1.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_graphics1.xml
index 4df33e2..55af056 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_graphics1.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_graphics1.xml
@@ -141,16 +141,16 @@
name="QualityText2" v_pad="0" width="95">
Quality
-
-
-
-
-
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_voice.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_voice.xml
index 1ec3fcd..fc9b6cd 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_voice.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_voice.xml
@@ -55,7 +55,7 @@
-
Browser Cache:
-
-
-
--
cgit v1.1
From 2e2c0f3ce7a9c1781530734ee38c6b3f7ba4cc79 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Thu, 2 Sep 2010 00:37:07 -0700
Subject: Fixed layout of Local Chat window
---
.../newview/skins/default/xui/en-us/floater_chat_history.xml | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml b/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml
index 2e6fee4..87e1dae 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml
@@ -65,7 +65,7 @@
Control your camera
-
@@ -76,10 +76,10 @@
+ DicDownloadBaseURL
+
+ Comment
+ Base url for download dictionaries
+ Persist
+ 1
+ Type
+ String
+ Value
+ http://www.imprudenceviewer.org/app/dics/
+
EmeraldEnableAutoCorrect
Comment
diff --git a/linden/indra/newview/lggdicdownload.cpp b/linden/indra/newview/lggdicdownload.cpp
index bd383e2..5b8b13a 100644
--- a/linden/indra/newview/lggdicdownload.cpp
+++ b/linden/indra/newview/lggdicdownload.cpp
@@ -44,6 +44,7 @@
#include "llcombobox.h"
#include "llview.h"
#include "llprefsadvanced.h"
+#include "llviewercontrol.h"
#include "llhttpclient.h"
#include "llbufferstream.h"
@@ -128,8 +129,8 @@ void lggDicDownloadFloater::onClickDownload(void* data)
{
index--;
std::string newDict(self->sNames[index]);
- LLHTTPClient::get("http://www.imprudenceviewer.org/app/dics/"+newDict+".aff", new EmeraldDicDownloader(self,newDict+".aff"));
- LLHTTPClient::get("http://www.imprudenceviewer.org/app/dics/"+newDict+".dic", new EmeraldDicDownloader(NULL,newDict+".dic"));
+ LLHTTPClient::get(gSavedSettings.getString("DicDownloadBaseURL")+newDict+".aff", new EmeraldDicDownloader(self,newDict+".aff"));
+ LLHTTPClient::get(gSavedSettings.getString("DicDownloadBaseURL")+newDict+".dic", new EmeraldDicDownloader(NULL,newDict+".dic"));
LLButton* butt = self->getChild("Emerald_dic_download");
if(butt)
diff --git a/linden/indra/newview/lgghunspell_wrapper.cpp b/linden/indra/newview/lgghunspell_wrapper.cpp
index ff5a3d0..5879bac 100644
--- a/linden/indra/newview/lgghunspell_wrapper.cpp
+++ b/linden/indra/newview/lgghunspell_wrapper.cpp
@@ -503,7 +503,7 @@ void lggHunSpell_Wrapper::setNewDictionary(std::string newDict)
myHunspell = new Hunspell(dicaffpath.c_str(),dicdicpath.c_str());
llinfos << "Adding custom dictionary " << llendl;
createCustomDic();
- addDictionary("emerald_custom");
+ addDictionary("custom");
std::vector toInstall = getInstalledDicts();
for(int i =0;i<(int)toInstall.size();i++)
addDictionary(toInstall[i]);
@@ -513,7 +513,7 @@ void lggHunSpell_Wrapper::setNewDictionary(std::string newDict)
void lggHunSpell_Wrapper::createCustomDic()
{
std::string filename(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,
- "dictionaries", "emerald_custom.dic"));
+ "dictionaries", "custom.dic"));
if(!gDirUtilp->fileExists(filename))
{
llofstream export_file;
@@ -527,7 +527,7 @@ void lggHunSpell_Wrapper::addWordToCustomDictionary(std::string wordToAdd)
{
if(!myHunspell)return;
myHunspell->add(wordToAdd.c_str());
- std::string filename(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries", "emerald_custom.dic"));
+ std::string filename(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries", "custom.dic"));
std::vector lines;
if(gDirUtilp->fileExists(filename))
{
@@ -847,7 +847,7 @@ void lggHunSpell_Wrapper::getMoreButton(void * data)
{
std::vector shortNames;
std::vector longNames;
- LLSD response = LLHTTPClient::blockingGet("http://www.imprudenceviewer.org/app/dics/dic_list.xml");
+ LLSD response = LLHTTPClient::blockingGet(gSavedSettings.getString("DicDownloadBaseURL")+"dic_list.xml");
if(response.has("body"))
{
const LLSD &dict_list = response["body"];
@@ -866,16 +866,14 @@ void lggHunSpell_Wrapper::getMoreButton(void * data)
}
void lggHunSpell_Wrapper::editCustomButton()
{
- std::string dicdicpath(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries", std::string("emerald_custom.dic")).c_str());
-
- std::vector lines;
-
+ std::string dicdicpath(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries", std::string("custom.dic")).c_str());
+
if(!gDirUtilp->fileExists(dicdicpath))
{
- createCustomDic();
- //glggHunSpell->addWordToCustomDictionary("temp");
+ createCustomDic();
+ //glggHunSpell->addWordToCustomDictionary("temp");
}
-
+
gViewerWindow->getWindow()->ShellEx(dicdicpath);
}
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
index 74ea621..857d1f1 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
@@ -162,9 +162,9 @@
-
- -->
+
To spellcheck, right click a misspelled word
(red or not) and click on its replacement
--
cgit v1.1
From b298c7b918e09249632168e9eb0154c2fa7e9a8a Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Thu, 2 Sep 2010 02:03:15 -0700
Subject: Changed notification from 'Emerald Help' to something more
descriptive
---
linden/indra/newview/skins/default/xui/en-us/notifications.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/notifications.xml b/linden/indra/newview/skins/default/xui/en-us/notifications.xml
index 9952d25..0de1df5 100644
--- a/linden/indra/newview/skins/default/xui/en-us/notifications.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/notifications.xml
@@ -7063,7 +7063,7 @@ To use a command, type it in your chat bar (Local Chat) and press enter.
To Spell Check a word, right click on it and choose its replacement.
--
cgit v1.1
From 3fe17b6bbdbb6cdbe811e43f72394e2f6ba482cd Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Thu, 2 Sep 2010 13:05:34 -0700
Subject: Applied patch by Damian Delacrois for VWR-10592: sounds not working
when running multiple instances
---
linden/indra/llaudio/audioengine.cpp | 3 +++
linden/indra/llaudio/audioengine_openal.cpp | 2 +-
linden/indra/llaudio/llaudiodecodemgr.cpp | 7 +++++--
3 files changed, 9 insertions(+), 3 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/llaudio/audioengine.cpp b/linden/indra/llaudio/audioengine.cpp
index 7cec920..728f054 100644
--- a/linden/indra/llaudio/audioengine.cpp
+++ b/linden/indra/llaudio/audioengine.cpp
@@ -1892,6 +1892,9 @@ bool LLAudioData::load()
gAudiop->cleanupBuffer(mBufferp);
mBufferp = NULL;
+ // Maybe it was removed by another instance. Send it to the preload queue.
+ gAudiop->preloadSound(mID);
+
return false;
}
mBufferp->mAudioDatap = this;
diff --git a/linden/indra/llaudio/audioengine_openal.cpp b/linden/indra/llaudio/audioengine_openal.cpp
index b4eed57..84305f0 100644
--- a/linden/indra/llaudio/audioengine_openal.cpp
+++ b/linden/indra/llaudio/audioengine_openal.cpp
@@ -109,7 +109,7 @@ bool LLAudioEngine_OpenAL::init(const S32 num_channels, void* userdata)
ALCdevice *device = alcGetContextsDevice(alcGetCurrentContext());
alcGetIntegerv(device, ALC_MAJOR_VERSION, 1, &major);
- alcGetIntegerv(device, ALC_MAJOR_VERSION, 1, &minor);
+ alcGetIntegerv(device, ALC_MINOR_VERSION, 1, &minor);
llinfos << "ALC version: " << major << "." << minor << llendl;
llinfos << "ALC default device: "
diff --git a/linden/indra/llaudio/llaudiodecodemgr.cpp b/linden/indra/llaudio/llaudiodecodemgr.cpp
index 399adf5..afb3c33 100644
--- a/linden/indra/llaudio/llaudiodecodemgr.cpp
+++ b/linden/indra/llaudio/llaudiodecodemgr.cpp
@@ -631,8 +631,11 @@ BOOL LLAudioDecodeMgr::addDecodeRequest(const LLUUID &uuid)
if (gAssetStorage->hasLocalAsset(uuid, LLAssetType::AT_SOUND))
{
- // Just put it on the decode queue.
- mImpl->mDecodeQueue.push(uuid);
+ // Just put it on the decode queue if it's not already.
+ if (!mImpl->mDecodeQueue.checkData(uuid))
+ {
+ mImpl->mDecodeQueue.push(uuid);
+ }
return TRUE;
}
--
cgit v1.1
From 5ccb564d3602642a2e9a3bda78b2db4a2e425e1c Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Thu, 2 Sep 2010 13:13:56 -0700
Subject: Replaced Emerald's dict with one by us: en_sl.dic, licensed under the
GPLv2
---
.../newview/app_settings/dictionaries/en_sl.dic | 12456 +++----------------
1 file changed, 1691 insertions(+), 10765 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/dictionaries/en_sl.dic b/linden/indra/newview/app_settings/dictionaries/en_sl.dic
index c9048ee..9060f79 100644
--- a/linden/indra/newview/app_settings/dictionaries/en_sl.dic
+++ b/linden/indra/newview/app_settings/dictionaries/en_sl.dic
@@ -1,10895 +1,1821 @@
-10894
-rez
-slex
-slutorial
-ruth
-ruthing
-rezzing
-lag
-prim
-anim
-anims
-noob
-noobie
-slurl
-flexi
-sculptmap
-sim
-opensim
-greenlife
-openmetaverse
-onrez
-wiki
-aditi
-agni
-alt
-freebie
-tech
-mod
-bling
-banline
-banlines
-blog
-blogger
-gteam
-goo
-griefer
-griefing
-havok
-havok4
-homestead
-campie
-chim
-lag
-coalesced
-indra
-invisiprim
-infohub
-jpeg2000
-kdu
-kakadu
-landmark
-liason
-lindex
-estate
-fmod
-facelight
-megaprim
-mono
-mouseview
-mouselook
-neko
-occlusion
-ogg
-vorbis
-firefox
-online
-offline
-openspace
-orbiter
-parcel
-primitar
-quaternion
-resi
-showcase
-skybox
-slebrity
-sliders
-snowglobe
-spacenavigator
-spam
-stipend
-teleport
-tos
-tier
-uuid
-unlink
-uberexplorer
-vollee
-windlight
-yiff
-X-Axis
-Y-Axis
-Z-Axis
-Aabye
-Allen
-Amat
-Anatine
-Asbrink
-Auer
-Babenco
-Babii
-Bade
-Bailey
-Balczo
-Ballinger
-Balogh
-Balut
-Bamaisin
-Barbosa
-Barthelmess
-Barzane
-Basevi
-Beattie
-Beaumont
-Bechir
-Beck
-Beerbaum
-Bekkers
-Benelli
-Beresford
-Biedermann
-Bikcin
-Binder
-Bing
-Bingyi
-Blachere
-Bleac
-Boa
-Bonetto
-Boucher
-Bracken
-Broek
-Broome
-Burt
-Bury
-Canning
-Capalini
-Carfagno
-Carlberg
-Carnell
-Carter
-Catteneo
-Cazalet
-Ceawlin
-Chaffe
-Choche
-Cioc
-Clary
-Coage
-Coakes
-Collas
-Congrejo
-Cortes
-Dagger
-Dagostino
-Daviau
-Debevec
-Decosta
-DeCuir
-Demina
-Dench
-Despres
-Dinzeo
-Docherty
-Dollinger
-Dovgal
-Dryke
-Ducatillon
-Dyrssen
-Ebbage
-Edman
-Eilde
-Emmons
-Enoch
-Etchegaray
-Etzel
-Ewing
-Falta
-Fargis
-Faulds
-Fegte
-Ferraris
-Fimicoloud
-Flanagan
-Foden
-Forcella
-Forder
-Forwzy
-Fredriksson
-Fride
-Furse
-Garrigus
-Gausman
-Gazov
-Giha
-Graves
-Greggan
-Grut
-Gufler
-Gustafson
-Guyot
-Gynoid
-Habercom
-Halasy
-Halderman
-Hammerer
-Handrick
-Hapmouche
-Harrop
-Hax
-Heberle
-Heckroth
-Helgerud
-Heron
-Hienrichs
-Hifeng
-Hird
-Hirons
-Hirvi
-Holmer
-Homewood
-Hoorenbeek
-Hotaling
-Huet
-Huldschinsky
-Hultcrantz
-Humby
-Humphreys
-Hykova
-Hynes
-Hyun
-Igaly
-Ihnen
-Ireton
-Iuga
-Jacobus
-Jansma
-Janus
-Jewell
-Jie
-Johin
-Jun
-Juran
-Kamachi
-Kappler
-Karas
-Katscher
-Kidd
-Klaar
-Klees
-Koba
-Koenkamp
-Kohime
-Kohnke
-Korhonen
-Korobase
-Kuhn
-Kungler
-Kurka
-Lane
-Larsson
-Laryukov
-Laval
-Lednev
-Lilliehook
-Ling
-Lisle
-Loon
-Lowey
-Lubitsch
-Lundquist
-Lusch
-Lykin
-Lytton
-Maertens
-Maktoum
-Mannonen
-Martinek
-Martynov
-Masala
-Mathy
-Matova
-Mayo
-McMahon
-McMillan
-Meili
-Melnik
-Menges
-Meriman
-Merlin
-Mertel
-Messmer
-Mielziner
-Miles
-Milev
-Mills
-Mizser
-Mokeev
-Morigi
-Munro
-Nagy
-Negulesco
-Nemeth
-Nikolaidis
-Nishi
-Noel
-Oh
-Oppewall
-Oyen
-Paine
-Palen
-Panacek
-Papp
-Peccable
-Pennell
-Pera
-Perfferle
-Pessoa
-Petrov
-Pfeffer
-Philbin
-Piek
-Pinion
-Pintens
-Planer
-Platthy
-Qinan
-Qunhua
-Rang
-Rasmuson
-Rau
-Raymaker
-Recreant
-Rehula
-Reifsnider
-Repine
-Rhode
-Riederer
-Robbiani
-Rodenberger
-Roelofs
-Roffo
-Ronmark
-Rosca
-Rossini
-Rotaru
-Runo
-Saenz
-Sands
-Sautereau
-Schnyder
-Schridde
-Schumann
-Seiling
-Sewell
-Shan
-Shepherd
-Shilova
-Sicling
-Singh
-Sirbu
-Slade
-Snook
-Soderstrom
-Sperber
-Spitteler
-Staheli
-Starostin
-Stenvaag
-Straaf
-Streeter
-Swindlehurst
-Szondi
-Takacs
-Tammas
-Tatham
-Taurog
-Tenk
-Theas
-Tomsen
-Torok
-Tripsa
-Uggla
-Ultsch
-Umarov
-Upshaw
-Uriza
-Vella
-Villota
-Vollmar
-Voom
-Vuckovic
-Watanabe
-Waydelich
-Whitfield
-Wiefel
-Winkler
-Woodget
-Writer
-Wuyts
-Yalin
-Yifu
-Yiyuan
-Yoshikawa
-Zabelin
-Zapedzki
-Zehetbauer
-Zenovka
-Chung
-Spade
-Jones
-Taylor
-Cardway
-Liebknecht
-Leinhardt
-Semyorka
-Oxide
-Vanbeeck
-Draken
-Ra
-Kato
-Voss
-Federal
-Lassally
-Schlesinger
-Reisler
-Friedkin
-Paderborn
-Brennon
-Cummings
-Quaranta
-Hrachov
-Lindman
-Carripook
-Foss
-Kepler
-Meerson
-Usher
-Alcott
-Soderberg
-Henley
-Garden
-Leonard
-Mosuke
-Qi
-Tyson
-Ogee
-Laramide
-Subagja
-Ogg
-Wijaya
-Priestman
-Hiten
-Sabre
-Ginsberg
-Renegade
-Rolls
-Foulon
-Laborde
-Hienke
-Rosetta
-Reinert
-Glasgow
-Beleza
-Medusa
-Grebe
-Gaspara
-Harrison
-Mascot
-Muni
-Sodwind
-Grigges
-Independent
-Renoir
-Penokea
-Kazan
-Wildcat
-Felix
-Houston
-Biziou
-Swot
-Tizona
-Petronius
-Moriarty
-Antler
-Surtees
-Sternberg
-Mouroutsos
-Magellan
-Munich
-Montpark
-Mulligan
-Vanguard
-Greenberg
-Rahja
-Professor
-Cao
-Paisley
-Goldblatt
-Souter
-Ayakashi
-Yareach
-Sungsoo
-Medby
-Birmingham
-Maddaloni
-Pyle
-Brooks
-Oregon
-Geiger
-Palliard
-Paul
-Perenti
-Taira
-Lamatia
-Gundersen
-Ersetu
-Figgis
-Richez
-Gray
-Piccard
-Figaro
-Fitzgerald
-Michinaga
-Manga
-Swenholt
-Hallard
-Fonda
-Stardust
-Knibber
-Zhaoying
-Brody
-Polano
-Tibbett
-Mincemeat
-Columbino
-Marsi
-Gunawan
-Brenner
-Branagh
-Klata
-McElroy
-Vernon
-Pixel
-Tracy
-Zemlja
-Nakamura
-Ferrer
-Spark
-Meijer
-Sinatra
-Bergson
-Wertmuller
-Moyer
-Longstaff
-Malick
-Ritt
-Fadoodle
-Mathieson
-Sandial
-Bode
-Stockton
-Bagration
-Lutetia
-Beaton
-Colonel
-Shamroy
-Sonic
-Marama
-Schaffner
-Heideman
-Tendaze
-Lesnie
-Altamura
-Frangilli
-Saintlouis
-Regent
-Kerensky
-Moana
-Schroeder
-Oliva
-Boyd
-Yip
-Lasek
-Beauchamp
-Xi
-Andree
-Gallacher
-Burks
-Primbee
-Frantisek
-Westinghouse
-Cormer
-Rockin
-Onmura
-Bumstead
-Jorda
-Plubeau
-Goldenberg
-Chestnut
-Senyurt
-Meiklejohn
-Siodmak
-Josten
-Cooke
-Crabgrass
-Weizhen
-Rousselot
-Frederix
-Yohogania
-Sellers
-Bartz
-Pakula
-Voyager
-Vidor
-Rehnquist
-Ouachita
-Islander
-Bouras
-Harvey
-Werribee
-Mehring
-Alexandre
-Goalpost
-Zhang
-Kurosawa
-Lerwick
-Becloud
-Lean
-Greatrex
-Poplin
-Bates
-Laxness
-Calliope
-Preminger
-Thielt
-Pidgeon
-Ackland
-Ahn
-Zanetti
-Lancaster
-Soothsayer
-Halleck
-Ofarrel
-Steuart
-Stovall
-Tower
-Fiddlesticks
-Lambeau
-Vandyke
-Benigni
-Sleaford
-McCudden
-Rotunno
-Quentin
-McLaglen
-Gulick
-Greene
-Gulaev
-Bright
-Haigh
-Cremorne
-Box
-Serrurier
-Kearny
-Sheridan
-Lowell
-Mathilde
-Bosch
-Scamper
-Koltai
-Alito
-Lachman
-Fraisse
-Leigh
-Hafner
-Clave
-Halberd
-Kaminski
-Storaro
-Colman
-Urbanowicz
-Feingold
-Portola
-Ulich
-Sampaio
-Schnabel
-Minnelli
-Berblinger
-Surya
-Vandeperck
-Metty
-Lopez
-Woodward
-Brendel
-Shuftan
-Rossen
-Nichols
-Vieria
-Marvin
-Swain
-Zhukovsky
-Wexler
-Beltran
-Barnes
-Hennah
-Hern
-Rovio
-Ondricek
-Solomon
-Ayres
-Novikov
-Cannned
-Legend
-Ikarus
-Clatworthy
-Fapp
-Creber
-Fraina
-Milland
-Amsterdam
-Nordwind
-Seungmo
-Hiller
-Humphrey
-Pau
-Okey
-Hennesy
-Posthorn
-Ricardo
-Fussbudget
-Neher
-Valeeva
-Kish
-Northmead
-Moo
-Buckler
-Francis
-Carr
-McCarey
-Horwitz
-Nyle
-Gabreski
-Truffaut
-Remblai
-Drayman
-Pedro
-Bogdanovich
-Crispien
-Phlox
-Vilas
-Palmer
-Stallion
-Whitman
-Flintoff
-Sempati
-Ah
-Lukas
-Clift
-Malle
-Rydell
-Stonewall
-Gleeson
-Clutterbuck
-Stradling
-Hian
-Celt
-Hogfather
-Hawkeye
-Lemmon
-Kasei
-Bisiani
-Burgess
-Vansant
-McLeod
-Koken
-Carnot
-Moller
-Columbo
-Schnook
-Kubrick
-Flintlock
-Yates
-Lamont
-Shinja
-Shenlin
-Ichigo
-Fontaine
-Heston
-Bourgoin
-Scheflo
-Horsefly
-Lehtovaara
-Skjellerup
-Mantis
-Belford
-Krasker
-Wind
-Seymour
-Vanvleck
-Tungl
-Minghuang
-Tureaud
-Lanate
-Esposito
-Germi
-Elderslie
-Voight
-Gardiner
-Antonelli
-Bucyk
-Glineux
-Batz
-Vellhi
-Food
-Smadga
-Carthage
-Fukai
-Talaj
-Jarvis
-Hanni
-Frankton
-Molinaro
-Spire
-Ellsworth
-Poitier
-Hessely
-Haworth
-Woolley
-Olivier
-Emoto
-Quellmalz
-Jung
-Roizman
-Whitcroft
-Taov
-Reiner
-Tuncsik
-Perinal
-Mersereau
-Lacey
-Misfit
-Bulan
-Vielle
-Flossberg
-Lyon
-Giotto
-Market
-Parker
-Vanalten
-Rennahan
-Haifisch
-Aster
-Friis
-Foil
-Bombast
-Parisi
-Wheeler
-Pace
-Lustre
-Salomon
-Soon
-Connell
-Newall
-Ibbetson
-Albert
-Claymore
-Bluecoat
-Legion
-Coen
-Curtiz
-Susanti
-Connolly
-Ames
-Robledo
-Morgridge
-Theriac
-Ozsvar
-Birke
-Sohmers
-Boronski
-Vallejo
-Tizzy
-Holder
-Glenville
-Wilson
-Replacement
-Stotz
-Silverstar
-Bishop
-Aldrich
-Hullabaloo
-Howard
-Balhaus
-Novi
-Redgrave
-Trollop
-Tulip
-Paravane
-Zhao
-Fairymeadow
-Zeta
-Freund
-Boardwalk
-Hanson
-Rozier
-Connoisseur
-Hansup
-Cochrane
-Hitchcock
-Peterman
-Quine
-Helios
-Foton
-Ulysses
-Gollob
-Student
-Esparza
-Zinner
-Antfarm
-Lumet
-Haas
-Otaared
-Santos
-Bourne
-Trautman
-Agnomen
-Cagney
-Pugilist
-Noarlunga
-Hollwood
-Finney
-Folsom
-Chaplin
-Bertrand
-Quijote
-Rimbaud
-Ambrose
-Travanti
-Brouwer
-Fossett
-Welles
-Cork
-Prieto
-Halley
-Mollor
-Borgnine
-Malibu
-Seaton
-Ellison
-Abruzzo
-Lederberg
-Camilo
-Hera
-Triskaidekaphobia
-Sabena
-Odell
-Bartlett
-Antonioni
-Seelowe
-Ranger
-Smagulov
-Ginsburg
-Chang
-Emert
-Tae
-Yue
-Cleanslate
-Frascati
-Nereus
-Guffey
-Couffer
-Thirroul
-Loyton
-Cordeaux
-Gapchenko
-Andric
-Fujita
-Antwerp
-Kline
-Ascot
-Ruttenberg
-Ochs
-Innis
-Garfield
-Paike
-Corleone
-Stine
-Impfondo
-Matterhorn
-Ivory
-Mankiewicz
-Bulubate
-Noonan
-Leavitt
-Pontecorvo
-Sao
-Almendros
-Sumbula
-Cheney
-Lomba
-Bournemouth
-Wise
-Furst
-Hedrick
-Nomura
-Weir
-Lynch
-Chevalier
-Edelman
-Tuttle
-Meng
-Millionsofus
-Marseille
-Krugman
-Virtanen
-Fangio
-Potato
-Franchini
-Garmes
-Li
-Lehman
-Robson
-Cukor
-Wiles
-Burroughs
-Toll
-Courier
-Yao
-Falcon
-Lorenz
-Hansen
-Kotobide
-Bergbahn
-Waverley
-Link
-Finucane
-Laughton
-Ferlinghetti
-Visconti
-Sturges
-Tidewater
-Payne
-Chezquiz
-Laszlo
-Lovell
-Moody
-Cosmos
-Haller
-Milestone
-Niven
-Holgado
-March
-Widget
-Grizot
-Gerhadsen
-Skall
-Drumheller
-Forager
-Arnot
-Fluno
-Auk
-Hallstrom
-Arkin
-Maculate
-Muse
-Albion
-Ramos
-Conover
-Burleigh
-Mommsen
-Chengpang
-Glimmer
-Redhill
-Luthardt
-Erskine
-Fulham
-Hofmann
-Spearmann
-Cronon
-Buchanan
-Massey
-Borrelly
-Haskell
-Flyer
-Commander
-Cicerone
-Dale
-Leroux
-Frye
-Tani
-Jya
-Something
-Stoklitsky
-Ellis
-Krogstad
-Snookums
-Gasser
-Fisseux
-Snye
-DuPont
-Burns
-Lilienthal
-Smirnov
-Moorhen
-Dye
-Pikajuna
-Paperclip
-Hutton
-Looby
-Bu
-Messlee
-Nordlicht
-LeSuere
-Sobocinski
-Hock
-Gladstone
-Mariani
-Guerrero
-Huffhines
-Tzara
-Gagliano
-Triangle
-Menjou
-Braendle
-Latynina
-Ur
-Vandeverre
-Turas
-Yesheyev
-Steins
-Argus
-Jaehun
-Eddy
-Queso
-Oktomica
-Chambers
-Shabazz
-Cassavetes
-Colasanti
-Jamberoo
-Margetts
-Fabre
-Hajtos
-Muggleston
-Gagarin
-Numbers
-Yosuke
-Braver
-Skosh
-Handayani
-Willsmere
-Yugen
-Marellan
-Pulford
-Petrel
-Fosse
-Hildyard
-Hartunian
-Yellowjacket
-Griswold
-Pey
-Deharo
-Sanchez
-Sterling
-Giugiaro
-Delec
-Brannan
-Biniak
-Tuck
-Rope
-Gao
-Goddard
-Utarid
-Spork
-Biddle
-Arliss
-Cassini
-Apocalypse
-Zeffirelli
-Hawthorne
-Hazlehurst
-Snyder
-Cheeky
-Wyler
-Georgette
-Simons
-Bogan
-Corkscrew
-Sonoda
-Steiner
-Kesey
-Quaggy
-Sciurus
-Elwro
-Keen
-Howell
-Zeme
-Attenborough
-Butuzova
-Wigner
-Warrior
-Evans
-Kwon
-Ondeko
-Finsbury
-Geewhiz
-Brando
-Bobak
-Mercier
-Schuck
-Kagekiyo
-Ay
-Abramovich
-Darkes
-Ross
-Crawford
-Thibaud
-Maloney
-Frampton
-Nohkan
-Braathens
-Lazarno
-Talon
-Butoh
-Raabe
-Fuosing
-Allard
-Rigaud
-Mandelbrot
-Brennen
-Amadeus
-Zetkin
-Otterson
-Malthus
-Pilipenko
-Guynemer
-Scarfiotti
-Traveler
-Sikorsky
-LeShelle
-Pfohl
-Peterson
-London
-Godwin
-Ingmann
-Eliot
-Otoole
-Rident
-Clancy
-Farrell
-Cannonball
-Descenna
-Boyington
-Tamale
-Paragon
-Chernov
-Peckham
-Bouchard
-Bristol
-Schulze
-Gilks
-Cramer
-Cronenwerth
-Irvine
-Lupino
-Benedek
-Baverel
-Serdyuk
-Kubarev
-Milano
-Kammerer
-Reisman
-Voltaire
-Hoyer
-Toluboff
-Rothlisberger
-Jeffries
-Sylbert
-Tadanori
-Machin
-Csak
-Surveryor
-Goosson
-Niangao
-Kenzo
-Cathcart
-Crossair
-Maroon
-Tzedek
-Walker
-Iddinja
-Jonze
-Dal
-Torres
-Styrian
-Quonset
-Pokryshkin
-Fats
-Crosby
-DeVinna
-Gaudio
-Siegel
-Delpaso
-Commons
-Foxchase
-Diage
-Spear
-Comet
-Damask
-Uralia
-Yuequi
-Piedpiper
-Partch
-Drum
-Asp
-Sturm
-Minton
-Fitzroy
-Rhino
-Shu
-Watkin
-Paster
-Biondetti
-Moraff
-Orca
-Ehrler
-Day
-Jookerie
-Pippen
-Audina
-Puhakka
-Pogelmann
-Simonds
-Oranos
-Gaea
-Meness
-Lauridsen
-Barley
-Fellini
-Swayne
-Krasopani
-Atkey
-Foxley
-Grant
-Platypus
-Curtiss
-Losaberidze
-Lok
-Zolnir
-Scanlan
-Larkin
-Cusack
-Welch
-Manbi
-Tinlegs
-Gerard
-Bumi
-Bohm
-Veranes
-Zaoh
-Castro
-Shenley
-Hawes
-Roar
-Switchblade
-Terry
-Coffey
-Sunnyside
-Whitehead
-Beeks
-Selfridge
-Zhichao
-Zheng
-Copeland
-Clifton
-Lelouch
-Nilsson
-Zebaki
-Paterson
-Kiernan
-Pan
-Donat
-Semple
-Lombardi
-Zeevi
-Bamboo
-Reynolds
-Mimistrobell
-Calhern
-Crimson
-Dodonpa
-Hermano
-Keats
-Woebegone
-Toland
-Sellery
-Levi
-Ringo
-Nebestanka
-Maxsted
-Lingiuan
-May
-Mensing
-Roughneck
-Shams
-Boehm
-Grimes
-Aska
-Bearcat
-Sadovnycha
-Cardiff
-Hasp
-Allandale
-Shingleton
-Asano
-Jericho
-Xinpeng
-Gibb
-Bender
-Potkova
-Kit
-Hodgson
-Zwerling
-Kraft
-Bumbo
-Bakhtar
-Moonsoo
-Granville
-Gassner
-Punchinello
-Morang
-Roeth
-Trilling
-Ashby
-Abismo
-Beebe
-Morahan
-Moose
-Bigdipper
-Lehmann
-Idziak
-Burnham
-Daehlie
-Tadashiro
-Dieffenbach
-Tavoularis
-Yakan
-Ryder
-Kivert
-Ishii
-Bremser
-Coswell
-Larg
-Helvetic
-Stindberg
-Daldry
-Harlow
-Goldflake
-Wellman
-Goode
-Maximov
-McConachie
-Hye
-Golitzen
-Caliber
-Yaseotoko
-Saltwater
-Hoggard
-Avalanche
-Malaprop
-Suen
-Welty
-Woodbury
-Moskvitch
-Dobropan
-Darrest
-Story
-McFly
-Bayoumi
-Express
-Peck
-Junge
-Artizar
-Pontchartrain
-Zinnemann
-Dod
-Korda
-Phillip
-Pollock
-Gervasi
-Merilouto
-Waldman
-Stringer
-Klubov
-Loudon
-Sol
-Juutilainen
-Vacirca
-Sunbelter
-Kiwi
-Jenns
-Polgase
-Schlag
-Goombah
-Petty
-Curry
-Cordoso
-Melendez
-Flamand
-Wunderlich
-Leavenworth
-Temin
-Picket
-Komparu
-Gherardi
-Boyle
-Olbers
-Bolero
-McAllister
-Geest
-Schildhauer
-Tuppakaka
-Carmona
-Gritzi
-Sternad
-Mesyats
-Laasonen
-Kuramoto
-Pippita
-Dahlstrom
-Blackthorne
-Ribble
-Heita
-Eriksen
-Gymnast
-Boyau
-Dumont
-Gylling
-Swamphen
-Ares
-McKinney
-Galiazzo
-Kyger
-Leven
-Nurmi
-Bombacci
-Karami
-James
-Whorfin
-Saarinen
-Trimble
-Wilder
-Rockett
-Lagan
-Grigg
-Spinotti
-Zond
-Wheeling
-Grumiaux
-Balatron
-Zucker
-Vostok
-Wunderland
-Perreault
-Lamourfou
-Paslong
-Herouin
-Pieck
-Blazer
-Flannery
-Tantalus
-Luo
-Shermer
-Breaker
-McNally
-Fate
-Quinn
-Silvera
-Alphabeta
-Arcadia
-Pattle
-Mabellon
-Sputnik
-Nowicka
-Mendes
-Onomatopoeia
-Kittel
-Jibilla
-Digital
-Lyndhurst
-Thewphaingarm
-Creeley
-Tamura
-Delcon
-Beisswenger
-Theeuwes
-Reddevil
-Lucerne
-Yeuxdoux
-Revolution
-Ransford
-Glume
-Canto
-Douglas
-Brewer
-Idler
-Dengaku
-Longcloth
-Laws
-DeSantis
-Viking
-Barbour
-Lubezki
-Actil
-Lonergan
-Maslow
-Rosse
-Laa
-Wake
-Hayabusa
-Scaggs
-Eguzkia
-Guffroy
-Helsinki
-Backer
-Alder
-Chadbourne
-Swanson
-Sixpack
-Abel
-Maddux
-Boorman
-Elcar
-Bourjade
-Pak
-Slippery
-Rezillo
-Pro
-Knight
-Cranes
-Culdesac
-Eagleburger
-Kelley
-Delgado
-McGuire
-Merricks
-Eckersley
-Pomegranate
-Cornwall
-Heavy
-Montale
-Beery
-Paean
-Krasner
-Sevier
-Fleury
-Robbins
-Forman
-Desoto
-Crabe
-Stella
-Pole
-Reve
-Mohr
-Packbiers
-McAlpine
-Loll
-Delbonnel
-Winnfield
-Bellambi
-Bonne
-Spotter
-Priestly
-Dowd
-Nixdorf
-Jervil
-Racer
-Heart
-Gantenbein
-Otafuku
-Boram
-Potvin
-Stuart
-Labrada
-Wombarra
-Welders
-Spicer
-Giovinazzo
-Melnitz
-Kleene
-Rail
-Roskopp
-Ferguson
-Kwak
-Salubrius
-Malone
-Gunes
-Fushikizoh
-Ronzoni
-Gilmour
-Hefferman
-Petion
-Palowakski
-Mariner
-Newbold
-Phobos
-Cimino
-Whittaker
-Hesse
-Pitney
-Wilber
-Jedburgh
-Hooper
-Wardhani
-Weyland
-Breck
-Yetto
-Rosher
-Pahute
-Dowren
-Ariel
-Slazar
-Galsworthy
-Kaufman
-Kondo
-Kozhedub
-Kobolowski
-Elswit
-Eponym
-Melville
-Rearwin
-Muldoon
-Lunt
-Rootes
-Gastel
-Pinkenba
-Senior
-Marbles
-Pike
-Hendrawan
-Penguin
-Aero
-Alucinakis
-Rickenbacker
-Daniels
-Todriya
-Harley
-Cloetens
-Lunardi
-Howe
-Prinz
-Sihtu
-Irwin
-Gough
-Podolsky
-Riptide
-Spijkers
-Herzbrun
-Pilote
-Peralta
-Pegoud
-Losangeles
-Schertzinger
-Dowler
-Dancer
-Morenz
-Doboy
-Bunour
-Rothschild
-Schwartzman
-Mastroianni
-Vale
-Newcomb
-Skookum
-Gill
-Cascabel
-Patpa
-Ashton
-Demontrond
-Khorana
-Zemach
-Venkman
-Pawlowski
-Mulberry
-Mansbridge
-Kumsung
-Okina
-Grockle
-Pekli
-Atlantis
-Yongho
-Kayamanu
-Jang
-Heike
-Tinsley
-Morgenrote
-Kabuki
-Battery
-Dilweg
-Jester
-Soleil
-Pencer
-Maersk
-Parrott
-Damdin
-Althouse
-Tackleberry
-Beckham
-Boogiewoogie
-Nungesser
-Yaud
-Valentine
-Bert
-Kyogen
-Dibou
-Krams
-Edgeworth
-Hickman
-Allstar
-Tripp
-Osumi
-Margulis
-Monstre
-Kyomoon
-Kaiousei
-Foyston
-Sutherland
-Picnic
-Steenbock
-Petshop
-Devoix
-Fassnacht
-Grommet
-Gibbons
-Dolgov
-Longduk
-Dreier
-Eun
-Ratelle
-Ebi
-Delebat
-Dorn
-Berger
-Yongbo
-Pooraka
-Sandell
-Kiebach
-Pertelson
-Delphin
-Sucettes
-Pascale
-Dukes
-Ironclad
-Kuttelwascher
-Wakaonna
-Carbenell
-Wei
-Wikinger
-Fierrens
-Vesta
-Plymouth
-Gamba
-Poutine
-Langwarrin
-Thunders
-Graf
-Stoneage
-Bertolucci
-Wanweird
-Panhandle
-Bissell
-Geary
-Gontyuk
-Bedlam
-Showboat
-Superior
-Breyer
-Cleaver
-Moy
-Suising
-Vanmoer
-Stroganoff
-Ariantho
-Nagorski
-Richter
-Dynamo
-Slocombe
-Zymurgy
-Kurrajong
-Zadeh
-Scaife
-Wopat
-Leisen
-Gregory
-Egoyan
-Jannings
-Mapp
-Hannya
-Zarf
-Sawley
-Kuncoro
-Rechkalov
-Doigts
-Charlan
-Philgarlic
-Beaver
-Nelson
-Foo
-Husky
-Polanski
-Spitz
-Lawl
-Borchovski
-Jacks
-Defiant
-Baldwin
-Plunkett
-Hush
-Trenton
-Garros
-Soyuz
-Carpenter
-Nowotny
-Dixon
-Padgett
-Carroll
-Lyne
-Jurgis
-Ewry
-Bandit
-Ning
-Supply
-Tir
-Oto
-Perhaps
-Yohkoh
-Aliev
-Tomcat
-Jua
-Schack
-Zamin
-Durant
-Nykvist
-Slunce
-Bossy
-Quisling
-Wachmann
-Hathaway
-Quimby
-Dingson
-Dunn
-Meehan
-Valiant
-Vacano
-Piranha
-Pharaoh
-Seitan
-Giove
-Howey
-Claxton
-Springvale
-Mu
-Interflug
-Obscure
-Niles
-Kincess
-Pye
-Korro
-Serapis
-Druart
-Cerveau
-Poikolainen
-Rustamova
-Dae
-Lagerkvist
-Brewster
-Clyburn
-Shikami
-Calvert
-Slok
-Hartono
-Shui
-Kuri
-Source
-Mission
-Carbetta
-Hightower
-Emms
-Rhea
-Ratite
-Pierterson
-Alviso
-Cuddihy
-Wunderle
-Blackhawk
-Finn
-Beatty
-Maverick
-Milo
-Budich
-Bellah
-Oldbull
-Ferris
-Magneto
-Ramaty
-Olbracht
-Yost
-Plante
-Perkins
-Oumionna
-Bulldog
-Arnold
-Desideri
-Pitts
-Dean
-Juno
-Liddie
-Dobbs
-Olmstead
-Relph
-McKinley
-Proctor
-Mangaroon
-Perway
-Ludwig
-Hartmann
-Boelcke
-Vig
-Rolland
-Kawaguichi
-Biondi
-Kimban
-Falken
-Raveup
-Volare
-Horner
-Deadlight
-Coronet
-Newchurch
-Zwiers
-Wottitz
-Vestel
-Decatur
-Lawson
-Barrs
-Colossus
-Vox
-Stilman
-Milner
-Moxing
-Litvak
-Hinkle
-Hyland
-Glenbrook
-Prospero
-Kirshner
-Mainaky
-Zauberflote
-Starbrook
-Tornado
-Meek
-Soler
-Nastula
-Borel
-Koala
-Hermans
-Lacava
-Hoch
-Tao
-Duncan
-Joffe
-Slapstick
-Poindexter
-Pussycat
-Dielli
-Chippewa
-Few
-Musashi
-Zaius
-Omega
-Nerd
-Neva
-Anvil
-Whalen
-Balnarring
-Goodnight
-Goodfellow
-Cattaneo
-Trottier
-Lindsay
-Jetaime
-Frangible
-Warwick
-Barkkorn
-Driggs
-Ademeit
-Moraga
-Flute
-Ruggles
-Brennan
-Mannock
-Brissot
-Hegel
-Bunyip
-Sin
-Cournoyer
-Radius
-Thiebaud
-Loschmidt
-McKay
-Udet
-Hearn
-Zuhrah
-Rumey
-Lowe
-Joans
-Haul
-Stringfellow
-Mirrikh
-Jae
-Rall
-Frazer
-Moran
-Hawerchuk
-Utorid
-Lime
-Engebretsen
-Szuyuan
-Antelope
-Michalske
-Glenelg
-Darracq
-Woori
-Pony
-Whinstanes
-Yapungku
-Namanari
-Rakels
-Zeluco
-Taringa
-Field
-Wendell
-Raffke
-Pannotia
-Zsigmond
-Vasiliev
-Lipponen
-Dodge
-Reino
-Diplomat
-Armistice
-Phillips
-Aurinko
-Address
-Fenua
-Lahtinen
-Nimbus
-Brule
-Narrambi
-Lumpen
-Anzac
-Signals
-Submariner
-Lumley
-Bowman
-Octagon
-Noe
-Derby
-Immelmann
-Zambia
-Tsure
-Gainsbourg
-Merkur
-Dutton
-Standish
-Bian
-Bascom
-Stepanov
-Hua
-Eisbar
-Rojyo
-Munson
-Sparrow
-Dailey
-Tester
-Quality
-Pegler
-Beurling
-Makira
-Stubbs
-Goff
-Hayashida
-Tyron
-Scintilla
-Ely
-Niu
-Chowderhead
-Gisaku
-Ni
-Checker
-Jiang
-Cartwheel
-MacAlpine
-Winthorpe
-Alas
-Milton
-Damone
-Honua
-Wolfstein
-Bosshart
-Giles
-Jatho
-Bergman
-Clinquant
-Walcher
-Hienzman
-Shabtay
-Preddy
-Hilra
-Orr
-Dunia
-Kakapo
-Stockholm
-Fanwood
-Arten
-Tuni
-Bourgue
-Idigo
-Sydney
-Obzina
-Magnolia
-Rush
-Jogiches
-Clanger
-Troughton
-Tilling
-Hillquit
-Limpele
-Deepdene
-Dojoji
-Yanyean
-Expedition
-Angkarn
-Shablin
-Cromulent
-Schlegal
-Nowhere
-Onlyone
-Nesterov
-Cydrome
-McDunnough
-Paverini
-Artaud
-Wilcke
-Mahina
-Skirr
-Strong
-Latrell
-Steadham
-Lufbery
-Canadeo
-Sloat
-Lurra
-Umpqua
-Beika
-Reymont
-Yallock
-Banshee
-Pow
-Patrono
-Greenfield
-Tombola
-Nasworthy
-Cavan
-Deluca
-Alturas
-Plessis
-Engawa
-Pisarek
-Makarov
-Pearse
-Nieder
-Iwashi
-Buridan
-Rubio
-Fawcett
-Gilruth
-Lemuria
-Schneider
-Golding
-Nordberg
-Vodopan
-Bonito
-Pronovost
-Lagerlof
-Parmelee
-Huygens
-Kalok
-Nori
-Ash
-Vindaloo
-Kipling
-Luke
-Gremminger
-Fiske
-Variscan
-Sanford
-Ruxton
-Pierce
-Uramen
-Drakes
-Brautigan
-Glitter
-Figtree
-Bussy
-Kosrae
-Liveoak
-Frossard
-Luxor
-Citylights
-Rachmil
-Sismondi
-Pestana
-Murasaki
-Jordan
-Blobel
-Russell
-Drumbeat
-Olaria
-Coiffard
-Blanchard
-Anza
-Nogah
-Webb
-Davison
-Zeeman
-Racecourse
-Newell
-Blackmountain
-Hargrave
-Glinka
-Koi
-Ingrassia
-Bundy
-Cole
-Kirkorian
-Enzyme
-Kemsley
-Morellet
-Chandrayaan
-Nighbor
-Jurack
-Gildea
-Unknown
-McKenna
-Coledale
-Diglot
-Otawara
-Gumsing
-Skillman
-Bentham
-Ostrich
-Schmo
-Barbecue
-Excelsior
-Mackie
-Giant
-Berry
-Wesburn
-Steuben
-Fillion
-Primeau
-Nolder
-Fell
-Dooley
-Millgrove
-Lock
-Vavoom
-Coldstream
-Worsley
-Doowangle
-Vernet
-Tatsu
-Dabu
-Epin
-Tal
-Stiglitz
-Taiyou
-Taifun
-Rosebud
-Donnelly
-Lefebvre
-Hashi
-Carlton
-Saito
-Go
-Ophelia
-Tran
-Woollahra
-Giulia
-Donburi
-Rasoir
-Shalala
-Unsustainable
-Rodinia
-Fielding
-Shinobu
-Dorado
-Eretz
-Mitra
-Kapuskas
-Amiga
-Dumart
-Wilberg
-Darragh
-Levertov
-Kienzle
-Heidenstam
-Bryant
-Montague
-Grenville
-Mystakidou
-Xie
-Flaman
-Rofflecopter
-Serrati
-McClure
-Mulgrave
-Fieschi
-Sienkiewicz
-Alonzo
-Ghia
-Howitt
-Lipo
-Tanner
-Fremont
-Senn
-Nakanihon
-Lian
-Shenzhou
-Moreau
-Hurnung
-Katsu
-Merrienboer
-Leopold
-Barnett
-Cassell
-Gemini
-Noh
-Grabke
-Gallindo
-Tucker
-Boisblanc
-Dittmann
-Gobo
-Detritus
-Baxter
-Maladay
-Deemster
-Southard
-Heying
-Kondrad
-Trihey
-Carmichael
-Shemesh
-Montgolfier
-Skronski
-Martinkovic
-Gloucester
-Aferdita
-Birdbrain
-Behemoth
-Santana
-Anadyr
-Clapper
-Hyacinth
-Nieminen
-Uram
-Coppens
-Oliver
-Luna
-Willis
-Pikkara
-Hana
-Chapman
-Yossarian
-Burbclave
-Tayot
-Bennett
-Ladybird
-Oates
-Sukra
-Abdallah
-Polydactyle
-Bligh
-Fraker
-Harpoon
-Patrick
-Toman
-Birks
-Seale
-Nevzerov
-Braess
-Moa
-Guru
-Forte
-Casanova
-Burum
-Serge
-Mauvaise
-Leonov
-Kyong
-Todd
-Burch
-Kovpan
-Whippet
-Click
-Eldrich
-Enigma
-Roundfield
-Dzieciol
-Marchlewski
-Matsukaze
-Colville
-Cheetah
-Grier
-Dagmar
-Rodriquez
-Nitschke
-Ryan
-Jessop
-Demar
-Dimsum
-Myriam
-Gentil
-Olson
-Hayashi
-Prudhomme
-Sharpard
-Hall
-Petrichor
-Wheels
-Ge
-Rockwell
-Barbarossa
-Ringgold
-Svendsen
-Axon
-Oconner
-Bringholf
-Hay
-Daffodil
-Ivanova
-Sivocci
-Sleestak
-McGann
-Hoark
-Aleixandre
-Mikadze
-Yerd
-Budan
-Syakumi
-Jezebel
-Yoshiyuki
-Wright
-Mahoney
-Myhre
-Paris
-Capra
-Nedkov
-Acronym
-Yuya
-Emu
-Flare
-Gran
-Holden
-Hilite
-Taliaferro
-Tatum
-Watts
-Concertina
-Sonnerstein
-Schoonmaker
-Marathon
-Gregg
-Costagravas
-Iceberg
-McGimsie
-Richthofen
-Laperriere
-Fairweather
-Warren
-Jinxing
-Philo
-Devonshire
-Essex
-Isabella
-Clellon
-Sakai
-Gruntled
-Ragowski
-Nakamichi
-Orbit
-Whittlesea
-Dorance
-Sommambulist
-Fairlane
-Susanto
-Yamauba
-Dejavu
-Zenith
-Savon
-Cahill
-Berlin
-Sequent
-Hilbert
-Noltenius
-Drebin
-Sharpless
-Smalls
-Delaid
-Beese
-Exodus
-Richardson
-Cookie
-Stein
-Ripley
-Noble
-Orochi
-Joliat
-Berjis
-Christensen
-Pualhan
-Drinkwater
-Skolnick
-Daumig
-Malinow
-Maa
-Charles
-Savard
-Apogee
-Troell
-Rookwood
-Clipper
-Hausdorff
-Chase
-Fish
-Jano
-Burrel
-Talamasca
-Demain
-Baumer
-Aarde
-Mekong
-Brown
-Greer
-Plympton
-Post
-Sooper
-Willunga
-Wormser
-Blouin
-Narayan
-Eureka
-Everidge
-Geesink
-Aldwych
-Tiki
-Chaparral
-Holiday
-Tuxing
-Broderick
-Delling
-Flinker
-Matahari
-Barth
-Junot
-Strabel
-Encke
-Hudson
-Constantineau
-Hutson
-Dazy
-Gordimer
-Tretiak
-Granada
-Burma
-Manen
-Shiras
-Meyer
-Raymond
-Barbarino
-Barcelona
-Maracas
-Aravalli
-Cabaret
-Nacon
-Musgrave
-Seville
-Huskerdu
-Stravinsky
-Centaur
-Escape
-Ohtobide
-Schufang
-Gonzales
-Gwynneville
-Schreiner
-Havercamp
-Freelunch
-Bellman
-Norsk
-Cyr
-Gaibov
-Scalia
-Luxemburg
-Mulford
-Cachin
-Warburton
-Sneerwell
-Fizir
-Jael
-Gisel
-Undertone
-Roop
-Cline
-Koenig
-Autopoiesis
-Lassard
-Juneau
-Kramer
-Pitre
-Encinal
-Fredrickson
-Lathrop
-Shen
-Langset
-Coanda
-Lei
-Abilene
-Mip
-Boshops
-Stonehill
-Magojiro
-Brynner
-Rankin
-Dryburgh
-Zelmanov
-Attila
-Palisades
-Saule
-Cassowary
-Widdershins
-Eastkew
-Blabbermouth
-Apollo
-Alba
-Graysmark
-Zugzwang
-Yorimasa
-Delacroix
-Groshomme
-Hosho
-MacDiarmid
-Sarugaku
-Davids
-Malan
-Berthold
-Chariot
-Farina
-Gegaku
-Corrimal
-Hand
-Trebuchet
-Dionne
-Berzin
-Bullard
-Babcock
-Krog
-Holsworthy
-Acorn
-Nielson
-Westmoreland
-Lucero
-Baobob
-Leroy
-Holyoke
-Dabney
-Ruska
-Klinger
-Lowenhardt
-Mycron
-Dieterle
-Bader
-Rexroth
-Neely
-Colo
-Nozaki
-Tokyo
-Okame
-Corrigible
-Arna
-Radford
-Iredell
-Moisant
-Augustus
-Mitchell
-Speedwell
-Tosung
-Mercy
-Zon
-Alacrity
-Hackl
-Salming
-Takao
-Seferis
-Lightfoot
-Basalt
-Sawchuk
-Gorky
-Dix
-Taggart
-Coorara
-Dowding
-Geoffrion
-Berkson
-Bertone
-Habsburg
-Schultz
-Arrow
-Kingsford
-Resistance
-Sugita
-Koga
-Sidran
-Forester
-Anabuki
-Steamroller
-Hextall
-Hainsworth
-Mushtarie
-Eclipse
-Unsworth
-Brink
-Momiji
-Duke
-Baral
-Jantzen
-Laurasia
-Bentley
-Skalski
-Matthews
-Clapsaddle
-Snoring
-Galland
-Teatime
-Eerie
-Sage
-Mahovlich
-Khalamov
-Austin
-Begonia
-Luan
-Bosen
-Venera
-Borst
-Park
-Ree
-Ponzu
-Leidesdorff
-Prathivi
-Etoile
-Lipfert
-Tuominen
-Tagore
-Reardon
-Stohr
-Griffith
-Dhara
-Edelweiss
-Douhet
-Benton
-Arad
-Riel
-Byrne
-Brandeis
-Hull
-Almodovar
-Hula
-Rodgers
-Reinsch
-Inglis
-Goulet
-Chandra
-Beam
-Discovolante
-Mantha
-Spittka
-Vazquez
-Turk
-Borzage
-Karski
-Ludd
-Hanner
-Hugo
-Mineff
-Deschanel
-Meltzer
-Sixgallery
-Galvin
-Dawn
-Saramago
-Barmy
-Bismark
-Wirtanen
-Surface
-Oluja
-Darling
-Mondegreen
-Whizenhunt
-Charlotte
-Winx
-Moxie
-Encore
-Llanfair
-Devanter
-Chalet
-Fouquet
-Portsmouth
-Cruddas
-Rejected
-Dwi
-Demme
-Strauss
-Peel
-Sassoon
-Ousley
-Cassady
-Desmoulins
-Deere
-Majestic
-Corinthian
-Khalifa
-Clark
-Shino
-Briers
-Lalonde
-Deigan
-Continental
-Inada
-Manray
-Trilam
-Somme
-Rosenthal
-Reiter
-Soosung
-Kovacs
-Pluto
-Kenorland
-Alemany
-Xeno
-Mikazuki
-Maradona
-Ofeq
-Sarlo
-Hughes
-Barker
-Briggs
-Zuhal
-Erlanger
-Knafelc
-Trenchard
-Samas
-Rees
-Rikichi
-Ard
-Yorkshire
-Stuchka
-Mahana
-Curtis
-Norse
-Lake
-Mishin
-Otsuzum
-Green
-Hamsun
-Ramona
-Ida
-Welinder
-Somerton
-Nesiote
-Proudfoot
-Martov
-Utu
-Croquet
-Seversky
-Weeks
-Mesic
-Dada
-Oherlihy
-Riiser
-Naheed
-Kilara
-Gondwana
-David
-Rogan
-Klamath
-Cullen
-Chantilly
-Luukkanen
-Marikh
-Roundel
-Alvarado
-Valencia
-Dogpatch
-CiscoSystems
-Shipman
-Radio
-Kyuzo
-Sugarbeet
-Wiranata
-Fuller
-Toshihiko
-Itamae
-Tristan
-Bleriot
-Fritch
-Smashcan
-Delorean
-Freeloader
-Haight
-Eucken
-Bowie
-Lafleur
-Josephus
-Winkoop
-Dinosaur
-Earp
-Grian
-Leckrone
-Lesse
-Stork
-Botanical
-Fetisov
-Supplee
-Zhongyuan
-Zephaniah
-Cameron
-Seoul
-Herbst
-Goodman
-Beckersted
-Zagato
-Petrova
-Champollion
-Collishaw
-Gardenvale
-Wade
-Selene
-Fieseler
-Kaiser
-Riverview
-Adzebills
-Pangaea
-Weiland
-Kurri
-Jacobs
-Jubilee
-Coppola
-Appalachia
-Yering
-Jeegoo
-Pirandello
-Hubble
-Kuiper
-Brentano
-Norfolk
-Mainline
-Mangala
-Rosenberg
-Goldberg
-Levitsky
-Reatequi
-Yutani
-Yer
-Broadway
-Roberts
-Wandin
-Herber
-Peart
-Moksung
-Spaatz
-Milling
-Prather
-Okonomi
-Matzerath
-Sansome
-Peng
-Aquacade
-McConnell
-Mountain
-Caldwell
-Stevenson
-Nevadan
-Shirk
-Griffis
-Harbinger
-Schuyler
-Cerminara
-Eros
-Hotger
-Maine
-Amdahl
-Obviate
-Clostermann
-Wayne
-Kaupas
-Ruban
-Berchot
-Camden
-Termagant
-Darrow
-Yap
-Sapwood
-Commodore
-Tardis
-Montferrand
-Coulter
-Mullen
-Gupte
-Schell
-Morico
-Hawks
-Shinji
-DuCasse
-Thalheimer
-Quelch
-Shojo
-Nasu
-Shilton
-Mostel
-Martini
-Steinbeck
-Clementine
-Kerouac
-Shinohara
-Powell
-Thatcher
-Frobozz
-Richmond
-Jansen
-Hill
-Romeo
-Ray
-Electricteeth
-Steeplechase
-Tennant
-Tangerine
-Lineker
-Lycia
-Beat
-Mistral
-Walsh
-Zona
-Potluck
-Tiger
-Beckett
-Cyclone
-Feng
-Barrymore
-Thurston
-Clinton
-Duesenburg
-Stuer
-Tracer
-Vaughan
-Simoni
-Adelaide
-Vixen
-Princess
-Woyseck
-Crossing
-Engel
-Burrito
-Silversten
-Shark
-McGill
-Obstreperous
-Ruml
-Steiger
-Palace
-Young
-Larsen
-Hayes
-Twilight
-Insoo
-Biberman
-Hwasung
-Townsend
-Kostolany
-Balder
-Kubo
-Zobel
-Karura
-Coats
-Pimpernel
-Tone
-Fardel
-Lotus
-Stonecutter
-Pankhurst
-Sholokhov
-Nakatani
-Childs
-Nosferatu
-Bellow
-Calderwood
-Truss
-Carson
-Wrangler
-Burton
-Gealach
-Shirabyoshi
-Toonie
-Kitchensink
-Merit
-Ornitz
-Bugaboo
-Snowdrop
-North
-Hidayat
-Linden
-Rainbow
-Undercity
-Newman
-Helle
-Balboa
-Hope
-Kayvon
-Kokorin
-Grot
-Salsman
-Ziemia
-Huszar
-Russ
-Grainger
-Gandini
-Lupis
-Reuven
-Quartermass
-Gasparini
-Soy
-Bahram
-Skolem
-Nihilist
-Seattle
-Asylum
-Dapto
-Fold
-Popinjay
-Hathor
-Delphis
-Buaku
-Blumenthal
-Genji
-Epsilon
-Voskhod
-Projects
-Stepford
-Boyoma
-Maxwell
-Hao
-Acropolis
-Cunningham
-Grimm
-Minogue
-Kanno
-Madsen
-Octavia
-Khondji
-Kavka
-Kendall
-Languish
-Yang
-Goheen
-Caballero
-Duell
-Bueller
-Fastback
-Fredericks
-Flax
-Feldman
-Regenbogen
-Atlanta
-Kronos
-Flint
-Ruttan
-Franciosa
-Cundey
-Duvall
-Worters
-Baker
-Kyrgyz
-Marx
-Fasching
-Seisenbacher
-Kralomoc
-Tempel
-Braun
-Columbia
-Takashi
-Kivioq
-Narcissus
-Morgan
-Kabumpo
-Sura
-Kohl
-Szydlowska
-Goldkey
-Cord
-Kanze
-LaFontaine
-Keynes
-Zeddmore
-Gerstort
-Herzog
-Bukowski
-Isachenko
-Ormsby
-Jaxa
-Sachertorte
-Atansoff
-Elkhart
-Drake
-Kyaw
-Randwick
-Launay
-Schmidt
-Bricklin
-Flan
-Nap
-Gregoire
-Divisadero
-Apparatchik
-Kasshiki
-Plasma
-Lindbergh
-Scognamillo
-Canaille
-Television
-Bethune
-Weissenberger
-Scholten
-Kinsei
-Ratner
-Fugu
-Schlegel
-Karlfeldt
-Steinhoff
-Gainey
-Kittinger
-Drillon
-Klopek
-Alexandria
-Normandy
-Scapin
-Benford
-Squeegee
-Doctorow
-Blankes
-Losee
-Kidomen
-Dahlgren
-Palou
-Sidek
-Duettmann
-Knopfli
-Mesmer
-Volitant
-Walcott
-Kleiber
-Horbaczewski
-Eberlain
-Collingwood
-Fratica
-Brock
-Enzian
-Calhoun
-Bordiga
-Ikura
-Neumann
-Quackenbush
-Krastins
-Carpathea
-Asturias
-Foley
-Allmenroder
-Swenson
-Lange
-Talbot
-Harker
-Ophuls
-Saiz
-Fischer
-Daikon
-Logan
-Monnett
-Deakins
-Tanabe
-Varun
-Calayan
-Sinclair
-Mower
-Scofield
-Barracuda
-Sprocket
-Austinmer
-Poppy
-Ceres
-Belvedere
-Kilda
-Athens
-Blum
-VanDornan
-Frankfurter
-Frederick
-Frontenac
-Gainsaid
-Kryakutnoy
-Glass
-Dilley
-Levy
-Overlord
-Longwell
-Kazakov
-Oxberger
-Greenstein
-Stromer
-Kupferberg
-Achterbahn
-Fortitude
-Whetmore
-Maidstone
-Noland
-Trotter
-Slate
-Faulkner
-Booran
-Longully
-Worthington
-Spinnaker
-Marlowe
-Cianci
-Echegaray
-Kita
-Tweak
-Northport
-Beachey
-Palmerstone
-Pawpaw
-Millhouse
-Dunderdale
-Tiros
-Kukulcan
-Ajax
-Ansett
-Cleghorn
-Manilow
-Abernathy
-Chihuly
-Ball
-Fox
-Dickins
-Mayfair
-Kew
-Flagstaff
-Kappa
-Ziskey
-Pickles
-Condor
-Randall
-Oddfellow
-Forti
-Krupinski
-Chandler
-Hemingway
-Midnight
-Silverman
-Azure
-Shriner
-Jackalope
-Conacher
-Wharton
-Ock
-Cyclops
-Hartnell
-Semaphore
-Christiansen
-Witherspoon
-Tapioca
-Spicoli
-Giffen
-Kaczmarek
-Coleman
-Sloane
-Rucker
-Shaftoe
-Lardner
-Rosselsprung
-Fonck
-Czervik
-Biggles
-Goodliffe
-Kobeshimi
-Lameth
-Mougin
-Izumi
-McArdle
-Gully
-Berland
-Kellner
-Hagoromo
-Lewis
-Ehrlich
-Elvehjem
-Bute
-Hercules
-Yeats
-Greenacre
-Menoptra
-Hoodoo
-Husar
-Birge
-Barnstormer
-Howl
-Dharma
-Banting
-Yan
-Rawley
-Barry
-Holt
-Buck
-Fallon
-Bigwig
-McGee
-Ingersoll
-Hubbard
-Brickworks
-Morris
-Primrose
-Saiman
-Neruda
-Quadrifoglio
-Book
-Dumouriez
-Kochav
-Lightworker
-Hutchence
-Sachs
-Undset
-Broda
-Morrison
-Amos
-Dusk
-Goodspeed
-Macdonald
-Creeggan
-Grelling
-Middle
-Montreal
-Doji
-Menatep
-Mukerji
-Nosov
-Metropolitan
-Zuhra
-Susa
-LeSabre
-Portello
-Hogarth
-Harmison
-Quamar
-Cataract
-Nakizo
-Tymets
-Demo
-Vollmer
-Itokawa
-Lemaire
-Oe
-Canter
-Noodle
-Broadbent
-Jowisz
-Strangelove
-Chenille
-Dechou
-Valois
-Newt
-Fuhr
-Sutter
-Chama
-Hunchke
-McDonnagh
-Spackler
-Bao
-Byrd
-Salyut
-Durnan
-Bourdeille
-Soyer
-Fan
-Zeami
-Liwei
-Szymborska
-Moanalo
-Torricelli
-Lahtoh
-Vanbrugh
-Graziadei
-Tsiolkovsky
-Bradley
-Mifflin
-Rohini
-Tempura
-Ruff
-Crowley
-Suntzu
-Schilling
-Okawa
-Sopor
-Shutt
-Warilla
-Kuu
-Thorn
-Catron
-Kilby
-Masukami
-Matador
-Giacobini
-Coffee
-Titan
-Korolev
-Juniper
-Kentoku
-Metalhead
-Varga
-Oxbar
-Laprade
-Mill
-Olejniczak
-Locataire
-Callisto
-Barsov
-Shimada
-Sanders
-Reuters
-Buwan
-Lapointe
-Getting
-Idora
-Donaldo
-Mosienko
-Carillon
-Miasma
-Perry
-Mysterio
-Aoi
-Musytari
-Morphett
-Kikuchiyo
-Mayne
-Alva
-Varmint
-Craig
-Stern
-Glushenko
-Gjellerup
-Nyanda
-Berwick
-Bachman
-Wollongong
-Bunavad
-Giacomin
-Yamdev
-Rakosi
-DeVaux
-Seuss
-Tenjin
-Weinstein
-Oskan
-Veloce
-Legien
-Eggplant
-Frost
-Oki
-Michelson
-Sun
-Ebisu
-Fortas
-Jorgensen
-Shakkyo
-Spoonhammer
-Abrahamson
-Stawberry
-Manuel
-Lamar
-Dinkin
-Regina
-Kyung
-McCallister
-Otoro
-Maryfield
-Pratt
-Lightstone
-Andalso
-Chickenwing
-Shore
-Demozay
-Coalcliff
-Ramsay
-Vezina
-Vaalbara
-Madurta
-Yun
-Micheline
-Kararan
-Hyde
-Rebus
-Fossil
-Cheevers
-Laysan
-Williams
-Nuvolari
-Eagle
-Bohemia
-Sakigake
-Franklin
-Boethin
-Qian
-Tandino
-Hosoi
-Warner
-Hashimoto
-Brodie
-Barrett
-Takakura
-Kanami
-Busch
-Zagoskin
-Alabaster
-Nouvelle
-Stanley
-Taka
-Kearby
-Harlan
-Yin
-Lagodadaly
-Skomoroklov
-Schuman
-Graff
-Merosi
-Rote
-Kuroe
-Oberth
-Agnon
-Tang
-Astonia
-Wallace
-Mahfouz
-Beeper
-Barkley
-Desade
-Taft
-Memotech
-Rochefort
-Ferranti
-Ingraham
-Renneville
-Stapovic
-Warrigal
-Hin
-Quasimodo
-Blackmun
-Partridge
-Ohara
-Cone
-Kurelek
-Hatfield
-Chabrow
-Constellation
-Roystead
-Shatzkin
-Roy
-Gwasi
-Marquette
-Zohari
-Alfa
-Bower
-Miquel
-Baron
-Simca
-Langway
-Lusso
-MacKay
-Mah
-Cela
-Drago
-Nervous
-Woodhen
-Kitsune
-Hauptmann
-Auxarmes
-Bobbysocks
-Eccleston
-Janitor
-Isan
-Manzo
-Araw
-Fassbinder
-Pixie
-Taiyang
-Veil
-Reitveld
-Action
-Hassanov
-Baysklef
-Assia
-Dalgleish
-Canetti
-Musketeer
-Pointe
-Jonas
-Vertes
-Harlequin
-Fraenkel
-Till
-Grosso
-Tengu
-Isbell
-Sapunov
-Rosmer
-Underall
-Control
-Zou
-Irvin
-Sola
-Milosz
-Brevity
-Usobuki
-Supercharge
-Nephilim
-Scissor
-Evelyn
-Arguello
-Flimflam
-Formosa
-Brimsek
-Davidson
-Galbraith
-Shatner
-Seibert
-Fackler
-Crosley
-Fisher
-Dweebie
-Sims
-Petit
-Pink
-Dodo
-Harford
-Marchionne
-Leafblower
-Mochi
-Ristow
-Dripp
-Patel
-Javelin
-Burnett
-Lurton
-Laffer
-Sparkle
-Rennebohm
-Katayama
-Federko
-Mirabeau
-Street
-Colonial
-Chikuwa
-Kelly
-Westwick
-Brenham
-Hold
-Sprawl
-Gadsby
-Seurat
-Kagu
-Anaconda
-Rosencrans
-Sadoul
-Liberty
-Duncker
-Kindley
-Stastny
-Denneny
-Gontermann
-Nishizawa
-DeGroot
-Domhan
-Heaney
-Su
-Hocken
-Pavlova
-Rinkitink
-Vinson
-Simpson
-Appin
-Claar
-Wildung
-Slichter
-Patton
-Beltway
-Rayner
-Robinson
-Ortega
-Templin
-McNamara
-Sliter
-Sandgrain
-Kardex
-Xu
-Nefarious
-Levitt
-Codesmith
-Yowahoshi
-Kendal
-Aji
-Dosei
-Nozomi
-Kiesler
-Chastity
-Proost
-Liadis
-Adria
-Susenko
-Kanahoe
-Bock
-Gyoza
-Erde
-Mathys
-Khorshid
-Mann
-Waisman
-Fizz
-Oz
-Zeno
-Underthorn
-Falck
-Steinhardt
-Opus
-Keon
-Hailey
-Varayez
-Wakawaka
-Menendez
-Campbell
-Deledda
-Pertwee
-Kamenev
-Zidane
-Genosse
-Quintus
-Poole
-Doesburg
-Suisei
-Avis
-Zorger
-Dangle
-Weka
-Barber
-Uba
-Mokusei
-Melbourne
-Mendicant
-Winger
-LaSalle
-Okumura
-Lulibub
-Dmytryk
-Proudhon
-Woodin
-Marker
-Anna
-Svarog
-Reed
-DaSilva
-Brokken
-Doyle
-Pontoppidan
-Wakmann
-Wolfe
-Cowen
-Bruder
-Blair
-Fizgig
-Blatchford
-Jiutai
-Lageos
-Barnard
-Tully
-Curie
-Bayliss
-Burdeyna
-DiPrima
-Twin
-Cannoli
-Nabob
-Lang
-Frua
-Bengal
-Usitnov
-Daidig
-Ng
-Lach
-Diqui
-Soyinka
-Maitland
-Droz
-Clayton
-Arizona
-Rutledge
-Howton
-Bernal
-Bardeen
-Sonnenblume
-Laguna
-Cassidy
-Ventura
-Valkyrie
-Marat
-Chu
-Andrews
-Zhou
-Meadowbrook
-Poulot
-Cupola
-Summers
-Manhattan
-Cohen
-Vallely
-Bardot
-Babeli
-Gelfand
-Calamari
-Cooper
-Davis
-Roviana
-Grayson
-Montana
-Clifford
-Bloxome
-Quatro
-Vodafone
-Tsuki
-Edison
-Kamaboko
-Saltair
-Arbusto
-Akebono
-Rasikas
-Stapleton
-Gall
-Stantz
-MC
-Gable
-Flotta
-Serf
-Xiao
-Michabo
-Marquez
-Bamatter
-Garsztka
-Langdon
-Sani
-Greyskin
-Duck
-Black
-Ketsugo
-Dyden
-King
-Bai
-Elliott
-Thyben
-Parks
-Vantongerloo
-Vanek
-Snickerdoodle
-Zapotocky
-DeVille
-Shichiroji
-Stradale
-Benedict
-Burnfield
-Lightcloud
-Paperdoll
-Aderdeen
-Hulka
-Fujin
-Cardozo
-Adamley
-Pinkerton
-Grumby
-Poultry
-Florio
-Culcomp
-Madison
-Basiat
-Waves
-Greenspan
-Tarski
-Geer
-Darlandes
-Komachi
-Mortal
-Mounier
-Shackle
-Firefly
-Jevon
-Nolan
-Brockholst
-Raine
-Milkic
-Dannunzio
-Kojishi
-Hollywood
-Bilan
-Division
-Skye
-Syaka
-Alena
-Zephyr
-Glitterbuck
-Daniel
-Hokkigai
-Vivian
-Cushing
-Kuhr
-Mars
-Beliveau
-Mirihi
-Caledonia
-Tesio
-Gruppman
-Hamilton
-Sontse
-Rutabaga
-Average
-Yohei
-Fleming
-Watson
-Lu
-McCellan
-Takahe
-Towradgi
-Solvang
-Beach
-Apps
-Boon
-Speculaas
-Miranda
-Omegamu
-Baraka
-Tokhes
-Milk
-Opel
-Laviolette
-Ping
-Zhu
-Chaika
-Whittenton
-Diller
-Prevost
-Spectre
-Wendt
-Bach
-Bjornson
-Washington
-Akami
-Kraken
-Taney
-Strutt
-Bainbridge
-Faulkland
-Smallville
-Westerburg
-Cinquetti
-Flanders
-Pascal
-Hornpipe
-Jay
-Becquerel
-Breed
-Dallin
-Bogomil
-Heyse
-Berkman
-Robertson
-Beale
-Murakami
-Starseeker
-Eber
-Chamerberlin
-Moore
-Hunt
-Dayton
-Kamloops
-Flora
-Fermi
-Thatch
-Aridian
-Debs
-Sojourner
-Mnemonic
-Woonona
-Doolittle
-Divine
-Pennyfeather
-Seraph
-Huber
-Kolache
-Serra
-Okamoto
-Barbee
-Ren
-Vogel
-Richard
-Fugazi
-Montagne
-Marten
-Wiggins
-Raven
-Mousehold
-Solzhenitsyn
-Lobo
-Bathgate
-Splash
-Letlow
-Marlin
-Prunes
-Herrey
-Virgo
-Snoats
-Candour
-Allaert
-Dana
-Doughboy
-Perun
-Tyne
-Welesa
-Cellardoor
-Bailly
-Gretzky
-PMS
-Weaver
-Kronsage
-Teazle
-Dot
-Concord
-Shaw
-Panther
-Jack
-Therian
-Rooney
-Fluffy
-Loveless
-Waki
-Daguerre
-Nadir
-Archer
-Templar
-Trescothick
-Keegan
-Nielsen
-Kitty
-McLuhan
-Bessie
-Sunchaser
-Starr
-Padar
-Molinari
-Valentino
-Charming
-Sunset
-Sondergaard
-FairChang
-Jade
-Money
-Maltese
-Valen
-Epoch
-Zabibha
-Nash
-Orman
-Danton
-Aquitaine
-Perth
-Suicide
-Massiel
-Fairchild
-Mikita
-Sunshine
-Powers
-Stone
-Cartier
-Wishbringer
-Sapeur
-Roark
-Cosmo
-Klein
-Udal
-Joffre
-Elytis
-An
-Aubriot
-Wu
-Neutra
-Bain
-Gallant
-Benavente
-Miller
-Shi
-Lorentz
-Dassin
-Lindley
-Horus
-Plato
-Odets
-Dou
-Harris
-Montgomery
-DiorJoaillerie
-Kuroda
-Warf
-Mauriac
-Stanwell
-Pinkdot
-Singer
-Fahid
-Banach
-Rand
-Guilbeaux
-Vesperia
-Izutsu
-Mackenzie
-McTeague
-Charlton
-Hoisin
-Freeman
-Fresse
-VonLenard
-Jimenez
-Scarborough
-Nyak
-Darkholme
-Barragar
-Kong
-Witte
-Maelstrom
-Hicks
-Carducci
-Vargas
-Sillanpaa
-Lemieux
-Medici
-Pasternak
-Nightshade
-Bean
-Korvin
-York
-Simon
-Gould
-Rich
-Bomazi
-Rosewood
-Wombat
-Muir
-Aida
-Flytrap
-Night
-Taiko
-Fauna
-Commerce
-Memorial
-Electric
-Hoffman
-Blackflag
-Case
-Fitzcarraldo
-Babka
-Fudo
-Dion
-Kembla
-Gavaskar
-Naumova
-Seifert
-Bliss
-Turner
-Zebrastripe
-Grasshopper
-Polonsky
-Lollipop
-Tones
-Lehane
-Maeterlinck
-Ennui
-Page
-Lament
-Moonflower
-Bell
-Twang
-Stormwind
-Luchador
-Rocco
-Saru
-Dulce
-Skidoo
-Brightwillow
-Vasilopita
-Johnson
-Nicholas
-Llewelyn
-Tokugawa
-Spencer
-Spaight
-Mason
-Ellsberg
-Soke
-Stryker
-Perse
-Draper
-Churchill
-Aubret
-Einarmige
-Harrington
-Moonlight
-Pendragon
-Rogers
-Arbuckle
-Kothari
-Galileo
-McCoy
-Cult
-Stooge
-Faust
-Fortune
-Samiam
-Rust
-Zamboni
-Wood
-Gide
-Absolute
-Unsung
-Hayek
-Nomad
-Yamamoto
-Teevee
-Argonaut
-Protagonist
-Lippmann
-Thompson
-Steed
-Enfield
-Galatea
-LeMay
-Timtam
-Camus
-Pollack
-Butler
-Barbara
-Faddoul
-Keiko
-Spengler
-Burali
-Fetid
-Dunheved
-Brearly
-Madonna
-Scott
-Tuque
-Ogre
-DeFarge
-Gateaux
-Torrone
-OFlynn
-Tank
-Lumiere
-Duport
-Burke
-Windang
-Fei
-Ganache
-Bancroft
-Rambler
-Dougall
-Heiden
-Under
-Spice
-Vanness
-Vega
-Xevious
-Sleeper
-EarlyCreator
-Murphy
-Appleby
-Roentgen
-Kongo
-GKid
-Chen
-Suavage
-Severine
-Whiplash
-Abattoir
-Clarke
-Hornet
-Moe
-Cain
-Teacher
-Honey
-Hazlitt
-Yaffle
-Kiama
-Martin
-Bogart
-Sartre
-Paklena
-Neurocam
-Otis
-Weary
-Bijoux
-Fraser
-Neville
-Gorilla
-Daligdig
-Shang
-RiversRunRed
-GeekSquad
-Extraordinaire
-Democracy
-Diamond
-Zadoq
-Paz
-Chatnoir
-Pomeray
-Lewellen
-Feaver
-Williamson
-Bakalava
-Arnaz
-Bienenstich
-Carlos
-Trenchmouth
-Bunin
-Olsen
-Sullivan
-Xia
-Weber
-Noir
-Blanc
-Spatula
-Mandala
-Learner
-Akula
-Onizuka
-Anubis
-Adamant
-Buttercup
-Boivin
-Jimador
-Sheep
-Hocho
-Psaltery
-Baskerville
-Yoshiro
-Thereian
-Omlet
-Magpie
-Monde
-Peregrine
-Deckard
-Dawson
-Kilian
-Revere
-Sieyes
-Stirling
-Phoenix
-Jewel
-Cure
-Leviathan
-Seigo
-Quirk
-Beckenbauer
-Hedges
-Careless
-LaFollette
-Terra
-Bombay
-Smails
-Gabriel
-Clio
-Maltz
-Kawabata
-Golem
-Pinkney
-Guillaume
-Diggy
-Jackson
-Steptoe
-Baphomet
-ACS
-Karuna
-Gremlin
-Lioncourt
-McCann
-Parson
-Snakeankle
-Batra
-Buckenburger
-Donovan
-Jensen
-Han
-Kinsella
-Playahead
-Lamington
-Delvecchio
-Falcone
-Koolhaas
-Fool
-Cave
-Flasheart
-Costello
-Yellowknife
-Benmergui
-Trumbo
-Xavier
-Marshall
-Rebel
-Mondrian
-Gorham
-Eusebio
-Roo
-Angel
-Ogopogo
-Sugar
-Bunnyhug
-Bling
-Nino
-Playfair
-Withnail
-Murdock
-Zander
-Boyer
-Brocco
-MacFound
-Turnbull
-KaizenGames
-Shirakawa
-RossiResidencial
-Stewart
-Xingjian
-Rutherford
-Zapata
-Zaftig
-Callahan
-Ahmed
-Bard
-Bravo
-Wallaby
-Brotherhood
-Puff
-Ixchel
-Czukor
-Prior
-Hannibal
-Pasteur
-TUi
-Hermes
-Hawkins
-Steele
-Shortbread
-Femto
-Adroit
-Weinberger
-Pacer
-Ideator
-Skallagrimson
-Olafson
-Cook
-Amarula
-Rampal
-JCKL
-Dingo
-Bauhaus
-Small
-Overdrive
-Baggio
-Dragonfly
-Mfume
-Thomson
-Hadlee
-Satyr
-Lindgren
-Fitzsimmons
-Linderot
-Lily
-Caligari
-Bernstein
-Greenleaf
-Kavanagh
-Ludovico
-Richelieu
-Au
-Cruyff
-Domela
-Balderdash
-Trudeau
-Stygian
-Fallingbridge
-Lomax
-Muromachi
-Horton
-OsMoz
-Barnave
-Coral
-Livingston
-Anansi
-Yamabushi
-Herde
-Bauer
-McGettigan
-Edo
-Tesla
-Tomba
-Maginot
-Martinez
-Moseley
-Khan
-Boxer
-Tonic
-DeAnda
-Aprendiz
-Jacques
-Marcone
-Fluffball
-Nico
-Grace
-Astro
-Ambassador
-White
-McLean
-Bacon
-Hebert
-Boomslang
-Hare
-Altman
-Boffin
-Grindstaff
-Platini
-Salome
-Ritter
-Armitage
-Highlander
-Fonzarelli
-Jarrico
-Ferdinand
-Juergens
-Petunia
-Fairplay
-Millions
-Brodsky
-Boccara
-Tiramisu
-Kennedy
-Kent
-Gumshoe
-Manimal
-TeeCee
-LeFay
-Eisenberg
-Farber
-Walkabout
-Uritsky
-Anderson
-Hanks
-Angelus
-Flower
-Fatale
-Edge
-Ixtab
-Clymer
-Portocarrero
-Thetan
-Claveau
-Everett
-Edelbrock
-Craven
-Kojima
-Dalek
-Gullwing
-Acres
-Loonie
-Mechanique
-Lulu
-Banjo
-Qin
-Escher
-Itoku
-LaGrassa
-Wilde
-MovieTickets
-Gomez
-Kapor
-Sion
-Volos
-Guildenstern
-McHenry
-Cotton
-Gascoigne
-Gillespie
-Prefect
-Ming
-DeLane
-Leader
-Orlowski
-Broom
-Gilman
-Torgeson
-Rollins
-Took
-Basset
-Eldritch
-Fairlight
-Ayoob
-Om
-Aloft
-Dibbell
-Zircon
-Alexander
-IWOOT
-Tigereye
-Murray
-Bronfman
-Grandi
-Bunderfeld
-Riva
-Zuma
-Pfetzing
-Thirty
-Bixby
-Digeridoo
-Kaos
-Best
-Godel
-Parvenu
-Chaos
-Annenberg
-Bommerang
-Gkguest
-Carola
-OurVirtualHolland
-Paxman
-Serpentine
-Tabla
-Roemer
-Prototype
-Plisskin
-Neptune
-Shelley
-Phaeton
-Faraday
-Havok
-ATI
-Dell
-Bay
-Romulus
-Lambert
-Gasseros
-Caldera
-Kimmel
-Leandros
-INGRenaultF1Team
-Oud
-Maestro
-Bradesco
-Erato
-Rowland
-Meltingdots
-Backbite
-Ukrop
-Svensen
-Williston
-Dinova
-Gardner
-Invincible
-Statosky
-Lear
-Cafine
-Rhodes
-Filth
-BnT
-Stephanopolis
-Stonebender
-Triebel
-Liu
-Ware
-Diaz
-Snow
-Pitt
-Bartle
-Posner
-Knox
-Rheingold
-PSlunce
-Way
-Dyson
-Gabaldon
-Akina
-Albanese
-Andrew
-Arai
-Arashi
-Arbizu
-Aya
-Back
-Baroque
-Bebb
-Benazzi
-Bergamasco
-Betsen
-Blackadder
-Blanco
-Botha
-Brezoianu
-Bulloch
-Burger
-Cale
-Campese
-Carling
-Castaignede
-Charron
-Checchinato
-Chemistry
-Collins
-Contepomi
-Cooljoke
-Cuttita
-Dallagio
-Darcy
-Davies
-Dawes
-Dayafter
-Dominquez
-Dragonash
-Eales
-Eel
-Ella
-Ellils
-Farrjones
-Fayray
-Fitzpatrick
-Flatley
-Flow
-Fouroux
-Freenote
-Gabe
-Gackt
-Galthie
-Gibbs
-Gontineac
-Gopheller
-Greenwood
-Gregan
-Habana
-Halcali
-Hamaski
-Hastings
-Heartsdale
-Heslop
-Hirano
-Horan
-Howlett
-Howley
-Hutchinson
-Ibanez
-Indigo
-Infinity
-Iwish
-Jenkins
-Jetcity
-Jinn
-John
-Joubert
-Kattun
-Kawashima
-Kayo
-Kronfeld
-Kumaki
-Kungfu
-Larkham
-Lewsey
-Little
-Littlething
-Llewellyn
-Lomu
-Lunasea
-Lungu
-Lyle
-Lynagh
-Maggs
-Magne
-Matfield
-McBride
-McCaw
-McDowwll
-Meads
-Mehrtens
-Meredith
-Michalak
-Mighty
-Mortlock
-Muliaina
-Nakamori
-Nicholls
-Niekerk
-Noriega
-Obolensky
-Oceanlane
-Oconnell
-Odriscoll
-Offcourse
-Okelly
-Otsuka
-Paulse
-Pelous
-Pichot
-Pienaar
-Pinklady
-Pizzicato
-Porta
-Preez
-Price
-Quinnell
-Rabeni
-Randt
-Rives
-Roff
-Rokocoko
-Roux
-Rowlands
-Sawson
-Seesaw
-Sella
-Serevi
-Shelford
-Skinstad
-Smit
-Sporleder
-Stransky
-Teichmann
-Thorne
-Tobias
-Tokyoska
-Tomorrow
-Troncon
-Tuqiri
-Umaga
-Underwood
-Villiers
-Watkins
-Whiteberry
-Wilkinson
-Woller
-Yachvili
-Ontyne
-Mendez
-DiPietro
-Messenger
-Meiji
-Gabel
-Secondfest
-Rose
-SunMicrosystems
-Gabetti
-Kobayashi
-Onassis
-Smith
-Farrow
-Babson
-Eno
-Autodesk
-Gibson
-CredicardCiti
-Lumin
-Bond
-Song
-Meailverstar
-Pride
-Santoro
-Schwab
-Angelo
-Domino
-Barsema
-Enberg
-Intel
-Sklar
-Zulauf
-Tscher
-McCabe
-Ponticelli
-Werbach
-Wisconsin
-See
-Philpoco
-Pausch
-Abramovic
-Afarensis
-Akroyd
-Alderson
-Aluveaux
-Alvord
-Amoufhaz
-Anderton
-Apfelbaum
-Applemoor
-Arctor
-Arida
-Auebauch
-Bagley
-Balbozar
-Barbasz
-Bedrosian
-Berboral
-Bimbogami
-Blessed
-Blister
-Boozehound
-Bosatsu
-Carpool
-Chesnokov
-Coeyman
-Corvale
-Darkstone
-Dawg
-Donardson
-Dreadlow
-Drechsler
-Drevnerussky
-Eichel
-Elephas
-Eracktor
-Farella
-Felisimo
-Ferrentino
-Fizzle
-Flores
-Foggarty
-Forzane
-Fotherington
-Freck
-Freschi
-Fullstop
-Gaffer
-Ganesvoort
-Godenot
-Gustav
-Habilis
-Hartshon
-Horczys
-Imako
-Janick
-Jarman
-Jiagu
-Jonesford
-Kangjon
-Kharg
-Kiergarten
-Klaxon
-Klossovsky
-Kowalski
-Leakey
-Lefavre
-Liotta
-Lockjaw
-Lovenkraft
-Lutrova
-Manamiko
-Manatiso
-Mapholisto
-Marjeta
-Markova
-Markstein
-Masatada
-Maurer
-Maximus
-Mayako
-McGinnis
-Merryman
-Miklos
-Milena
-Milos
-Mizin
-Monentes
-Mopp
-Morales
-Mornington
-Moulliez
-Msarko
-Mumfuzz
-Myoo
-Nadezda
-Ninetails
-Noyes
-Olchowy
-Oldrich
-Outlander
-Owatatsumi
-Pastorelli
-Pinazzo
-Proto
-Puchkina
-Questi
-Radek
-Rayna
-Razor
-Reina
-Reinard
-Revnik
-Reyes
-Rickena
-Rieko
-Rivera
-Ryba
-Sadofsky
-Samtanko
-Scarpulla
-Schmooz
-Schoonhoven
-Sciarri
-Seomun
-Setsuko
-Shostakovich
-Sideways
-Silverspar
-Sinister
-Sosa
-Strom
-Takaaki
-Tedeschi
-Tendandes
-Thibedeau
-Thursday
-Timeless
-Toshi
-Troglodite
-Trommler
-Vantelli
-Varriale
-Veliz
-Vendetta
-Vhargon
-Vita
-Waechter
-Walpole
-Weatherwax
-Weston
-Wingtips
-Wisent
-Wobbit
-Wycliffe
-Yumako
-Zabaleta
-Zamani
-Zerbino
-Zhangsun
-Zhong
-Zhora
-Zimminy
-Adamczyk
-Aeghin
-Aeon
-Agrawal
-Aichi
-Albatros
-Alekseev
-Alsop
-Alter
-Amiot
-Anatra
-Ansaldo
-Ansome
-Anthony
-Arado
-Arnahan
-Ashbourne
-Aurbierre
-Aviatik
-Avro
-Bachem
-Ballyhoo
-Bashly
-Beardmore
-Bellios
-Beningbrough
-Benoir
-Bereznyak
-Berkmans
-Bernard
-Bisnovat
-Blackburn
-Blinker
-Bloch
-Boccaccio
-Boomhauer
-Brandenburg
-Breda
-Breguet
-Buscaylet
-Camel
-Caproni
-Carver
-Caudron
-Cazenove
-Chakrabarti
-Charleville
-Clavenham
-Clawtooth
-Clip
-Colclough
-Compton
-Convair
-Courtois
-Criss
-Cryotank
-Dalglish
-Darwin
-Dastardly
-Debruyere
-Deerhunter
-Delpiaz
-Demonge
-Demonia
-Denja
-Densmith
-Destiny
-Devin
-Dewoitine
-Dharnen
-Doflug
-Doobie
-Dreamscape
-Ducrot
-Dudek
-Dufaux
-Dumpling
-Duranjaya
-Eames
-Earnshaw
-Easterman
-Eberhart
-Ecksol
-Eebus
-Effingham
-Ember
-Enzo
-Euler
-Ewinaga
-Ezvalt
-Fairey
-Fall
-Falworth
-Fanshaw
-Farman
-Faulkes
-Fearne
-Felwitch
-Folland
-Foulsbane
-Frog
-Gabardini
-Galli
-Garside
-Gartle
-Garzo
-Gears
-Georgia
-Giano
-Gigamon
-Gloster
-Gorbunov
-Gourdou
-Grigorovich
-Gudkov
-Gumbo
-Haedong
-Haefeli
-Haggwood
-Halberstadt
-Halfpint
-Hanfoi
-Hanriot
-Harbour
-Harsley
-Hawker
-Heinkel
-Henhouse
-Hereter
-Himmel
-Hissop
-Hitendra
-Hobble
-Hoisan
-Honi
-Hoobinoo
-Horsforth
-Horten
-Hotshot
-Hunghi
-Illios
-Illyar
-Imtiaz
-Inshan
-Insippo
-Intikhab
-Irata
-Itano
-Jaerls
-Jameson
-Jashan
-Jaxxon
-Jefferson
-Jehangir
-Jiminy
-Jishnu
-Jonson
-Jungsten
-Junkers
-Kanto
-Karlsbar
-Kawanishi
-Kazyanenko
-Kesslinger
-Kirax
-Kjeller
-Knelstrom
-Knoller
-Kocherigin
-Kondor
-Koolhoven
-Kutanaga
-Laminsk
-Lanzius
-Latte
-Laville
-Lavochkin
-Lebed
-Leominster
-Letord
-Letov
-Levasseur
-Loening
-Lohner
-Loire
-Looming
-Loring
-Macchi
-Marksman
-Martinsyde
-Maruti
-Maynard
-McCallen
-McCullough
-McDonnell
-Melson
-Memel
-Messerchmitt
-Mikoyan
-Moomintoog
-Morane
-Morgath
-Morgwain
-Morrisey
-Moskalev
-Mrigesh
-Munster
-Mureaux
-Naglo
-Nakajima
-Neddings
-Nestler
-Nieuport
-Nightfire
-Nikitin
-Nirpaw
-Nitely
-Nostram
-Numanox
-Olkhovsky
-Parnall
-Pashinin
-Petlyakov
-Pfalz
-Piaggio
-Polikarpov
-Pomilio
-Ponnier
-Potez
-Praga
-Rammidge
-Ravikumar
-Reggiane
-Renard
-Republic
-Rhiano
-Riggles
-Rikugun
-Rishmal
-Rogozarski
-Romano
-Roogus
-Roussel
-Rubble
-Rumpler
-Runningbear
-Rutkowski
-Sablatnig
-Sadayappan
-Saeed
-Salmson
-Saunders
-Schintauer
-Schism
-Schmertzin
-Schoomantal
-Schuttelanz
-Schwade
-Scorbal
-Selentiak
-Short
-Siddeley
-Siemens
-Silvansky
-Sirkelianov
-Sittingbull
-Slyusarenko
-Smythe
-Sobczak
-Sodertelge
-Sopwith
-Spad
-Spyker
-Stoop
-Sturtevant
-Supermarine
-Svenska
-Szaberwick
-Tachikawa
-Tairov
-Tebaldi
-Teebrook
-Telling
-Tereshchenko
-Teskat
-Thor
-Tigerpaw
-Tolsen
-Trafalgar
-Trefoil
-Trefusis
-Trenchcoat
-Trenkins
-Trevellion
-Tsarchon
-Uborstein
-Ulderport
-Undercroft
-Urqhart
-Urriah
-Usbourne
-Vought
-Vultee
-Waco
-Wakowski
-Walworth
-Washborne
-Weames
-Westland
-Weymann
-Wezzog
-Wibault
-Wierwight
-Willenov
-Worbridge
-Wozniak
-Wrigglesworth
-Wuramunga
-Wylie
-Yatsenko
-Yokosuka
-GossipGirl
-WorldUE
-Burnholme
-Ehrlike
-Horn
-Hatley
-Teryaki
-Firlan
-Vasser
-Zebberman
-Pappilomo
-Zuiker
-Delight
-Mayflower
-Ireland
-Connaught
-Google
-Henly
-Eleventhauer
-Weidman
-Perrin
-Trappen
-Northolt
-Vlitzen
-Jennings
-Bashir
-Raffles
-Christen
-Eldridge
-Kingstop
-Yeshto
-Belfire
-Ostaschon
-Bazno
-Redstar
-Elfan
-Giadelli
-Moonbeam
-Jodra
-Chenaux
-Ashley
-Cliffhanger
-Robenet
-Wallifers
-Kirktown
-Oppental
-Shawbridge
-Harchester
-Ishnoo
-Gordonstone
-Trialle
-Reinoir
-Nessen
-Schama
-Leeming
-Loam
-Emsbury
-Liertow
-Irling
-Umbram
-Eppeston
-Whittenstall
-Urnst
-Lunark
-Weder
-Vonbaum
-Dagenhall
-Boothroyd
-Adlerstein
-Askham
-Oughden
-Quinsette
-ConnectedWomen
-Karphar
-Bernst
-Newbauld
-Kleb
-Senne
-Ramir
-Qualcar
-Philter
-Aubos
-Fanton
-Rasteridge
-Tischler
-Defroig
-Thorsveld
-Garmouth
-Mosten
-Qaven
-Jolafson
-Yengawa
-Maudower
-Kenthauer
-Dhanhu
-Orfein
-Periapse
-Szpieler
-Njaim
-Frabersham
-Thomas
-MadeVirtual
-Dementulo
-Lowden
-Sensei
-Straylight
-Trott
-Szabo
-Garrett
-Dub
-Holloman
-Gavankar
-Lessig
-Matlin
-Pulver
-Betteridge
-IBM
-Glin
-Karpo
-Allanson
-Mojo
-Valerio
-Herz
-Alicious
-Millionaire
-Hades
-Mueller
-Motion
-Jamaluz
-Trablesi
-FiatBrasil
-AOL
-Gessner
-Gigi
-DutchX
-Design
-HzO
-Andolini
-Hunter
-Replay
-Ireport
-Pond
-Hawley
-SeraKorea
-WeAreHere
-Reeves
-Si
-HermanMiller
-Crash
-Harmsworth
-Zakaria
-SkyNews
-Perdiguero
-Adams
-Krotoski
-Martino
-Morta
-Empero
-Esiason
-Rapisardi
-Zero7
-Briegel
-Isa
-Lupus
-Holmes
-Ito
-Telstra
-Voyunicef
-UTexas
-Folds
-Malko
-Stengel
-Abair
-Romero
-Boas
-Hammer
-OrangeTeam
-Eye4You
-FIGMENTsl
-Onrez
-Xerox
-Showtime
-PhilipsDesign
-Techsan
-Avila
-Baca
-Bateman
-Benavides
-Bowling
-Bruner
-Capps
-Carrier
-Chamberlain
-Champion
-Choi
-Conn
-Darnell
-Dominguez
-Elkins
-Fitch
-Fowler
-Guzman
-Hankins
-Huerta
-Key
-Kirkpatrick
-Langford
-Le
-Lund
-Manley
-Mansfield
-McWilliams
-Moss
-Palacios
-Pina
-Roman
-Root
-Sandoval
-Seals
-Sheppard
-Solis
-Swift
-Temple
-Thomason
-Valdez
-Varner
-Vick
-Westbrook
-Wiley
-Allison
-Bermudez
-Broussard
-Bullock
-Dickens
-Dillard
-Dotson
-Elliot
-Ervin
-Flowers
-Fountain
-Gaston
-Hays
-House
-Lawrence
-Lindsey
-Lockwood
-Lujan
-Mack
-Mata
-Mathis
-Mayes
-McNair
-Metcalf
-Michel
-Negron
-Owens
-Petersen
-Reese
-Rudd
-Sierra
-Thurman
-Toney
-Valle
-Waddell
-Walden
-Whitaker
-Willard
-William
-Zimmerman
-Adkins
-Bowen
-Bridges
-Carlisle
-Castle
-Champagne
-Collier
-Conner
-Cornett
-Dempsey
-Engle
-Foreman
-Foster
-Fournier
-Garrison
-Golden
-Groves
-Hamlin
-Holcomb
-Holloway
-Hoyt
-Hutchison
-Leary
-Ledbetter
-Mackey
-Marrero
-Masters
-McClellan
-McFadden
-Mendoza
-Meyers
-Painter
-Potter
-Reece
-Riggs
-Roper
-Sams
-Shook
-Sloan
-Sneed
-Spivey
-Steward
-Tipton
-Webster
-Barrow
-Blevins
-Blue
-Boggs
-Bunch
-Clay
-Correa
-Crump
-Dyer
-Feliciano
-Fernandez
-Givens
-Haywood
-Henson
-Hernandez
-Holman
-Leal
-Lilly
-Mathews
-McGrath
-McLain
-Miner
-Mock
-Montoya
-Napier
-Ouellette
-Pacheco
-Pickens
-Quintero
-Rodrigues
-Roe
-Roland
-Rubin
-Salas
-Salazar
-Shapiro
-Snider
-Spangler
-Spence
-Stout
-Sykes
-Thayer
-Villarreal
-Whitley
-Whitt
-Xiong
-Acosta
-Benjamin
-Benson
-Bruno
-Bryan
-Campos
-Cochran
-Decker
-Early
-Farris
-Felton
-Good
-Judd
-Light
-McCauley
-McMullen
-Murillo
-Nix
-Pierson
-Sawyer
-Stratton
-Sutton
-Tilley
-Waldron
-Walter
-Wesley
-Zuniga
-Baez
-Bergeron
-Betts
-Boswell
-Butts
-Cabrera
-Colon
-Connelly
-Dubois
-Epps
-Foote
-Galindo
-Hobbs
-Holley
-Hoover
-Huynh
-Kirby
-Krause
-Lay
-Lord
-Maddox
-Meade
-Owen
-Ponce
-Potts
-Riddle
-Rivas
-Robison
-Rosas
-Schaefer
-Schwartz
-Shafer
-Villalobos
-West
-Abbott
-Acevedo
-Andersen
-Bellamy
-Blackman
-Bourgeois
-Camp
-Carlson
-Duffy
-Elmore
-Farley
-Figueroa
-Gonzalez
-Goodrich
-Griffin
-Hargrove
-Huddleston
-Ibarra
-Jamison
-Kay
-Kemp
-Lundy
-Maldonado
-Muniz
-Nadeau
-Prescott
-Raines
-Rocha
-Rosado
-Rosales
-Rowell
-Scruggs
-Shipley
-Stacy
-Staton
-Avery
-Beard
-Bonner
-Booker
-Burrell
-Call
-Deal
-Dugan
-Echols
-Erwin
-Fontenot
-Hamm
-Hart
-Hensley
-Hickey
-Jaramillo
-Keys
-Ladd
-Land
-Longoria
-McDonough
-McPherson
-Morse
-Nunez
-Ramey
-Snell
-Springer
-Trent
-Winn
-Zamora
-Bass
-Bowden
-Cash
-Castaneda
-Cornelius
-Covington
-Darden
-Denton
-Finley
-Flynn
-Gee
-Goodson
-Helms
-Inman
-Ivey
-Kyle
-Laird
-Ledford
-McNeill
-Merrill
-Norton
-Ramsey
-Rhoades
-Rojas
-Rouse
-Salinas
-Shannon
-Silva
-Sumner
-Vance
-Ybarra
-Abraham
-Baird
-Battle
-Blackmon
-Bledsoe
-Bloom
-Conrad
-Eubanks
-Goldman
-Guthrie
-Hagan
-Hale
-Kaplan
-Kurtz
-Locke
-Lockhart
-McKenzie
-Meadows
-Navarro
-Oakley
-Ortiz
-Ruiz
-Stephens
-Tillman
-Washburn
-Yarbrough
-Yazzie
-Ziegler
-Abrams
-Allred
-Bowles
-Brady
-Caron
-Cartwright
-Connors
-Corcoran
-Cordova
-Corley
-Enriquez
-Friedman
-Friend
-Gallagher
-Glover
-Harden
-Harrell
-Hatch
-Heller
-Herrera
-Hilton
-Huggins
-Hurt
-Ladner
-Love
-McClendon
-Medina
-Parr
-Pearson
-Porter
-Quintana
-Redmond
-Reeder
-Reilly
-Rios
-Rodriguez
-Vang
-Wilkes
-Wiseman
-Yoder
-Berg
-Bingham
-Branch
-Chin
-Conway
-Corbin
-Crane
-Dill
-Drew
-Gary
-Hendricks
-Hogue
-Hopper
-Huffman
-Juarez
-Lester
-Lim
-Marion
-McRae
-Melton
-Slaughter
-Smallwood
-Spears
-Tapia
-Thacker
-Womack
-Barron
-Begay
-Block
-Burris
-Chan
-Clemons
-Cote
-Driver
-Fry
-Guy
-Haney
-Herbert
-Houser
-Kearney
-Kerns
-Kirk
-Leach
-Lloyd
-Moser
-Person
-Queen
-Roberson
-Rock
-Smiley
-Starnes
-Wells
-Wolf
-Benoit
-Brantley
-Burr
-Cobb
-Emery
-England
-Guerra
-Gutierrez
-Hardy
-Henry
-Jacob
-Joyner
-Kessler
-Marino
-McDermott
-Neff
-Pearce
-Pryor
-Serrano
-Shepard
-Shields
-Simms
-Boston
-Childress
-Christian
-Crews
-Devine
-Dougherty
-Emerson
-Isaac
-Justice
-Kilgore
-Krueger
-Lozano
-Michael
-Montano
-Pate
-Pugh
-Ruffin
-Sheehan
-Stark
-Tidwell
-Woods
-Cardenas
-Carrillo
-Caudill
-Cervantes
-Conley
-Crain
-Cuevas
-Delaney
-Garza
-Hoskins
-Levine
-Lyles
-Lynn
-Marsh
-Randle
-Shoemaker
-Slater
-Staley
-Talley
-Vasquez
-Aguirre
-Akins
-Atwood
-Barlow
-Barnhart
-Burnette
-Cody
-Crockett
-Crum
-Davila
-Dickinson
-Dupree
-Hairston
-Helton
-Hester
-Hodge
-Hollingsworth
-Jarrett
-Keyes
-McClain
-McGraw
-Meza
-Parrish
-Pritchard
-Ransom
-Ricks
-Russo
-Samuels
-Travis
-Atkinson
-Babb
-Boykin
-Bradshaw
-Calderon
-Conklin
-Dickey
-Gifford
-Hinton
-Long
-Middleton
-Mobley
-Pierre
-Rangel
-Santiago
-Vickers
-Winslow
-Barajas
-Blankenship
-Bolden
-Calloway
-Coley
-Cross
-Gentry
-Griggs
-Harper
-Hodges
-Jernigan
-Johns
-Kinney
-Koch
-McCray
-Mejia
-Melvin
-Montes
-Moses
-Orozco
-Platt
-Roach
-Rosario
-Singleton
-Whaley
-Alford
-Barrera
-Boone
-Butcher
-Combs
-Crandall
-Ferrell
-Flood
-Frey
-Gagne
-Gay
-Gilliam
-Grove
-Hines
-Holland
-Ingram
-Irving
-Keenan
-Kimble
-Koehler
-Lowery
-McCracken
-McIntyre
-Payton
-Pritchett
-Reid
-Riley
-Salgado
-Shaver
-Shultz
-Swan
-Thornton
-Tovar
-Waller
-Akers
-Arias
-Biggs
-Booth
-Boudreaux
-Brandt
-Bryson
-Bynum
-Chaney
-Currie
-Daly
-Dunlap
-Galvan
-Grover
-Hancock
-Hurd
-Kauffman
-Kendrick
-Meier
-Putnam
-Sears
-Seay
-Stinson
-Tabor
-Trujillo
-Vann
-Vela
-Wilkerson
-Browning
-Cox
-Crowell
-Downing
-Easley
-Espinoza
-Frazier
-Goldsmith
-Gunter
-Hobson
-Keith
-Kruse
-Lee
-Magee
-Minor
-Perez
-Sanderson
-Stover
-Timmons
-Walton
-Alfaro
-Bird
-Chacon
-Corbett
-Cormier
-Dorsey
-Erickson
-Hinson
-Marcus
-McGowan
-Prater
-Ritchie
-Self
-Simmons
-Skaggs
-Smart
-Sweeney
-Wall
-Witt
-Blanton
-Bolton
-Chatman
-Cope
-Delarosa
-Franks
-Grady
-Hadley
-Haines
-Ham
-Hayden
-Leon
-McCarty
-Morrow
-Morton
-Mullins
-Spaulding
-Belcher
-Dickerson
-Dobson
-Dove
-Fields
-Gomes
-Hendrickson
-Kiser
-Lyons
-McNeal
-Moreno
-Schafer
-Ayers
-Banks
-Corona
-Crow
-Goss
-Harmon
-Ho
-Landers
-Mays
-McFarland
-Phelps
-Rainey
-Wilcox
-Zavala
-Barton
-Blackwell
-Bland
-Bray
-Brunson
-Church
-Cordero
-Crabtree
-Crenshaw
-Escobar
-Farmer
-Haley
-Hammond
-Hewitt
-Honeycutt
-Hurley
-Monroe
-Muller
-Novak
-Purcell
-Sampson
-Ward
-Billings
-Cisneros
-Coates
-Dennis
-Duarte
-Dumas
-Faulk
-Garland
-Gilmore
-Lutz
-Ramirez
-Schmitt
-Sexton
-Stanton
-Tolbert
-Beal
-Buckner
-Crouch
-Dodd
-Lin
-Manning
-McDowell
-McKnight
-Mercado
-Merritt
-Paige
-Peacock
-Pineda
-Romo
-Rosen
-Schmitz
-Stokes
-Wang
-Winters
-Yeager
-Addison
-Arellano
-Ballard
-Beasley
-Frank
-George
-Hartman
-Heard
-Herring
-Lamb
-Larson
-Lockett
-Lucas
-Lusk
-McManus
-Myrick
-Sizemore
-Stiles
-Triplett
-Velazquez
-Aragon
-Carney
-Dalton
-Davenport
-Gamble
-Hooks
-Kirkland
-Lacy
-Madrid
-McCormick
-Medeiros
-Rivers
-Rosa
-Sadler
-Stahl
-Teague
-Villa
-Villanueva
-Blake
-Byers
-Clement
-Cooley
-Crocker
-Drummond
-Gage
-Garner
-Gipson
-Gross
-Hurst
-Kincaid
-Knutson
-McCall
-Nickerson
-Sargent
-Worley
-Ackerman
-Bonilla
-Colbert
-Cruz
-Downs
-Elder
-Gleason
-Lugo
-Marin
-Meeks
-Nava
-Pollard
-Workman
-Aaron
-Comer
-Connor
-Coon
-Espinosa
-Hawk
-Lam
-Molina
-Tobin
-Aguilar
-Aldridge
-Anaya
-Arredondo
-Arroyo
-Arthur
-Atkins
-Barr
-Bassett
-Becker
-Belanger
-Bonds
-Boyce
-Bragg
-Brandon
-Britt
-Britton
-Browne
-Burgos
-Burkett
-Busby
-Cannon
-Cantrell
-Cantu
-Casey
-Castillo
-Chappell
-Cherry
-Christie
-Clements
-Coffman
-Coker
-Colvin
-Contreras
-Couch
-Courtney
-Craft
-Crowder
-Crowe
-Curran
-Dahl
-Dawkins
-Delacruz
-Deleon
-Delong
-Dennison
-Denny
-Dewitt
-Dickson
-Diggs
-Dodson
-Doherty
-Dolan
-Donahue
-Doran
-Dow
-Dowdy
-Dudley
-Dunham
-Edmonds
-Egan
-English
-Fair
-Farr
-Ferreira
-Finch
-Fink
-Fletcher
-Forbes
-Franco
-French
-Fritz
-Fulton
-Gagnon
-Gallo
-Galloway
-Gillis
-Glenn
-Goins
-Goldstein
-Gorman
-Grubbs
-Guidry
-Gunn
-Hackett
-Hagen
-Hager
-Hahn
-Hanley
-Hanna
-Haskins
-Haynes
-Head
-Heath
-Hendrix
-Herndon
-Herrington
-Herron
-Hilliard
-Hopkins
-Huff
-Hutchins
-Jacobson
-Johnston
-Joseph
-Joyce
-Kane
-Katz
-Keene
-Kenney
-Kern
-Kerr
-Knapp
-Lackey
-Landis
-Landry
-Langston
-Lassiter
-Latham
-Law
-Leblanc
-Leslie
-Lott
-Lovett
-Lowry
-Macias
-Madden
-Maher
-Major
-Marks
-Matos
-Mayberry
-Mayer
-McCarthy
-McCord
-McKee
-McKinnon
-McNeil
-McQueen
-Means
-Messer
-Michaud
-Milligan
-Mims
-Moon
-Mooney
-Mosley
-Myles
-Naquin
-Newsome
-Newton
-Nguyen
-Nieves
-Norris
-Oakes
-Otero
-Otto
-Parham
-Parsons
-Patterson
-Paulson
-Pendleton
-Perdue
-Pettit
-Pickett
-Piper
-Pittman
-Plummer
-Polk
-Posey
-Prince
-Quinones
-Ragland
-Randolph
-Ratliff
-Reyna
-Richards
-Richey
-Robles
-Rossi
-Rowe
-Rudolph
-Rushing
-Saldana
-Salter
-Savage
-Segura
-Shearer
-Sheets
-Sheffield
-Shelton
-Sherman
-Sherwood
-Skinner
-Sorensen
-Souza
-Stallings
-Stanford
-Starks
-Strickland
-Stroud
-Suarez
-Swartz
-Sweet
-Sylvester
-Terrell
-Tomlinson
-Trejo
-Trevino
-Valentin
-Valenzuela
-Vaughn
-Velez
-Villegas
-Vincent
-Vogt
-Weiss
-Welsh
-Werner
-Whitlock
-Whitten
-Wilkins
-Wills
-Winter
-Woodall
-Woodard
-Woodson
-Woody
-Wooten
-Wray
-Wyatt
-Wynn
-Adair
-Albright
-Andrade
-Arrington
-Askew
-Ayala
-Bartley
-Benitez
-Bowers
-Camacho
-Childers
-Cho
-Cleveland
-Cortez
-Costa
-Darby
-Daugherty
-Donaldson
-Doty
-Driscoll
-Dunbar
-Durham
-Earl
-Eason
-Eaton
-Fenton
-Floyd
-Forrest
-Gallegos
-Gordon
-Hampton
-Hannah
-Harding
-Hartley
-Hatcher
-Hemphill
-Hess
-Holbrook
-Holliday
-Hood
-Hooker
-Horne
-Jacobsen
-Jeffers
-Kenny
-Langley
-Lara
-Looney
-Marcum
-Mayfield
-McCollum
-McGhee
-Mead
-Medrano
-Mercer
-Mora
-Morin
-Myers
-Nicholson
-Norman
-Ott
-Overton
-Pack
-Pagan
-Pelletier
-Pena
-Pennington
-Peters
-Phipps
-Poe
-Pruitt
-Rasmussen
-Roth
-Schaffer
-Schulz
-Sharpe
-Shea
-Shirley
-Soto
-Sparks
-Sprague
-Stafford
-Stephenson
-Suggs
-Tate
-Tyler
-Velasquez
-Walls
-Walters
-Webber
-Winston
-Wolff
-Woodruff
-Youngblood
-Yu
-Alston
-Christopher
-Cornell
-Culver
-Daley
-Fuentes
-Gaines
-Godfrey
-Gold
-Healy
-Henderson
-Hogan
-Hollis
-Jean
-Lunsford
-Munoz
-Nance
-Neal
-Ogden
-Peoples
-Reaves
-Samuel
-Shaffer
-Sheldon
-Staples
-Tackett
-Thorpe
-Vigil
-Waters
-Whitney
-Buckley
-Cates
-Doss
-Hardin
-Jolly
-Kimball
-Metz
-Preston
-Quick
-Read
-Sapp
-Tompkins
-Granger
-Louis
-Moreland
-Pool
-Sharp
-Alvarez
-Bautista
-Brand
-Cowan
-Duran
-Herman
-Norwood
-Presley
-Downey
-Joiner
-Dwyer
-Eastman
-Vera
-Puckett
-Estes
-Anbinder
-Aronowicz
-Axel
-Axelbrad
-Baarer
-Baran
-Barenzohn
-Barom
-Bartfeld
-Baum
-Berensohn
-Beres
-Birman
-Blaustein
-Blausztein
-Bleich
-Blitz
-Bobicz
-Breslaner
-Breslauer
-Bruh
-Buchsbaum
-Buksbaum
-Charman
-Chmelniker
-Chrousch
-Chrzan
-Chuwes
-Cimmelsohn
-Czaczke
-Deutsch
-Diener
-Dikes
-Dorfler
-Drathman
-Ehrenkranz
-Eizenhart
-Eksstein
-Ellenberg
-Erdheim
-Euenstein
-Fabak
-Fafler
-Feld
-Ferber
-Ferd
-Finkler
-Fischgold
-Fischhof
-Folger
-Freese
-Freiman
-Frischohl
-Fteiszfarb
-Fuchs
-Furischer
-Furmann
-Galanter
-Gedales
-Gelbhard
-Gelbtuch
-Glas
-Goldrosen
-Gotter
-Gottesmann
-Gottlieb
-Grossman
-Grunbaum
-Grunstein
-Gunsberg
-Gunzberg
-Haber
-Halpern
-Hamer
-Handschuh
-Handsohn
-Hansmann
-Herzfeld
-Hirschklau
-Hochberg
-Hornstein
-Horowitz
-Ilsker
-Jaworower
-Jefes
-Jegolnicer
-Joles
-Kaffebaum
-Kanarek
-Kanarik
-Kaniuk
-Kassner
-Kaul
-Keppel
-Kestenbaum
-Kleinberg
-Kornfeld
-Kornitzer
-Kosnetyner
-Kriewer
-Krimmer
-Kriwer
-Kunke
-Kupfer
-Kwasman
-Laks
-Lanzet
-Lewinter
-Lowensztark
-Mandel
-Mandelkern
-Mantel
-Marbach
-Marder
-Mariasz
-Matwes
-Mazi
-Menczel
-Menker
-Menkes
-Menkez
-Mersand
-Metzer
-Migden
-Mitelman
-Mittelman
-Monczer
-Morgenstern
-Motniak
-Nathansohn
-Neuman
-Ochsenhorn
-Peczenyk
-Pfefferbluth
-Plotzel
-Pohorylles
-Polki
-Precz
-Queller
-Rabinowicz
-Reichman
-Rendelstein
-Rondelstein
-Rosenstrauch
-Rosnitiner
-Rozenfeld
-Rozenhauch
-Rozensztrauch
-Sack
-Sak
-Schaller
-Schapire
-Scharfberg
-Scharfspitz
-Schechter
-Scheitel
-Schiner
-Schleyen
-Schonberg
-Schpigelblatt
-Schrank
-Schuler
-Schumsker
-Schupfler
-Schuster
-Schwarz
-Sigall
-Silberman
-Sommerstein
-Speiser
-Spiegel
-Spiezel
-Stand
-Staryk
-Steinbok
-Susserman
-Szarbark
-Szpigel
-Szulman
-Tabacznyk
-Tabak
-Tarantal
-Tarber
-Tauber
-Tennenbaum
-Thaler
-Treberman
-Tumim
-Turkel
-Turtykower
-Tyles
-Wachtel
-Weigler
-Weisser
-Weissmeht
-Wejntraub
-Weledniger
-Wiszniak
-Wurzel
-Wysznowitzer
-Zaks
-Zeid
-Zimer
-Zimring
-Zlatkes
-Zweig
-Zwickel
-Zwilling
-Akselbrad
-Allerhand
-Altneu
-Altstatter
-Atlas
-Auerbach
-Auerbauch
-Augapfel
-Augenblik
-Axelrad
-Baar
-Babad
-Bandler
-Barbasch
-Bardach
-Bardasch
-Baryl
-Bazar
-Bazilinski
-Beizer
-Belar
-Berenhaut
-Berhunker
-Berliner
-Berman
-Bezner
-Bialyk
-Biegeleisen
-Biler
-Bilewicz
-Billig
-Binstok
-Binsztok
-Birkenfeld
-Birnbaum
-Blumenfeld
-Bokserbaum
-Boksernbaum
-Bomse
-Bomze
-Bonde
-Borsuk
-Brandes
-Brandris
-Brandriss
-Breitman
-Breiz
-Bremer
-Breumann
-Brim
-Briner
-Bromberg
-Bronet
-Bruhl
-Brumer
-Brummer
-Chajes
-Chajit
-Charmann
-Chronisch
-Chronisz
-Chunes
-Chuzen
-Czeret
-Dankner
-Dawid
-Dechtar
-Diechter
-Diker
-Dligacz
-Douner
-Dresler
-Dressler
-Drucker
-Drut
-Druth
-Drutmann
-Dubienski
-Eisenhart
-Eisenmann
-Eisman
-Eitelberg
-Eizenberg
-Eizenstark
-Ekstein
-Elfenbeim
-Elfenbein
-Erdhein
-Exelbirth
-Feigenblatt
-Feintuch
-Felberbaum
-Feldmann
-Feller
-Fellgarber
-Fellstein
-Feuerstein
-Finkelsztein
-Finl
-Fischgall
-Fiszer
-Fittinger
-Fiul
-Fleischfarb
-Fleischhacker
-Flieg
-Flugelmann
-Frachtenberg
-Frak
-Francoz
-Frankel
-Franzos
-Freundlich
-Friedlander
-Friedmann
-Friehof
-Fuhrman
-Fuhrmann
-Furkel
-Gans
-Garfunkel
-Gartenberg
-Gehlbard
-Gelbart
-Gelber
-Gelbert
-Gendzier
-Genzer
-Gerje
-Getler
-Glanz
-Glaz
-Glazner
-Gligacz
-Goldfarb
-Goldlust
-Goldrozen
-Goldschein
-Gottesman
-Gottessman
-Gottfried
-Granman
-Grauman
-Ruhig
-Grossmann
-Gruber
-Grunberg
-Grunfeld
-Grunhaut
-Grunspan
-Grunszpan
-Guter
-Hak
-Halberstam
-Halster
-Hapter
-Hassoch
-Hausmann
-Heillmann
-Held
-Hellman
-Hellmann
-Henig
-Herstein
-Hersztein
-Hesten
-Hirschl
-Hirschorn
-Hirszberg
-Hochbaum
-Hollak
-Honig
-Horberg
-Horches
-Horchier
-Horcies
-Horees
-Horeies
-Ingwer
-Jampoler
-Jampuler
-Jaryczower
-Jeces
-Jecies
-Jegolnitzer
-Jolles
-Jorisch
-Jorysch
-Jorysz
-Joszp
-Joszpe
-Joszpy
-Kaczer
-Kaczor
-Kaffehbaum
-Kahane
-Kamchen
-Kamm
-Kanik
-Kanisz
-Kapelusz
-Karmin
-Kass
-Kaufmann
-Kerbman
-Kessel
-Kesten
-Kestenberg
-Kips
-Kitaj
-Kittaj
-Kiwetz
-Klang
-Kleinfeld
-Kleinman
-Kletzel
-Klotzel
-Klugman
-Klugmann
-Knotler
-Koffenbaum
-Koppel
-Korkus
-Kornberg
-Kornbluth
-Kostenbaum
-Krakauer
-Krell
-Krochmal
-Kultus
-Kumel
-Kupferwasser
-Kurfurst
-Kurmin
-Kwasmann
-Kwastel
-Kwaszes
-Landau
-Landman
-Landmann
-Later
-Laufer
-Lax
-Leibstein
-Leichter
-Lekach
-Lenczyc
-Lerner
-Lewites
-Liebster
-Lonczyc
-Low
-Lowenhart
-Lubianiker
-Luftig
-Lutwak
-Maiman
-Maimann
-Males
-Malies
-Margulies
-Markus
-Maryjasz
-Mauer
-Meersand
-Mehler
-Mendelsohn
-Metall
-Meyersohn
-Migdan
-Milter
-Mindes
-Moger
-Munz
-Nussbaum
-Oberlander
-Ochcies
-Ocheis
-Ohl
-Ohrenstein
-Ohrensztein
-Olinger
-Orenberg
-Orenstein
-Ort
-Ostersetzer
-Ostorsetzer
-Parnas
-Patetew
-Pechmann
-Perl
-Perlman
-Perlmann
-Peterzil
-Pick
-Platzman
-Podhorzer
-Pohoryles
-Polek
-Poliak
-Polik
-Poper
-Preis
-Preiss
-Preiz
-Pudless
-Queler
-Rachman
-Rachter
-Rauch
-Rawicz
-Rechel
-Rechter
-Reich
-Reichmann
-Reitman
-Rendelsztein
-Resch
-Rosenbaum
-Rosenblum
-Rosenhauch
-Rosenman
-Rosentrauch
-Rosenzweig
-Rothberg
-Rothstein
-Rotterssman
-Rozen
-Rozenberg
-Rozenblum
-Rozenmann
-Rozenohl
-Rozenschtrauch
-Rozensztok
-Rudbarck
-Salzinger
-Sammet
-Saphir
-Sass
-Sassower
-Schachter
-Schaf
-Schames
-Schapira
-Schechtmann
-Schenkel
-Schimer
-Schmajnik
-Schmajuk
-Schmergel
-Schmetterling
-Schmid
-Schmierer
-Schneiderman
-Schneidermann
-Schnirten
-Schorr
-Schulberg
-Schulman
-Schussel
-Schwadron
-Schwalb
-Schwamm
-Scmergel
-Segall
-Seidman
-Setner
-Setzerman
-Silbermann
-Silberstein
-Silbersztein
-Somerflek
-Sommer
-Sommerfeld
-Sommerfleck
-Spacierer
-Spiegelblatt
-Spiegelmann
-Spiesel
-Spirt
-Spizel
-Srebrna
-Starek
-Stiefelman
-Susser
-Sygall
-Szachowicer
-Szapira
-Szerman
-Szkolnik
-Szmergel
-Szmuger
-Sznur
-Szpeizer
-Szpiegel
-Szpringer
-Szpunberg
-Szteiger
-Szulbaum
-Szulmann
-Szumsker
-Szumski
-Szuster
-Szwarz
-Szymar
-Tabelman
-Tafler
-Teichholz
-Teitelbaum
-Tellig
-Tepper
-Tereszke
-Thiemen
-Thumem
-Tinkel
-Tisch
-Torczyner
-Trachtenberg
-Tumem
-Twischer
-Walach
-Waltuch
-Wasser
-Wasserstrom
-Wassersztrom
-Watler
-Webelmann
-Weieman
-Weiger
-Weihrauch
-Weinbaum
-Weinber
-Weinberg
-Weinreb
-Weintraub
-Weiser
-Weissnicht
-Weisstein
-Weisstopf
-Weitman
-Weiz
-Weizenberg
-Weksler
-Werber
-Wereszczuk
-Wiener
-Wiesel
-Wieselthur
-Wilner
-Winnikow
-Winograd
-Winogrod
-Winykow
-Witrial
-Wittels
-Wolfenhaut
-Wolfzahn
-Wortsmann
-Worzsman
-Wotycer
-Wynikow
-Wyszniak
-Wysznik
-Zeiler
-Zeitlich
-Zelnik
-Ziarkower
-Ziemelsohn
-Zimerman
-Zimmermann
-Zipper
-Zlatkis
-Zwerdling
-Zwikel
-Ackmann
-Aker
-Aszkenaze
-Atlass
-Augenblick
-Barenhaut
-Barensohn
-Berenohn
-Berggrun
-Bieler
-Birnberg
-Bondar
-Branner
-Brennman
-Brun
-Byk
-Cham
-Donner
-Dratman
-Dunner
-Essel
-Eulenberg
-Feichholz
-Feriszke
-Fiszgold
-Flaks
-Flaschen
-Frauenglaz
-Freudenthal
-Frischein
-Fruchtman
-Furman
-Gehlband
-Gelbfarb
-Gertler
-Grosberg
-Grossberg
-Grun
-Hecht
-Helfer
-Hiess
-Hirsch
-Holrych
-Iger
-Jakob
-Jeczes
-Jejces
-Kas
-Kellman
-Kepferwasser
-Kleiner
-Klippel
-Kohn
-Kormann
-Kozower
-Krakaner
-Kramarz
-Kwassmann
-Kweller
-Kwietz
-Landesberg
-Liebergall
-Lorber
-Lowenstark
-Lutwag
-Madfess
-Mandelkorn
-Marmurek
-Mazie
-Meistrich
-Milgrom
-Mondschein
-Nemerower
-Orchicz
-Oryl
-Permisohn
-Philipp
-Pieczenik
-Pikholz
-Plasker
-Platzel
-Platzmann
-Pletzel
-Posaner
-Pudles
-Ramer
-Rappaport
-Rondelsztein
-Rosenfeld
-Rozenbaum
-Rozenstrauch
-Salcinger
-Samet
-Scharf
-Schenker
-Schleien
-Schonbrun
-Schor
-Schwam
-Seideler
-Seidler
-Seliger
-Sielbermann
-Sierot
-Speizer
-Suserman
-Szimmer
-Szulberg
-Szymer
-Tattelbaum
-Thei
-Verstandig
-Wachter
-Wahrhaftig
-Weinfeld
-Weisstaub
-Weitmann
-Weledniker
-Werberg
-Winterfeld
-Wolicer
-Zwanger
-Zwidling
-Acker
-Altney
-Aufrecht
-Barski
-Bazilynski
-Bazylinska
-Bazylinski
-Berkowicz
-Bermann
-Blecher
-Blitzstein
-Brecher
-Brenmann
-Brimmer
-Buxbaum
-Chajet
-Charik
-Chuwen
-Czaczkes
-Czarnobiski
-Dawner
-Dlugacz
-Epstein
-Federschneider
-Fereszki
-Finkel
-Fleiszfarb
-Forster
-Fruks
-Gatter
-Gelband
-Gelbard
-Gelles
-Goldschmied
-Gondzior
-Gutter
-Hagel
-Herzenstein
-Hirschberg
-Hirschel
-Hirszhorn
-Horehier
-Jaecies
-Jariczower
-Jawetz
-Kiezelstein
-Kiwitz
-Knipper
-Krampf
-Kraus
-Kruh
-Kwassman
-Landesbaum
-Lehrner
-Liebling
-Lowenhar
-Mager
-Margules
-Marmorek
-Messing
-Nacht
-Ochl
-Ohrberg
-Parnass
-Parnes
-Parness
-Pechman
-Perlmutter
-Pohryles
-Polke
-Popowicz
-Ryzyder
-Schimmer
-Schonhaut
-Schulmann
-Schwager
-Schwarzman
-Seid
-Seidel
-Sielberman
-Sierota
-Silberberg
-Silberfeld
-Sohl
-Spieler
-Spunberg
-Strumpfler
-Sussermann
-Taffler
-Tennen
-Thaub
-Thierhaus
-Tolczyner
-Tuchs
-Tuchscherer
-Untermann
-Walkenberg
-Webelman
-Wechsler
-Weissberg
-Weissbrod
-Weissmann
-Weistaub
-Wolkenberg
-Zauber
-Zauberman
-Zellermeyer
-Zimmer
-Brimm
-Fleischhaker
-Kerdmann
-Kleinmann
-Rossman
-Schreyer
-Slonimsk
-Somerstein
-Teplicki
-Zilz
-Zimermann
-Zukerman
-Dyszel
-Eismann
-Finkelstein
-Ginssberg
-Kirszner
-Madfes
-Mai
-Niemerower
-Sigal
-Thiemem
-Zeimer
-Barak
-Bienstock
-Kerdman
-Kieselstein
-Krach
-Mordkamm
-Baramm
-Drutman
-Kosten
-Rejkus
-Vogelbaum
-Hirschhorn
-Jejcies
-Kestenband
-Landsmann
-Steig
-Schochet
-Leiner
-Altgeld
-Osborn
-Real
-Maeda
-Graham
-Edwards
-Hockenberry
-McCain
-Heffernan
-Battelle
-Mole
-UnitTestParamilita
-UnitTestMain
-UnitTestWaffled
-UnitTestComer
-UnitTestCataloguin
-UnitTestBribery
-UnitTestTopologica
-UnitTestDisobliged
-UnitTestBuckler
-UnitTestTaejon
-UnitTestMountbatte
-UnitTestMaxillary
-UnitTestEnvisages
-UnitTestVerdure
-UnitTestImpossibil
-UnitTestCompromise
-UnitTestDenebola
-UnitTestChurch
-UnitTestAffliction
-UnitTestLuanda
-UnitTestPolyhymnia
-UnitTestOsborn
-UnitTestLawfulness
-UnitTestPhysicking
-UnitTestDisinteres
-UnitTestDarrin
-UnitTestDevalued
-UnitTestLeeward
-UnitTestExculpated
-UnitTestPerching
-UnitTestExits
-UnitTestCockleshel
-UnitTestMawkish
-UnitTestVandal
-UnitTestUnproved
-UnitTestTheories
-UnitTestSal
-UnitTestMilk
-UnitTestOshawa
-UnitTestGangland
-UnitTestBanks
-UnitTestFootman
-UnitTestMedallions
-UnitTestCoffees
-UnitTestAccustom
-UnitTestCaroler
-UnitTestControlled
-UnitTestDickens
-UnitTestAnesthetis
-UnitTestSalvadoran
-UnitTestDrywall
-UnitTestWindiness
-UnitTestHearsay
-UnitTestLoosen
-UnitTestWon
-UnitTestSaigon
-UnitTestRereads
-UnitTestCircumscri
-UnitTestRusty
-UnitTestSnouts
-UnitTestVagueness
-UnitTestEcclesiast
-UnitTestTinseltown
-UnitTestNationalis
-UnitTestMedici
-UnitTestNeighborho
-UnitTestPollutant
-UnitTestGuaranteed
-UnitTestUnite
-UnitTestGiovanni
-UnitTestCollusive
-UnitTestAquila
-UnitTestSafeguards
-UnitTestWhilst
-UnitTestReelects
-UnitTestConcession
-UnitTestCovey
-UnitTestAmplificat
-UnitTestGrazed
-UnitTestHeadmaster
-UnitTestPeru
-UnitTestWeeknight
-UnitTestTwitters
-UnitTestIndustrial
-UnitTestKeepers
-UnitTestLiverpudli
-UnitTestKaput
-UnitTestPoems
-UnitTestEtymologis
-UnitTestAvatar
-UnitTestShuttlecoc
-UnitTestStraightja
-UnitTestSewage
-UnitTestAccretion
-UnitTestMonologgin
-UnitTestBowstrings
-UnitTestGashing
-UnitTestNaturalize
-UnitTestRefraction
-UnitTestBedder
-UnitTestBands
-UnitTestJoy
-UnitTestTine
-UnitTestSavant
-UnitTestWriggler
-UnitTestDanubian
-UnitTestBattery
-UnitTestCourthouse
-UnitTestWharton
-UnitTestWatusi
-UnitTestYesterdays
-UnitTestBernardo
-UnitTestDecrescend
-UnitTestFrocks
-UnitTestRecipe
-UnitTestStruck
-UnitTestBlazer
-UnitTestJosue
-UnitTestHostelling
-UnitTestFibroid
-UnitTestSpiffies
-UnitTestSnailed
-UnitTestSolomon
-UnitTestWaltzing
-UnitTestStepmother
-UnitTestSkater
-UnitTestSteroid
-UnitTestLocalizati
-UnitTestMollifying
-UnitTestParity
-UnitTestBriefcase
-UnitTestPond
-UnitTestPym
-UnitTestSneeringly
-UnitTestManifestat
-UnitTestFrothier
-UnitTestHookier
-UnitTestSarsaparil
-UnitTestIrtish
-UnitTestNehemiah
-UnitTestAlistair
-UnitTestThreatens
-UnitTestFebruary
-UnitTestBashfully
-UnitTestCartridge
-UnitTestPeed
-UnitTestSwampier
-UnitTestMistassini
-UnitTestReassess
-UnitTestMusicals
-UnitTestForeseeabl
-UnitTestFo
-UnitTestRowboats
-UnitTestArroyo
-UnitTestAgnes
-UnitTestSpooky
-UnitTestDachau
-UnitTestOfferings
-UnitTestProfession
-UnitTestMust
-UnitTestProceeding
-UnitTestSelfish
-UnitTestAsserting
-UnitTestAcquitting
-Banufong
-Bellic
-Bookmite
-Galicia
-Hellershanks
-Lorefield
-Mimulus
-Osterham
-Parx
-Seriman
-Shelman
-Shippe
-Snoodle
-Szczepanski
-Uladstron
-Ansar
-Blaisdale
-Bravin
-Dubrovna
-Finesmith
-Footman
-Gothly
-Gurbux
-Inglewood
-Jarvinen
-Landar
-Luik
-Mavendorf
-Naidoo
-Nootan
-Penucca
-Pevensey
-Poliatevska
-Quan
-Rhiadra
-Siamendes
-Skytower
-Susanowa
-Thespian
-Twine
-Ugajin
-Weezles
-Whybrow
-Xeltentat
-Zapatero
-Andel
-Baxton
-Borkotron
-Burnstein
-Clowes
-Constantine
-Denimore
-Dezno
-Ethaniel
-Exonar
-Fhang
-Fiertze
-Franizzi
-Guisse
-Haystack
-Heliosense
-Jayaram
-Juliesse
-Kaligawa
-Karu
-Kelberwitz
-Khandr
-Koskinen
-Larnia
-Lupindo
-Magic
-Michigan
-Minotaur
-Moonites
-Morpork
-Mubble
-Muhindra
-Muircastle
-Navarathna
-Olifone
-Paule
-Quandry
-Quintessa
-Ragu
-Raviprakash
-Robonaught
-Seetan
-Sirnah
-Sorbet
-String
-Svoboda
-Triellis
-Tunwarm
-Vaher
-Vlodovic
-Wemyss
-Xue
-Yuitza
-Zessinthal
-Helendale
-Perduco
-Prim
-Mono
-Reis
-SimoneDesign
-Honda
-Umusic
-Uphantis
-Angelot
-Hanso
-Brunozzi
-Rice
-Behrend
-CokePremiereGuest
-Underhill
-Diageo
-Dillon
-Headey
-Gerkens
-Bugra
-Lemeur
-Lempert
-Goodwin
-Gourgeon
-Parra
-DuranDuran
-McMurray
-Lichtenstein
-Liguori
-Mule
-Andreessen
-TUVNORD
-Unilever
-GKteen
-Armidi
-ISID
-SParker
-Accubee
-OzIslander
-Schomer
-Renaud
-Lanier
-AmericanCancer
-MLCAmicus
-SportRelief
-CarterFinancial
-Calmund
-Helnwein
-Whammy
-Lenhardt
-Ruso
-Wagner
-Carey
-Casaca
-Fagiola
-MLCAU
-Fake
-Radiks
-Parkinson
-UnitTestImprecisio
-UnitTestObsequious
-Adamski
-Amaterasu
-Ametza
-Aristocrat
-Ashdene
-Belgar
-Beverly
-Bolissima
-Breen
-Caerndow
-Ceriano
-Cooperstone
-Diavolo
-Diesel
-Dirval
-Easterwood
-Eberhardt
-Firanelli
-Foxtrot
-Fromund
-Genira
-Gravois
-Hancroft
-Hendrassen
-Hermit
-Jigsaw
-Jumanya
-Kaestner
-Kiranov
-Kranfel
-Lannock
-Lefevre
-Lemon
-Levenque
-Lorgsval
-Luminos
-MacMoragh
-Mefusula
-Michalski
-Mirajkar
-Mistwallow
-Mortenwold
-Muggins
-Netizen
-Nubalo
-Oanomochi
-Odigaunt
-Palianta
-Parkin
-Paulino
-Plutonian
-Pobieski
-Putzo
-Raghilda
-Rajal
-Renfold
-Rexen
-Scarmon
-Scribe
-Seoung
-Serpente
-Sharple
-Shinn
-Simondsen
-Sporg
-Swashbuckler
-Sweetwater
-Teardrop
-Tharnaby
-Tiratzo
-Turbo
-Udimo
-Urvilan
-Waffle
-Windlow
-Wirefly
-Wulluf
-Zanzibar
-Beningborough
-Haefnir
-Karillion
-Martian
-McMinnar
-Savira
-Sideshow
-Yedmore
-Braveheart
-Vayandar
-DavidStern
-RoyalDutchShell
-Royal
-Knighton
-SIMA
-Silver
-Haleti
-Hillburn
-Burner
-Abbal
-futuresource
-RBS
-Bostonian
-KingdomCome
-Denk
-Fidelity
-Lamonica
-Raccoon
-Serafini
-Storm
-Tiffany
-KaySlay
-MorenoOcampo
-Abeyante
-Aboma
-Aboubakar
-Alecto
-Algoma
-Ampan
-Andretti
-Arbenlow
-Arriaga
-Avril
-Azalee
-Baguier
-Balazic
-Bartavelle
-Beeswing
-Bigbear
-Bikergrrl
-Bluxome
-Bouscario
-Bowenford
-Brandi
-Cabassoun
-Caggles
-Canucci
-Carami
-Cardalines
-Carissa
-Carpaccio
-Cascarino
-Cerise
-Choovio
-Clarity
-Coba
-Coleslaw
-Collazo
+1816
Core
-Crazyboi
-Cvercko
-Cyberschreiber
-Czartza
-Darkfold
-Dawodu
-Delicioso
-Delvalle
-Dembo
-Digfoot
-Dotterkelch
+Alex
+Abbot
+Solo
+Aboma
+Zepp
+Crystal
+Viper
+Blackheart
Dover
-Drezelan
-Dubratt
-Enderfield
-Enyo
-Eourres
-Erin
-Fanbridge
-Farigoule
+Baily
+Sparta
+Neox
+FLux
+Ruby
+Arun
+Aquila
+Chrome
+Bayn
+Deed
+Fallen
+Andretti
+Lionheart
+Toxx
+Aldrin
Foxclaw
-Frimon
-Funizza
-Goldshark
-Gummibaum
+Brune
+Zsun
+Jupiter
+Enyo
+Moonwall
+Admiral
+Ying
+Zarco
+Delicioso
+Boxen
+Gant
+Silvercloud
+Bigbear
+Scorpio
+Titanium
+Guardian
+Popstar
+Silverfall
Haiku
-Halostar
-Hazelnut
-Hepzipig
-Hernandoz
-Himanez
-Hinterland
-Hoffnung
-Huckleberry
-Humburg
-Hunniton
-Inaka
-Inkpen
-Intermenos
-Ireman
-Ivanovic
-Jinx
-Juanos
-Jyraffe
-Kahanamoku
-Kalinakov
-Kamala
-Kanya
-Kelberry
+Citron
Keng
-Kenin
-Kimono
-Koopastown
-Koray
-Kytori
-Krautrauch
-Krokus
-Lacombe
-Lamilton
-Landfall
-Langstrumpf
-Lavendel
-Lecker
-Lenroy
-Levee
-Lexenstar
-Lorakeet
-Loudwater
-Mahogany
-Marabana
-Marioman
-Marville
-Menizah
-Miami
-Moleno
-Monigal
-Moonwall
-Moriguchi
-Myrtle
-Nandahar
-Navarita
+Runner
+Shim
+Monday
+Artful
+Draconia
+Alchemi
Naxos
-Nayar
-Neiro
-Oatsmill
-Odisark
-Ohmai
-Okelli
-Oller
-Omizu
-Oompa
-Paneer
-Pawpad
-Peapod
-Petrovic
-Piers
-Placebo
-Pluvences
-Pooley
-Portland
-Pralou
-Puddlegum
-Quicksand
+India
+Taurus
+Anton
+Barcelos
+Goldshark
+Rain
+Sapphire
+Copperfield
+Kenin
+Carpaccio
+Breil
+Pizzaro
+Zelin
Radikal
-Rascon
-Revestel
-Roecastle
-Rothmanay
-Rugani
-Ruissatel
-Sabra
-Salamander
-Sandalwood
-Schnute
-Sciavo
-Seerose
-Shelbyville
-Shilling
-Shim
-Sixpence
-Skizm
-Skute
-Socke
-Sonnenkern
-Spargel
-Sparta
-Stourmead
-Stratten
-Strazytski
-Streusel
-Sugarplum
-Suppenkraut
-Swansong
-Swords
-Tigerauge
-Tigerfish
-Tiponi
-Tiraxibar
-Torvalar
-Tungsten
-Tyran
-Ushimawa
-Vaniva
-Varnish
-Warbaum
-Wickentower
-Wirsing
-Wizenheim
-Xaris
-Xenno
-Yakubu
-Yarrowroot
-Yootz
-Yuhara
-Zadark
-Zeplin
-Zepp
+Carami
+Maven
+Mocha
+Kling
+Roxley
+Genesis
+Bombastic
+Static
+Crumb
+Millar
+Wasp
+Snowpaw
+Badger
+Abrahams
+Inaka
+Spore
Ziplon
-Zsun
-Alan
-Eye
-Gillmor
-PontiacGXP
-Ropler
-Abrastraza
-Aljon
-Asamoah
-Aurotharius
-Aycliffe
-Baragula
-Bayn
-Belavidorico
-Berithos
-Braham
-Brinner
-Button
-Byron
-Caerntown
-Chaplynski
-Charisma
-Chau
-Chieng
-Chrome
-Cifuentes
-Cisse
-Copperfield
-Coulibaly
-Cyberstar
-Czavicevic
-Daffyd
-Daxeline
-Daxter
-Debbel
-Dereham
-Direwytch
-Domenitzo
-Donogal
-Draconia
-Earst
-Edelmann
-Eiren
-Ellisson
-Emor
+Broono
Engineer
+Nayar
+Bigboots
+Magnifico
+Kimono
+Garnet
Falconer
-Farquart
-Fensen
-Fenutzini
-Ferryhill
-Foehammer
-Follet
-Frenburg
-Galaxy
-Garaguru
-Gartner
-Geraln
-Ghost
-Grantham
-Grayman
-Gridolfo
-Guardian
-Haalan
-Hammand
-Heninga
-Horatio
-Huntress
-Ireto
-Ivercourt
-Jardberg
-Jolbey
-Kabila
-Karfield
-Keneinan
-Kimagawa
-Kitalpha
-Kristan
-Latzo
-Lauria
-Leborski
-Leistone
-Leitner
-Lerintzo
-Lethecus
-Lionheart
-Lisa
-Longfall
-Macalroy
-Macarthur
-Macbain
-Madrigal
-Madruga
-Masingh
-Maskelyne
-Maven
-Mavinelli
+Darkwatch
+Unplugged
+Riler
+Vemo
+Eyre
McAndrews
-Melody
+Difference
+Lexington
+Dembo
+Ronas
+Mistwalker
+Portland
+Kanya
+Acer
+Shuffle
+Ellisson
+Starship
+Wylder
+Blackbart
+Rage
+Halostar
+Kamala
+Ivanovic
+Delvalle
+Braham
+Hanly
+Kytori
+Spires
+Calamity
+Frostbite
+Rexie
+Skute
+Lexico
+Baudin
+Yven
+Lenroy
+Cheng
+Marville
Menna
-Metaller
-Mexicola
-Millet
-Milneaux
-Monacular
-Mosely
-Neox
-Nexen
-Nizna
-Ocello
-Ogleby
-Ogrimund
-Olivieri
-Ordinary
-Ormstein
-Palmira
+Cristole
+Veeper
+SecretSpy
+Overland
+Brianna
+Werefox
+Alderton
+Digfoot
+Warden
+Carfield
+Luckstone
+Starsider
+Fairlady
+Cascarino
Panthar
-Paragorn
-Parfort
-Passariello
-Pearl
-Peretz
-Pleides
-Popstar
-Python
-Qendra
-Quar
-Ranimo
-Raynier
-Rebane
-Rembranch
-Renfew
-Rexie
-Rodas
-Ronas
-Ruby
+Nider
+Debbel
+Velde
+Hoxley
+Gearbox
+Greymoon
+Philly
+Vaniva
+Ireman
+Pinelli
+Zuzu
+Lectar
+Lanley
+Okelli
+Halsey
+Neutron
+Sandalwood
+Seerose
+Ditko
Rudolf
-Sabetha
-Sabretooth
-Saxmundham
-Scarbridge
-Seubert
+Lavendel
+Yakubu
+Fireguard
+Ibor
+Verino
+Swansong
+Giordano
+Somerset
+Zifer
+Snowbear
+Ireto
+Hema
+Deezul
+Woodrunner
+Winslet
+Loudwater
+Umia
+Nyoki
+Fensen
Shamen
-Shoreman
-Silvercloud
-Snowpaw
-Spore
-Steampunk
-Sveiss
-Swordthain
-Tamatzui
-Tchailenov
-Teodosio
-Terasaur
-Thiessam
-Titanium
-Tremor
-Trizomu
+Rumble
+Feden
+Darkfire
Ulrik
-Valeska
-Vanistok
-Velinov
-Verwood
-Vintner
-Violet
-Vyper
-Walamai
-Walmer
-Walpanheim
-Warwillow
-Webwyre
-Westminster
-Wetherby
-Winstanley
-Ying
-Zaurak
-Zaytsev
-Zdychava
-Cristole
-Umino
-Wasp
-Bradford
-Cyanic
-Eisner
-Koppejan
-Lynx
-FilsAime
-Gingrich
-Higgins
-vLearning
-UH
-Reavis
-keres
-Unito
-Chauliac
-WOSP
-babbler
-Strawberry
-Tequila
-TM
-xAlixia
-Alchemi
-Aldrin
-Alenquer
-Aquila
-Aristocarnas
-Auster
-Avedon
-Azambuja
-Azemus
-Baily
-Barcelos
-Baudin
-Bellingshausen
-Bigboots
-Blackbart
-Blackheart
-Blauvelt
-Blaylock
-Bowdit
-Broadfoot
-Broono
-Bruun
-Burckhardt
-Capelo
-Carrasco
-Carstensz
-Ceriaptrix
-Charlegorn
-Chronowire
-Correia
-December
-Deezul
-Denver
-Dexing
-Diabolito
-Difference
-Dragovar
-Eberdene
-Elcano
-Eleonara
-Fadlan
-Fhloston
-Finchy
-Finistair
-Flinders
-Floresby
-Frychester
-Gabilondo
-Garnburg
-Gloom
-Grau
-Greybeard
-Halsey
-Hamelin
-Hannu
-Henusaki
-Hexicola
-Hinchcliffe
-Horngold
-Horsley
-Huncke
-Hydraconis
-Ishtari
-Jenipe
+Bulmer
+McWinnie
+Rascon
+Flagon
+Monitor
+Abrastraza
+Cyberstar
+Steampunk
Juneberry
-Jupiter
-Kawadias
-Kling
-Kozlov
-Langsdorff
-Lavradorio
-Lourbridge
-Lowtide
-MacFanatic
-Malaspina
-Marialla
-Mascarenhas
-McGillivary
-Medier
-Megadon
-Meridoc
-Metaluna
-Mocha
-Mohegan
-Monday
-Monokarlsefni
-Myanamotu
-Nachtigal
-Naimarc
-Naminosaki
-Nansen
-Nirvana
-Nordenskiold
+Ordinary
+TopHat
+Appletor
+Firelight
+Batistuta
Oakleaf
-Oleander
-Optera
-Orellana
-Orfan
-Ormega
-Overland
-Pelliot
-Perdide
-Perian
-Petrolhead
-Pexington
-Philly
-Pizzaro
-Portal
-Porthos
-Przhevalsky
-Rae
-Raleigh
-Razorfen
-Redyard
-Renierd
-Rewell
-Ricantaur
-Riddler
-Rubanis
-Schneuta
-Seljan
-Serendipity
-Serenity
+Coberts
+Raynier
+Spingflower
+Lamilton
+Oompa
+Macarthur
Serrao
-Shackleton
-Shieldmaiden
-Shuffle
-Soulstar
-Steamer
-Steamweaver
-Straulino
-Stromfield
-Strzelecki
-Tenenbaum
-Texan
-Thorkveld
-Torkelsonn
-Treves
-Trezuguet
-Tsunenaga
-Tylman
-Ubert
-Umbarundu
-Unplugged
-Urdaneta
-Uxlay
-Vectoscope
-Velde
-Verrazzano
-Vespucciano
-Wardell
-Warden
-Waverider
-Wheatcliffe
-Woodrunner
-Xomotron
-Xuanzang
-Yangtz
-Yheng
-Zarco
-Zifanwe
-Arabello
-Bloobury
-Buccaneer
-Fazuku
-Firecaster
-Furuseth
-Gearbox
-Genezzia
-Hanly
-Hassanein
-Herbit
-Karsin
-Kozlowski
-Lamplight
-Loopen
-Pyrithea
+Mhia
Qork
-Seminario
-Senizen
-Shamrock
-Strathearn
-Verne
-Vyceratops
-Yordstorm
+Rewell
+McMahn
+Francois
+Mexicola
+Serendipity
+Falmer
+Murfin
+Mistwood
+Mirabella
+Funizza
+Metaller
Zemenis
-Kegel
-Szentmartony
-Teixeira
-Glassman
-Lashes
-YouthVenture
-Tameside
-Naughty
-Actor
-Antiesse
-Anton
-Appletor
-Audeburgh
-Badger
-Benusconi
-Bilasimo
-Bluebird
-Brentley
-Brianna
-Brune
Brunswick
-Carfield
-Carlucci
-Causten
-Charlesworth
-Chun
-Clarence
-Crumb
-Daines
-Danick
-Danitz
-Davidov
-Dinzel
-Ditko
-Dockal
-Endsleigh
-Enimo
-Eppenberger
-Evanier
-Falodir
-Ferina
-Fireguard
-Flagon
-Foxdale
-Frakture
-Francois
+Molko
+Adagio
+Denfu
+Wickentower
+Bonham
+Sciavo
+Bubble
+Mildor
Galtier
-Galuptra
-Ganloso
-Garobie
-Gearhead
-Giordano
-Glom
-Hambleton
-Hansome
-Haroldsen
-Harvy
-Hawksby
-Hendes
-Humbridge
-India
-Innovia
-Islay
-Josephina
-Kira
-Kobichenko
-Korbitza
-Mekanic
-Meskin
-Migpalion
-Miliandrovic
-Mint
-Moorsider
-Munforth
-Muramabhad
-Pedalo
-Pollemis
-Qarnac
-Rajesh
-Renfort
-Roxley
-Sahara
-Schmidtzau
-Silversmith
-Somerset
-Steerpike
-Stradjinski
-Taurus
-Threebeards
-Udein
-Umia
-Underby
-Veeper
-Viatruso
-Viper
-Wardark
-Weimes
-Wellesley
-Woodford
-Xenobuilder
-Xigalia
-Yacubsen
-Yearsley
-Yiwama
-Zackerly
-Zenfold
-Arrowmint
-Calamity
-Chiung
-Easterling
-Frostbite
-Hammerthall
-Harumabhad
-Helstein
-Ichtama
-Jenvieve
-Jonstone
-Jurassic
-Larimal
-Lexington
-Mohindi
-Quinzet
-Solo
-Adder
-Aries
-Zero
-Mayhem
-Luper
-Quartz
-Crystal
-Fang
-Gearz
-Chauveau
-Barrowstone
-Cheng
-Coberts
-Hallison
-Istmal
-Joseppe
-Kalamunda
-Bunjie
+Finchy
+Xenga
+Luckless
+Lemondrop
+Bearsfoot
+MacFanatic
+Mixmaster
+Warwillow
+Delwood
+Svenson
+Alenquer
+Metaluna
+Paneer
+Collinson
+Earthboy
+Highfield
+Stromfield
+Claremont
+Iadyl
+Twist
+Inkpen
+Freng
+Crescendo
+Megadon
+Hyx
+Peretz
+Alcove
+McAuley
+Trill
+Frequency
+Southpaw
+Baguier
+Drascol
Bumblefoot
-Boxen
-Couturier
-Marenwolf
-Rizooto
-Bernheim
-Cyannis
-Lavecchia
-Mildor
-Neximus
-Scrabblebat
-Smithson
-Abbot
-Alex
-Annamemnon
-Artful
-Batriani
-Bodenhall
-Bombastic
-Boszormeny
-Bressig
-Brongniart
-Brucato
-Caffarelli
-Caultard
-Citron
-Claven
-Curameyer
-Damiano
-Darbyshire
-Denfu
-Dimitriaski
-Earleno
-Ectonite
-Edenbaum
+Steamweaver
+Wardark
+Bowenford
+Herbit
+Nyn
+Ubert
+Starsmith
+Haven
+Zeitman
+Dirkle
+Donogal
+Quixote
+Bovarro
+Aiten
Farshore
-Firehawk
-Forsythe
-Freng
-Fretwerk
-Frostwych
-Gargasaur
-Garnet
-Gavenkrantz
-Gilgandra
-Grashnar
-Harbrough
-Heungsung
-Hindrabar
-Hoxley
-Ishmene
-Jiersen
-Junibalya
-Kalnoky
-Karlsvalt
-Kaventipovic
-Kerang
-Kobaleinen
-Langer
-Lanley
-Lawksley
-Lectar
-Leeeroy
-Leimes
+Edelmann
+Moonshadow
+Teixeira
+Madrigal
+McGillivary
+Royce
+Adderstein
+Alderbury
+Sharktooth
+Puddlegum
+Caramel
+Hoof
+Shoreman
Lemton
-Lennie
-Lexico
-Magnifico
-Malifozik
-Malisotops
-Manimbo
-McKeenan
-McWinnie
-Meriadoc
-Minoptra
-Mistwalker
-Mongrain
-Oberueng
-Olihenge
-Ormenthal
-Orsini
-Oximoxi
-Padroclum
-Paolino
-Piancastellios
-Pixelmaid
-Podlum
-Quinote
-Rallier
-Rembrandt
-Rhiannyr
-Roddenham
-Scholessinger
-Scorfield
-Sharpshire
-Silverfall
-Trapdoor
-Untermeyer
-Vemo
-Wahwah
-Werefox
-Wikifoo
-Wylder
-Xevion
-Yardley
-Yven
-Zeminoba
-Zobovic
-Zufreur
-Nyoki
-Poulter
-Fierenza
-Pelazzi
-Lamplugh
-Riaxik
-Podless
-Dexler
-Kaliopov
-Arentire
-Quihoxil
-Zuta
-Gant
-Alderton
-Krutschek
-Teriatzi
-Idlemind
-Endrizzi
-Corryong
-Afterthought
-Starsider
-Gyranaut
-Raygunn
-Duranske
-PrimeLab
-LevelTwentyFive
-Papadopoulos
-Armstrong
-Kim
-Maker
-Pico
-Apple
-Museum
-SEN
-Abrahams
-Adored
-Allardyce
-Arun
-Audion
-Audurburgh
-Baddingham
-Batistuta
-Beamish
-Beninzap
-Beorn
-Beornssen
-Bhalti
-Blogfan
-Blogger
-Bohemian
-Bonham
-Borgin
-Breil
-Calcutt
+Eleonara
+Fazuku
+Nowles
+Ishtari
+Midal
+Marialla
+Pookes
+Flinders
+Darkfury
+Baragula
+Causten
+Helstein
Carminucci
-Catronis
-Chayoo
-Chiantelle
-Chingseng
-Chiwanga
-Christenson
-Chronometrist
-Claridge
-Crannock
-Dartmouth
-Darwinian
-Davi
-Davidovasic
-Dighno
-Dorchester
-Eddenbaum
-Ellsmere
-Elton
-Emerald
-Fairport
-Fallen
-Farspire
-Fenstalker
-FLux
-Foodiboo
-Garsdale
-Geordie
-Grantly
-Harcourt
-Hixantapo
-Inniatzo
-Inventor
-Jhamin
-Jovinavic
-Kariunga
-Kaufmat
-Kayor
-Kinomis
-Klavinham
-Larimore
-Laviscu
-LittleBoots
-Loordes
-Lowbeam
-Maesar
-Mattercaster
-Mendle
-Messinez
-Miggins
-Mixemup
-Molinaxil
-Molko
-Monitor
-Mordly
-Mortensen
-Murfin
-Newey
-Nider
-Nissondorf
-Northman
-Onyett
-Ozigard
-Panache
-Patrucci
-Pexie
-Pinelli
-Plassitz
-Porchers
-Portilo
-Qissinger
-Quixote
-Quorzar
-Qvetcher
-Ravinelli
-Reanimator
-Reilig
-Reinerman
-Rhapsody
-Rodex
-Rookstown
-Rubermeyer
-Runner
-Sapphire
-Scarfould
-Scientist
-Sharktooth
-Silverweb
-Smedley
-Sockington
-Southmoor
-Spanton
-Starship
-Stipe
-Svenson
-Swansen
-Tierbal
-Topaz
-Tyrellium
-Urnestone
-Waddington
-Warilard
+Toros
Warrhol
-Wexhome
-Winslet
-Winsmore
-Wonder
-Wrexan
-Xorbun
-Xubersnak
-Yanimayer
-Zebendein
-Zeitman
-Zelin
-Aghurabor
-Arkright
-Auxifur
-Batista
+Rizooto
Dionysus
-Duffield
-Euromat
-Frentis
-Ghiardie
-Glendale
-Jaggernov
-Oberts
-Parabola
-Ubble
-Yazimoto
-Yebut
-Edenflower
-Mowadeng
-Khalim
-Mumsat
-Sofinco
-Stevens
-Resonance
-Pathfinder
-IntelEmbedded
-Uresti
-CSC
-Lauren
-Comsys
-ImmersiveWorkspaces
-ThetiSheri
-Sharpesworth
-Kenyon
-Caiben
-Sleydon
-Rioccan
-Feila
-Phelan
-Whelan
-Verino
-Kalchek
-Limonaxit
-Hatchuk
-Slingshot
-OHanlon
-OHare
-Oddenfen
-Orcenhall
-Oppenbaum
-Loxingly
-Loxtonian
-Poleni
-Pappentas
-Eddingham
-Qissentell
-Qoida
-Querilo
-Weirsider
-Kolonimann
-Haustraun
-Pottzen
-Stroikavskoi
-Juventa
-Braumley
-Audebarn
-Gedenspire
-Darkwatch
-Caeran
-Cuthbertsson
-Hammill
-Tremmor
-Icthan
-Iadyl
-Iramesius
-Hema
-Jiadom
-Janic
+Velinov
+Voir
+Aubin
+Raleigh
+Caggles
+Gearhead
+Leistone
+Marabana
+Hadisson
+Silvershade
+Ixtar
+Bianco
+Asamoah
+Mendle
+Belargio
+Bernitz
+Iali
+Dethly
+Uxlay
+Horngold
+Bhalti
+Farspire
+Choovio
+Ranimo
+Torii
+Asalia
+Bluewood
+Dockal
+Fadlan
+Greybeard
+Yheng
+Arcana
+Bunjie
+Fenwitch
+Verrazzano
+Colter
Cliassi
-Fetiocci
-Reluin
-Admiral
-Saxondale
-Slafford
-Shoreland
-Spires
-Selona
-Seda
-Drammond
-Claremont
-Eyre
-Melgund
-Canonmill
-Doune
-Leamouth
-Porterfield
-Pennent
-Dragoone
-Clarrington
-Ormidale
-Murrayforth
-Glendevon
-Marshdevil
-Mothman
-Alderbury
-Merchiston
-Marchant
-SecretSpy
-Moorlord
-Rofanui
-Colinsgrove
-Millar
-Cluny
-SpiritWeaver
-Burnesdean
-Luckstone
-Caedmon
-Ghennyn
-Derryth
-Fearguis
-Ibor
-Odgar
-Leodhais
-Drachnyd
-Emodemon
-Skeltragor
-Bardenboar
-Bearsfoot
-Wrydan
-Xonfor
+Holfe
+Kalinakov
+Lysette
+Ashmoot
+Coy
+Yardley
+Miggins
+Vespucciano
+Macpherson
+Fanbridge
+Pelliot
+Sharpshire
+Panache
+Foehammer
Xurina
-Zalivstok
-Zunimoor
-Zulaman
-Genopeak
+Glendale
+Hernandoz
+Pexington
+Classito
+Acacia
+Grantly
+Paragorn
+Titian
+Deluxe
Balzibo
-Ranimodo
-Rufus
-Riler
-Toxx
-Hareshide
-Sheryffe
-Morlim
-TopHat
-Crescendo
-Composer
-Herriat
-Naire
-Namiboo
-Nowles
-Neutron
-Darkmatter
+Streusel
+Blokke
+Mekanic
+Frentis
Dimanovic
-Slavicz
-Penberg
-Horchester
+Wikifoo
+Wolfhunter
+Venom
+Islar
+Toki
+Torvalar
+Souther
+Xaron
+Orellana
+Trapdoor
+Kingsley
+Chiung
+Darwinian
+Fetuccio
+Foodiboo
+Blazewood
+Barnside
+Medier
+Atisso
+Asadar
+Sunkiller
Edring
-Cybertar
-Spingflower
-Gracemount
-Carolina
-Torrance
-Camino
-Avon
-Applewhyte
-Leonoase
-Tragonach
-Bregonis
-Kruyschek
-Feden
-Nuubert
-Edwardstone
-Aonifall
-Jestyr
-DX
-Harlander
-Dirkle
-Drascol
-Renilo
-Narstrom
-Venenbaum
-Serupta
-Ghanduhar
-Messioptra
-Meiler
-Ordram
-Faudeburgh
-Xenga
-Ahren
-Loxely
-Absent
-Jules
-Jeriamas
-Teromaximus
-Vesuvino
-Bradders
-Scorpio
-Wurgle
-Queenstown
-Pookes
-Hoyes
-Oliphaunt
-Sharkfin
-Deanimator
-Catnap
-Doghouse
-Harcassle
-Ysabel
-Luckless
+Hoffnung
+Farrasco
Freidman
+Reanimator
+Battitude
+Marioman
+Arlington
+Sabetha
+Hexicola
+Renilo
+Aurotharius
+Razorfen
+Cardalines
+Darkthief
+Oberts
+Malaspina
+Avalira
+Wellesley
+Lapis
+Wizenheim
+Oxidor
Trallis
-Urvile
-Jorgental
-Mode
-Frugel
-Hornbridge
-Demonista
-Bakerly
-Irelund
-Moyet
-Wizardly
-Ishelwood
-Genna
-Fetuccio
-Liamano
-Deed
-Endersleigh
-Lycheborne
-Mirabella
-Alphaville
-Oskar
-Gauntley
-Grafta
-Highfield
-Canningham
-Oridium
-Omegaman
-Frequency
-Gradenko
-Soup
-Madzuko
-Static
-Zeritonga
-Collinson
-Roxan
-Bramlington
-Hillburton
-Genesis
-Furlough
-Melodie
-MacIntyre
+Domenitzo
+Leimes
+Monk
+Mixemup
+Yebut
+Kimagawa
+Rubanis
+Katana
+Bradders
+Dimitriaski
+Solano
+Hartle
Mactavish
-Farrior
-Rumble
-Lemondrop
-Zane
-Sauber
-Footpad
-Mhia
-Leissa
-Mumblewood
-Kingmaker
-Ronwood
-Warcliffe
-Mesmeriser
-Souther
-Cartauld
+Tamatzui
+Threebeards
+Zaytsev
+Slafford
+Knave
+Zahm
+Allardyce
+Genezzia
+Breuer
+Azambuja
+Tutti
+Jestyr
+Blauvelt
+Humbridge
+Briand
+Frenburg
+Omegaman
+Darkward
+Bernandes
+Emolite
+Belavidorico
+Loorden
Sorrowman
-Modan
-Adderstein
-Holmeforth
-Peliatropis
-Montpenier
-Salubria
-Faith
-Sporaciao
-Elan
-Towton
-Spiritor
-Fairlady
-Mixmaster
-Glendullen
-Glenfadden
-Glenwalker
-Blindside
-Barnside
-Ruben
+Latoe
+Deanimator
+Xomotron
+Dawodu
+Blogfan
+Petrolhead
+Porterfield
+Darbyshire
+Cerna
+Moonkill
Listern
-Radmussen
-Falmer
-Bernitz
-Linette
-Bulmer
-Korpov
-Robespear
-Ashmoot
-Weirman
-Deimatov
-McAuley
-McMahn
-Macpherson
-Macbeth
-Hadisson
-Bergan
-Abonwood
-Stormcrow
-Aulder
-Yorcliffe
-Mellison
-Fenwitch
-Lysette
-Giranamo
-Southpaw
-Bravitz
-Kroitschov
-Modesto
-Nixon
-Leister
-UnitTestSalivating
-UnitTestRogers
-UnitTestThrongs
-UnitTestRifer
-Manager
-Famous
-Primsmith
-Beauty
-Knightpoint
-Buster
-UnitTestExpunging
-Expunging
-Jamkarta
+Viatruso
+Steerpike
+Mumblewood
+Lynwood
+Seljan
+Bernheim
+Waddington
+Manx
+Auggers
+Kyrie
+Oatsmill
+Burckhardt
+Czartza
+Faerye
+Balehawk
+Menizah
+Maesar
+Whelan
+Yiwama
+Gracemount
+Miliandrovic
+Underby
+Krovac
+Teodosio
+Khalim
+Nikita
+Mystiere
Niosaki
-Zimberman
-Renobaum
-Refenoir
-Esharham
-Barangaham
-Misupor
-Hadazuma
-Reikaz
-Mofanui
-Stoanes
-Rexerzon
-Breadbin
-Poida
-Undamann
-Zamarung
-Deischer
-Viertz
-Volotenko
-Valimedzic
-Koronikov
-Ullawaio
-Ferengeto
-Ixtar
-Ermintrood
-Qargen
-Classito
-Kontucci
-Limondi
-Serrari
-Naopolitana
-Numbanumba
-Rookswood
-Aedipo
-Novaland
-Hartle
-Qelmo
-Jillybean
-Dorben
-Geddins
+Airy
+Rainier
+Ivercourt
+Geordie
+Wyx
+Ryada
+Yangtz
+Merchi
+Lavarock
+Huxxely
+Udein
+Cifuentes
+Farlight
+Fenstalker
+Kerang
+Calael
+Eddingham
+Xofan
+Wheatcliffe
+Geraln
+Zenoria
+Euromat
+Derryth
+Kaur
+Snowfield
+Daysleeper
+Silent
+Coeur
+Firecloak
+Hydraconis
+Ganloso
+Zifanwe
+Klaber
+Caedmon
+Nandahar
+Edenbaum
+Xenobuilder
Yowman
-Beedit
-Emolite
-Warziders
-Knave
-Loorden
-Sarjeant
-Juisser
-Jeruben
-Kaptane
-Mondalimare
-Yorkiv
-Bardeslaw
-Sheriffe
-Quillitch
-Expiento
-Redinamus
-Lekvoda
-Massivitus
-Warbunsee
-Hubbenfluff
-Starsmith
-Dethly
-Shelter
-Raremaster
+Rajesh
Redenblack
-Earthboy
-Mistwood
-Snowbear
-Winterwolf
-Luponox
-Wassep
-Avonside
-Serrta
-Mammoth
-Darmoset
-Restless
-Battitude
-Oxhall
-Zerundi
-Stickfigure
-Yuheng
-Dreddmor
-Chiuh
-Shoteka
-Greymoon
-Xootfly
-Dannitza
-Brebenfarm
-Farslider
-Primswitch
-Froobert
-Hilltop
Ranica
-Celestalis
-Giarbert
-Littlebird
-Homebuilder
-Wobbentay
-Raymation
-Lethdetter
-Lichlore
-Utherwurldly
-Bestijl
-Chatterbox
-Feiri
-Setzer
-Thirdborn
-Mimiteh
-Kutenai
-Paquot
-Rockspider
-Mapochi
-Huillermeyer
-Aelberts
-Holfe
-Bohannes
-Forhilde
-Jarnhilde
-Lardack
-Idesma
-Yuadl
-Yexil
-Iasmertz
-Quirina
-Avindar
-Mearkus
-Lyvette
-Dasmijn
-Poggel
-Blaukempt
-Zifer
-Briebers
-Varthader
-Fessbeinder
-Hiereichler
-Klaber
-Merchi
-Correiado
-Lomes
+Gandt
+Blackcinder
+Roi
+Xuanzang
+Cvercko
+Sonnenkern
+Bluestar
+Shieldmaiden
+Serrta
+Jiersen
+Roddenham
+Colinsgrove
+Pennent
+Mattercaster
+Lacourte
+Namiboo
+Seaside
+Spearsong
+Qarnac
+Garsdale
+Walamai
+Mongrain
+Taur
Ronzales
-Bernandes
-Farrasco
-Bovarro
-Midal
-Galdonaldo
-Simsider
-Mortmagus
-Corpur
-Decycla
-Domzarjs
-Belwraith
-Belargio
-Oxidor
-Juriya
-Huxxely
-Kiopak
-Auggers
-Feldragonne
-Qusifor
-Jharls
-Terrawyng
-Fyanucci
-Pootawn
-Zeurra
-Oysternatz
-Zoilin
-Wheelwright
-Plodnaco
-Frandevoel
-Vanderbor
-Friller
-Sight
-ProductEngine
-Darkspider
-LabCube
-HarrisBroadcast
-Fresh
-YOG
-TSTC
-Chipka
-GTLLP
-Metaversa
-Pintak
-Skodlow
-Woodells
-Bridger
-Curtau
-Hurikan
-Cheorley
-Herberg
-Mialifo
-Memo
-Polandia
-Krovac
-Djannovic
-Ergaron
-Bowler
-Farstrider
-Hummingly
-Zenoria
-Xofan
-Firelyte
-Hauster
-Jierdon
-Yorfle
-Faerye
-Draegonne
-Bilavio
-Criadic
-Lyter
-Monaron
-Quander
-Querrien
-Oddson
-Vuissent
-Denothar
-Wrentling
-Ergenthal
-Aunerfal
-Ugimachi
-Kujisawa
-Ryada
-Xuisse
+Reilig
+Avium
Madeye
-Oaklourne
-Gandt
-Blokke
-Ixito
-Wiskee
-Wandsworth
-Forgraine
-Lordenwych
-Nerido
-Bogbat
-Kraditzio
-Markenly
-Shergood
-Siabonne
-Massenberg
-Ferduccio
-Vordun
-Quingly
-Palletier
-Bouevier
-Bruissardt
-Fravoisse
-Houley
-Rodeyn
-Hallenbook
-McConach
-McConaught
-Mullery
-Faromet
-McMasters
-Dertzer
-Aumenie
-Melune
-Mileman
-Moeleneaux
-Rumsford
-Veriander
-VanDouser
-Voorhees
-Velaystar
-Zahm
-Gellner
-Riegler
-Pinden
-Bagshawe
-Barineaux
-Bracula
-Ernshaw
-Larwyck
-Breuer
-Breuilly
-Brougham
-Brunsen
-Tryce
-Lavender
-Lanfier
-Laroway
-Doomdale
-Elman
-Delwood
-Ryerley
+Deimatov
+Ilex
+Thirdborn
+Dighno
+Serin
+Czavicevic
+Sharpesworth
+Wrydan
+Malik
+Canonmill
+Lemur
+Dotterkelch
+Tsunenaga
+Hauster
+Quinzet
+Xstar
+Woodsheart
+Zalivstok
+Lyric
Seorn
-Indiawood
-Islar
-Organiser
-Oxygen
-Prantis
-Pelia
-Urquan
-Lexigle
-Aura
-Lighthouse
-Nuyasaka
-Nguya
-Kamiguwa
-Hyandi
-Bandalora
-Mumbhata
-Spearsong
-Somersley
-Hindermann
-Uldarmann
-Loomslough
-Zuidde
-Zirgar
-Vrandic
-Cyrado
-Cedarbridge
-Latoe
-Latour
-Ledevre
-Jeansia
-Johnsky
-Keystrel
-Balehawk
-Malso
-Malvogen
-Diranovitz
-Hendachevich
-Milasevic
-Milodanic
-Radinovic
-Meinster
-Leirdrow
-Meriborne
-Miranifone
-Jaynesford
-Lavarock
-Lyvingstone
-Wytchwood
-Westerlow
-Toocool
-Rootcreeper
-Ericson
-Sonnenburg
-MetaverseModSquad
-integer
-float
-vector
-rotation
-string
-list
-key
-for
-if
-else
-do
-while
-jump
-return
-state
-default
-llAbs
-llAcos
-llAddToLandBanList
-llAddToLandPassList
-llAdjustSoundVolume
-llAllowInventoryDrop
-llAngleBetween
-llApplyImpulse
-llApplyRotationalImpulse
-llAsin
-llAtan2
-llAttachToAvatar
-llAvatarOnSitTarget
-llAxes2Rot
-llAxisAngle2Rot
-llBase64ToInteger
-llBase64ToString
-llBreakAllLinks
-llBreakLink
-llCeil
-llClearCameraParams
-llCloseRemoteDataChannel
-llCloud
-llCollisionFilter
-llCollisionSound
-llCollisionSprite
+Caliera
+Bettencourt
+Podless
+Rhys
+Corbeau
+Narstrom
+Gata
+Whitefalcon
+Slavicz
+llSin
llCos
-llCreateLink
-llCSV2List
-llDeleteSubList
-llDeleteSubString
-llDetachFromAvatar
-llDetectedGrab
-llDetectedGroup
-llDetectedKey
-llDetectedLinkNumber
-llDetectedName
-llDetectedOwner
-llDetectedPos
-llDetectedRot
-llDetectedType
-llDetectedVel
-llDialog
-llDie
-llDumpList2String
-llEdgeOfWorld
-llEjectFromLand
-llEmail
-llEscapeURL
-llEuler2Rot
-llFabs
-llFloor
-llForceMouselook
-llFrand
-llGetAccel
-llGetAgentInfo
-llGetAgentLanguage
-llGetAgentSize
-llGetAlpha
-llGetAndResetTime
-llGetAnimation
-llGetAnimationList
-llGetAttached
-llGetBoundingBox
-llGetCameraPos
-llGetCameraRot
-llGetCenterOfMass
-llGetColor
-llGetCreator
-llGetDate
-llGetEnergy
-llGetForce
-llGetFreeMemory
-llGetGeometricCenter
-llGetGMTclock
-llGetInventoryCreator
-llGetInventoryKey
-llGetInventoryName
-llGetInventoryNumber
-llGetInventoryPermMask
-llGetInventoryType
-llGetKey
-llGetLandOwnerAt
-llGetLinkKey
-llGetLinkName
-llGetLinkNumber
-llGetListEntryType
-llGetListLength
-llGetLocalPos
-llGetLocalRot
-llGetMass
-llGetNextEmail
-llGetNotecardLine
-llGetNumberOfNotecardLines
-llGetNumberOfPrims
-llGetNumberOfSides
-llGetObjectDesc
-llGetObjectMass
-llGetObjectName
-llGetObjectPermMask
-llGetObjectPrimCount
-llGetOmega
-llGetOwner
-llGetOwnerKey
-llGetParcelDetails
-llGetParcelFlags
-llGetParcelMaxPrims
-llGetParcelPrimCount
-llGetParcelPrimOwners
-llGetPermissions
-llGetPermissionsKey
-llGetPos
-llGetPrimitiveParams
-llGetRegionCorner
-llGetRegionFlags
-llGetRegionFPS
-llGetRegionName
-llGetRegionTimeDilation
-llGetRootPosition
-llGetRootRotation
-llGetRot
-llGetScale
-llGetScriptName
-llGetScriptState
-llGetSimulatorHostname
-llGetStartParameter
+llTan
+llAtan2
+llSqrt
+llPow
+llAbs
+llFabs
+llFrand
+llFloor
+llCeil
+llRound
+llVecMag
+llVecNorm
+llVecDist
+llRot2Euler
+llEuler2Rot
+llAxes2Rot
+llRot2Fwd
+llRot2Left
+llRot2Up
+llRotBetween
+llWhisper
+llSay
+llShout
+llListen
+llListenControl
+llListenRemove
+llSensor
+llSensorRepeat
+llSensorRemove
+llDetectedName
+llDetectedKey
+llDetectedOwner
+llDetectedType
+llDetectedPos
+llDetectedVel
+llDetectedGrab
+llDetectedRot
+llDetectedGroup
+llDetectedLinkNumber
+llDie
+llGround
+llCloud
+llWind
+llSetStatus
llGetStatus
-llGetSubString
-llGetSunDirection
+llSetScale
+llGetScale
+llSetColor
+llGetAlpha
+llSetAlpha
+llGetColor
+llSetTexture
+llScaleTexture
+llOffsetTexture
+llRotateTexture
llGetTexture
-llGetTextureOffset
-llGetTextureRot
-llGetTextureScale
-llGetTime
-llGetTimeOfDay
-llGetTimestamp
+llSetPos
+llGetPos
+llGetLocalPos
+llSetRot
+llGetRot
+llGetLocalRot
+llSetForce
+llGetForce
+llTarget
+llTargetRemove
+llRotTarget
+llRotTargetRemove
+llMoveToTarget
+llStopMoveToTarget
+llApplyImpulse
+llApplyRotationalImpulse
+llSetTorque
llGetTorque
-llGetUnixTime
+llSetForceAndTorque
llGetVel
+llGetAccel
+llGetOmega
+llGetTimeOfDay
llGetWallclock
-llGiveInventory
-llGiveInventoryList
-llGiveMoney
-llGround
-llGroundContour
-llGroundNormal
-llGroundRepel
-llGroundSlope
-llHTTPRequest
-llInsertString
-llInstantMessage
-llIntegerToBase64
-llKey2Name
-llList2CSV
-llList2Float
-llList2Integer
-llList2Key
-llList2List
-llList2ListStrided
-llList2Rot
-llList2String
-llList2Vector
-llListen
-llListenControl
-llListenRemove
-llListFindList
-llListInsertList
-llListRandomize
-llListReplaceList
-llListSort
-llListStatistics
-llLoadURL
-llLog
-llLog10
-llLookAt
+llGetTime
+llResetTime
+llGetAndResetTime
+llSound
+llPlaySound
llLoopSound
llLoopSoundMaster
llLoopSoundSlave
-llMapDestination
-llMD5String
-llMessageLinked
-llMinEventDelay
-llModifyLand
-llModPow
-llMoveToTarget
-llOffsetTexture
-llOpenRemoteDataChannel
-llOverMyLand
-llOwnerSay
-llParcelMediaCommandList
-llParcelMediaQuery
-llParseString2List
-llParseStringKeepNulls
-llParticleSystem
-llPassCollisions
-llPassTouches
-llPlaySound
llPlaySoundSlave
-llPointAt
-llPow
+llTriggerSound
+llStopSound
llPreloadSound
-llPushObject
-llReleaseCamera
+llGetSubString
+llDeleteSubString
+llInsertString
+llToUpper
+llToLower
+llGiveMoney
+llMakeExplosion
+llMakeFountain
+llMakeSmoke
+llMakeFire
+llRezObject
+llLookAt
+llStopLookAt
+llSetTimerEvent
+llSleep
+llGetMass
+llCollisionFilter
+llTakeControls
llReleaseControls
-llRegionSay
-llRemoteDataReply
-llRemoteDataSetRegion
-llRemoteLoadScriptPin
-llRemoveFromLandBanList
-llRemoveFromLandPassList
+llAttachToAvatar
+llDetachFromAvatar
+llTakeCamera
+llReleaseCamera
+llGetOwner
+llInstantMessage
+llEmail
+llGetNextEmail
+llGetKey
+llSetBuoyancy
+llSetHoverHeight
+llStopHover
+llMinEventDelay
+llSoundPreload
+llRotLookAt
+llStringLength
+llStartAnimation
+llStopAnimation
+llPointAt
+llStopPointAt
+llTargetOmega
+llGetStartParameter
+llGodLikeRezObject
+llRequestPermissions
+llGetPermissionsKey
+llGetPermissions
+llGetLinkNumber
+llSetLinkColor
+llCreateLink
+llBreakLink
+llBreakAllLinks
+llGetLinkKey
+llGetLinkName
+llGetInventoryNumber
+llGetInventoryName
+llSetScriptState
+llGetEnergy
+llGiveInventory
llRemoveInventory
-llRemoveVehicleFlags
+llSetText
+llWater
+llPassTouches
llRequestAgentData
llRequestInventoryData
-llRequestPermissions
-llRequestSimulatorData
-llResetOtherScript
+llSetDamage
+llTeleportAgentHome
+llModifyLand
+llCollisionSound
+llCollisionSprite
+llGetAnimation
llResetScript
-llResetTime
-llRezAtRoot
-llRezObject
-llRot2Angle
+llMessageLinked
+llPushObject
+llPassCollisions
+llGetScriptName
+llGetNumberOfSides
+llAxisAngle2Rot
llRot2Axis
-llRot2Euler
-llRot2Fwd
-llRot2Left
-llRot2Up
-llRotateTexture
-llRotBetween
-llRotLookAt
-llRotTarget
-llRotTargetRemove
-llRound
-llSameGroup
-llSay
-llScaleTexture
-llScriptDanger
-llSendRemoteData
-llSensor
-llSensorRemove
-llSensorRepeat
-llSetAlpha
-llSetBuoyancy
-llSetCameraAtOffset
-llSetCameraEyeOffset
-llSetCameraParams
-llSetColor
-llSetDamage
-llSetForce
-llSetForceAndTorque
-llSetHoverHeight
-llSetLinkAlpha
-llSetLinkColor
-llSetLinkPrimitiveParams
-llSetLocalRot
-llSetObjectDesc
+llRot2Angle
+llAcos
+llAsin
+llAngleBetween
+llGetInventoryKey
+llAllowInventoryDrop
+llGetSunDirection
+llGetTextureOffset
+llGetTextureScale
+llGetTextureRot
+llSubStringIndex
+llGetOwnerKey
+llGetCenterOfMass
+llListSort
+llGetListLength
+llList2Integer
+llList2Float
+llList2String
+llList2Key
+llList2Vector
+llList2Rot
+llList2List
+llDeleteSubList
+llGetListEntryType
+llList2CSV
+llCSV2List
+llListRandomize
+llList2ListStrided
+llGetRegionCorner
+llListInsertList
+llListFindList
+llGetObjectName
llSetObjectName
-llSetParcelMusicURL
-llSetPayPrice
-llSetPos
-llSetPrimitiveParams
-llSetRemoteScriptAccessPin
-llSetRot
-llSetScale
-llSetScriptState
-llSetSitText
+llGetDate
+llEdgeOfWorld
+llGetAgentInfo
+llAdjustSoundVolume
llSetSoundQueueing
-llSetStatus
-llSetText
-llSetTexture
+llSetSoundRadius
+llKey2Name
llSetTextureAnim
-llSetTimerEvent
-llSetTorque
-llSetTouchText
-llSetVehicleFlags
-llSetVehicleFloatParam
-llSetVehicleRotationParam
+llTriggerSoundLimited
+llEjectFromLand
+llParseString2List
+llOverMyLand
+llGetLandOwnerAt
+llGetNotecardLine
+llGetAgentSize
+llSameGroup
+llUnSit
+llGroundSlope
+llGroundNormal
+llGroundContour
+llGetAttached
+llGetFreeMemory
+llGetRegionName
+llGetRegionTimeDilation
+llGetRegionFPS
+llParticleSystem
+llGroundRepel
+llGiveInventoryList
llSetVehicleType
+llSetVehicleFloatParam
llSetVehicleVectorParam
-llShout
-llSin
+llSetVehicleRotationParam
+llSetVehicleFlags
+llRemoveVehicleFlags
llSitTarget
-llSleep
-llSqrt
-llStartAnimation
-llStopAnimation
-llStopHover
-llStopLookAt
-llStopMoveToTarget
-llStopPointAt
-llStopSound
-llStringLength
+llAvatarOnSitTarget
+llAddToLandPassList
+llSetTouchText
+llSetSitText
+llSetCameraEyeOffset
+llSetCameraAtOffset
+llDumpList2String
+llScriptDanger
+llDialog
+llVolumeDetect
+llResetOtherScript
+llGetScriptState
+llRemoteLoadScript
+llSetRemoteScriptAccessPin
+llRemoteLoadScriptPin
+llOpenRemoteDataChannel
+llSendRemoteData
+llRemoteDataReply
+llCloseRemoteDataChannel
+llMD5String
+llSetPrimitiveParams
llStringToBase64
-llSubStringIndex
-llTakeControls
-llTan
-llTarget
-llTargetOmega
-llTargetRemove
-llTeleportAgentHome
-llToLower
-llToUpper
-llTriggerSound
-llTriggerSoundLimited
+llBase64ToString
+llXorBase64Strings
+llRemoteDataSetRegion
+llLog10
+llLog
+llGetAnimationList
+llSetParcelMusicURL
+llGetRootPosition
+llGetRootRotation
+llGetObjectDesc
+llSetObjectDesc
+llGetCreator
+llGetTimestamp
+llSetLinkAlpha
+llGetNumberOfPrims
+llGetNumberOfNotecardLines
+llGetBoundingBox
+llGetGeometricCenter
+llGetPrimitiveParams
+llIntegerToBase64
+llBase64ToInteger
+llGetGMTclock
+llGetSimulatorHostname
+llSetLocalRot
+llParseStringKeepNulls
+llRezAtRoot
+llGetObjectPermMask
+llSetObjectPermMask
+llGetInventoryPermMask
+llSetInventoryPermMask
+llGetInventoryCreator
+llOwnerSay
+llRequestSimulatorData
+llForceMouselook
+llGetObjectMass
+llListReplaceList
+llLoadURL
+llParcelMediaCommandList
+llParcelMediaQuery
+llModPow
+llGetInventoryType
+llSetPayPrice
+llGetCameraPos
+llGetCameraRot
+llSetPrimURL
+llRefreshPrimURL
+llEscapeURL
llUnescapeURL
-llUnSit
-llVecDist
-llVecMag
-llVecNorm
-llVolumeDetect
-llWater
-llWhisper
-llWind
+llMapDestination
+llAddToLandBanList
+llRemoveFromLandPassList
+llRemoveFromLandBanList
+llSetCameraParams
+llClearCameraParams
+llListStatistics
+llGetUnixTime
+llGetParcelFlags
+llGetRegionFlags
llXorBase64StringsCorrect
-llDetectedTouchBinormal
+llHTTPRequest
+llResetLandBanList
+llResetLandPassList
+llGetObjectPrimCount
+llGetParcelPrimOwners
+llGetParcelPrimCount
+llGetParcelMaxPrims
+llGetParcelDetails
+llSetLinkPrimitiveParams
+llSetLinkTexture
+llStringTrim
+llRegionSay
+llGetObjectDetails
+llSetClickAction
+llGetRegionAgentCount
+llTextBox
+llGetAgentLanguage
+llDetectedTouchUV
llDetectedTouchFace
-llDetectedTouchNormal
llDetectedTouchPos
+llDetectedTouchNormal
+llDetectedTouchBinormal
llDetectedTouchST
-llDetectedTouchUV
-llTextBox
-llReleaseURL
-llRequestSecureURL
+llSHA1String
+llGetFreeURLs
llRequestURL
+llRequestSecureURL
+llReleaseURL
llHTTPResponse
llGetHTTPHeader
-llGetFreeURLs
-at_rot_target
-at_target
-attach
-changed
+llSetPrimMediaParams
+llGetPrimMediaParams
+llClearPrimMedia
+llSetLinkPrimitiveParamsFast
+llGetLinkPrimitiveParams
+llLinkParticleSystem
+llSetLinkTextureAnim
+llGetLinkNumberOfSides
+osSetRegionWaterHeight
+osSetRegionSunSettings
+osSetEstateSunSettings
+osGetCurrentSunHour
+osSunGetParam
+osSunSetParam
+osWindActiveModelPluginName
+osWindParamSet
+osWindParamGet
+osList2Double
+osSetDynamicTextureURL
+osSetDynamicTextureData
+osSetDynamicTextureURLBlend
+osSetDynamicTextureDataBlend
+osSetDynamicTextureURLBlendFace
+osSetDynamicTextureDataBlendFace
+osTerrainGetHeight
+osTerrainSetHeight
+osTerrainFlush
+osRegionRestart
+osRegionNotice
+osConsoleCommand
+osSetParcelMediaURL
+osSetParcelSIPAddress
+osSetPrimFloatOnWater
+osTeleportAgent
+osGetAgentIP
+osGetAgents
+osAvatarPlayAnimation
+osAvatarStopAnimation
+osMovePen
+osDrawLine
+osDrawText
+osDrawEllipse
+osDrawRectangle
+osDrawFilledRectangle
+osDrawPolygon
+osDrawFilledPolygon
+osSetFontSize
+osSetFontName
+osSetPenSize
+osSetPenCap
+osSetPenColour
+osDrawImage
+osGetDrawStringSize
+osSetStateEvents
+osGetScriptEngineName
+osGetSimulatorVersion
+osParseJSON
+osMessageObject
+osMakeNotecard
+osGetNotecardLine
+osGetNotecard
+osGetNumberOfNotecardLines
+osAvatarName2Key
+osKey2Name
+osGetGridNick
+osGetGridName
+osGetGridLoginURI
+osFormatString
+osMatchString
+osLoadedCreationDate
+osLoadedCreationTime
+osLoadedCreationID
+osGetLinkPrimitiveParams
+osNpcCreate
+osNpcMoveTo
+osNpcSay
+osNpcRemove
+osGetMapTexture
+osGetRegionMapTexture
+osGetRegionStats
+osGetSimulatorMemory
+osKickAvatar
+osSetSpeed
+osCauseDamage
+osCauseHealing
+cmSetWindlightScene
+cmSetWindlightSceneTargeted
+cmGetWindlightScene
+lsSetWindlightScene
+lsSetWindlightSceneTargeted
+lsGetWindlightScene
+llkeywords
+word
+default
+state
+integer
+float
+string
+key
+vector
+rotation
+list
+state_entry
+state_exit
+touch_start
+touch
+touch_end
+collision_start
collision
collision_end
-collision_start
-control
-dataserver
-email
-http_response
+land_collision_start
land_collision
land_collision_end
-land_collision_start
-link_message
+timer
listen
-money
-moving_end
-moving_start
+sensor
no_sensor
-not_at_rot_target
+control
+at_target
not_at_target
-object_rez
-on_rez
-remote_data
+at_rot_target
+not_at_rot_target
+money
+email
run_time_permissions
-sensor
-state_entry
-state_exit
-timer
-touch
-touch_end
-touch_start
+attach
+dataserver
+moving_start
+moving_end
+on_rez
+object_rez
+link_message
+changed
+remote_data
+http_response
http_request
-ACTIVE
+TRUE
+FALSE
+STATUS_PHYSICS
+STATUS_PHANTOM
+STATUS_ROTATE_X
+STATUS_ROTATE_Y
+STATUS_ROTATE_Z
+STATUS_SANDBOX
+STATUS_BLOCK_GRAB
+STATUS_DIE_AT_EDGE
+STATUS_RETURN_AT_EDGE
+STATUS_CAST_SHADOWS
AGENT
-AGENT_ALWAYS_RUN
+ACTIVE
+PASSIVE
+SCRIPTED
+CONTROL_FWD
+CONTROL_BACK
+CONTROL_LEFT
+CONTROL_RIGHT
+CONTROL_ROT_LEFT
+CONTROL_ROT_RIGHT
+CONTROL_UP
+CONTROL_DOWN
+CONTROL_LBUTTON
+CONTROL_ML_LBUTTON
+PERMISSION_DEBIT
+PERMISSION_TAKE_CONTROLS
+PERMISSION_TRIGGER_ANIMATION
+PERMISSION_ATTACH
+PERMISSION_CHANGE_LINKS
+PERMISSION_TRACK_CAMERA
+PERMISSION_CONTROL_CAMERA
+DEBUG_CHANNEL
+PUBLIC_CHANNEL
+AGENT_FLYING
AGENT_ATTACHMENTS
+AGENT_SCRIPTED
+AGENT_SITTING
+AGENT_ON_OBJECT
+AGENT_MOUSELOOK
AGENT_AWAY
-AGENT_CROUCHING
-AGENT_FLYING
-AGENT_BUSY
+AGENT_WALKING
AGENT_IN_AIR
AGENT_TYPING
-AGENT_WALKING
-AGENT_MOUSELOOK
-AGENT_ON_OBJECT
-AGENT_SCRIPTED
-AGENT_SITTING
-ALL_SIDES
-ANIM_ON
-ATTACH_BACK
-ATTACH_BELLY
-ATTACH_CHEST
-ATTACH_CHIN
-ATTACH_HEAD
-ATTACH_HUD_BOTTOM
-ATTACH_HUD_BOTTOM_LEFT
-ATTACH_HUD_BOTTOM_RIGHT
-ATTACH_HUD_CENTER_1
-ATTACH_HUD_CENTER_2
-ATTACH_HUD_TOP_CENTER
-ATTACH_HUD_TOP_LEFT
-ATTACH_HUD_TOP_RIGHT
-ATTACH_LEAR
-ATTACH_LEYE
-ATTACH_LFOOT
-ATTACH_LHAND
-ATTACH_LHIP
-ATTACH_LLARM
-ATTACH_LLLEG
-ATTACH_LSHOULDER
-ATTACH_LUARM
-ATTACH_LULEG
-ATTACH_MOUTH
-ATTACH_NOSE
-ATTACH_PELVIS
-ATTACH_REAR
-ATTACH_REYE
-ATTACH_RFOOT
-ATTACH_RHAND
-ATTACH_RHIP
-ATTACH_RLARM
-ATTACH_RLLEG
-ATTACH_RSHOULDER
-ATTACH_RUARM
-ATTACH_RULEG
-CAMERA_ACTIVE
+AGENT_CROUCHING
+AGENT_BUSY
+AGENT_ALWAYS_RUN
+AGENT_AUTOPILOT
+PSYS_PART_FLAGS
+PSYS_PART_START_COLOR
+PSYS_PART_START_ALPHA
+PSYS_PART_START_SCALE
+PSYS_PART_END_COLOR
+PSYS_PART_END_ALPHA
+PSYS_PART_END_SCALE
+PSYS_PART_MAX_AGE
+PSYS_PART_BOUNCE_MASK
+PSYS_PART_WIND_MASK
+PSYS_PART_INTERP_COLOR_MASK
+PSYS_PART_INTERP_SCALE_MASK
+PSYS_PART_FOLLOW_SRC_MASK
+PSYS_PART_FOLLOW_VELOCITY_MASK
+PSYS_PART_TARGET_POS_MASK
+PSYS_PART_EMISSIVE_MASK
+PSYS_PART_TARGET_LINEAR_MASK
+PSYS_SRC_PATTERN
+PSYS_SRC_INNERANGLE
+PSYS_SRC_OUTERANGLE
+PSYS_SRC_ANGLE_BEGIN
+PSYS_SRC_ANGLE_END
+PSYS_SRC_BURST_RATE
+PSYS_SRC_BURST_PART_COUNT
+PSYS_SRC_BURST_RADIUS
+PSYS_SRC_BURST_SPEED_MIN
+PSYS_SRC_BURST_SPEED_MAX
+PSYS_SRC_MAX_AGE
+PSYS_SRC_ACCEL
+PSYS_SRC_TEXTURE
+PSYS_SRC_TARGET_KEY
+PSYS_SRC_OMEGA
+PSYS_SRC_PATTERN_DROP
+PSYS_SRC_PATTERN_EXPLODE
+PSYS_SRC_PATTERN_ANGLE
+PSYS_SRC_PATTERN_ANGLE_CONE
+PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY
+OBJECT_UNKNOWN_DETAIL
+OBJECT_NAME
+OBJECT_DESC
+OBJECT_POS
+OBJECT_ROT
+OBJECT_VELOCITY
+OBJECT_OWNER
+OBJECT_GROUP
+OBJECT_CREATOR
+VEHICLE_TYPE_NONE
+VEHICLE_TYPE_SLED
+VEHICLE_TYPE_CAR
+VEHICLE_TYPE_BOAT
+VEHICLE_TYPE_AIRPLANE
+VEHICLE_TYPE_BALLOON
+VEHICLE_REFERENCE_FRAME
+VEHICLE_LINEAR_FRICTION_TIMESCALE
+VEHICLE_ANGULAR_FRICTION_TIMESCALE
+VEHICLE_LINEAR_MOTOR_DIRECTION
+VEHICLE_LINEAR_MOTOR_OFFSET
+VEHICLE_ANGULAR_MOTOR_DIRECTION
+VEHICLE_HOVER_HEIGHT
+VEHICLE_HOVER_EFFICIENCY
+VEHICLE_HOVER_TIMESCALE
+VEHICLE_BUOYANCY
+VEHICLE_LINEAR_DEFLECTION_EFFICIENCY
+VEHICLE_LINEAR_DEFLECTION_TIMESCALE
+VEHICLE_LINEAR_MOTOR_TIMESCALE
+VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE
+VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY
+VEHICLE_ANGULAR_DEFLECTION_TIMESCALE
+VEHICLE_ANGULAR_MOTOR_TIMESCALE
+VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE
+VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY
+VEHICLE_VERTICAL_ATTRACTION_TIMESCALE
+VEHICLE_BANKING_EFFICIENCY
+VEHICLE_BANKING_MIX
+VEHICLE_BANKING_TIMESCALE
+VEHICLE_FLAG_NO_DEFLECTION_UP
+VEHICLE_FLAG_LIMIT_ROLL_ONLY
+VEHICLE_FLAG_HOVER_WATER_ONLY
+VEHICLE_FLAG_HOVER_TERRAIN_ONLY
+VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT
+VEHICLE_FLAG_HOVER_UP_ONLY
+VEHICLE_FLAG_LIMIT_MOTOR_UP
+VEHICLE_FLAG_MOUSELOOK_STEER
+VEHICLE_FLAG_MOUSELOOK_BANK
+VEHICLE_FLAG_CAMERA_DECOUPLED
+CAMERA_PITCH
+CAMERA_FOCUS_OFFSET
+CAMERA_POSITION_LAG
+CAMERA_FOCUS_LAG
+CAMERA_DISTANCE
CAMERA_BEHINDNESS_ANGLE
CAMERA_BEHINDNESS_LAG
-CAMERA_DISTANCE
-CAMERA_FOCUS
-CAMERA_FOCUS_LAG
-CAMERA_FOCUS_LOCKED
-CAMERA_FOCUS_OFFSET
+CAMERA_POSITION_THRESHOLD
CAMERA_FOCUS_THRESHOLD
-CAMERA_PITCH
+CAMERA_ACTIVE
CAMERA_POSITION
-CAMERA_POSITION_LAG
+CAMERA_FOCUS
CAMERA_POSITION_LOCKED
-CAMERA_POSITION_THRESHOLD
-CHANGED_ALLOWED_DROP
-CHANGED_COLOR
-CHANGED_INVENTORY
-CHANGED_LINK
-CHANGED_OWNER
-CHANGED_REGION
-CHANGED_SCALE
-CHANGED_SHAPE
-CHANGED_TELEPORT
-CHANGED_TEXTURE
-CLICK_ACTION_BUY
-CLICK_ACTION_NONE
-CLICK_ACTION_OPEN
-CLICK_ACTION_OPEN_MEDIA
-CLICK_ACTION_PAY
-CLICK_ACTION_PLAY
-CLICK_ACTION_SIT
-CLICK_ACTION_TOUCH
-CONTROL_BACK
-CONTROL_DOWN
-CONTROL_FWD
-CONTROL_LBUTTON
-CONTROL_LEFT
-CONTROL_ML_LBUTTON
-CONTROL_RIGHT
-CONTROL_ROT_LEFT
-CONTROL_ROT_RIGHT
-CONTROL_UP
-DATA_BORN
-DATA_NAME
-DATA_ONLINE
-DATA_PAYINFO
-DATA_SIM_POS
-DATA_SIM_RATING
-DATA_SIM_STATUS
-DEBUG_CHANNEL
-EOF
-FALSE
-HTTP_BODY_MAXLENGTH
-HTTP_BODY_TRUNCATED
-HTTP_METHOD
-HTTP_MIMETYPE
-HTTP_VERIFY_CERT
-INVENTORY_ALL
-INVENTORY_ANIMATION
-INVENTORY_BODYPART
+CAMERA_FOCUS_LOCKED
+INVENTORY_TEXTURE
+INVENTORY_SOUND
+INVENTORY_OBJECT
+INVENTORY_SCRIPT
+INVENTORY_LANDMARK
INVENTORY_CLOTHING
+INVENTORY_NOTECARD
+INVENTORY_BODYPART
+INVENTORY_ANIMATION
INVENTORY_GESTURE
-INVENTORY_LANDMARK
+INVENTORY_ALL
INVENTORY_NONE
-INVENTORY_NOTECARD
-INVENTORY_OBJECT
-INVENTORY_SCRIPT
-INVENTORY_SOUND
-INVENTORY_TEXTURE
+ATTACH_CHEST
+ATTACH_HEAD
+ATTACH_LSHOULDER
+ATTACH_RSHOULDER
+ATTACH_LHAND
+ATTACH_RHAND
+ATTACH_LFOOT
+ATTACH_RFOOT
+ATTACH_BACK
+ATTACH_PELVIS
+ATTACH_MOUTH
+ATTACH_CHIN
+ATTACH_LEAR
+ATTACH_REAR
+ATTACH_LEYE
+ATTACH_REYE
+ATTACH_NOSE
+ATTACH_RUARM
+ATTACH_RLARM
+ATTACH_LUARM
+ATTACH_LLARM
+ATTACH_RHIP
+ATTACH_RULEG
+ATTACH_RLLEG
+ATTACH_LHIP
+ATTACH_LULEG
+ATTACH_LLLEG
+ATTACH_BELLY
+ATTACH_RPEC
+ATTACH_LPEC
LAND_LEVEL
+LAND_RAISE
LAND_LOWER
+LAND_SMOOTH
LAND_NOISE
-LAND_RAISE
LAND_REVERT
-LAND_SMOOTH
-LINK_ALL_CHILDREN
-LINK_ALL_OTHERS
-LINK_ROOT
-LINK_SET
-LINK_THIS
-LIST_STAT_GEOMETRIC_MEAN
-LIST_STAT_MAX
-LIST_STAT_MEAN
-LIST_STAT_MEDIAN
-LIST_STAT_MIN
-LIST_STAT_NUM_COUNT
-LIST_STAT_RANGE
-LIST_STAT_STD_DEV
-LIST_STAT_SUM
-LIST_STAT_SUM_SQUARES
-LOOP
-MASK_BASE
-MASK_EVERYONE
-MASK_GROUP
-MASK_NEXT
-MASK_OWNER
-NULL_KEY
-OBJECT_CREATOR
-OBJECT_DESC
-OBJECT_GROUP
-OBJECT_NAME
-OBJECT_OWNER
-OBJECT_POS
-OBJECT_ROT
-OBJECT_UNKNOWN_DETAIL
-OBJECT_VELOCITY
-PARCEL_DETAILS_AREA
-PARCEL_DETAILS_DESC
-PARCEL_DETAILS_GROUP
-PARCEL_DETAILS_NAME
-PARCEL_DETAILS_OWNER
-PARCEL_FLAG_ALLOW_ALL_OBJECT_ENTRY
-PARCEL_FLAG_ALLOW_CREATE_GROUP_OBJECTS
-PARCEL_FLAG_ALLOW_CREATE_OBJECTS
-PARCEL_FLAG_ALLOW_DAMAGE
-PARCEL_FLAG_ALLOW_FLY
-PARCEL_FLAG_ALLOW_GROUP_OBJECT_ENTRY
-PARCEL_FLAG_ALLOW_GROUP_SCRIPTS
-PARCEL_FLAG_ALLOW_LANDMARK
-PARCEL_FLAG_ALLOW_SCRIPTS
-PARCEL_FLAG_ALLOW_TERRAFORM
-PARCEL_FLAG_LOCAL_SOUND_ONLY
-PARCEL_FLAG_RESTRICT_PUSHOBJECT
-PARCEL_FLAG_USE_ACCESS_GROUP
-PARCEL_FLAG_USE_ACCESS_LIST
-PARCEL_FLAG_USE_BAN_LIST
-PARCEL_FLAG_USE_LAND_PASS_LIST
-PARCEL_MEDIA_COMMAND_AGENT
-PARCEL_MEDIA_COMMAND_AUTO_ALIGN
-PARCEL_MEDIA_COMMAND_LOOP
-PARCEL_MEDIA_COMMAND_PAUSE
-PARCEL_MEDIA_COMMAND_PLAY
-PARCEL_MEDIA_COMMAND_STOP
-PARCEL_MEDIA_COMMAND_TEXTURE
-PARCEL_MEDIA_COMMAND_TIME
-PARCEL_MEDIA_COMMAND_UNLOAD
-PARCEL_MEDIA_COMMAND_URL
-PASSIVE
+LAND_SMALL_BRUSH
+LAND_MEDIUM_BRUSH
+LAND_LARGE_BRUSH
+DATA_PAYINFO
+DATA_ONLINE
+DATA_NAME
+DATA_BORN
+DATA_RATING
+DATA_SIM_POS
+DATA_SIM_STATUS
+DATA_SIM_RATING
PAYMENT_INFO_ON_FILE
PAYMENT_INFO_USED
-PAY_DEFAULT
-PAY_HIDE
-PERMISSION_ATTACH
-PERMISSION_CHANGE_LINKS
-PERMISSION_CONTROL_CAMERA
-PERMISSION_DEBIT
-PERMISSION_TAKE_CONTROLS
-PERMISSION_TRACK_CAMERA
-PERMISSION_TRIGGER_ANIMATION
-PERM_ALL
-PERM_COPY
-PERM_MODIFY
-PERM_MOVE
-PERM_TRANSFER
+ANIM_ON
+LOOP
+REVERSE
PING_PONG
-PRIM_BUMP_BARK
-PRIM_BUMP_BLOBS
-PRIM_BUMP_BRICKS
-PRIM_BUMP_
-PRIM_BUMP_CHECKER
-PRIM_BUMP_CONCRETE
-PRIM_BUMP_DARK
-PRIM_BUMP_DISKS
-PRIM_BUMP_GRAVEL
-PRIM_BUMP_LARGETILE
-PRIM_BUMP_NONE
-PRIM_BUMP_SHINY
-PRIM_BUMP_SIDING
-PRIM_BUMP_STONE
-PRIM_BUMP_STUCCO
-PRIM_BUMP_SUCTION
-PRIM_BUMP_TILE
-PRIM_BUMP_WEAVE
-PRIM_BUMP_WOOD
-PRIM_COLOR
-PRIM_FLEXIBLE
-PRIM_FULL
-PRIM_GLOW
-PRIM_HOLE_CIRCLE
-PRIM_HOLE_DEFAULT
-PRIM_HOLE_SQUARE
-PRIM_HOLE_TRIANGLE
+SMOOTH
+ROTATE
+SCALE
+ALL_SIDES
+LINK_SET
+LINK_ROOT
+LINK_ALL_OTHERS
+LINK_ALL_CHILDREN
+LINK_THIS
+CHANGED_INVENTORY
+CHANGED_COLOR
+CHANGED_SHAPE
+CHANGED_SCALE
+CHANGED_TEXTURE
+CHANGED_LINK
+CHANGED_ALLOWED_DROP
+CHANGED_OWNER
+CHANGED_REGION
+CHANGED_TELEPORT
+CHANGED_REGION_START
+CHANGED_MEDIA
+TYPE_INTEGER
+TYPE_FLOAT
+TYPE_STRING
+TYPE_KEY
+TYPE_VECTOR
+TYPE_ROTATION
+TYPE_INVALID
+REMOTE_DATA_CHANNEL
+REMOTE_DATA_REQUEST
+REMOTE_DATA_REPLY
+PRIM_TYPE
PRIM_MATERIAL
-PRIM_MATERIAL_FLESH
-PRIM_MATERIAL_GLASS
-PRIM_MATERIAL_METAL
-PRIM_MATERIAL_PLASTIC
-PRIM_MATERIAL_RUBBER
-PRIM_MATERIAL_STONE
-PRIM_MATERIAL_WOOD
-PRIM_PHANTOM
PRIM_PHYSICS
+PRIM_FLEXIBLE
PRIM_POINT_LIGHT
+PRIM_TEMP_ON_REZ
+PRIM_PHANTOM
+PRIM_CAST_SHADOWS
PRIM_POSITION
-PRIM_ROTATION
-PRIM_SCULPT_TYPE_CYLINDER
-PRIM_SCULPT_TYPE_PLANE
-PRIM_SCULPT_TYPE_SPHERE
-PRIM_SCULPT_TYPE_TORUS
-PRIM_SHINY_HIGH
-PRIM_SHINY_LOW
-PRIM_SHINY_MEDIUM
-PRIM_SHINY_NONE
PRIM_SIZE
-PRIM_TEMP_ON_REZ
-PRIM_TEXGEN
-PRIM_TEXGEN_DEFAULT
-PRIM_TEXGEN_PLANAR
+PRIM_ROTATION
PRIM_TEXTURE
-PRIM_TYPE
+PRIM_COLOR
+PRIM_BUMP_SHINY
+PRIM_FULLBRIGHT
+PRIM_TEXGEN
+PRIM_GLOW
+PRIM_TEXT
+PRIM_NAME
+PRIM_DESC
PRIM_TYPE_BOX
PRIM_TYPE_CYLINDER
PRIM_TYPE_PRISM
-PRIM_TYPE_RING
-PRIM_TYPE_SCULPT
PRIM_TYPE_SPHERE
PRIM_TYPE_TORUS
PRIM_TYPE_TUBE
-PUBLIC_CHANNEL
-REMOTE_DATA_CHANNEL
-REMOTE_DATA_REPLY
-REMOTE_DATA_REQUEST
-REVERSE
-ROTATE
-SCALE
-SCRIPTED
-SMOOTH
-STATUS_BLOCK_GRAB
-STATUS_CAST_SHADOWS
-STATUS_DIE_AT_EDGE
-STATUS_PHANTOM
-STATUS_PHYSICS
-STATUS_RETURN_AT_EDGE
-STATUS_ROTATE_X
-STATUS_ROTATE_Y
-STATUS_ROTATE_Z
-STATUS_SANDBOX
-STRING_TRIM
+PRIM_TYPE_RING
+PRIM_TYPE_SCULPT
+PRIM_HOLE_DEFAULT
+PRIM_HOLE_SQUARE
+PRIM_HOLE_CIRCLE
+PRIM_HOLE_TRIANGLE
+PRIM_MATERIAL_STONE
+PRIM_MATERIAL_METAL
+PRIM_MATERIAL_GLASS
+PRIM_MATERIAL_WOOD
+PRIM_MATERIAL_FLESH
+PRIM_MATERIAL_PLASTIC
+PRIM_MATERIAL_RUBBER
+PRIM_MATERIAL_LIGHT
+PRIM_SHINY_NONE
+PRIM_SHINY_LOW
+PRIM_SHINY_MEDIUM
+PRIM_SHINY_HIGH
+PRIM_BUMP_NONE
+PRIM_BUMP_BRIGHT
+PRIM_BUMP_DARK
+PRIM_BUMP_WOOD
+PRIM_BUMP_BARK
+PRIM_BUMP_BRICKS
+PRIM_BUMP_CHECKER
+PRIM_BUMP_CONCRETE
+PRIM_BUMP_TILE
+PRIM_BUMP_STONE
+PRIM_BUMP_DISKS
+PRIM_BUMP_GRAVEL
+PRIM_BUMP_BLOBS
+PRIM_BUMP_SIDING
+PRIM_BUMP_LARGETILE
+PRIM_BUMP_STUCCO
+PRIM_BUMP_SUCTION
+PRIM_BUMP_WEAVE
+PRIM_TEXGEN_DEFAULT
+PRIM_TEXGEN_PLANAR
+PRIM_SCULPT_TYPE_SPHERE
+PRIM_SCULPT_TYPE_TORUS
+PRIM_SCULPT_TYPE_PLANE
+PRIM_SCULPT_TYPE_CYLINDER
+PRIM_SCULPT_TYPE_MASK
+PRIM_SCULPT_FLAG_INVERT
+PRIM_SCULPT_FLAG_MIRROR
+MASK_BASE
+MASK_OWNER
+MASK_GROUP
+MASK_EVERYONE
+MASK_NEXT
+PERM_TRANSFER
+PERM_MODIFY
+PERM_COPY
+PERM_MOVE
+PERM_ALL
+PARCEL_MEDIA_COMMAND_STOP
+PARCEL_MEDIA_COMMAND_PAUSE
+PARCEL_MEDIA_COMMAND_PLAY
+PARCEL_MEDIA_COMMAND_LOOP
+PARCEL_MEDIA_COMMAND_TEXTURE
+PARCEL_MEDIA_COMMAND_URL
+PARCEL_MEDIA_COMMAND_TYPE
+PARCEL_MEDIA_COMMAND_DESC
+PARCEL_MEDIA_COMMAND_TIME
+PARCEL_MEDIA_COMMAND_SIZE
+PARCEL_MEDIA_COMMAND_AGENT
+PARCEL_MEDIA_COMMAND_UNLOAD
+PARCEL_MEDIA_COMMAND_AUTO_ALIGN
+PAY_HIDE
+PAY_DEFAULT
+LIST_STAT_MAX
+LIST_STAT_MIN
+LIST_STAT_MEAN
+LIST_STAT_MEDIAN
+LIST_STAT_STD_DEV
+LIST_STAT_SUM
+LIST_STAT_SUM_SQUARES
+LIST_STAT_NUM_COUNT
+LIST_STAT_GEOMETRIC_MEAN
+LIST_STAT_RANGE
+PARCEL_FLAG_ALLOW_FLY
+PARCEL_FLAG_ALLOW_GROUP_SCRIPTS
+PARCEL_FLAG_ALLOW_SCRIPTS
+PARCEL_FLAG_ALLOW_LANDMARK
+PARCEL_FLAG_ALLOW_TERRAFORM
+PARCEL_FLAG_ALLOW_DAMAGE
+PARCEL_FLAG_ALLOW_CREATE_OBJECTS
+PARCEL_FLAG_ALLOW_CREATE_GROUP_OBJECTS
+PARCEL_FLAG_USE_ACCESS_GROUP
+PARCEL_FLAG_USE_ACCESS_LIST
+PARCEL_FLAG_USE_BAN_LIST
+PARCEL_FLAG_USE_LAND_PASS_LIST
+PARCEL_FLAG_LOCAL_SOUND_ONLY
+PARCEL_FLAG_RESTRICT_PUSHOBJECT
+PARCEL_FLAG_ALLOW_ALL_OBJECT_ENTRY
+PARCEL_FLAG_ALLOW_GROUP_OBJECT_ENTRY
+REGION_FLAG_ALLOW_DAMAGE
+REGION_FLAG_FIXED_SUN
+REGION_FLAG_BLOCK_TERRAFORM
+REGION_FLAG_SANDBOX
+REGION_FLAG_DISABLE_COLLISIONS
+REGION_FLAG_DISABLE_PHYSICS
+REGION_FLAG_BLOCK_FLY
+REGION_FLAG_ALLOW_DIRECT_TELEPORT
+REGION_FLAG_RESTRICT_PUSHOBJECT
+HTTP_METHOD
+HTTP_MIMETYPE
+HTTP_BODY_MAXLENGTH
+HTTP_VERIFY_CERT
+HTTP_BODY_TRUNCATED
+PARCEL_COUNT_TOTAL
+PARCEL_COUNT_OWNER
+PARCEL_COUNT_GROUP
+PARCEL_COUNT_OTHER
+PARCEL_COUNT_SELECTED
+PARCEL_COUNT_TEMP
+PARCEL_DETAILS_NAME
+PARCEL_DETAILS_DESC
+PARCEL_DETAILS_OWNER
+PARCEL_DETAILS_GROUP
+PARCEL_DETAILS_AREA
STRING_TRIM_HEAD
STRING_TRIM_TAIL
-TRUE
-TYPE_FLOAT
-TYPE_INTEGER
-TYPE_INVALID
-TYPE_KEY
-TYPE_ROTATION
-TYPE_STRING
-TYPE_VECTOR
-VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY
-VEHICLE_ANGULAR_DEFLECTION_TIMESCALE
-VEHICLE_ANGULAR_FRICTION_TIMESCALE
-VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE
-VEHICLE_ANGULAR_MOTOR_DIRECTION
-VEHICLE_ANGULAR_MOTOR_TIMESCALE
-VEHICLE_BANKING_EFFICIENCY
-VEHICLE_BANKING_MIX
-VEHICLE_BANKING_TIMESCALE
-VEHICLE_BUOYANCY
-VEHICLE_FLAG_CAMERA_DECOUPLED
-VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT
-VEHICLE_FLAG_HOVER_TERRAIN_ONLY
-VEHICLE_FLAG_HOVER_UP_ONLY
-VEHICLE_FLAG_HOVER_WATER_ONLY
-VEHICLE_FLAG_LIMIT_MOTOR_UP
-VEHICLE_FLAG_LIMIT_ROLL_ONLY
-VEHICLE_FLAG_MOUSELOOK_BANK
-VEHICLE_FLAG_MOUSELOOK_STEER
-VEHICLE_FLAG_NO_DEFLECTION_UP
-VEHICLE_HOVER_EFFICIENCY
-VEHICLE_HOVER_GLOBAL_HEIGHT
-VEHICLE_HOVER_HEIGHT
-VEHICLE_HOVER_TERRAIN_ONLY
-VEHICLE_HOVER_TIMESCALE
-VEHICLE_HOVER_WATER_ONLY
-VEHICLE_LINEAR_DEFLECTION_EFFICIENCY
-VEHICLE_LINEAR_DEFLECTION_TIMESCALE
-VEHICLE_LINEAR_FRICTION_TIMESCALE
-VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE
-VEHICLE_LINEAR_MOTOR_DIRECTION
-VEHICLE_LINEAR_MOTOR_OFFSET
-VEHICLE_LINEAR_MOTOR_TIMESCALE
-VEHICLE_REFERENCE_FRAME
-VEHICLE_TYPE_AIRPLANE
-VEHICLE_TYPE_BALLOON
-VEHICLE_TYPE_BOAT
-VEHICLE_TYPE_CAR
-VEHICLE_TYPE_NONE
-VEHICLE_TYPE_SLED
-VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY
-VEHICLE_VERTICAL_ATTRACTION_TIMESCALE
-TOUCH_INVALID_FACE
+STRING_TRIM
+CLICK_ACTION_NONE
+CLICK_ACTION_TOUCH
+CLICK_ACTION_SIT
+CLICK_ACTION_BUY
+CLICK_ACTION_PAY
+CLICK_ACTION_OPEN
+CLICK_ACTION_PLAY
+CLICK_ACTION_OPEN_MEDIA
+CLICK_ACTION_ZOOM
TOUCH_INVALID_TEXCOORD
TOUCH_INVALID_VECTOR
+TOUCH_INVALID_FACE
+PRIM_MEDIA_ALT_IMAGE_ENABLE
+PRIM_MEDIA_CONTROLS
+PRIM_MEDIA_CURRENT_URL
+PRIM_MEDIA_HOME_URL
+PRIM_MEDIA_AUTO_LOOP
+PRIM_MEDIA_AUTO_PLAY
+PRIM_MEDIA_AUTO_SCALE
+PRIM_MEDIA_AUTO_ZOOM
+PRIM_MEDIA_FIRST_CLICK_INTERACT
+PRIM_MEDIA_WIDTH_PIXELS
+PRIM_MEDIA_HEIGHT_PIXELS
+PRIM_MEDIA_WHITELIST_ENABLE
+PRIM_MEDIA_WHITELIST
+PRIM_MEDIA_PERMS_INTERACT
+PRIM_MEDIA_PERMS_CONTROL
+PRIM_MEDIA_PARAM_MAX
+PRIM_MEDIA_CONTROLS_STANDARD
+PRIM_MEDIA_CONTROLS_MINI
+PRIM_MEDIA_PERM_NONE
+PRIM_MEDIA_PERM_OWNER
+PRIM_MEDIA_PERM_GROUP
+PRIM_MEDIA_PERM_ANYONE
+PRIM_MEDIA_MAX_URL_LENGTH
+PRIM_MEDIA_MAX_WHITELIST_SIZE
+PRIM_MEDIA_MAX_WHITELIST_COUNT
+PRIM_MEDIA_MAX_WIDTH_PIXELS
+PRIM_MEDIA_MAX_HEIGHT_PIXELS
+STATUS_OK
+STATUS_MALFORMED_PARAMS
+STATUS_TYPE_MISMATCH
+STATUS_BOUNDS_ERROR
+STATUS_NOT_FOUND
+STATUS_NOT_SUPPORTED
+STATUS_INTERNAL_ERROR
+STATUS_WHITELIST_FAILED
+WL_WATER_COLOR
+WL_WATER_FOG_DENSITY_EXPONENT
+WL_UNDERWATER_FOG_MODIFIER
+WL_REFLECTION_WAVELET_SCALE
+WL_FRESNEL_SCALE
+WL_FRESNEL_OFFSET
+WL_REFRACT_SCALE_ABOVE
+WL_REFRACT_SCALE_BELOW
+WL_BLUR_MULTIPLIER
+WL_BIG_WAVE_DIRECTION
+WL_LITTLE_WAVE_DIRECTION
+WL_NORMAL_MAP_TEXTURE
+WL_HORIZON
+WL_HAZE_HORIZON
+WL_BLUE_DENSITY
+WL_HAZE_DENSITY
+WL_DENSITY_MULTIPLIER
+WL_DISTANCE_MULTIPLIER
+WL_MAX_ALTITUDE
+WL_SUN_MOON_COLOR
+WL_SUN_MOON_POSITION
+WL_AMBIENT
+WL_EAST_ANGLE
+WL_SUN_GLOW_FOCUS
+WL_SUN_GLOW_SIZE
+WL_SCENE_GAMMA
+WL_STAR_BRIGHTNESS
+WL_CLOUD_COLOR
+WL_CLOUD_XY_DENSITY
+WL_CLOUD_COVERAGE
+WL_CLOUD_SCALE
+WL_CLOUD_DETAIL_XY_DENSITY
+WL_CLOUD_SCROLL_X
+WL_CLOUD_SCROLL_Y
+WL_CLOUD_SCROLL_Y_LOCK
+WL_CLOUD_SCROLL_X_LOCK
+WL_DRAW_CLASSIC_CLOUDS
+NULL_KEY
+EOF
+TEXTURE_BLANK
+TEXTURE_DEFAULT
+TEXTURE_MEDIA
+TEXTURE_PLYWOOD
+TEXTURE_TRANSPARENT
URL_REQUEST_GRANTED
URL_REQUEST_DENIED
-CHANGED_REGION_START
-DEG_TO_RAD
PI
+TWO_PI
PI_BY_TWO
-SQRT2
+DEG_TO_RAD
RAD_TO_DEG
-TWO_PI
-ZERO_ROTATION
+SQRT2
ZERO_VECTOR
-PSYS_PART_FLAGS
-PSYS_PART_BOUNCE_MASK
-PSYS_PART_EMISSIVE_MASK
-PSYS_PART_FOLLOW_SRC_MASK
-PSYS_PART_FOLLOW_VELOCITY_MASK
-PSYS_PART_INTERP_COLOR_MASK
-PSYS_PART_INTERP_SCALE_MASK
-PSYS_PART_TARGET_LINEAR_MASK
-PSYS_PART_TARGET_POS_MASK
-PSYS_PART_WIND_MASK
-PSYS_PART_BEAM_MASK
-LL_PART_HUD
-LL_PART_DEAD_MASK
-LL_PART_RANDOM_ACCEL_MASK
-LL_PART_RANDOM_VEL_MASK
-LL_PART_TRAIL_MASK
-PSYS_SRC_PATTERN
-PSYS_SRC_PATTERN_ANGLE
-PSYS_SRC_PATTERN_ANGLE_CONE
-PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY
-PSYS_SRC_PATTERN_DROP
-PSYS_SRC_PATTERN_EXPLODE
-PSYS_SRC_BURST_RADIUS
-PSYS_SRC_ANGLE_BEGIN
-PSYS_SRC_ANGLE_END
-PSYS_SRC_INNERANGLE
-PSYS_SRC_OUTERANGLE
-PSYS_SRC_TARGET_KEY
-PSYS_PART_START_COLOR
-PSYS_PART_END_COLOR
-PSYS_PART_START_ALPHA
-PSYS_PART_END_ALPHA
-PSYS_PART_START_SCALE
-PSYS_PART_END_SCALE
-PSYS_SRC_TEXTURE
-PSYS_SRC_MAX_AGE
-PSYS_PART_MAX_AGE
-PSYS_SRC_BURST_RATE
-PSYS_SRC_BURST_PART_COUNT
-PSYS_SRC_ACCEL
-PSYS_SRC_OMEGA
-PSYS_SRC_BURST_SPEED_MIN
-PSYS_SRC_BURST_SPEED_MAX
+ZERO_ROTATION
+for
+do
+while
+if
+else
+jump
+return
+.com
+.org
+.net
+3rdrock
+3rdrockgrid
+3rg
+aditi
+afk
+agni
+alt
+alts
+anim
+anims
+ao
+aos
+avatar
+avatars
+avination
+banline
+banlines
+bling
+blog
+blogger
+blogs
+cgi
+chim
+chims
+cmake
+cmakelists
+cmakelists.txt
+coalesced
+copy_win_libs
+copy_win_scripts
+crashlog
+cyberlandia
+dangergrid
+derender
+develop.py
+facelight
+facelights
+firefox
+flexi
+freebie
+freebies
+furdom
+furries
+furry
+furson
+giantgrid
+gorgrid
+griefer
+griefers
+griefing
+gteam
+havok
+havok4
+havok7
+homestead
+http
+https
+hud
+huds
+imprudence.exe
+imprudenceviewer
+indra
+infohub
+infohubs
+invisiprim
+invisiprims
+inworldz
+inworldzbeta
+iw
+j2c
+j2p
+jira
+jpeg2000
+kakadu
+kdu
+l$
+lag
+lagging
+lags
+landmark
+landmarks
+legendcityonline
+liason
+liasons
+lightshare
+linden
+lindens
+lindex
+llaudio
+llcharacter
+llcommon
+llcrashlogger
+llimage
+llimagej2coj
+llinventory
+llkdu
+llkdu.dll
+llmath
+llmessage
+llplugin
+llprimitive
+llrender
+llui
+llvfs
+llwindow
+llxml
+lms
+localhost
+login
+logins
+logout
+lscript
+mac_crash_logger
+mac_updater
+media_plugins
+megaprim
+megaprims
+megaregion
+megaregions
+megas
+meta7
+mod
+mono
+mouselook
+mouseview
+mozilla
+neko
+newview
+newworldgrid
+noob
+noobie
+noobs
+offline
+ogg
+omv
+onikenkon
+online
+onrez
+openjpeg.dll
+openmetaverse
+opensim
+opensimulator
+openspace
+os
+osg
+osgrid
+php
+prebuilt
+prefab
+prim
+primitar
+prims
+quaternion
+quicktime
+reactiongrid
+rebake
+rebaked
+rebakes
+redmine
+render
+resi
+rez
+rezzed
+rezzes
+rezzing
+roleplayworlds
+ruth
+ruths
+ruthing
+sciencesim
+sciencesimbeta
+sculptie
+sculpties
+sculptmap
+secondlife
+secondlifebeta
+showcase
+sim
+simiangrid
+skybox
+sl
+slebrity
+slex
+slexing
+slurl
+slurls
+slutorial
+snowglobe
+snowstorm
+spacenav
+spacenavigator
+spam
+spamming
+spams
+stipend
+stipends
+teleport
+test_apps
+thegorgrid
+thenewworldgrid
+tier
+tiers
+tos
+tp
+tping
+tps
+trans
+unlink
+unlinks
+uuid
+uuids
+viewer_manifest.py
+virtyou
+vorbis
+webkit
+wiki
+win_crash_logger
+win_updater
+windlight
+worldsimterra
+xml
+xstreet
+xstreetsl
+yiff
+yiffs
+yiffing
+yiffy
+youralternativelife
total_number
--
cgit v1.1
From 1bdcdfab1051cf7eccc488ea43f7f5f11a5447c8 Mon Sep 17 00:00:00 2001
From: Nemurimasu Neiro
Date: Sat, 28 Aug 2010 15:33:32 +0000
Subject: fix libjpeg linking on Mac OS
my custom builds were linking against /usr/local/lib/libjpeg.8.dylib and
causing a version mismatch error when trying to use JPEGs
---
linden/indra/cmake/JPEG.cmake | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/cmake/JPEG.cmake b/linden/indra/cmake/JPEG.cmake
index 4f99efd..de9667e 100644
--- a/linden/indra/cmake/JPEG.cmake
+++ b/linden/indra/cmake/JPEG.cmake
@@ -12,7 +12,11 @@ else (STANDALONE)
if (LINUX)
set(JPEG_LIBRARIES jpeg)
elseif (DARWIN)
- set(JPEG_LIBRARIES jpeg)
+ find_library(JPEG_LIBRARIES
+ NAMES jpeg.62
+ PATHS ${ARCH_PREBUILT_DIRS_RELEASE}
+ NO_DEFAULT_PATH
+ )
elseif (WINDOWS)
set(JPEG_LIBRARIES jpeglib)
endif (LINUX)
--
cgit v1.1
From 4f09d9df6d2fa7b484489595f9620dc7dbb0c22b Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Thu, 2 Sep 2010 15:23:38 -0700
Subject: Enable chatbar commands button depending on if we're using chatbar as
a commandline or not
---
linden/indra/newview/llprefsadvanced.cpp | 10 ++++++++++
1 file changed, 10 insertions(+)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llprefsadvanced.cpp b/linden/indra/newview/llprefsadvanced.cpp
index 7fa694c..de39e01 100644
--- a/linden/indra/newview/llprefsadvanced.cpp
+++ b/linden/indra/newview/llprefsadvanced.cpp
@@ -53,6 +53,7 @@ LLPrefsAdvanced::LLPrefsAdvanced()
sInstance = this;
childSetCommitCallback("speed_rez_check", onCommitCheckBox, this);
+ childSetCommitCallback("command_line_check", onCommitCheckBox, this);
childSetAction("reset_btn", onClickResetPrefs, this);
childSetAction("command_line_btn", onClickCommandLine, this);
@@ -216,6 +217,15 @@ void LLPrefsAdvanced::refresh()
childDisable("speed_rez_seconds_text");
}
+ if (childGetValue("command_line_check").asBoolean())
+ {
+ childEnable("command_line_btn");
+ }
+ else
+ {
+ childDisable("command_line_btn");
+ }
+
LLComboBox* comboBox = getChild("EmeraldSpellBase");
if(comboBox != NULL)
{
--
cgit v1.1
From 60d8e1d77b10e6d0c0bb7361d2c2f8c3784f3a62 Mon Sep 17 00:00:00 2001
From: Nemurimasu Neiro
Date: Mon, 30 Aug 2010 20:03:09 +0000
Subject: libFLAC missing from manifest
---
linden/indra/newview/viewer_manifest.py | 1 +
1 file changed, 1 insertion(+)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/viewer_manifest.py b/linden/indra/newview/viewer_manifest.py
index a54e6fe..88ef0ad 100755
--- a/linden/indra/newview/viewer_manifest.py
+++ b/linden/indra/newview/viewer_manifest.py
@@ -557,6 +557,7 @@ class DarwinManifest(ViewerManifest):
self.path("libxml2.2.dylib")
self.path("libfaad.2.dylib")
+ self.path("libFLAC.8.dylib")
self.path("libintl.3.dylib")
self.path("libjpeg.62.dylib")
self.path("libpng12.0.dylib")
--
cgit v1.1
From 91bf5ede7c99d7b166db2d5d03b50f5602989956 Mon Sep 17 00:00:00 2001
From: Nemurimasu Neiro
Date: Mon, 30 Aug 2010 22:05:07 +0000
Subject: fix GStreamer on Mac OS
---
linden/indra/llmedia/llmediaimplgstreamer.cpp | 3 +++
1 file changed, 3 insertions(+)
(limited to 'linden/indra')
diff --git a/linden/indra/llmedia/llmediaimplgstreamer.cpp b/linden/indra/llmedia/llmediaimplgstreamer.cpp
index 259f903..2bfe4ea 100644
--- a/linden/indra/llmedia/llmediaimplgstreamer.cpp
+++ b/linden/indra/llmedia/llmediaimplgstreamer.cpp
@@ -188,6 +188,9 @@ bool LLMediaImplGStreamer::startup (LLMediaManagerData* init_data)
// Protect against GStreamer resetting the locale, yuck.
static std::string saved_locale;
saved_locale = setlocale(LC_ALL, NULL);
+#if LL_DARWIN
+ setenv("GST_PLUGIN_SYSTEM_PATH", "lib/gstreamer-plugins", TRUE);
+#endif
if (0 == gst_init_check(NULL, NULL, NULL))
{
LL_WARNS("MediaImpl") << "GStreamer library failed to initialize and load standard plugins." << LL_ENDL;
--
cgit v1.1
From e1b3562f5a71ee84796b00afe1ccc3b82bc07211 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Thu, 2 Sep 2010 15:26:50 -0700
Subject: Revert "Toggle between limited and sim-wide range for radar"
temporarily since we're not doing radar improvements this week
This reverts commit bc1263e920eb673f3c93edb8757b97b9a8a7125a.
---
linden/indra/newview/app_settings/settings.xml | 11 --------
linden/indra/newview/panelradar.cpp | 33 ++--------------------
linden/indra/newview/panelradar.h | 3 --
.../skins/default/xui/en-us/panel_radar.xml | 14 +++------
4 files changed, 7 insertions(+), 54 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index 894473b..65a6c00 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -551,17 +551,6 @@
Value
0
- RadarSimWide
-
- Comment
- If true, radar shows everyone in the sim
- Persist
- 1
- Type
- Boolean
- Value
- 0
-
SavedRenderFarClip
Comment
diff --git a/linden/indra/newview/panelradar.cpp b/linden/indra/newview/panelradar.cpp
index cfaffde..ce91da2 100644
--- a/linden/indra/newview/panelradar.cpp
+++ b/linden/indra/newview/panelradar.cpp
@@ -29,7 +29,6 @@
#include "panelradar.h"
-#include "hippoLimits.h"
#include "llagent.h"
#include "llchat.h"
#include "llfloateravatarinfo.h"
@@ -46,7 +45,6 @@
#include "llregionposition.h"
#include "roles_constants.h"
#include "llscrolllistctrl.h"
-#include "llspinctrl.h"
#include "lltracker.h"
#include "lluictrlfactory.h"
#include "llviewercontrol.h"
@@ -79,11 +77,6 @@ BOOL PanelRadar::postBuild()
childSetCommitCallback("RadarList", onUseRadarList, this);
mRadarList->setDoubleClickCallback(onClickIM);
- childSetCommitCallback("simwide_checkbox", onCheckSimWide, this);
-
- // Set max range to max height
- getChild("near_me_range")->setMaxValue(gHippoLimits->getMaxHeight());
-
childSetAction("im_btn", onClickIM, this);
childSetAction("profile_btn", onClickProfile, this);
childSetAction("offer_teleport_btn", onClickOfferTeleport, this);
@@ -223,6 +216,8 @@ void PanelRadar::updateRadarDisplay()
F32 range = gSavedSettings.getF32("NearMeRange");
bool notify_chat = gSavedSettings.getBOOL("MiniMapNotifyChatRange");
bool notify_sim = gSavedSettings.getBOOL("MiniMapNotifySimRange");
+ // We show avatars outside the estate even if you can't manage it in case griefers are lying on the border
+ bool is_manager = gAgent.getRegion()->canManageEstate();
// [RLVa:KB] - Alternate: Imprudence-1.2.0
if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
{
@@ -291,7 +286,7 @@ void PanelRadar::updateRadarDisplay()
}
// Only display avatars in range
- if (mSimWide || entry->getDistance() <= range)
+ if (is_manager || entry->getDistance() <= range)
{
// Append typing string
std::string typing = "";
@@ -554,28 +549,6 @@ void PanelRadar::onUseRadarList(LLUICtrl* ctrl, void* user_data)
}
-// static
-void PanelRadar::onCheckSimWide(LLUICtrl* ctrl, void* user_data)
-{
- PanelRadar* self = (PanelRadar*)user_data;
- if (self)
- {
- self->updateRangeControls();
- }
-}
-
-
-void PanelRadar::updateRangeControls()
-{
- LLSpinCtrl* near_me = getChild("near_me_range");
- if (near_me)
- {
- near_me->setEnabled(!gSavedSettings.getBOOL("RadarSimWide"));
- }
- mSimWide = gSavedSettings.getBOOL("RadarSimWide");
-}
-
-
bool PanelRadar::visibleItemsSelected() const
{
return (mRadarList->getFirstSelectedIndex() >= 0);
diff --git a/linden/indra/newview/panelradar.h b/linden/indra/newview/panelradar.h
index 4d53b56..59e6aff 100644
--- a/linden/indra/newview/panelradar.h
+++ b/linden/indra/newview/panelradar.h
@@ -77,7 +77,6 @@ private:
LLScrollListCtrl* mRadarList;
LLUUID mSelectedAvatar;
F32 mSelectedDistance;
- bool mSimWide;
bool visibleItemsSelected() const;
bool isKickable(const LLUUID& agent_id);
@@ -89,8 +88,6 @@ private:
static void onUseRadarList(LLUICtrl* ctrl, void* user_data);
static void onRangeChange(LLFocusableElement* focus, void* user_data);
- static void onCheckSimWide(LLUICtrl* ctrl, void* user_data);
- void updateRangeControls();
static void onClickProfile(void* user_data);
static void onClickIM(void* user_data);
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_radar.xml b/linden/indra/newview/skins/default/xui/en-us/panel_radar.xml
index d02ff0d..603f2d8 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_radar.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_radar.xml
@@ -40,13 +40,13 @@
0 avatars in
-
-
-
getConnectedGrid()->isSecondLife())
{
F32 width;
if (i >> width) cmdline_rezplat(false, width);
diff --git a/linden/indra/newview/floatercommandline.cpp b/linden/indra/newview/floatercommandline.cpp
index a700b62..c093a58 100644
--- a/linden/indra/newview/floatercommandline.cpp
+++ b/linden/indra/newview/floatercommandline.cpp
@@ -32,6 +32,7 @@
#include "floatercommandline.h"
+#include "hippoGridManager.h"
#include "lluictrlfactory.h"
#include "llviewercontrol.h"
@@ -64,6 +65,14 @@ BOOL FloaterCommandLine::postBuild()
childSetCommitCallback("CmdLineChatbarAO", onCommitApplyControl);
childSetCommitCallback("CmdLineChatbarClearChat", onCommitApplyControl);
+ // hide options that don't work on non-SL-based grids
+ if (!gHippoGridManager->getConnectedGrid()->isSecondLife())
+ {
+ childSetEnabled("CmdLineChatbarRezPlatform", FALSE);
+ childSetEnabled("loltxt6", FALSE);
+ childSetEnabled("CmdLineChatbarPlatformSize", FALSE);
+ }
+
return TRUE;
}
--
cgit v1.1
From 0025c97f079245c41431ec8a10bbca8523008cc3 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Thu, 2 Sep 2010 17:18:21 -0700
Subject: Fixed domain suffixes showing up as misspelled
---
linden/indra/newview/app_settings/dictionaries/en_sl.dic | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/dictionaries/en_sl.dic b/linden/indra/newview/app_settings/dictionaries/en_sl.dic
index b797d85..2b7a2c6 100644
--- a/linden/indra/newview/app_settings/dictionaries/en_sl.dic
+++ b/linden/indra/newview/app_settings/dictionaries/en_sl.dic
@@ -1587,9 +1587,15 @@ if
else
jump
return
-.com
-.org
-.net
+com
+org
+net
+gov
+edu
+co
+uk
+www
+irc
3rdrock
3rdrockgrid
3rg
--
cgit v1.1
From b1aeeb190c8d0ebd652a8e874c894706b199ee9b Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Thu, 2 Sep 2010 17:51:44 -0700
Subject: Fixed 'cao on/off' commands not working in the chatbar
---
linden/indra/newview/aoremotectrl.cpp | 2 ++
linden/indra/newview/chatbar_as_cmdline.cpp | 6 +++---
2 files changed, 5 insertions(+), 3 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/aoremotectrl.cpp b/linden/indra/newview/aoremotectrl.cpp
index 8cafdd9..781f1b3 100644
--- a/linden/indra/newview/aoremotectrl.cpp
+++ b/linden/indra/newview/aoremotectrl.cpp
@@ -96,6 +96,7 @@ void AORemoteCtrl::onClickToggleAO(void* data)
{
BOOL ao_enable = gSavedSettings.getBOOL("AOEnabled");
gSavedSettings.setBOOL("AOEnabled", !ao_enable);
+ LLFloaterAO::run();
}
//static
@@ -103,6 +104,7 @@ void AORemoteCtrl::onClickToggleAOSit(void* data)
{
BOOL sit_enable = gSavedSettings.getBOOL("AOSitsEnabled");
gSavedSettings.setBOOL("AOSitsEnabled", !sit_enable);
+ LLFloaterAO::run();
}
//static
diff --git a/linden/indra/newview/chatbar_as_cmdline.cpp b/linden/indra/newview/chatbar_as_cmdline.cpp
index aae4fbe..59804c0 100644
--- a/linden/indra/newview/chatbar_as_cmdline.cpp
+++ b/linden/indra/newview/chatbar_as_cmdline.cpp
@@ -378,18 +378,18 @@ bool cmd_line_chat(std::string revised_text, EChatType type)
{
if (status == "on" )
{
- gSavedPerAccountSettings.setBOOL("AOEnabled",TRUE);
+ gSavedSettings.setBOOL("AOEnabled",TRUE);
// LLFloaterAO::init();
LLFloaterAO::run();
}
else if (status == "off" )
{
- gSavedPerAccountSettings.setBOOL("AOEnabled",FALSE);
+ gSavedSettings.setBOOL("AOEnabled",FALSE);
LLFloaterAO::run();
}
else if (status == "sit" )
{
- gSavedPerAccountSettings.setBOOL("AOSitsEnabled",!gSavedPerAccountSettings.getBOOL("AOSitsEnabled"));
+ gSavedSettings.setBOOL("AOSitsEnabled",!gSavedPerAccountSettings.getBOOL("AOSitsEnabled"));
}
}
return false;
--
cgit v1.1
From 33fbe66dd105e7cc642c2d164bf2c5c58fae3a11 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Fri, 3 Sep 2010 09:01:46 -0700
Subject: Made IM History feature enabled cross-platform (#182). Also fixes
#250
---
linden/indra/newview/llimpanel.cpp | 121 ++++++---------------
linden/indra/newview/llimpanel.h | 2 -
.../default/xui/en-us/floater_instant_message.xml | 18 +--
.../xui/en-us/floater_instant_message_group.xml | 12 +-
4 files changed, 48 insertions(+), 105 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llimpanel.cpp b/linden/indra/newview/llimpanel.cpp
index be6df5b..6cf7ffb 100644
--- a/linden/indra/newview/llimpanel.cpp
+++ b/linden/indra/newview/llimpanel.cpp
@@ -1082,7 +1082,6 @@ LLFloaterIMPanel::LLFloaterIMPanel(
LLFloater(session_label, LLRect(), session_label),
mInputEditor(NULL),
mHistoryEditor(NULL),
- mComboIM(NULL),
mSessionUUID(session_id),
mVoiceChannel(NULL),
mSessionInitialized(FALSE),
@@ -1283,10 +1282,6 @@ BOOL LLFloaterIMPanel::postBuild()
requires("chat_editor");
requires("im_history");
-#if LL_LINUX || LL_DARWIN
- childSetVisible("history_btn", false);
-#endif
-
if (checkRequirements())
{
mInputEditor = getChild("chat_editor");
@@ -1300,18 +1295,8 @@ BOOL LLFloaterIMPanel::postBuild()
mInputEditor->setReplaceNewlinesWithSpaces( FALSE );
// Profile combobox in floater_instant_message.xml
- mComboIM = getChild("profile_callee_btn");
- mComboIM->setCommitCallback(onCommitCombo);
- mComboIM->setCallbackUserData(this);
-
-#ifdef LL_WINDOWS
- mComboIM->add(getString("history_entry"));
-#endif
- mComboIM->add(getString("pay_entry"));
- mComboIM->add(getString("teleport_entry"));
-
- childSetAction("group_info_btn", onClickGroupInfo, this);
- childSetAction("history_btn", onClickHistory, this);
+ childSetCommitCallback("profile_callee_btn", onCommitCombo, this);
+ childSetCommitCallback("group_info_btn", onCommitCombo, this);
childSetAction("start_call_btn", onClickStartCall, this);
childSetAction("end_call_btn", onClickEndCall, this);
@@ -1804,41 +1789,6 @@ void LLFloaterIMPanel::onTabClick(void* userdata)
}
// static
-void LLFloaterIMPanel::onClickHistory( void* userdata )
-{
- LLFloaterIMPanel* self = (LLFloaterIMPanel*) userdata;
-
- if (self->mOtherParticipantUUID.notNull())
- {
- struct stat fileInfo;
- int result;
-
- std::string fullname = self->getTitle();;
- //gCacheName->getFullName(self->mOtherParticipantUUID, fullname);
- //if(fullname == "(Loading...)")
- std::string file_path = gDirUtilp->getPerAccountChatLogsDir() + "\\" + fullname + ".txt";
-
- // check if file exists by trying to get its attributes
- result = stat(file_path.c_str(), &fileInfo);
- if(result == 0)
- {
- char command[256];
- sprintf(command, "\"%s\\%s.txt\"", gDirUtilp->getPerAccountChatLogsDir().c_str(),fullname.c_str());
- gViewerWindow->getWindow()->ShellEx(command);
-
- llinfos << command << llendl;
- }
- else
- {
- LLSD args;
- args["[NAME]"] = fullname;
- LLNotifications::instance().add("IMLogNotFound", args);
- llinfos << file_path << llendl;
- }
- }
-}
-
-// static
void LLFloaterIMPanel::onClickGroupInfo( void* userdata )
{
// Bring up the Profile window
@@ -1899,59 +1849,52 @@ void LLFloaterIMPanel::onCommitChat(LLUICtrl* caller, void* userdata)
void LLFloaterIMPanel::onCommitCombo(LLUICtrl* caller, void* userdata)
{
LLFloaterIMPanel* self = (LLFloaterIMPanel*) userdata;
- LLCtrlListInterface* options = self->mComboIM ? self->mComboIM->getListInterface() : NULL;
- if (options)
+ if (self->getOtherParticipantID().notNull())
{
- S32 index = options->getFirstSelectedIndex();
- if (index < 0)
+ if (caller->getValue().asString() == "history_entry")
{
- // Open profile or group window
- if (self->mOtherParticipantUUID.notNull())
+ if (self->getOtherParticipantID().notNull())
{
- LLFloaterAvatarInfo::showFromDirectory(self->getOtherParticipantID());
- }
- return;
- }
-
- std::string selected = self->mComboIM->getSelectedValue().asString();
- if (selected == self->getString("history_entry"))
- {
- if (self->mOtherParticipantUUID.notNull())
- {
- struct stat fileInfo;
- int result;
-
- std::string fullname = self->getTitle();;
+ std::string fullname = self->getTitle();
//gCacheName->getFullName(self->mOtherParticipantUUID, fullname);
//if(fullname == "(Loading...)")
- std::string file_path = gDirUtilp->getPerAccountChatLogsDir() + "\\" + fullname + ".txt";
+ std::string file = gDirUtilp->getPerAccountChatLogsDir() + "\\" + fullname + ".txt";
- // check if file exists by trying to get its attributes
- result = stat(file_path.c_str(), &fileInfo);
- if(result == 0)
+ llstat stat_info;
+ if (LLFile::stat(file.c_str(), &stat_info))
{
- char command[256];
- sprintf(command, "\"%s\\%s.txt\"", gDirUtilp->getPerAccountChatLogsDir().c_str(),fullname.c_str());
- gViewerWindow->getWindow()->ShellEx(command);
-
- llinfos << command << llendl;
+ LLSD args;
+ args["[NAME]"] = fullname;
+ LLNotifications::instance().add("IMLogNotFound", args, LLSD());
+ //llinfos << file << " not found" << llendl;
}
else
{
- LLSD args;
- args["[NAME]"] = fullname;
- LLNotifications::instance().add("IMLogNotFound", args);
- llinfos << file_path << llendl;
+ gViewerWindow->getWindow()->ShellEx(file);
+ //llinfos << file << " found" << llendl;
}
}
}
- else if (selected == self->getString("pay_entry"))
+ else if (caller->getValue().asString() == "pay_entry")
{
- handle_pay_by_id(self->mOtherParticipantUUID);
+ handle_pay_by_id(self->getOtherParticipantID());
}
- else if (selected == self->getString("teleport_entry"))
+ else if (caller->getValue().asString() == "teleport_entry")
{
- handle_lure(self->mOtherParticipantUUID);
+ handle_lure(self->getOtherParticipantID());
+ }
+ else
+ {
+ // group
+ if (self->getOtherParticipantID() == self->getSessionID())
+ {
+ LLFloaterGroupInfo::showFromUUID(self->getSessionID());
+ }
+ // profile
+ else
+ {
+ LLFloaterAvatarInfo::showFromDirectory(self->getOtherParticipantID());
+ }
}
}
}
diff --git a/linden/indra/newview/llimpanel.h b/linden/indra/newview/llimpanel.h
index 24f5c9b..5887095 100644
--- a/linden/indra/newview/llimpanel.h
+++ b/linden/indra/newview/llimpanel.h
@@ -232,7 +232,6 @@ public:
static void onCommitCombo(LLUICtrl* caller, void* userdata);
static void onTabClick( void* userdata );
- static void onClickHistory( void* userdata );
static void onClickGroupInfo( void* userdata );
static void onClickClose( void* userdata );
static void onClickStartCall( void* userdata );
@@ -300,7 +299,6 @@ private:
private:
LLLineEditor* mInputEditor;
LLViewerTextEditor* mHistoryEditor;
- LLComboBox* mComboIM;
// The value of the mSessionUUID depends on how the IM session was started:
// one-on-one ==> random id
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml b/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml
index 98d2020..cf2a457 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml
@@ -37,17 +37,17 @@
Text chat is not available for this call.
-
- History
-
-
- Pay
-
-
- Offer Teleport
-
+
+ View History
+
+
+ Pay
+
+
+ Offer Teleport
+
-
+
+
+ View History
+
+
-
getValue().asString() == "save_disk_item")
- {
- LLWaterParamManager::instance()->mCurParams.mName =
- comboBox->getSelectedItemLabel();
-
- // check to see if it's a default and shouldn't be overwritten
- std::set::iterator sIt = sDefaultPresets.find(
- comboBox->getSelectedItemLabel());
- if(sIt != sDefaultPresets.end() && !gSavedSettings.getBOOL("WaterEditPresets"))
- {
- LLNotifications::instance().add("WLNoEditDefault");
- return;
- }
-
- LLNotifications::instance().add("WLSavePresetAlert", LLSD(), LLSD(), saveAlertCallback);
- }
- else if (ctrl->getValue().asString() == "save_inventory_item")
+ if (ctrl->getValue().asString() == "save_inventory_item")
{
// Check if this is already a notecard.
if(LLWaterParamManager::instance()->mCurParams.mInventoryID.notNull())
@@ -696,6 +680,22 @@ void LLFloaterWater::onSavePreset(LLUICtrl* ctrl, void* userData)
}
}
+ else
+ {
+ LLWaterParamManager::instance()->mCurParams.mName =
+ comboBox->getSelectedItemLabel();
+
+ // check to see if it's a default and shouldn't be overwritten
+ std::set::iterator sIt = sDefaultPresets.find(
+ comboBox->getSelectedItemLabel());
+ if(sIt != sDefaultPresets.end() && !gSavedSettings.getBOOL("WaterEditPresets"))
+ {
+ LLNotifications::instance().add("WLNoEditDefault");
+ return;
+ }
+
+ LLNotifications::instance().add("WLSavePresetAlert", LLSD(), LLSD(), saveAlertCallback);
+ }
}
bool LLFloaterWater::saveNotecardCallback(const LLSD& notification, const LLSD& response)
diff --git a/linden/indra/newview/llfloaterwindlight.cpp b/linden/indra/newview/llfloaterwindlight.cpp
index ae94d3a..be3c1fd 100644
--- a/linden/indra/newview/llfloaterwindlight.cpp
+++ b/linden/indra/newview/llfloaterwindlight.cpp
@@ -843,23 +843,7 @@ void LLFloaterWindLight::onSavePreset(LLUICtrl* ctrl, void* userData)
return;
}
- if (ctrl->getValue().asString() == "save_disk_item")
- {
- // check to see if it's a default and shouldn't be overwritten
- std::set::iterator sIt = sDefaultPresets.find(
- comboBox->getSelectedItemLabel());
- if(sIt != sDefaultPresets.end() && !gSavedSettings.getBOOL("SkyEditPresets"))
- {
- LLNotifications::instance().add("WLNoEditDefault");
- return;
- }
-
- LLWLParamManager::instance()->mCurParams.mName =
- comboBox->getSelectedItemLabel();
-
- LLNotifications::instance().add("WLSavePresetAlert", LLSD(), LLSD(), saveAlertCallback);
- }
- else if (ctrl->getValue().asString() == "save_inventory_item")
+ if (ctrl->getValue().asString() == "save_inventory_item")
{
// Check if this is already a notecard.
if(LLWLParamManager::instance()->mCurParams.mInventoryID.notNull())
@@ -890,6 +874,22 @@ void LLFloaterWindLight::onSavePreset(LLUICtrl* ctrl, void* userData)
}
}
+ else
+ {
+ // check to see if it's a default and shouldn't be overwritten
+ std::set::iterator sIt = sDefaultPresets.find(
+ comboBox->getSelectedItemLabel());
+ if(sIt != sDefaultPresets.end() && !gSavedSettings.getBOOL("SkyEditPresets"))
+ {
+ LLNotifications::instance().add("WLNoEditDefault");
+ return;
+ }
+
+ LLWLParamManager::instance()->mCurParams.mName =
+ comboBox->getSelectedItemLabel();
+
+ LLNotifications::instance().add("WLSavePresetAlert", LLSD(), LLSD(), saveAlertCallback);
+ }
}
bool LLFloaterWindLight::saveNotecardCallback(const LLSD& notification, const LLSD& response)
--
cgit v1.1
From 4775d7f697830d86a34b0e8327a399b67866b5c9 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Fri, 3 Sep 2010 09:13:07 -0700
Subject: Added some subgroups to the SL dic (these commits should really be
squashed once the testing spurt is done)
---
linden/indra/newview/app_settings/dictionaries/en_sl.dic | 3 +++
1 file changed, 3 insertions(+)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/dictionaries/en_sl.dic b/linden/indra/newview/app_settings/dictionaries/en_sl.dic
index 2b7a2c6..c5de03f 100644
--- a/linden/indra/newview/app_settings/dictionaries/en_sl.dic
+++ b/linden/indra/newview/app_settings/dictionaries/en_sl.dic
@@ -1648,6 +1648,8 @@ furries
furry
furson
giantgrid
+gor
+gorean
gorgrid
griefer
griefers
@@ -1802,6 +1804,7 @@ spacenavigator
spam
spamming
spams
+steampunk
stipend
stipends
teleport
--
cgit v1.1
From b88d3f2a93f4cb479fc139844fe8ef3e8524277a Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Fri, 3 Sep 2010 14:39:47 -0700
Subject: Revert "Updated lltexturecache to the latest in viewer-development
(see #425)" since it was causing issues with local assets and object backup
This reverts commit 4ca4594ec264f390be981568ef5ff3ff0f2f77e6.
---
linden/indra/llcommon/llworkerthread.cpp | 39 +-
linden/indra/llcommon/llworkerthread.h | 8 +-
linden/indra/newview/lltexturecache.cpp | 679 ++++++++++---------------------
linden/indra/newview/lltexturecache.h | 37 +-
linden/indra/newview/lltexturefetch.cpp | 2 -
5 files changed, 232 insertions(+), 533 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/llcommon/llworkerthread.cpp b/linden/indra/llcommon/llworkerthread.cpp
index 67664c7..8195e1c 100644
--- a/linden/indra/llcommon/llworkerthread.cpp
+++ b/linden/indra/llcommon/llworkerthread.cpp
@@ -60,27 +60,6 @@ LLWorkerThread::~LLWorkerThread()
// ~LLQueuedThread() will be called here
}
-//called only in destructor.
-void LLWorkerThread::clearDeleteList()
-{
- // Delete any workers in the delete queue (should be safe - had better be!)
- if (!mDeleteList.empty())
- {
- llwarns << "Worker Thread: " << mName << " destroyed with " << mDeleteList.size()
- << " entries in delete list." << llendl;
-
- mDeleteMutex->lock();
- for (delete_list_t::iterator iter = mDeleteList.begin(); iter != mDeleteList.end(); ++iter)
- {
- (*iter)->mRequestHandle = LLWorkerThread::nullHandle();
- (*iter)->clearFlags(LLWorkerClass::WCF_HAVE_WORK);
- delete *iter ;
- }
- mDeleteList.clear() ;
- mDeleteMutex->unlock() ;
- }
-}
-
// virtual
S32 LLWorkerThread::update(U32 max_time_ms)
{
@@ -204,7 +183,6 @@ LLWorkerClass::LLWorkerClass(LLWorkerThread* workerthread, const std::string& na
: mWorkerThread(workerthread),
mWorkerClassName(name),
mRequestHandle(LLWorkerThread::nullHandle()),
- mRequestPriority(LLWorkerThread::PRIORITY_NORMAL),
mMutex(NULL),
mWorkFlags(0)
{
@@ -336,20 +314,7 @@ bool LLWorkerClass::checkWork(bool aborting)
if (mRequestHandle != LLWorkerThread::nullHandle())
{
LLWorkerThread::WorkRequest* workreq = (LLWorkerThread::WorkRequest*)mWorkerThread->getRequest(mRequestHandle);
- if(!workreq)
- {
- if(mWorkerThread->isQuitting() || mWorkerThread->isStopped()) //the mWorkerThread is not running
- {
- mRequestHandle = LLWorkerThread::nullHandle();
- clearFlags(WCF_HAVE_WORK);
- }
- else
- {
- llassert_always(workreq);
- }
- return true ;
- }
-
+ llassert_always(workreq);
LLQueuedThread::status_t status = workreq->getStatus();
if (status == LLWorkerThread::STATUS_ABORTED)
{
@@ -399,7 +364,7 @@ void LLWorkerClass::scheduleDelete()
void LLWorkerClass::setPriority(U32 priority)
{
mMutex.lock();
- if (mRequestHandle != LLWorkerThread::nullHandle() && mRequestPriority != priority)
+ if (mRequestHandle != LLWorkerThread::nullHandle())
{
mRequestPriority = priority;
mWorkerThread->setPriority(mRequestHandle, priority);
diff --git a/linden/indra/llcommon/llworkerthread.h b/linden/indra/llcommon/llworkerthread.h
index d1868bc..708d812 100644
--- a/linden/indra/llcommon/llworkerthread.h
+++ b/linden/indra/llcommon/llworkerthread.h
@@ -80,9 +80,6 @@ public:
S32 mParam;
};
-protected:
- void clearDeleteList() ;
-
private:
typedef std::list delete_list_t;
delete_list_t mDeleteList;
@@ -96,11 +93,8 @@ public:
handle_t addWorkRequest(LLWorkerClass* workerclass, S32 param, U32 priority = PRIORITY_NORMAL);
- S32 getNumDeletes() { return (S32)mDeleteList.size(); } // debug
-
-private:
void deleteWorker(LLWorkerClass* workerclass); // schedule for deletion
-
+ S32 getNumDeletes() { return (S32)mDeleteList.size(); } // debug
};
//============================================================================
diff --git a/linden/indra/newview/lltexturecache.cpp b/linden/indra/newview/lltexturecache.cpp
index 0a76742..46c125f 100644
--- a/linden/indra/newview/lltexturecache.cpp
+++ b/linden/indra/newview/lltexturecache.cpp
@@ -48,11 +48,11 @@
// Unordered array of Entry structs
// cache/texture.cache
// First TEXTURE_CACHE_ENTRY_SIZE bytes of each texture in texture.entries in same order
+// Entry size same as header packet, so we're not 0-padding unless whole image is contained in header.
// cache/textures/[0-F]/UUID.texture
// Actual texture body files
-//note: there is no good to define 1024 for TEXTURE_CACHE_ENTRY_SIZE while FIRST_PACKET_SIZE is 600 on sim side.
-const S32 TEXTURE_CACHE_ENTRY_SIZE = FIRST_PACKET_SIZE;//1024;
+const S32 TEXTURE_CACHE_ENTRY_SIZE = FIRST_PACKET_SIZE;
const F32 TEXTURE_CACHE_PURGE_AMOUNT = .20f; // % amount to reduce the cache by when it exceeds its limit
const F32 TEXTURE_CACHE_LRU_SIZE = .10f; // % amount for LRU list (low overhead to regenerate)
@@ -390,7 +390,6 @@ bool LLTextureCacheRemoteWorker::doRead()
}
else
{
- //llinfos << "texture " << mID.asString() << " found in local_assets" << llendl;
mImageSize = local_size;
mImageLocal = TRUE;
}
@@ -401,8 +400,7 @@ bool LLTextureCacheRemoteWorker::doRead()
// Second state / stage : identify the cache or not...
if (!done && (mState == CACHE))
{
- LLTextureCache::Entry entry ;
- idx = mCache->getHeaderCacheEntry(mID, entry);
+ idx = mCache->getHeaderCacheEntry(mID, mImageSize);
if (idx < 0)
{
// The texture is *not* cached. We're done here...
@@ -411,7 +409,6 @@ bool LLTextureCacheRemoteWorker::doRead()
}
else
{
- mImageSize = entry.mImageSize ;
// If the read offset is bigger than the header cache, we read directly from the body
// Note that currently, we *never* read with offset from the cache, so the result is *always* HEADER
mState = mOffset < TEXTURE_CACHE_ENTRY_SIZE ? HEADER : BODY;
@@ -539,7 +536,6 @@ bool LLTextureCacheRemoteWorker::doWrite()
{
llassert_always(mOffset == 0); // We currently do not support write offsets
llassert_always(mDataSize > 0); // Things will go badly wrong if mDataSize is nul or negative...
- llassert_always(mImageSize >= mDataSize);
mState = CACHE;
}
@@ -549,19 +545,14 @@ bool LLTextureCacheRemoteWorker::doWrite()
if (!done && (mState == CACHE))
{
bool alreadyCached = false;
- LLTextureCache::Entry entry ;
-
+ S32 cur_imagesize = 0;
// Checks if this image is already in the entry list
- idx = mCache->getHeaderCacheEntry(mID, entry);
- if(idx < 0)
- {
- idx = mCache->setHeaderCacheEntry(mID, entry, mImageSize, mDataSize); // create the new entry.
- }
- else
+ idx = mCache->getHeaderCacheEntry(mID, cur_imagesize);
+ if (idx >= 0 && (cur_imagesize >= 0))
{
- alreadyCached = mCache->updateEntry(idx, entry, mImageSize, mDataSize); // update the existing entry.
+ alreadyCached = true; // already there and non empty
}
-
+ idx = mCache->setHeaderCacheEntry(mID, mImageSize); // create or touch the entry
if (idx < 0)
{
llwarns << "LLTextureCacheWorker: " << mID
@@ -571,6 +562,10 @@ bool LLTextureCacheRemoteWorker::doWrite()
}
else
{
+ if (cur_imagesize > 0 && (mImageSize != cur_imagesize))
+ {
+ alreadyCached = false; // re-write the header if the size changed in all cases
+ }
if (alreadyCached && (mDataSize <= TEXTURE_CACHE_ENTRY_SIZE))
{
// Small texture already cached case: we're done with writing
@@ -633,7 +628,7 @@ bool LLTextureCacheRemoteWorker::doWrite()
{
llassert(mDataSize > TEXTURE_CACHE_ENTRY_SIZE); // wouldn't make sense to be here otherwise...
S32 file_size = mDataSize - TEXTURE_CACHE_ENTRY_SIZE;
-
+ if ((file_size > 0) && mCache->updateTextureEntryList(mID, file_size))
{
// build the cache file name from the UUID
std::string filename = mCache->getTextureFileName(mID);
@@ -650,7 +645,10 @@ bool LLTextureCacheRemoteWorker::doWrite()
done = true;
}
}
-
+ else
+ {
+ mDataSize = 0; // no data written
+ }
// Nothing else to do at that point...
done = true;
}
@@ -741,7 +739,7 @@ LLTextureCache::LLTextureCache(bool threaded)
mHeaderMutex(NULL),
mListMutex(NULL),
mHeaderAPRFile(NULL),
- mReadOnly(TRUE), //do not allow to change the texture cache until setReadOnly() is called.
+ mReadOnly(FALSE),
mTexturesSizeTotal(0),
mDoPurge(FALSE)
{
@@ -749,8 +747,6 @@ LLTextureCache::LLTextureCache(bool threaded)
LLTextureCache::~LLTextureCache()
{
- clearDeleteList() ;
- writeUpdatedEntries() ;
}
//////////////////////////////////////////////////////////////////////////////
@@ -758,9 +754,6 @@ LLTextureCache::~LLTextureCache()
//virtual
S32 LLTextureCache::update(U32 max_time_ms)
{
- static LLFrameTimer timer ;
- static const F32 MAX_TIME_INTERVAL = 300.f ; //seconds.
-
S32 res;
res = LLWorkerThread::update(max_time_ms);
@@ -796,12 +789,6 @@ S32 LLTextureCache::update(U32 max_time_ms)
responder->completed(success);
}
- if(!res && timer.getElapsedTimeF32() > MAX_TIME_INTERVAL)
- {
- timer.reset() ;
- writeUpdatedEntries() ;
- }
-
return res;
}
@@ -824,54 +811,58 @@ std::string LLTextureCache::getTextureFileName(const LLUUID& id)
return filename;
}
-//debug
-BOOL LLTextureCache::isInCache(const LLUUID& id)
+bool LLTextureCache::updateTextureEntryList(const LLUUID& id, S32 bodysize)
{
- LLMutexLock lock(&mHeaderMutex);
- id_map_t::const_iterator iter = mHeaderIDMap.find(id);
-
- return (iter != mHeaderIDMap.end()) ;
-}
-
-//debug
-BOOL LLTextureCache::isInLocal(const LLUUID& id)
-{
- S32 local_size = 0;
- std::string local_filename;
-
- std::string filename = getLocalFileName(id);
- // Is it a JPEG2000 file?
- {
- local_filename = filename + ".j2c";
- local_size = LLAPRFile::size(local_filename);
- if (local_size > 0)
- {
- return TRUE ;
- }
- }
-
- // If not, is it a jpeg file?
+ bool res = false;
+ bool purge = false;
{
- local_filename = filename + ".jpg";
- local_size = LLAPRFile::size(local_filename);
- if (local_size > 0)
+ mHeaderMutex.lock();
+ size_map_t::iterator iter1 = mTexturesSizeMap.find(id);
+ if (iter1 == mTexturesSizeMap.end() || iter1->second < bodysize)
{
- return TRUE ;
+ llassert_always(bodysize > 0);
+
+ S32 oldbodysize = 0;
+ if (iter1 != mTexturesSizeMap.end())
+ {
+ oldbodysize = iter1->second;
+ }
+
+ Entry entry;
+ S32 idx = openAndReadEntry(id, entry, false);
+ if (idx < 0)
+ {
+ llwarns << "Failed to open entry: " << id << llendl;
+ mHeaderMutex.unlock();
+ removeFromCache(id);
+ return false;
+ }
+ else if (oldbodysize != entry.mBodySize)
+ {
+ llwarns << "Entry mismatch in mTextureSizeMap / mHeaderIDMap"
+ << " idx=" << idx << " oldsize=" << oldbodysize << " entrysize=" << entry.mBodySize << llendl;
+ }
+ entry.mBodySize = bodysize;
+ writeEntryAndClose(idx, entry);
+
+ mTexturesSizeTotal -= oldbodysize;
+ mTexturesSizeTotal += bodysize;
+
+ if (mTexturesSizeTotal > sCacheMaxTexturesSize)
+ {
+ purge = true;
+ }
+ res = true;
}
}
-
- // Hmm... What about a targa file? (used for UI texture mostly)
+ if (purge)
{
- local_filename = filename + ".tga";
- local_size = LLAPRFile::size(local_filename);
- if (local_size > 0)
- {
- return TRUE ;
- }
+ mDoPurge = TRUE;
}
-
- return FALSE ;
+ mHeaderMutex.unlock();
+ return res;
}
+
//////////////////////////////////////////////////////////////////////////////
//static
@@ -902,21 +893,13 @@ void LLTextureCache::purgeCache(ELLPath location)
LLAPRFile::remove(mHeaderEntriesFileName);
LLAPRFile::remove(mHeaderDataFileName);
}
- //remove the current texture cache.
purgeAllTextures(true);
}
-//is called in the main thread before initCache(...) is called.
-void LLTextureCache::setReadOnly(BOOL read_only)
+S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL read_only)
{
mReadOnly = read_only;
-}
-
-//called in the main thread.
-S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL disable_texture_cache)
-{
- llassert_always(getPending() == 0) ; //should not start accessing the texture cache before initialized.
-
+
S64 header_size = (max_size * 2) / 10;
S64 max_entries = header_size / TEXTURE_CACHE_ENTRY_SIZE;
sCacheMaxEntries = (S32)(llmin((S64)sCacheMaxEntries, max_entries));
@@ -928,15 +911,6 @@ S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL disable_textu
sCacheMaxTexturesSize = max_size;
max_size -= sCacheMaxTexturesSize;
- if(disable_texture_cache) //the texture cache is disabled
- {
- llinfos << "The texture cache is disabled!" << llendl ;
- setReadOnly(TRUE) ;
- purgeAllTextures(true);
-
- return max_size ;
- }
-
LL_INFOS("TextureCache") << "Headers: " << sCacheMaxEntries
<< " Textures size: " << sCacheMaxTexturesSize/(1024*1024) << " MB" << LL_ENDL;
@@ -945,7 +919,6 @@ S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL disable_textu
if (!mReadOnly)
{
LLFile::mkdir(mTexturesDirName);
-
const char* subdirs = "0123456789abcdef";
for (S32 i=0; i<16; i++)
{
@@ -956,8 +929,6 @@ S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL disable_textu
readHeaderCache();
purgeTextures(true); // calc mTexturesSize and make some room in the texture cache if we need it
- llassert_always(getPending() == 0) ; //should not start accessing the texture cache before initialized.
-
return max_size; // unused cache space
}
@@ -969,20 +940,13 @@ LLAPRFile* LLTextureCache::openHeaderEntriesFile(bool readonly, S32 offset)
llassert_always(mHeaderAPRFile == NULL);
apr_int32_t flags = readonly ? APR_READ|APR_BINARY : APR_READ|APR_WRITE|APR_BINARY;
mHeaderAPRFile = new LLAPRFile(mHeaderEntriesFileName, flags, LLAPRFile::local);
- if(offset > 0)
- {
- mHeaderAPRFile->seek(APR_SET, offset);
- }
+ mHeaderAPRFile->seek(APR_SET, offset);
return mHeaderAPRFile;
}
void LLTextureCache::closeHeaderEntriesFile()
{
- if(!mHeaderAPRFile)
- {
- return ;
- }
-
+ llassert_always(mHeaderAPRFile != NULL);
delete mHeaderAPRFile;
mHeaderAPRFile = NULL;
}
@@ -995,12 +959,6 @@ void LLTextureCache::readEntriesHeader()
{
LLAPRFile::readEx(mHeaderEntriesFileName, (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo));
}
- else //create an empty entries header.
- {
- mHeaderEntriesInfo.mVersion = sHeaderCacheVersion ;
- mHeaderEntriesInfo.mEntries = 0 ;
- writeEntriesHeader() ;
- }
}
void LLTextureCache::writeEntriesHeader()
@@ -1012,7 +970,8 @@ void LLTextureCache::writeEntriesHeader()
}
}
-//mHeaderMutex is locked before calling this.
+static S32 mHeaderEntriesMaxWriteIdx = 0;
+
S32 LLTextureCache::openAndReadEntry(const LLUUID& id, Entry& entry, bool create)
{
S32 idx = -1;
@@ -1052,7 +1011,8 @@ S32 LLTextureCache::openAndReadEntry(const LLUUID& id, Entry& entry, bool create
if (iter3 != mHeaderIDMap.end() && iter3->second >= 0)
{
idx = iter3->second;
- removeCachedTexture(oldid) ;//remove the existing cached texture to release the entry index.
+ mHeaderIDMap.erase(oldid);
+ mTexturesSizeMap.erase(oldid);
break;
}
}
@@ -1062,9 +1022,20 @@ S32 LLTextureCache::openAndReadEntry(const LLUUID& id, Entry& entry, bool create
}
if (idx >= 0)
{
- entry.mID = id ;
- entry.mImageSize = -1 ; //mark it is a brand-new entry.
- entry.mBodySize = 0 ;
+ // Set the header index
+ mHeaderIDMap[id] = idx;
+ llassert_always(mTexturesSizeMap.erase(id) == 0);
+ // Initialize the entry (will get written later)
+ entry.init(id, time(NULL));
+ // Update Header
+ writeEntriesHeader();
+ // Write Entry
+ S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry);
+ LLAPRFile* aprfile = openHeaderEntriesFile(false, offset);
+ S32 bytes_written = aprfile->write((void*)&entry, (S32)sizeof(Entry));
+ llassert_always(bytes_written == sizeof(Entry));
+ mHeaderEntriesMaxWriteIdx = llmax(mHeaderEntriesMaxWriteIdx, idx);
+ closeHeaderEntriesFile();
}
}
}
@@ -1073,153 +1044,44 @@ S32 LLTextureCache::openAndReadEntry(const LLUUID& id, Entry& entry, bool create
// Remove this entry from the LRU if it exists
mLRU.erase(id);
// Read the entry
- idx_entry_map_t::iterator iter = mUpdatedEntryMap.find(idx) ;
- if(iter != mUpdatedEntryMap.end())
- {
- entry = iter->second ;
- }
- else
- {
- readEntryFromHeaderImmediately(idx, entry) ;
- }
- if(entry.mImageSize <= entry.mBodySize)//it happens on 64-bit systems, do not know why
- {
- llwarns << "corrupted entry: " << id << " entry image size: " << entry.mImageSize << " entry body size: " << entry.mBodySize << llendl ;
-
- //erase this entry and the cached texture from the cache.
- std::string tex_filename = getTextureFileName(id);
- removeEntry(idx, entry, tex_filename) ;
- mUpdatedEntryMap.erase(idx) ;
- idx = -1 ;
- }
+ S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry);
+ LLAPRFile* aprfile = openHeaderEntriesFile(true, offset);
+ S32 bytes_read = aprfile->read((void*)&entry, (S32)sizeof(Entry));
+ llassert_always(bytes_read == sizeof(Entry));
+ llassert_always(entry.mImageSize == 0 || entry.mImageSize == -1 || entry.mImageSize > entry.mBodySize);
+ closeHeaderEntriesFile();
}
return idx;
}
-//mHeaderMutex is locked before calling this.
-void LLTextureCache::writeEntryToHeaderImmediately(S32& idx, Entry& entry, bool write_header)
-{
- LLAPRFile* aprfile ;
- S32 bytes_written ;
- S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry);
- if(write_header)
- {
- aprfile = openHeaderEntriesFile(false, 0);
- bytes_written = aprfile->write((U8*)&mHeaderEntriesInfo, sizeof(EntriesInfo)) ;
- if(bytes_written != sizeof(EntriesInfo))
- {
- clearCorruptedCache() ; //clear the cache.
- idx = -1 ;//mark the idx invalid.
- return ;
- }
-
- mHeaderAPRFile->seek(APR_SET, offset);
- }
- else
- {
- aprfile = openHeaderEntriesFile(false, offset);
- }
- bytes_written = aprfile->write((void*)&entry, (S32)sizeof(Entry));
- if(bytes_written != sizeof(Entry))
- {
- clearCorruptedCache() ; //clear the cache.
- idx = -1 ;//mark the idx invalid.
-
- return ;
- }
-
- closeHeaderEntriesFile();
- mUpdatedEntryMap.erase(idx) ;
-}
-
-//mHeaderMutex is locked before calling this.
-void LLTextureCache::readEntryFromHeaderImmediately(S32& idx, Entry& entry)
-{
- S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry);
- LLAPRFile* aprfile = openHeaderEntriesFile(true, offset);
- S32 bytes_read = aprfile->read((void*)&entry, (S32)sizeof(Entry));
- closeHeaderEntriesFile();
-
- if(bytes_read != sizeof(Entry))
- {
- clearCorruptedCache() ; //clear the cache.
- idx = -1 ;//mark the idx invalid.
- }
-}
-
-//mHeaderMutex is locked before calling this.
-//update an existing entry time stamp, delay writing.
-void LLTextureCache::updateEntryTimeStamp(S32 idx, Entry& entry)
+void LLTextureCache::writeEntryAndClose(S32 idx, Entry& entry)
{
- static const U32 MAX_ENTRIES_WITHOUT_TIME_STAMP = (U32)(LLTextureCache::sCacheMaxEntries * 0.75f) ;
-
- if(mHeaderEntriesInfo.mEntries < MAX_ENTRIES_WITHOUT_TIME_STAMP)
- {
- return ; //there are enough empty entry index space, no need to stamp time.
- }
-
if (idx >= 0)
{
if (!mReadOnly)
{
- entry.mTime = time(NULL);
- mUpdatedEntryMap[idx] = entry ;
- }
- }
-}
-
-//update an existing entry, write to header file immediately.
-bool LLTextureCache::updateEntry(S32& idx, Entry& entry, S32 new_image_size, S32 new_data_size)
-{
- S32 new_body_size = llmax(0, new_data_size - TEXTURE_CACHE_ENTRY_SIZE) ;
-
- if(new_image_size == entry.mImageSize && new_body_size == entry.mBodySize)
- {
- return true ; //nothing changed.
- }
- else
- {
- bool purge = false ;
-
- lockHeaders() ;
-
- bool update_header = false ;
- if(entry.mImageSize < 0) //is a brand-new entry
- {
- mHeaderIDMap[entry.mID] = idx;
- mTexturesSizeMap[entry.mID] = new_body_size ;
- mTexturesSizeTotal += new_body_size ;
-
- // Update Header
- update_header = true ;
- }
- else if (entry.mBodySize != new_body_size)
- {
- //already in mHeaderIDMap.
- mTexturesSizeMap[entry.mID] = new_body_size ;
- mTexturesSizeTotal -= entry.mBodySize ;
- mTexturesSizeTotal += new_body_size ;
- }
- entry.mTime = time(NULL);
- entry.mImageSize = new_image_size ;
- entry.mBodySize = new_body_size ;
-
- writeEntryToHeaderImmediately(idx, entry, update_header) ;
-
- if (mTexturesSizeTotal > sCacheMaxTexturesSize)
- {
- purge = true;
- }
-
- unlockHeaders() ;
+ entry.mTime = time(NULL);
+ if(entry.mImageSize < entry.mBodySize)
+ {
+ // Just say no, due to my messing around to cache discards other than 0 we can end up here
+ // after recalling an image from cache at a lower discard than cached. RC
+ return;
+ }
- if (purge)
- {
- mDoPurge = TRUE;
+ llassert_always(entry.mImageSize == 0 || entry.mImageSize == -1 || entry.mImageSize > entry.mBodySize);
+ if (entry.mBodySize > 0)
+ {
+ mTexturesSizeMap[entry.mID] = entry.mBodySize;
+ }
+// llinfos << "Updating TE: " << idx << ": " << id << " Size: " << entry.mBodySize << " Time: " << entry.mTime << llendl;
+ S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry);
+ LLAPRFile* aprfile = openHeaderEntriesFile(false, offset);
+ S32 bytes_written = aprfile->write((void*)&entry, (S32)sizeof(Entry));
+ llassert_always(bytes_written == sizeof(Entry));
+ mHeaderEntriesMaxWriteIdx = llmax(mHeaderEntriesMaxWriteIdx, idx);
+ closeHeaderEntriesFile();
}
}
-
- return false ;
}
U32 LLTextureCache::openAndReadEntries(std::vector& entries)
@@ -1231,21 +1093,7 @@ U32 LLTextureCache::openAndReadEntries(std::vector& entries)
mFreeList.clear();
mTexturesSizeTotal = 0;
- LLAPRFile* aprfile = NULL;
- if(mUpdatedEntryMap.empty())
- {
- aprfile = openHeaderEntriesFile(true, (S32)sizeof(EntriesInfo));
- }
- else //update the header file first.
- {
- aprfile = openHeaderEntriesFile(false, 0);
- updatedHeaderEntriesFile() ;
- if(!aprfile)
- {
- return 0;
- }
- aprfile->seek(APR_SET, (S32)sizeof(EntriesInfo));
- }
+ LLAPRFile* aprfile = openHeaderEntriesFile(false, (S32)sizeof(EntriesInfo));
for (U32 idx=0; idx& entries)
}
entries.push_back(entry);
// llinfos << "ENTRY: " << entry.mTime << " TEX: " << entry.mID << " IDX: " << idx << " Size: " << entry.mImageSize << llendl;
- if(entry.mImageSize > entry.mBodySize)
+ if (entry.mImageSize < 0)
{
- mHeaderIDMap[entry.mID] = idx;
- mTexturesSizeMap[entry.mID] = entry.mBodySize;
- mTexturesSizeTotal += entry.mBodySize;
+ mFreeList.insert(idx);
}
else
{
- mFreeList.insert(idx);
+ mHeaderIDMap[entry.mID] = idx;
+ if (entry.mBodySize > 0)
+ {
+ mTexturesSizeMap[entry.mID] = entry.mBodySize;
+ mTexturesSizeTotal += entry.mBodySize;
+ }
+ llassert_always(entry.mImageSize == 0 || entry.mImageSize > entry.mBodySize);
}
}
closeHeaderEntriesFile();
@@ -1285,65 +1137,13 @@ void LLTextureCache::writeEntriesAndClose(const std::vector& entries)
for (S32 idx=0; idxwrite((void*)(&entries[idx]), (S32)sizeof(Entry));
- if(bytes_written != sizeof(Entry))
- {
- clearCorruptedCache() ; //clear the cache.
- return ;
- }
+ llassert_always(bytes_written == sizeof(Entry));
}
+ mHeaderEntriesMaxWriteIdx = llmax(mHeaderEntriesMaxWriteIdx, num_entries-1);
closeHeaderEntriesFile();
}
}
-void LLTextureCache::writeUpdatedEntries()
-{
- lockHeaders() ;
- if (!mReadOnly && !mUpdatedEntryMap.empty())
- {
- openHeaderEntriesFile(false, 0);
- updatedHeaderEntriesFile() ;
- closeHeaderEntriesFile();
- }
- unlockHeaders() ;
-}
-
-//mHeaderMutex is locked and mHeaderAPRFile is created before calling this.
-void LLTextureCache::updatedHeaderEntriesFile()
-{
- if (!mReadOnly && !mUpdatedEntryMap.empty() && mHeaderAPRFile)
- {
- //entriesInfo
- mHeaderAPRFile->seek(APR_SET, 0);
- S32 bytes_written = mHeaderAPRFile->write((U8*)&mHeaderEntriesInfo, sizeof(EntriesInfo)) ;
- if(bytes_written != sizeof(EntriesInfo))
- {
- clearCorruptedCache() ; //clear the cache.
- return ;
- }
-
- //write each updated entry
- S32 entry_size = (S32)sizeof(Entry) ;
- S32 prev_idx = -1 ;
- S32 delta_idx ;
- for (idx_entry_map_t::iterator iter = mUpdatedEntryMap.begin(); iter != mUpdatedEntryMap.end(); ++iter)
- {
- delta_idx = iter->first - prev_idx - 1;
- prev_idx = iter->first ;
- if(delta_idx)
- {
- mHeaderAPRFile->seek(APR_CUR, delta_idx * entry_size);
- }
-
- bytes_written = mHeaderAPRFile->write((void*)(&iter->second), entry_size);
- if(bytes_written != entry_size)
- {
- clearCorruptedCache() ; //clear the cache.
- return ;
- }
- }
- mUpdatedEntryMap.clear() ;
- }
-}
//----------------------------------------------------------------------------
// Called from either the main thread or the worker thread
@@ -1369,27 +1169,28 @@ void LLTextureCache::readHeaderCache()
if (num_entries)
{
U32 empty_entries = 0;
- typedef std::pair lru_data_t;
+ typedef std::pair lru_data_t;
std::set lru;
- std::set purge_list;
+ std::vector purge_list;
for (U32 i=0; i 0)
{
if (entry.mBodySize > entry.mImageSize)
{
// Shouldn't happen, failsafe only
- llwarns << "Bad entry: " << i << ": " << entry.mID << ": BodySize: " << entry.mBodySize << llendl;
- purge_list.insert(i);
+ llwarns << "Bad entry: " << i << ": " << id << ": BodySize: " << entry.mBodySize << llendl;
+ purge_list.push_back(id);
}
}
}
@@ -1399,24 +1200,22 @@ void LLTextureCache::readHeaderCache()
// Special case: cache size was reduced, need to remove entries
// Note: After we prune entries, we will call this again and create the LRU
U32 entries_to_purge = (num_entries-empty_entries) - sCacheMaxEntries;
- llinfos << "Texture Cache Entries: " << num_entries << " Max: " << sCacheMaxEntries << " Empty: " << empty_entries << " Purging: " << entries_to_purge << llendl;
if (entries_to_purge > 0)
{
for (std::set::iterator iter = lru.begin(); iter != lru.end(); ++iter)
{
- purge_list.insert(iter->second);
- if (purge_list.size() >= entries_to_purge)
+ purge_list.push_back(iter->second);
+ if (--entries_to_purge <= 0)
break;
}
}
- llassert_always(purge_list.size() >= entries_to_purge);
}
else
{
S32 lru_entries = (S32)((F32)sCacheMaxEntries * TEXTURE_CACHE_LRU_SIZE);
for (std::set::iterator iter = lru.begin(); iter != lru.end(); ++iter)
{
- mLRU.insert(entries[iter->second].mID);
+ mLRU.insert(iter->second);
// llinfos << "LRU: " << iter->first << " : " << iter->second << llendl;
if (--lru_entries <= 0)
break;
@@ -1425,10 +1224,11 @@ void LLTextureCache::readHeaderCache()
if (purge_list.size() > 0)
{
- for (std::set::iterator iter = purge_list.begin(); iter != purge_list.end(); ++iter)
+ for (std::vector::iterator iter = purge_list.begin(); iter != purge_list.end(); ++iter)
{
- std::string tex_filename = getTextureFileName(entries[*iter].mID);
- removeEntry((S32)*iter, entries[*iter], tex_filename);
+ mHeaderMutex.unlock();
+ removeFromCache(*iter);
+ mHeaderMutex.lock();
}
// If we removed any entries, we need to rebuild the entries list,
// write the header, and call this again
@@ -1436,14 +1236,13 @@ void LLTextureCache::readHeaderCache()
for (U32 i=0; i 0)
+ if (entry.mImageSize >=0)
{
new_entries.push_back(entry);
}
}
llassert_always(new_entries.size() <= sCacheMaxEntries);
mHeaderEntriesInfo.mEntries = new_entries.size();
- writeEntriesHeader();
writeEntriesAndClose(new_entries);
mHeaderMutex.unlock(); // unlock the mutex before calling again
readHeaderCache(); // repeat with new entries file
@@ -1451,7 +1250,7 @@ void LLTextureCache::readHeaderCache()
}
else
{
- //entries are not changed, nothing here.
+ writeEntriesAndClose(entries);
}
}
}
@@ -1460,29 +1259,6 @@ void LLTextureCache::readHeaderCache()
//////////////////////////////////////////////////////////////////////////////
-//the header mutex is locked before calling this.
-void LLTextureCache::clearCorruptedCache()
-{
- llwarns << "the texture cache is corrupted, need to be cleared." << llendl ;
-
- closeHeaderEntriesFile();//close possible file handler
- purgeAllTextures(false) ; //clear the cache.
-
- if (!mReadOnly) //regenerate the directory tree if not exists.
- {
- LLFile::mkdir(mTexturesDirName);
-
- const char* subdirs = "0123456789abcdef";
- for (S32 i=0; i<16; i++)
- {
- std::string dirname = mTexturesDirName + gDirUtilp->getDirDelimiter() + subdirs[i];
- LLFile::mkdir(dirname);
- }
- }
-
- return ;
-}
-
void LLTextureCache::purgeAllTextures(bool purge_directories)
{
if (!mReadOnly)
@@ -1493,7 +1269,6 @@ void LLTextureCache::purgeAllTextures(bool purge_directories)
for (S32 i=0; i<16; i++)
{
std::string dirname = mTexturesDirName + delem + subdirs[i];
- llinfos << "Deleting files in directory: " << dirname << llendl;
gDirUtilp->deleteFilesInDir(dirname,mask);
if (purge_directories)
{
@@ -1502,23 +1277,19 @@ void LLTextureCache::purgeAllTextures(bool purge_directories)
}
if (purge_directories)
{
- gDirUtilp->deleteFilesInDir(mTexturesDirName, mask);
LLFile::rmdir(mTexturesDirName);
- }
+ }
}
mHeaderIDMap.clear();
mTexturesSizeMap.clear();
mTexturesSizeTotal = 0;
mFreeList.clear();
mTexturesSizeTotal = 0;
- mUpdatedEntryMap.clear();
// Info with 0 entries
mHeaderEntriesInfo.mVersion = sHeaderCacheVersion;
mHeaderEntriesInfo.mEntries = 0;
writeEntriesHeader();
-
- llinfos << "The entire texture cache is cleared." << llendl ;
}
void LLTextureCache::purgeTextures(bool validate)
@@ -1543,6 +1314,7 @@ void LLTextureCache::purgeTextures(bool validate)
U32 num_entries = openAndReadEntries(entries);
if (!num_entries)
{
+ writeEntriesAndClose(entries);
return; // nothing to purge
}
@@ -1561,10 +1333,6 @@ void LLTextureCache::purgeTextures(bool validate)
time_idx_set.insert(std::make_pair(entries[idx].mTime, idx));
// llinfos << "TIME: " << entries[idx].mTime << " TEX: " << entries[idx].mID << " IDX: " << idx << " Size: " << entries[idx].mImageSize << llendl;
}
- else
- {
- llerrs << "mTexturesSizeMap / mHeaderIDMap corrupted." << llendl ;
- }
}
}
@@ -1616,8 +1384,11 @@ void LLTextureCache::purgeTextures(bool validate)
{
purge_count++;
LL_DEBUGS("TextureCache") << "PURGING: " << filename << LL_ENDL;
- removeEntry(idx, entries[idx], filename) ;
+ LLAPRFile::remove(filename);
cache_size -= entries[idx].mBodySize;
+ mTexturesSizeTotal -= entries[idx].mBodySize;
+ entries[idx].mBodySize = 0;
+ mTexturesSizeMap.erase(entries[idx].mID);
}
}
@@ -1625,8 +1396,11 @@ void LLTextureCache::purgeTextures(bool validate)
writeEntriesAndClose(entries);
- // *FIX:Mani - watchdog back on.
- LLAppViewer::instance()->resumeMainloopTimeout();
+ if (!mThreaded)
+ {
+ // *FIX:Mani - watchdog back on.
+ LLAppViewer::instance()->resumeMainloopTimeout();
+ }
LL_INFOS("TextureCache") << "TEXTURE CACHE:"
<< " PURGED: " << purge_count
@@ -1664,38 +1438,40 @@ LLTextureCacheWorker* LLTextureCache::getWriter(handle_t handle)
// Called from work thread
// Reads imagesize from the header, updates timestamp
-S32 LLTextureCache::getHeaderCacheEntry(const LLUUID& id, Entry& entry)
+S32 LLTextureCache::getHeaderCacheEntry(const LLUUID& id, S32& imagesize)
{
- LLMutexLock lock(&mHeaderMutex);
+ LLMutexLock lock(&mHeaderMutex);
+ Entry entry;
S32 idx = openAndReadEntry(id, entry, false);
if (idx >= 0)
- {
- updateEntryTimeStamp(idx, entry); // updates time
+ {
+ imagesize = entry.mImageSize;
+ writeEntryAndClose(idx, entry); // updates time
}
return idx;
}
// Writes imagesize to the header, updates timestamp
-S32 LLTextureCache::setHeaderCacheEntry(const LLUUID& id, Entry& entry, S32 imagesize, S32 datasize)
+S32 LLTextureCache::setHeaderCacheEntry(const LLUUID& id, S32 imagesize)
{
mHeaderMutex.lock();
+ llassert_always(imagesize >= 0);
+ Entry entry;
S32 idx = openAndReadEntry(id, entry, true);
- mHeaderMutex.unlock();
-
if (idx >= 0)
{
- updateEntry(idx, entry, imagesize, datasize);
+ entry.mImageSize = imagesize;
+ writeEntryAndClose(idx, entry);
+ mHeaderMutex.unlock();
}
-
- if(idx < 0) // retry
+ else // retry
{
+ mHeaderMutex.unlock();
readHeaderCache(); // We couldn't write an entry, so refresh the LRU
-
mHeaderMutex.lock();
llassert_always(!mLRU.empty() || mHeaderEntriesInfo.mEntries < sCacheMaxEntries);
mHeaderMutex.unlock();
-
- idx = setHeaderCacheEntry(id, entry, imagesize, datasize); // assert above ensures no inf. recursion
+ idx = setHeaderCacheEntry(id, imagesize); // assert above ensures no inf. recursion
}
return idx;
}
@@ -1732,34 +1508,39 @@ LLTextureCache::handle_t LLTextureCache::readFromCache(const LLUUID& id, U32 pri
return handle;
}
-
+// Return true if the handle is not valid, which is the case
+// when the worker was already deleted or is scheduled for deletion.
+//
+// If the handle exists and a call to worker->complete() returns
+// true or abort is true, then the handle is removed and the worker
+// scheduled for deletion.
bool LLTextureCache::readComplete(handle_t handle, bool abort)
{
- lockWorkers();
+ lockWorkers(); // Needed for access to mReaders.
+
handle_map_t::iterator iter = mReaders.find(handle);
+ bool handle_is_valid = iter != mReaders.end();
+ llassert_always(handle_is_valid || abort);
LLTextureCacheWorker* worker = NULL;
- bool complete = false;
- if (iter != mReaders.end())
+ bool delete_worker = false;
+
+ if (handle_is_valid)
{
worker = iter->second;
- complete = worker->complete();
-
- if(!complete && abort)
+ delete_worker = worker->complete() || abort;
+ if (delete_worker)
{
- abortRequest(handle, true) ;
+ mReaders.erase(handle);
+ handle_is_valid = false;
}
}
- if (worker && (complete || abort))
- {
- mReaders.erase(iter);
- unlockWorkers();
- worker->scheduleDelete();
- }
- else
- {
- unlockWorkers();
- }
- return (complete || abort);
+
+ unlockWorkers();
+
+ if (delete_worker) worker->scheduleDelete();
+
+ // Return false if the handle is (still) valid.
+ return !handle_is_valid;
}
LLTextureCache::handle_t LLTextureCache::writeToCache(const LLUUID& id, U32 priority,
@@ -1792,20 +1573,20 @@ bool LLTextureCache::writeComplete(handle_t handle, bool abort)
{
lockWorkers();
handle_map_t::iterator iter = mWriters.find(handle);
- llassert(iter != mWriters.end());
- if (iter != mWriters.end())
+ llassert_always(iter != mWriters.end());
+ LLTextureCacheWorker* worker = iter->second;
+ if (worker->complete() || abort)
{
- LLTextureCacheWorker* worker = iter->second;
- if (worker->complete() || abort)
- {
- mWriters.erase(handle);
- unlockWorkers();
- worker->scheduleDelete();
- return true;
- }
+ mWriters.erase(handle);
+ unlockWorkers();
+ worker->scheduleDelete();
+ return true;
+ }
+ else
+ {
+ unlockWorkers();
+ return false;
}
- unlockWorkers();
- return false;
}
void LLTextureCache::prioritizeWrite(handle_t handle)
@@ -1824,56 +1605,38 @@ void LLTextureCache::addCompleted(Responder* responder, bool success)
//////////////////////////////////////////////////////////////////////////////
-//called after mHeaderMutex is locked.
-void LLTextureCache::removeCachedTexture(const LLUUID& id)
-{
- if(mTexturesSizeMap.find(id) != mTexturesSizeMap.end())
- {
- mTexturesSizeTotal -= mTexturesSizeMap[id] ;
- mTexturesSizeMap.erase(id);
- }
- mHeaderIDMap.erase(id);
- LLAPRFile::remove(getTextureFileName(id));
-}
+// Called from MAIN thread (endWork())
-//called after mHeaderMutex is locked.
-void LLTextureCache::removeEntry(S32 idx, Entry& entry, std::string& filename)
+bool LLTextureCache::removeHeaderCacheEntry(const LLUUID& id)
{
- if(idx >= 0) //valid entry
+ if (!mReadOnly)
{
- entry.mImageSize = -1;
- entry.mBodySize = 0;
- mHeaderIDMap.erase(entry.mID);
- mTexturesSizeMap.erase(entry.mID);
-
- mTexturesSizeTotal -= entry.mBodySize;
- mFreeList.insert(idx);
+ LLMutexLock lock(&mHeaderMutex);
+ Entry entry;
+ S32 idx = openAndReadEntry(id, entry, false);
+ if (idx >= 0)
+ {
+ entry.mImageSize = -1;
+ entry.mBodySize = 0;
+ writeEntryAndClose(idx, entry);
+ mFreeList.insert(idx);
+ mHeaderIDMap.erase(id);
+ mTexturesSizeMap.erase(id);
+ return true;
+ }
}
-
- LLAPRFile::remove(filename);
+ return false;
}
-bool LLTextureCache::removeFromCache(const LLUUID& id)
+void LLTextureCache::removeFromCache(const LLUUID& id)
{
//llwarns << "Removing texture from cache: " << id << llendl;
- bool ret = false ;
if (!mReadOnly)
{
- lockHeaders() ;
-
- Entry entry;
- S32 idx = openAndReadEntry(id, entry, false);
- std::string tex_filename = getTextureFileName(id);
- removeEntry(idx, entry, tex_filename) ;
- if (idx >= 0)
- {
- writeEntryToHeaderImmediately(idx, entry);
- ret = true;
- }
-
- unlockHeaders() ;
+ removeHeaderCacheEntry(id);
+ LLMutexLock lock(&mHeaderMutex);
+ LLAPRFile::remove(getTextureFileName(id));
}
- return ret ;
}
//////////////////////////////////////////////////////////////////////////////
diff --git a/linden/indra/newview/lltexturecache.h b/linden/indra/newview/lltexturecache.h
index f80be00..45804c2 100644
--- a/linden/indra/newview/lltexturecache.h
+++ b/linden/indra/newview/lltexturecache.h
@@ -40,7 +40,6 @@
#include "llworkerthread.h"
-class LLImageFormatted;
class LLTextureCacheWorker;
class LLTextureCache : public LLWorkerThread
@@ -59,16 +58,10 @@ private:
};
struct Entry
{
- Entry() :
- mBodySize(0),
- mImageSize(0),
- mTime(0)
- {
- }
+ Entry() {}
Entry(const LLUUID& id, S32 imagesize, S32 bodysize, U32 time) :
mID(id), mImageSize(imagesize), mBodySize(bodysize), mTime(time) {}
void init(const LLUUID& id, U32 time) { mID = id, mImageSize = 0; mBodySize = 0; mTime = time; }
- Entry& operator=(const Entry& entry) {mID = entry.mID, mImageSize = entry.mImageSize; mBodySize = entry.mBodySize; mTime = entry.mTime; return *this;}
LLUUID mID; // 16 bytes
S32 mImageSize; // total size of image if known
S32 mBodySize; // size of body file in body cache
@@ -110,8 +103,7 @@ public:
/*virtual*/ S32 update(U32 max_time_ms);
void purgeCache(ELLPath location);
- void setReadOnly(BOOL read_only) ;
- S64 initCache(ELLPath location, S64 maxsize, BOOL disable_texture_cache);
+ S64 initCache(ELLPath location, S64 maxsize, BOOL read_only);
handle_t readFromCache(const std::string& local_filename, const LLUUID& id, U32 priority, S32 offset, S32 size,
ReadResponder* responder);
@@ -124,7 +116,7 @@ public:
bool writeComplete(handle_t handle, bool abort = false);
void prioritizeWrite(handle_t handle);
- bool removeFromCache(const LLUUID& id);
+ void removeFromCache(const LLUUID& id);
// For LLTextureCacheWorker::Responder
LLTextureCacheWorker* getReader(handle_t handle);
@@ -139,11 +131,10 @@ public:
S64 getMaxUsage() { return sCacheMaxTexturesSize; }
U32 getEntries() { return mHeaderEntriesInfo.mEntries; }
U32 getMaxEntries() { return sCacheMaxEntries; };
- BOOL isInCache(const LLUUID& id) ;
- BOOL isInLocal(const LLUUID& id) ;
protected:
// Accessed by LLTextureCacheWorker
+ bool updateTextureEntryList(const LLUUID& id, S32 size);
std::string getLocalFileName(const LLUUID& id);
std::string getTextureFileName(const LLUUID& id);
void addCompleted(Responder* responder, bool success);
@@ -154,7 +145,6 @@ protected:
private:
void setDirNames(ELLPath location);
void readHeaderCache();
- void clearCorruptedCache();
void purgeAllTextures(bool purge_directories);
void purgeTextures(bool validate);
LLAPRFile* openHeaderEntriesFile(bool readonly, S32 offset);
@@ -162,20 +152,12 @@ private:
void readEntriesHeader();
void writeEntriesHeader();
S32 openAndReadEntry(const LLUUID& id, Entry& entry, bool create);
- bool updateEntry(S32& idx, Entry& entry, S32 new_image_size, S32 new_body_size);
- void updateEntryTimeStamp(S32 idx, Entry& entry) ;
+ void writeEntryAndClose(S32 idx, Entry& entry);
U32 openAndReadEntries(std::vector& entries);
void writeEntriesAndClose(const std::vector& entries);
- void readEntryFromHeaderImmediately(S32& idx, Entry& entry) ;
- void writeEntryToHeaderImmediately(S32& idx, Entry& entry, bool write_header = false) ;
- void removeEntry(S32 idx, Entry& entry, std::string& filename);
- void removeCachedTexture(const LLUUID& id) ;
- S32 getHeaderCacheEntry(const LLUUID& id, Entry& entry);
- S32 setHeaderCacheEntry(const LLUUID& id, Entry& entry, S32 imagesize, S32 datasize);
- void writeUpdatedEntries() ;
- void updatedHeaderEntriesFile() ;
- void lockHeaders() { mHeaderMutex.lock(); }
- void unlockHeaders() { mHeaderMutex.unlock(); }
+ S32 getHeaderCacheEntry(const LLUUID& id, S32& imagesize);
+ S32 setHeaderCacheEntry(const LLUUID& id, S32 imagesize);
+ bool removeHeaderCacheEntry(const LLUUID& id);
private:
// Internal
@@ -212,9 +194,6 @@ private:
S64 mTexturesSizeTotal;
LLAtomic32 mDoPurge;
- typedef std::map idx_entry_map_t;
- idx_entry_map_t mUpdatedEntryMap;
-
// Statics
static F32 sHeaderCacheVersion;
static U32 sCacheMaxEntries;
diff --git a/linden/indra/newview/lltexturefetch.cpp b/linden/indra/newview/lltexturefetch.cpp
index 427e55a..2184478 100644
--- a/linden/indra/newview/lltexturefetch.cpp
+++ b/linden/indra/newview/lltexturefetch.cpp
@@ -1500,8 +1500,6 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image
LLTextureFetch::~LLTextureFetch()
{
- clearDeleteList() ;
-
// ~LLQueuedThread() called here
}
--
cgit v1.1
From 1bd669621e08246857148f6e00df0722d343dced Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Sat, 4 Sep 2010 01:19:54 +0200
Subject: disable speedrez by default, because it confuses less advanced users.
---
linden/indra/newview/app_settings/settings.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index 65a6c00..7a1e808 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -582,7 +582,7 @@
Type
Boolean
Value
- 1
+ 0
SpeedRezInterval
--
cgit v1.1
From 2ab7c40c89c6c19ffd79db4f6a5cf3ab171e31ce Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Fri, 3 Sep 2010 15:23:46 +0200
Subject: linux64: fetch 32 bit libraries required for voice
---
linden/indra/cmake/ViewerMiscLibs.cmake | 3 +++
linden/indra/newview/viewer_manifest.py | 20 ++++++++++----------
2 files changed, 13 insertions(+), 10 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/cmake/ViewerMiscLibs.cmake b/linden/indra/cmake/ViewerMiscLibs.cmake
index 7bd306b..4a62ebd 100644
--- a/linden/indra/cmake/ViewerMiscLibs.cmake
+++ b/linden/indra/cmake/ViewerMiscLibs.cmake
@@ -4,6 +4,9 @@ include(Prebuilt)
if (NOT STANDALONE)
use_prebuilt_binary(libuuid)
use_prebuilt_binary(vivox)
+ if(LINUX64)
+ use_prebuilt_binary(32bitcompatibilitylibs)
+ endif(LINUX64)
use_prebuilt_binary(fontconfig)
endif(NOT STANDALONE)
diff --git a/linden/indra/newview/viewer_manifest.py b/linden/indra/newview/viewer_manifest.py
index 88ef0ad..d34e9ae 100755
--- a/linden/indra/newview/viewer_manifest.py
+++ b/linden/indra/newview/viewer_manifest.py
@@ -1006,7 +1006,6 @@ class Linux_i686Manifest(LinuxManifest):
self.path("libvivoxsdk.so")
self.end_prefix("lib")
-
class Linux_x86_64Manifest(LinuxManifest):
def construct(self):
super(Linux_x86_64Manifest, self).construct()
@@ -1123,14 +1122,6 @@ class Linux_x86_64Manifest(LinuxManifest):
self.end_prefix("gstreamer-plugins")
self.end_prefix("lib64")
-# if self.prefix("../../libraries/x86_64-linux/lib_release_client/32bit-compat", dst="lib32"):
-# self.path("libalut.so")
-# self.path("libidn.so.11")
-# self.path("libopenal.so.1")
-# self.path("libortp.so")
-# self.path("libuuid.so.1")
-# self.end_prefix("lib32")
-
# Vivox runtimes and libs
if self.prefix(src="vivox-runtime/i686-linux", dst="bin"):
@@ -1138,10 +1129,19 @@ class Linux_x86_64Manifest(LinuxManifest):
self.end_prefix("bin")
if self.prefix(src="vivox-runtime/i686-linux", dst="lib32"):
- self.path("libalut.so")
+ #self.path("libalut.so")
self.path("libortp.so")
self.path("libvivoxsdk.so")
self.end_prefix("lib32")
+
+ # 32bit libs needed for voice
+ if self.prefix("../../libraries/x86_64-linux/lib_release_client/32bit-compat", dst="lib32"):
+ self.path("libalut.so")
+ self.path("libidn.so.11")
+ self.path("libopenal.so.1")
+ # self.path("libortp.so")
+ self.path("libuuid.so.1")
+ self.end_prefix("lib32")
if __name__ == "__main__":
main()
--
cgit v1.1
From a52ea919465655871195823b3e04f0552ec190ee Mon Sep 17 00:00:00 2001
From: Jacek Antonelli
Date: Fri, 3 Sep 2010 20:04:15 -0500
Subject: Fixed dictionaries URL (should be no www).
---
linden/indra/newview/app_settings/settings.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index 7a1e808..2e10768 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -1535,7 +1535,7 @@
Type
String
Value
- http://www.imprudenceviewer.org/app/dics/
+ http://imprudenceviewer.org/app/dics/
EmeraldEnableAutoCorrect
--
cgit v1.1
From 294d16dcaf6169bc5f968c3f2a8ab6f8f2487ee0 Mon Sep 17 00:00:00 2001
From: Jacek Antonelli
Date: Fri, 3 Sep 2010 21:36:09 -0500
Subject: Fixed other instances of 'www.imprudenceviewer.org'. There is no www.
---
linden/indra/newview/app_settings/settings.xml | 2 +-
linden/indra/newview/llappviewer.cpp | 2 +-
linden/indra/newview/skins/default/xui/en-us/floater_about.xml | 2 +-
linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml | 4 ++--
4 files changed, 5 insertions(+), 5 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index 2e10768..bcf9ef6 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -68,7 +68,7 @@
Type
String
Value
- http://www.imprudenceviewer.org
+ http://imprudenceviewer.org
BrowserLastVisited
diff --git a/linden/indra/newview/llappviewer.cpp b/linden/indra/newview/llappviewer.cpp
index 52535bc..b3f3e59 100644
--- a/linden/indra/newview/llappviewer.cpp
+++ b/linden/indra/newview/llappviewer.cpp
@@ -3229,7 +3229,7 @@ void LLAppViewer::badNetworkHandler()
"the issue. \n"
" \n"
"If the problem continues, please report the issue at: \n"
- "www.imprudenceviewer.org" << grid_support_msg;
+ "http://imprudenceviewer.org" << grid_support_msg;
forceDisconnect(message.str());
}
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_about.xml b/linden/indra/newview/skins/default/xui/en-us/floater_about.xml
index 1370051..1ba9c40 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_about.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_about.xml
@@ -9,7 +9,7 @@
word_wrap="true">
The Imprudence Viewer was rocked hard by:
Jacek Antonelli, McCabe Maxsted, and Armin Weatherwax.
- http://www.imprudenceviewer.org
+ http://imprudenceviewer.org
Imprudence is so awesome thanks to contributions from many generous people:
diff --git a/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml b/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
index 1b64878..d15657e 100644
--- a/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
@@ -815,12 +815,12 @@
+ userdata="WebLaunchImprudenceBlog,http://imprudenceviewer.org/" />
+ userdata="WebLaunchImprudenceForums,http://imprudenceviewer.org/forums/" />
setAddressMode(LLTexUnit::TAM_WRAP);
mImagePreloads.insert(image);
}
-
+
+ std::string id;
+
+ // Preload default avatar eyes
+ id = gSavedSettings.getString("UIImgDefaultEyesUUID");
+ image = getImageFromFile(id+".j2c",MIPMAP_YES,IMMEDIATE_YES,0,0,LLUUID(id));
+ if (image)
+ {
+ image->setAddressMode(LLTexUnit::TAM_WRAP);
+ mImagePreloads.insert(image);
+ }
+
+ // Preload default avatar hair
+ id = gSavedSettings.getString("UIImgDefaultHairUUID");
+ image = getImageFromFile(id+".j2c",MIPMAP_YES,IMMEDIATE_YES,0,0,LLUUID(id));
+ if (image)
+ {
+ image->setAddressMode(LLTexUnit::TAM_WRAP);
+ mImagePreloads.insert(image);
+ }
+
}
static std::string get_texture_list_name()
--
cgit v1.1
From 22cc562720022684340bd80a66292ee3fd0f8dac Mon Sep 17 00:00:00 2001
From: Jacek Antonelli
Date: Fri, 3 Sep 2010 23:00:36 -0500
Subject: Fixed several issues with the local asset browser.
* Enable "Keep Updating" by default.
* Fixed the "Keep Updating" checkbox not toggling correctly.
* Fixed the upload fee label (it was showing currency symbol).
---
linden/indra/newview/floaterlocalassetbrowse.cpp | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/floaterlocalassetbrowse.cpp b/linden/indra/newview/floaterlocalassetbrowse.cpp
index 337a5e6..0ff24ca 100644
--- a/linden/indra/newview/floaterlocalassetbrowse.cpp
+++ b/linden/indra/newview/floaterlocalassetbrowse.cpp
@@ -106,8 +106,8 @@ LocalBitmap::LocalBitmap(std::string fullpath)
/* taking care of basic properties */
this->id.generate();
this->filename = fullpath;
- this->linkstatus = LINK_OFF;
- this->keep_updating = false;
+ this->linkstatus = LINK_ON;
+ this->keep_updating = true;
this->shortname = gDirUtilp->getBaseFileName(this->filename, true);
this->bitmap_type = TYPE_TEXTURE;
this->sculpt_dirty = false;
@@ -791,8 +791,8 @@ FloaterLocalAssetBrowser::FloaterLocalAssetBrowser()
// checkbox callbacks
mUpdateChkBox->setCommitCallback(onClickUpdateChkbox);
- mUpdateChkBox->set(true);
- mUploadBtn->setLabelArg("[UPLOADFEE]", gHippoGridManager->getConnectedGrid()->getCurrencySymbol());
+ mUpdateChkBox->set(false);
+ mUploadBtn->setLabelArg("[UPLOADFEE]", gHippoGridManager->getConnectedGrid()->getUploadFee());
}
void FloaterLocalAssetBrowser::show(void*)
@@ -915,7 +915,6 @@ void FloaterLocalAssetBrowser::UpdateRightSide()
sLFInstance->mTypeComboBox->selectNthItem( unit->getType() );
sLFInstance->mTextureView->setEnabled(true);
- sLFInstance->mUpdateChkBox->set(true);
sLFInstance->mUpdateChkBox->setEnabled(true);
sLFInstance->mTypeComboBox->setEnabled(true);
}
@@ -924,7 +923,6 @@ void FloaterLocalAssetBrowser::UpdateRightSide()
{
sLFInstance->mTextureView->setImageAssetID( NO_IMAGE );
sLFInstance->mTextureView->setEnabled( false );
- sLFInstance->mUpdateChkBox->set( false );
sLFInstance->mUpdateChkBox->setEnabled( false );
sLFInstance->mTypeComboBox->selectFirstItem();
--
cgit v1.1
From ca4d3f5c76aaa244770a30129a9de94bebc9b9ac Mon Sep 17 00:00:00 2001
From: Jacek Antonelli
Date: Mon, 30 Aug 2010 18:57:23 -0500
Subject: Switched main viewer font to DejaVu Sans Condensed.
Tweaked a few parts of the UI layout to fit the font better.
Still no easy way to switch fonts yet.
---
linden/indra/newview/app_settings/settings.xml | 4 ++--
.../skins/default/xui/en-us/floater_chat_history.xml | 9 ++++-----
.../default/xui/en-us/floater_instant_message_group.xml | 9 ++++-----
.../skins/default/xui/en-us/floater_preview_gesture.xml | 8 ++++----
linden/indra/newview/skins/default/xui/en-us/fonts.xml | 16 ++++++++--------
.../skins/default/xui/en-us/panel_preferences_web.xml | 4 ++--
.../newview/skins/default/xui/en-us/panel_toolbar.xml | 4 ++--
linden/indra/newview/viewer_manifest.py | 4 ++++
8 files changed, 30 insertions(+), 28 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index bcf9ef6..2aec96f 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -6131,7 +6131,7 @@
Type
String
Value
- LiberationSans-Regular.ttf
+ DejaVuSansCondensed.ttf
FontSansSerifBundledFallback
@@ -6153,7 +6153,7 @@
Type
String
Value
- LiberationSans-Bold.ttf
+ DejaVuSansCondensed-Bold.ttf
FontSansSerifFallback
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml b/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml
index 87e1dae..74fe708 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml
@@ -81,11 +81,10 @@
-
+
-
+
+ left="125" name="add_btn" width="90" />
+ left_delta="0" name="up_btn" width="90" />
+ left_delta="0" name="down_btn" width="90" />
+ name="delete_btn" width="90" />
ArialUni.ttf
- ăƒ’ăƒ©ă‚ă‚™ăƒè§’ă‚³ă‚™ Pro W3.otf
- ăƒ’ăƒ©ă‚ă‚™ăƒè§’ă‚³ă‚™ ProN W3.otf
+ ăƒ’ăƒ©ă‚®ăƒè§’ă‚´ Pro W3.otf
+ ăƒ’ăƒ©ă‚®ăƒè§’ă‚´ ProN W3.otf
AppleGothic.dfont
AppleGothic.ttf
å文细黑.ttf
@@ -19,13 +19,13 @@
- LiberationSans-Regular.ttf
+ DejaVuSansCondensed.ttf
- LiberationSans-Bold.ttf
+ DejaVuSansCondensed-Bold.ttf
- DejaVuSans.ttf
+ DejaVuSansCondensed.ttf
- DejaVuSansBold.ttf
+ DejaVuSansCondensed-Bold.ttf
- DejaVuSansOblique.ttf
+ DejaVuSansCondensed-Oblique.ttf
- DejaVuSansBoldOblique.ttf
+ DejaVuSansCondensed-BoldOblique.ttf
World search:
-
+ width="60" follows="left|right" user_resize="false"/>
+ width="40" follows="left|right" user_resize="false"/>
Type
F32
Value
- 1.002
+ 1.0
UISndAlert
--
cgit v1.1
From d4f7218ab9564d13cc406eb2abcfc81446b6fca9 Mon Sep 17 00:00:00 2001
From: Jacek Antonelli
Date: Sat, 4 Sep 2010 02:56:38 -0500
Subject: Changed version to 'Experimental 2010.09.04'.
---
linden/indra/newview/English.lproj/InfoPlist.strings | 4 ++--
linden/indra/newview/Info-Imprudence.plist | 2 +-
linden/indra/newview/app_settings/viewerversion.xml | 4 ++--
linden/indra/newview/res/viewerRes.rc | 8 ++++----
4 files changed, 9 insertions(+), 9 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/English.lproj/InfoPlist.strings b/linden/indra/newview/English.lproj/InfoPlist.strings
index d2e24bf..8f9c4f5 100644
--- a/linden/indra/newview/English.lproj/InfoPlist.strings
+++ b/linden/indra/newview/English.lproj/InfoPlist.strings
@@ -1,5 +1,5 @@
/* Localized versions of Info.plist keys */
CFBundleName = "Imprudence";
-CFBundleShortVersionString = "Imprudence Weekly 2010-06-26";
-CFBundleGetInfoString = "Imprudence Weekly 2010-06-26";
+CFBundleShortVersionString = "Imprudence Experimental 2010.09.04";
+CFBundleGetInfoString = "Imprudence Experimental 2010.09.04";
diff --git a/linden/indra/newview/Info-Imprudence.plist b/linden/indra/newview/Info-Imprudence.plist
index b6f834d..e9728f8 100644
--- a/linden/indra/newview/Info-Imprudence.plist
+++ b/linden/indra/newview/Info-Imprudence.plist
@@ -32,7 +32,7 @@
CFBundleVersion
- Weekly 2010-06-26
+ Experimental 2010.09.04
CSResourcesFileMapped
diff --git a/linden/indra/newview/app_settings/viewerversion.xml b/linden/indra/newview/app_settings/viewerversion.xml
index 37cfe0a..3b1a7df 100644
--- a/linden/indra/newview/app_settings/viewerversion.xml
+++ b/linden/indra/newview/app_settings/viewerversion.xml
@@ -14,12 +14,12 @@ need to be changed manually - MC
-
+
-
+
diff --git a/linden/indra/newview/res/viewerRes.rc b/linden/indra/newview/res/viewerRes.rc
index a3fafc6..45e50c9 100644
--- a/linden/indra/newview/res/viewerRes.rc
+++ b/linden/indra/newview/res/viewerRes.rc
@@ -155,12 +155,12 @@ BEGIN
BLOCK "040904b0"
BEGIN
VALUE "CompanyName", "Imprudence Viewer Project"
- VALUE "FileDescription", "Imprudence Weekly"
- VALUE "FileVersion", "2010-06-26"
- VALUE "InternalName", "Imprudence Weekly"
+ VALUE "FileDescription", "Imprudence Experimental"
+ VALUE "FileVersion", "2010.09.04"
+ VALUE "InternalName", "Imprudence Experimental"
VALUE "OriginalFilename", "Imprudence.exe"
VALUE "ProductName", "Imprudence Weekly"
- VALUE "ProductVersion", "2010-06-26"
+ VALUE "ProductVersion", "2010.09.04"
END
END
BLOCK "VarFileInfo"
--
cgit v1.1
From 96a3a589489ff61bf9e6e71fda3ab923b6c2869b Mon Sep 17 00:00:00 2001
From: Elektra Hesse
Date: Sat, 4 Sep 2010 21:00:09 +0200
Subject: Fixed Boost.cmake to correctly find the boost_system lib on mac
---
linden/indra/cmake/Boost.cmake | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/cmake/Boost.cmake b/linden/indra/cmake/Boost.cmake
index 90f39d2..692902a 100644
--- a/linden/indra/cmake/Boost.cmake
+++ b/linden/indra/cmake/Boost.cmake
@@ -10,7 +10,7 @@ if (STANDALONE)
set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-mt)
set(BOOST_REGEX_LIBRARY boost_regex-mt)
set(BOOST_SIGNALS_LIBRARY boost_signals-mt)
- set(BOOST_SYSTEM_LIBRARY boost_filesystem-mt)
+ set(BOOST_SYSTEM_LIBRARY boost_system-mt)
else (STANDALONE)
use_prebuilt_binary(boost)
set(Boost_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
@@ -43,7 +43,7 @@ else (STANDALONE)
set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-mt)
set(BOOST_REGEX_LIBRARY boost_regex-mt)
set(BOOST_SIGNALS_LIBRARY boost_signals-mt)
- set(BOOST_SYSTEM_LIBRARY boost_filesystem-mt)
+ set(BOOST_SYSTEM_LIBRARY boost_system-mt)
elseif (LINUX)
set(BOOST_FILESYSTEM_LIBRARY boost_filesystem-mt)
set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-mt)
--
cgit v1.1
From d4655d5a6bd6d309dabbc19a7404c94c6edffb42 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sun, 5 Sep 2010 00:32:09 -0700
Subject: Updated list of viewers and contributors in Help > About Imprudence
from the 1.3 release notes and commits in the first Experimental release.
Please add any other names we're missing
---
linden/indra/newview/skins/default/xui/en-us/floater_about.xml | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_about.xml b/linden/indra/newview/skins/default/xui/en-us/floater_about.xml
index 1ba9c40..ef02bfa 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_about.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_about.xml
@@ -8,16 +8,16 @@
max_length="65536" mouse_opaque="true" name="credits_editor" width="458"
word_wrap="true">
The Imprudence Viewer was rocked hard by:
- Jacek Antonelli, McCabe Maxsted, and Armin Weatherwax.
+ Jacek Antonelli, McCabe Maxsted, Armin Weatherwax, Elektra Hesse, and CodeBastard Redgrave.
http://imprudenceviewer.org
Imprudence is so awesome thanks to contributions from many generous people:
- For their patches and code contributions, we thank Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Angus Boyd, Asuka Neely, Balp Allen, Carjay McGinnis, Dale Glass, Felix Duesenburg, Geneko Nemeth, Henri Beauchamp, Kitty Barnett, Latif Khalifa, Lilly Zenovka, Mana Janus, Matthew Dowd, Michelle2 Zenovka, Nicholaz Beresford, Paul Churchill, Peter Lameth, Robin Cornelius, Stephen Zenith, Thomas Shikami, Vadim Bigbear, Zi Ree, and Zwagoth Klaar.
+ For their patches and code contributions, we thank Admiral Admiral, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Archimedies Plutonian, Angus Boyd, Ansariel Hiller, Ardy Lay, Asuka Neely, Balp Allen, Carjay McGinnis, Chalice Yao, Dale Glass, Damian Delacrois, Danny Nolan, Felix Duesenburg, Geneko Nemeth, Henri Beauchamp, Katharine Berry, KirstenLee Cinquetti, Kitty Barnett, Latif Khalifa, Lilly Zenovka, Makomk Makosen, Mana Janus, Matthew Dowd, Michelle2 Zenovka, Mm Alder, Nemurimasu Neiro, Nicholaz Beresford, Patrick Sapinski, Paul Churchill, Peter Lameth, Robin Cornelius, Stephen Zenith, Thickbrick Sleaford, Thomas Shikami, Tom Meta, tx Oh, Vaalith Jinn, Vadim Bigbear, Vex Streeter, Zi Ree, and Zwagoth Klaar.
For their WindLight presets, we thank Ana Lutetia, CodeBastard Redgrave, and Torley Linden.
- Thanks also to the developer(s) of the Emerald Viewer, Hippo Viewer, Cool VL Viewer, and Meerkat Viewer for viewer enhancements we have incorporated, as well as Kitty Barnett for RLVa. Special thanks to the folks at Linden Lab for releasing the viewer source, without which this endeavor would have been impossible.
+ Thanks also to the developer(s) of the Emerald Viewer, Hippo Viewer, Cool VL Viewer, Snowglobe Viewer, Meta7 Viewer, FrozenGlobe Viewer, and Meerkat Viewer for viewer enhancements we have incorporated, as well as Kitty Barnett for RLVa. Special thanks to the folks at Linden Lab for releasing the viewer source, without which this endeavor would have been impossible.
For a complete list of who did what, read the release notes!
--
cgit v1.1
From 27964ba7c04fac792ba2159d72f94ef247f3099b Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sun, 5 Sep 2010 21:11:28 -0700
Subject: Applied patch from Emerald, ported by Ansariel Hiller: #490: show
access level next to region name
---
linden/indra/newview/llworldmapview.cpp | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llworldmapview.cpp b/linden/indra/newview/llworldmapview.cpp
index 2e28d18..2632ae4 100644
--- a/linden/indra/newview/llworldmapview.cpp
+++ b/linden/indra/newview/llworldmapview.cpp
@@ -719,6 +719,27 @@ void LLWorldMapView::draw()
LLFontGL::DROP_SHADOW);
}
mesg = info->mName;
+
+ // Add access level to region name
+ U8 access = info->mAccess;
+ switch(access)
+ {
+ case SIM_ACCESS_MIN:
+ mesg += " (" + LLTrans::getString("SIM_ACCESS_MIN") +")";
+ break;
+ case SIM_ACCESS_PG:
+ mesg += " (" + LLTrans::getString("SIM_ACCESS_PG") +")";
+ break;
+ case SIM_ACCESS_MATURE:
+ mesg += " (" + LLTrans::getString("SIM_ACCESS_MATURE") +")";
+ break;
+ case SIM_ACCESS_ADULT:
+ mesg += " (" + LLTrans::getString("SIM_ACCESS_ADULT") +")";
+ break;
+ default:
+ mesg += llformat(" (Access: %d)", access);
+ break;
+ }
}
else
{
--
cgit v1.1
From fd8c70565a596286f95db90afb60185a68d879e4 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sun, 5 Sep 2010 23:07:07 -0700
Subject: Don't show region name min maturity due to different use based on
different grids
---
linden/indra/newview/llworldmapview.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llworldmapview.cpp b/linden/indra/newview/llworldmapview.cpp
index 2632ae4..d8e5b3d 100644
--- a/linden/indra/newview/llworldmapview.cpp
+++ b/linden/indra/newview/llworldmapview.cpp
@@ -725,7 +725,8 @@ void LLWorldMapView::draw()
switch(access)
{
case SIM_ACCESS_MIN:
- mesg += " (" + LLTrans::getString("SIM_ACCESS_MIN") +")";
+ // Don't show this due to different use based on different grids -- MC
+ //mesg += " (" + LLTrans::getString("SIM_ACCESS_MIN") +")";
break;
case SIM_ACCESS_PG:
mesg += " (" + LLTrans::getString("SIM_ACCESS_PG") +")";
--
cgit v1.1
From 553ab738b4e2d867e6c833596f5cbd35f48caf6c Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Mon, 6 Sep 2010 00:51:26 -0700
Subject: Ported patch by Kitty Barnett for right clicking an inventory item
and editing it
---
linden/indra/newview/llinventorybridge.cpp | 61 +++++++++++++++++++++-
linden/indra/newview/llinventoryview.cpp | 8 +--
.../skins/default/xui/en-us/menu_inventory.xml | 3 ++
3 files changed, 67 insertions(+), 5 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llinventorybridge.cpp b/linden/indra/newview/llinventorybridge.cpp
index 4a5ad67..30b0a4a 100644
--- a/linden/indra/newview/llinventorybridge.cpp
+++ b/linden/indra/newview/llinventorybridge.cpp
@@ -53,6 +53,7 @@
#include "llfloaterchat.h"
#include "llfloatercustomize.h"
#include "llfloaterproperties.h"
+#include "llfloatertools.h"
#include "llfloaterworldmap.h"
#include "llfocusmgr.h"
#include "llfolderview.h"
@@ -72,10 +73,14 @@
#include "llresmgr.h"
#include "llscrollcontainer.h"
#include "llimview.h"
+#include "lltoolcomp.h"
#include "lltooldraganddrop.h"
+#include "lltoolmgr.h"
#include "llviewerimagelist.h"
#include "llviewerinventory.h"
+#include "llviewerjoystick.h"
#include "llviewerobjectlist.h"
+#include "llviewerparcelmgr.h"
#include "llviewerwindow.h"
#include "llvoavatar.h"
#include "llwaterparammanager.h"
@@ -3493,6 +3498,55 @@ void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model
llwarns << "object not found - ignoring" << llendl;
}
}
+ else if ("edit" == action)
+ {
+ if (gRlvHandler.hasBehaviour(RLV_BHVR_EDIT))
+ return;
+ LLVOAvatar* avatarp = gAgent.getAvatarObject();
+ if (!avatarp)
+ return;
+ LLViewerObject* objectp = avatarp->getWornAttachment(mUUID);
+ if (!objectp)
+ return;
+
+ // [Selective copy/paste from LLObjectEdit::handleEvent()]
+ LLViewerParcelMgr::getInstance()->deselectLand();
+ LLSelectMgr::getInstance()->deselectAll();
+
+ if (gAgent.getFocusOnAvatar() && !LLToolMgr::getInstance()->inEdit())
+ {
+ if (objectp->isHUDAttachment() || !gSavedSettings.getBOOL("EditCameraMovement"))
+ {
+ // always freeze camera in space, even if camera doesn't move
+ // so, for example, follow cam scripts can't affect you when in build mode
+ gAgent.setFocusGlobal(gAgent.calcFocusPositionTargetGlobal(), LLUUID::null);
+ gAgent.setFocusOnAvatar(FALSE, ANIMATE);
+ }
+ else
+ {
+ gAgent.setFocusOnAvatar(FALSE, ANIMATE);
+
+ // zoom in on object center instead of where we clicked, as we need to see the manipulator handles
+ gAgent.setFocusGlobal(objectp->getPositionGlobal(), objectp->getID());
+ gAgent.cameraZoomIn(0.666f);
+ gAgent.cameraOrbitOver( 30.f * DEG_TO_RAD );
+ gViewerWindow->moveCursorToCenter();
+ }
+ }
+
+ gFloaterTools->open();
+
+ LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
+ gFloaterTools->setEditTool( LLToolCompTranslate::getInstance() );
+
+ LLViewerJoystick::getInstance()->moveObjects(true);
+ LLViewerJoystick::getInstance()->setNeedsReset(true);
+
+ LLSelectMgr::getInstance()->selectObjectAndFamily(objectp);
+
+ // Could be first use
+ LLFirstUse::useBuild();
+ }
else LLItemBridge::performAction(folder, model, action);
}
@@ -3654,9 +3708,15 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
return;
}
+ items.push_back(std::string("Attach Separator"));
if( avatarp->isWearingAttachment( mUUID ) )
{
items.push_back(std::string("Detach From Yourself"));
+ items.push_back(std::string("Attachment Edit"));
+ if ( ( (flags & FIRST_SELECTED_ITEM) == 0) || (gRlvHandler.hasBehaviour(RLV_BHVR_EDIT)) )
+ {
+ disabled_items.push_back(std::string("Attachment Edit"));
+ }
// [RLVa:KB] - Checked: 2009-10-10 (RLVa-1.0.5a) | Modified: RLVa-1.0.5a
if ( (rlv_handler_t::isEnabled()) &&
@@ -3669,7 +3729,6 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
else
if( !isInTrash() )
{
- items.push_back(std::string("Attach Separator"));
items.push_back(std::string("Object Wear"));
items.push_back(std::string("Attach To"));
items.push_back(std::string("Attach To HUD"));
diff --git a/linden/indra/newview/llinventoryview.cpp b/linden/indra/newview/llinventoryview.cpp
index 952121f..939d50b 100644
--- a/linden/indra/newview/llinventoryview.cpp
+++ b/linden/indra/newview/llinventoryview.cpp
@@ -578,11 +578,11 @@ void LLInventoryView::init(LLInventoryModel* inventory)
std::ostringstream filterSaveName;
filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "filters.xml");
llinfos << "LLInventoryView::init: reading from " << filterSaveName << llendl;
- llifstream file(filterSaveName.str());
+ llifstream file(filterSaveName.str());
LLSD savedFilterState;
- if (file.is_open())
- {
- LLSDSerialize::fromXML(savedFilterState, file);
+ if (file.is_open())
+ {
+ LLSDSerialize::fromXML(savedFilterState, file);
file.close();
// Load the persistent "Recent Items" settings.
diff --git a/linden/indra/newview/skins/default/xui/en-us/menu_inventory.xml b/linden/indra/newview/skins/default/xui/en-us/menu_inventory.xml
index 78fc75e..81b4ce2 100644
--- a/linden/indra/newview/skins/default/xui/en-us/menu_inventory.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/menu_inventory.xml
@@ -249,6 +249,9 @@
mouse_opaque="true" name="Detach From Yourself" width="128">
+
+
+
-
--
cgit v1.1
From faa545fefcc25791537c5de38a22db85aea3499e Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Mon, 6 Sep 2010 16:11:24 -0700
Subject: Made 'notify when currency spent or received' also chat the message
---
linden/indra/newview/llviewermessage.cpp | 4 ++++
1 file changed, 4 insertions(+)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llviewermessage.cpp b/linden/indra/newview/llviewermessage.cpp
index 45fd772..4cf9c87 100755
--- a/linden/indra/newview/llviewermessage.cpp
+++ b/linden/indra/newview/llviewermessage.cpp
@@ -4911,6 +4911,10 @@ void process_money_balance_reply( LLMessageSystem* msg, void** )
args["MESSAGE"] = desc;
LLNotifications::instance().add("SystemMessage", args);
+ // Also send notification to chat -- MC
+ LLChat chat(desc);
+ LLFloaterChat::addChat(desc);
+
// Once the 'recent' container gets large enough, chop some
// off the beginning.
const U32 MAX_LOOKBACK = 30;
--
cgit v1.1
From 931ac307f4bab7958817557e8ce951dfa3daa380 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Mon, 6 Sep 2010 17:34:47 -0700
Subject: Added slider to control the number of avatar imposters (can't think
of a better label)
---
linden/indra/newview/llpaneldisplay.cpp | 29 +++++++++++++++++++++-
linden/indra/newview/llpaneldisplay.h | 5 ++++
.../xui/en-us/panel_preferences_graphics1.xml | 23 ++++++++++++-----
3 files changed, 50 insertions(+), 7 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llpaneldisplay.cpp b/linden/indra/newview/llpaneldisplay.cpp
index cbf6052..b2313f6 100644
--- a/linden/indra/newview/llpaneldisplay.cpp
+++ b/linden/indra/newview/llpaneldisplay.cpp
@@ -242,6 +242,8 @@ BOOL LLPanelDisplay::postBuild()
// Avatar Render Mode
mCtrlAvatarCloth = getChild("AvatarCloth");
mCtrlAvatarImpostors = getChild("AvatarImpostors");
+ mCtrlAvatarImpostors->setCommitCallback(&LLPanelDisplay::onImpostorsEnable);
+ mCtrlAvatarImpostors->setCallbackUserData(this);
//----------------------------------------------------------------------------
// radio set for lighting detail
@@ -311,6 +313,10 @@ BOOL LLPanelDisplay::postBuild()
mCtrlPostProcess->setCommitCallback(&LLPanelDisplay::updateSliderText);
mCtrlPostProcess->setCallbackUserData(mPostProcessText);
+ // Avatar imposter count
+ mCtrlAvatarMaxVisible = getChild("AvatarMaxVisible");
+ mAvatarCountText = getChild("AvatarCountText");
+
// Text boxes (for enabling/disabling)
mShaderText = getChild("ShadersText");
mReflectionText = getChild("ReflectionDetailText");
@@ -411,8 +417,12 @@ void LLPanelDisplay::refresh()
mLightingDetail = gSavedSettings.getS32("RenderLightingDetail");
mTerrainDetail = gSavedSettings.getS32("RenderTerrainDetail");
+ // windlight remote
mWLControl = gSavedSettings.getBOOL("EnableWindlightRemote");
+ // max avatar count
+ mAvatarMaxVisible = gSavedSettings.getS32("RenderAvatarMaxVisible");
+
// slider text boxes
updateSliderText(mCtrlLODFactor, mLODFactorText);
updateSliderText(mCtrlFlexFactor, mFlexFactorText);
@@ -572,6 +582,9 @@ void LLPanelDisplay::disableUnavailableSettings()
mCtrlAvatarImpostors->setEnabled(FALSE);
mCtrlAvatarImpostors->setValue(FALSE);
}
+
+ mCtrlAvatarMaxVisible->setEnabled(mCtrlAvatarImpostors->getValue().asBoolean());
+ mAvatarCountText->setEnabled(mCtrlAvatarImpostors->getValue().asBoolean());
}
void LLPanelDisplay::setHiddenGraphicsState(bool isHidden)
@@ -587,6 +600,7 @@ void LLPanelDisplay::setHiddenGraphicsState(bool isHidden)
llassert(mCtrlTerrainFactor != NULL);
llassert(mCtrlSkyFactor != NULL);
llassert(mCtrlMaxParticle != NULL);
+ llassert(mCtrlAvatarMaxVisible != NULL);
llassert(mCtrlPostProcess != NULL);
llassert(mLODFactorText != NULL);
@@ -617,6 +631,7 @@ void LLPanelDisplay::setHiddenGraphicsState(bool isHidden)
llassert(mTerrainText != NULL);
llassert(mDrawDistanceMeterText1 != NULL);
llassert(mDrawDistanceMeterText2 != NULL);
+ llassert(mAvatarCountText != NULL);
// enable/disable the states
mGraphicsBorder->setVisible(!isHidden);
@@ -664,6 +679,7 @@ void LLPanelDisplay::setHiddenGraphicsState(bool isHidden)
mTerrainText->setVisible(!isHidden);
mDrawDistanceMeterText1->setVisible(!isHidden);
mDrawDistanceMeterText2->setVisible(!isHidden);
+ mAvatarCountText->setVisible(!isHidden);
// hide one meter text if we're making things visible
if(!isHidden)
@@ -672,6 +688,8 @@ void LLPanelDisplay::setHiddenGraphicsState(bool isHidden)
}
mMeshDetailText->setVisible(!isHidden);
+
+ mCtrlAvatarMaxVisible->setVisible(!isHidden);
}
void LLPanelDisplay::cancel()
@@ -708,6 +726,8 @@ void LLPanelDisplay::cancel()
gSavedSettings.setS32("RenderGlowResolutionPow", mPostProcess);
gSavedSettings.setBOOL("EnableWindlightRemote", mWLControl);
+
+ gSavedSettings.setS32("RenderAvatarMaxVisible", mAvatarMaxVisible);
}
void LLPanelDisplay::apply()
@@ -987,5 +1007,12 @@ void LLPanelDisplay::updateMeterText(LLUICtrl* ctrl, void* user_data)
m2->setVisible(!two_digits);
}
+// static
+void LLPanelDisplay::onImpostorsEnable(LLUICtrl* ctrl, void* user_data)
+{
+ LLPanelDisplay* self = (LLPanelDisplay*)user_data;
+ LLCheckBoxCtrl* checkbox = (LLCheckBoxCtrl*)ctrl;
-
+ self->mCtrlAvatarMaxVisible->setEnabled(checkbox->getValue().asBoolean());
+ self->mAvatarCountText->setEnabled(checkbox->getValue().asBoolean());
+}
diff --git a/linden/indra/newview/llpaneldisplay.h b/linden/indra/newview/llpaneldisplay.h
index 1cbdbba..e92cd2f 100644
--- a/linden/indra/newview/llpaneldisplay.h
+++ b/linden/indra/newview/llpaneldisplay.h
@@ -104,6 +104,7 @@ protected:
LLSliderCtrl *mCtrlSkyFactor; // LOD for terrain
LLSliderCtrl *mCtrlMaxParticle; // Max Particle
LLSliderCtrl *mCtrlPostProcess; // Max Particle
+ LLSliderCtrl *mCtrlAvatarMaxVisible; // Max avatars visible
LLCheckBoxCtrl *mCtrlBumpShiny;
LLCheckBoxCtrl *mCtrlReflections;
@@ -138,6 +139,7 @@ protected:
LLTextBox *mTerrainFactorText;
LLTextBox *mSkyFactorText;
LLTextBox *mPostProcessText;
+ LLTextBox *mAvatarCountText;
BOOL mFSAutoDetectAspect;
F32 mAspectRatio;
@@ -171,6 +173,8 @@ protected:
S32 mParticleCount;
S32 mPostProcess;
+ S32 mAvatarMaxVisible;
+
BOOL mWLControl;
static void setGraphicsSettings(LLControlGroup& group);
@@ -191,6 +195,7 @@ protected:
static void onApplyResolution(LLUICtrl* ctrl, void* data);
static void updateSliderText(LLUICtrl* ctrl, void* user_data);
static void updateMeterText(LLUICtrl* ctrl, void* user_data);
+ static void onImpostorsEnable(LLUICtrl* ctrl, void* user_data);
/// callback for defaults
static void setHardwareDefaults(void *data);
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_graphics1.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_graphics1.xml
index 55af056..153a111 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_graphics1.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_graphics1.xml
@@ -162,8 +162,8 @@
follows="left|top" font="SansSerifSmall" height="16"
initial_value="true" label="Custom" left="385" mouse_opaque="true"
name="CustomSettings" radio_style="false" width="256" />
-
+
+
+ Max. non-imposters:
+
+
-
-
+
+ scale_image="true" width="170" follows="left|bottom" />
[RES_X] x [RES_Y]
--
cgit v1.1
From 856b7ad6a941099939039e06180c392301596897 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Mon, 6 Sep 2010 19:49:48 -0700
Subject: Fixed regression of #295 in the 09.04 experimental
---
linden/indra/llui/lllineeditor.cpp | 37 +++++++++++++++++++++++--------------
1 file changed, 23 insertions(+), 14 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/llui/lllineeditor.cpp b/linden/indra/llui/lllineeditor.cpp
index 5441d0a..7d91ece 100644
--- a/linden/indra/llui/lllineeditor.cpp
+++ b/linden/indra/llui/lllineeditor.cpp
@@ -2621,28 +2621,37 @@ BOOL LLLineEditor::prevalidateASCII(const LLWString &str)
BOOL LLLineEditor::evaluateFloat()
{
- bool success;
- F32 result = 0.f;
+ bool success = false;
std::string expr = getText();
LLStringUtil::toUpper(expr);
- success = LLCalc::getInstance()->evalString(expr, result);
-
- if (!success)
+ // user deleted the contents, nothing to evaluate -- MC
+ if (expr.empty())
{
- // Move the cursor to near the error on failure
- setCursor(LLCalc::getInstance()->getLastErrorPos());
- // *TODO: Translated error message indicating the type of error? Select error text?
+ return success;
}
else
{
- // Replace the expression with the result
- std::string result_str = llformat("%f",result);
- setText(result_str);
- selectAll();
- }
+ F32 result = 0.f;
+ success = LLCalc::getInstance()->evalString(expr, result);
- return success;
+ if (!success)
+ {
+ // Move the cursor to near the error on failure
+ setCursor(LLCalc::getInstance()->getLastErrorPos());
+ // *TODO: Translated error message indicating the type of error? Select error text?
+ }
+ else
+ {
+ // Replace the expression with the result
+ std::ostringstream result_str;
+ result_str << result;
+ setText(result_str.str());
+ selectAll();
+ }
+
+ return success;
+ }
}
void LLLineEditor::onMouseCaptureLost()
--
cgit v1.1
From 7106e399b3343702b053547651264ff70ad3fa8f Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Mon, 6 Sep 2010 20:09:32 -0700
Subject: Fixed regression of #245
---
linden/indra/llui/lltexteditor.cpp | 5 +++++
linden/indra/newview/llpreviewscript.cpp | 3 +++
2 files changed, 8 insertions(+)
(limited to 'linden/indra')
diff --git a/linden/indra/llui/lltexteditor.cpp b/linden/indra/llui/lltexteditor.cpp
index 51f7ad6..8123af2 100644
--- a/linden/indra/llui/lltexteditor.cpp
+++ b/linden/indra/llui/lltexteditor.cpp
@@ -1079,6 +1079,11 @@ S32 LLTextEditor::getCursorPosFromLocalCoord( S32 local_x, S32 local_y, BOOL rou
void LLTextEditor::setCursor(S32 row, S32 column)
{
+ // Make sure we're not trying to set the cursor anywhere
+ // it can't go by always setting the min to 0 -- MC
+ row = (row < 0) ? 0 : row;
+ column = (column < 0) ? 0 : column;
+
const llwchar* doc = mWText.c_str();
const char CR = 10;
while(row--)
diff --git a/linden/indra/newview/llpreviewscript.cpp b/linden/indra/newview/llpreviewscript.cpp
index c77f7ff..d8c3aa9 100644
--- a/linden/indra/newview/llpreviewscript.cpp
+++ b/linden/indra/newview/llpreviewscript.cpp
@@ -1097,6 +1097,9 @@ void LLPreviewLSL::callbackLSLCompileFailed(const LLSD& compile_errors)
line < compile_errors.endArray();
line++)
{
+ // Note: OpenSim screws up and sends the wrong values for (row, column).
+ // (As of 2010-09-06: rows start at -1 instead of 0, and columns start at
+ // 1 instead of 0) -- MC
LLSD row;
std::string error_message = line->asString();
LLStringUtil::stripNonprintable(error_message);
--
cgit v1.1
From 1ec02bdd6a6c0f81bdd9bf11dce50baea6a2233f Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sat, 3 Apr 2010 13:49:04 -0700
Subject: Potential fix for a rare crash when creating notecards in the AO
---
linden/indra/llui/lltexteditor.cpp | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/llui/lltexteditor.cpp b/linden/indra/llui/lltexteditor.cpp
index 8123af2..6e5cdc4 100644
--- a/linden/indra/llui/lltexteditor.cpp
+++ b/linden/indra/llui/lltexteditor.cpp
@@ -951,7 +951,14 @@ S32 LLTextEditor::getLineStart( S32 line ) const
S32 segoffset = mLineStartList[line].mOffset;
LLTextSegment* seg = mSegments[segidx];
S32 res = seg->getStart() + segoffset;
- if (res > seg->getEnd()) llerrs << "wtf" << llendl;
+ if (res > seg->getEnd())
+ {
+ //llerrs << "wtf" << llendl;
+ // This happens when creating a new notecard using the AO on certain opensims.
+ // Play it safe instead of bringing down the viewer - MC
+ llwarns << "BAD JOOJOO! Text length (" << res << ") greater than text end (" << seg->getEnd() << "). Setting line start to " << seg->getEnd() << llendl;
+ res = seg->getEnd();
+ }
return res;
}
--
cgit v1.1
From c9ba7baf0230dacbf33601ace7f616c10b5d5967 Mon Sep 17 00:00:00 2001
From: Kakurady (Geneko Nemeth)
Date: Mon, 16 Nov 2009 14:25:07 -0500
Subject: Use solid circles instead of asterisks for password fields.
Regression fix for the 09.04 Experimental
---
linden/indra/llui/lllineeditor.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/llui/lllineeditor.cpp b/linden/indra/llui/lllineeditor.cpp
index 7d91ece..c1d8efa 100644
--- a/linden/indra/llui/lllineeditor.cpp
+++ b/linden/indra/llui/lllineeditor.cpp
@@ -439,7 +439,7 @@ S32 LLLineEditor::calculateCursorFromMouse( S32 local_mouse_x )
{
for (S32 i = 0; i < mText.length(); i++)
{
- asterix_text += '*';
+ asterix_text += (llwchar) 0x2022L;
}
wtext = asterix_text.c_str();
}
@@ -1938,7 +1938,7 @@ void LLLineEditor::draw()
std::string text;
for (S32 i = 0; i < mText.length(); i++)
{
- text += '*';
+ text += "\xe2\x80\xa2";
}
mText = text;
}
--
cgit v1.1
From 43cd306e901c444b997614c8e3d16ef79c3aa044 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Tue, 7 Sep 2010 00:46:37 -0700
Subject: Applied #472: teleport history from Emerald, patch by Ansariel Hiler,
feature originally by Zi Ree
---
linden/indra/newview/CMakeLists.txt | 2 +
linden/indra/newview/app_settings/settings.xml | 18 +-
linden/indra/newview/llagent.cpp | 29 ++
linden/indra/newview/llagent.h | 9 +-
linden/indra/newview/llfloaterteleporthistory.cpp | 348 +++++++++++++++++++++
linden/indra/newview/llfloaterteleporthistory.h | 93 ++++++
linden/indra/newview/llstartup.cpp | 10 +
linden/indra/newview/llviewermenu.cpp | 7 +
linden/indra/newview/llviewermessage.cpp | 11 +
linden/indra/newview/llviewerwindow.cpp | 8 +
.../default/xui/en-us/floater_teleport_history.xml | 46 +++
.../skins/default/xui/en-us/menu_viewer.xml | 4 +
12 files changed, 583 insertions(+), 2 deletions(-)
create mode 100644 linden/indra/newview/llfloaterteleporthistory.cpp
create mode 100644 linden/indra/newview/llfloaterteleporthistory.h
create mode 100644 linden/indra/newview/skins/default/xui/en-us/floater_teleport_history.xml
(limited to 'linden/indra')
diff --git a/linden/indra/newview/CMakeLists.txt b/linden/indra/newview/CMakeLists.txt
index cd4acdc..995ef7e 100644
--- a/linden/indra/newview/CMakeLists.txt
+++ b/linden/indra/newview/CMakeLists.txt
@@ -220,6 +220,7 @@ set(viewer_SOURCE_FILES
llfloatersnapshot.cpp
llfloaterstats.cpp
llfloatertelehub.cpp
+ llfloaterteleporthistory.cpp
llfloatertest.cpp
llfloatertools.cpp
llfloatertopobjects.cpp
@@ -663,6 +664,7 @@ set(viewer_HEADER_FILES
llfloatersnapshot.h
llfloaterstats.h
llfloatertelehub.h
+ llfloaterteleporthistory.h
llfloatertest.h
llfloatertools.h
llfloatertopobjects.h
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index 41ec05d..db44efd 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -5823,7 +5823,23 @@
0
- FloaterViewBottom
+ FloaterTeleportHistoryRect
+
+ Comment
+ Rectangle for teleport history window
+ Persist
+ 1
+ Type
+ Rect
+ Value
+
+ 20
+ 20
+ 470
+ 200
+
+
+ FloaterViewBottom
Comment
[DO NOT MODIFY] Controls layout of floating windows within SL window
diff --git a/linden/indra/newview/llagent.cpp b/linden/indra/newview/llagent.cpp
index 38e1c0f..03d5c65 100644
--- a/linden/indra/newview/llagent.cpp
+++ b/linden/indra/newview/llagent.cpp
@@ -6102,6 +6102,10 @@ void LLAgent::teleportRequest(
const LLVector3& pos_local)
{
LLViewerRegion* regionp = getRegion();
+
+ // Set last region data for teleport history
+ gAgent.setLastRegionData(regionp->getName(),gAgent.getPositionAgent());
+
if(regionp && teleportCore())
{
llinfos << "TeleportRequest: '" << region_handle << "':" << pos_local
@@ -6133,6 +6137,10 @@ void LLAgent::teleportViaLandmark(const LLUUID& landmark_asset_id)
// [/RLVa:KB]
LLViewerRegion *regionp = getRegion();
+
+ // Set last region data for teleport history
+ gAgent.setLastRegionData(regionp->getName(),gAgent.getPositionAgent());
+
if(regionp && teleportCore())
{
LLMessageSystem* msg = gMessageSystem;
@@ -6148,6 +6156,10 @@ void LLAgent::teleportViaLandmark(const LLUUID& landmark_asset_id)
void LLAgent::teleportViaLure(const LLUUID& lure_id, BOOL godlike)
{
LLViewerRegion* regionp = getRegion();
+
+ // Set last region data for teleport history
+ gAgent.setLastRegionData(regionp->getName(),gAgent.getPositionAgent());
+
if(regionp && teleportCore())
{
U32 teleport_flags = 0x0;
@@ -8082,4 +8094,21 @@ void LLAgent::parseTeleportMessages(const std::string& xml_filename)
}//end for (all message sets in xml file)
}
+void LLAgent::setLastRegionData(std::string regionName, LLVector3 agentCoords)
+{
+ mLastRegion = regionName;
+ mLastCoordinates = agentCoords;
+}
+
+std::string LLAgent::getLastRegion()
+{
+ return mLastRegion;
+}
+
+LLVector3 LLAgent::getLastCoords()
+{
+ return mLastCoordinates;
+}
+
+
// EOF
diff --git a/linden/indra/newview/llagent.h b/linden/indra/newview/llagent.h
index 798de8c..3a39448 100644
--- a/linden/indra/newview/llagent.h
+++ b/linden/indra/newview/llagent.h
@@ -177,6 +177,11 @@ public:
void clearRenderState(U8 clearstate);
U8 getRenderState();
+ // get/set last region data
+ std::string getLastRegion();
+ LLVector3 getLastCoords();
+ void setLastRegionData(std::string regionName,LLVector3 agentCoords);
+
// Set the home data
void setRegion(LLViewerRegion *regionp);
LLViewerRegion *getRegion() const;
@@ -915,7 +920,9 @@ private:
BOOL mFirstLogin;
BOOL mGenderChosen;
-
+ std::string mLastRegion;
+ LLVector3 mLastCoordinates;
+
//--------------------------------------------------------------------
// Wearables
//--------------------------------------------------------------------
diff --git a/linden/indra/newview/llfloaterteleporthistory.cpp b/linden/indra/newview/llfloaterteleporthistory.cpp
new file mode 100644
index 0000000..70a2d71
--- /dev/null
+++ b/linden/indra/newview/llfloaterteleporthistory.cpp
@@ -0,0 +1,348 @@
+/**
+ * @file llfloaterteleporthistory.cpp
+ * @author Zi Ree
+ * @brief LLFloaterTeleportHistory class implementation
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2008, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "linden_common.h"
+
+#include "llfloaterteleporthistory.h"
+#include "llfloaterworldmap.h"
+#include "lltimer.h"
+#include "lluictrlfactory.h"
+#include "llurldispatcher.h"
+#include "llurlsimstring.h"
+#include "llviewercontrol.h" // gSavedSettings
+#include "llviewerwindow.h"
+#include "llweb.h"
+
+#include "apr_time.h"
+
+// [RLVa:KB] - Emerald specific
+#include "rlvhandler.h"
+#include "llsdserialize.h"
+// [/RLVa:KB]
+
+// globals
+LLFloaterTeleportHistory* gFloaterTeleportHistory;
+
+LLFloaterTeleportHistory::LLFloaterTeleportHistory()
+: LLFloater(std::string("teleporthistory")),
+ mPlacesInList(NULL),
+ mPlacesOutList(NULL),
+ pItem(NULL),
+ id(0)
+{
+ LLUICtrlFactory::getInstance()->buildFloater(this, "floater_teleport_history.xml", NULL);
+}
+
+// virtual
+LLFloaterTeleportHistory::~LLFloaterTeleportHistory()
+{
+}
+
+// virtual
+void LLFloaterTeleportHistory::onFocusReceived()
+{
+ // take care to enable or disable buttons depending on the selection in the places list
+ if(pItem)
+ {
+ setButtonsEnabled(TRUE);
+ }
+ else
+ {
+ setButtonsEnabled(FALSE);
+ }
+ LLFloater::onFocusReceived();
+}
+
+BOOL LLFloaterTeleportHistory::postBuild()
+{
+ // make sure the cached pointer to the scroll list is valid
+ mPlacesInList=getChild("places_list_in");
+ if(!mPlacesInList)
+ {
+ llwarns << "coud not get pointer to places list in" << llendl;
+ return FALSE;
+ }
+ mPlacesOutList=getChild("places_list_out");
+ if(!mPlacesOutList)
+ {
+ llwarns << "coud not get pointer to places list out" << llendl;
+ return FALSE;
+ }
+
+ // setup callbacks for the scroll list
+ mPlacesInList->setDoubleClickCallback(onTeleport);
+ mPlacesOutList->setDoubleClickCallback(onTeleport);
+ childSetCommitCallback("places_list_in", onInPlacesSelected, this);
+ childSetCommitCallback("places_list_out", onOutPlacesSelected, this);
+ childSetAction("teleport", onTeleport, this);
+ childSetAction("show_on_map", onShowOnMap, this);
+ childSetAction("copy_slurl", onCopySLURL, this);
+ loadEntrys();
+
+ return TRUE;
+}
+void LLFloaterTeleportHistory::saveEntry(LLSD toSave)
+{
+ tpList.append(toSave);
+ std::string filename=getFileName();
+ llofstream file;
+ file.open(filename.c_str());
+ LLSDSerialize::toPrettyXML(tpList, file);
+ file.close();
+}
+
+std::string LLFloaterTeleportHistory::getFileName()
+{
+ std::string path=gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "");
+
+ if (!path.empty())
+ {
+ path = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "teleport_history.xml");
+ }
+ return path;
+}
+void LLFloaterTeleportHistory::loadEntrys()
+{
+ std::string filename=getFileName();
+ if (filename.empty())
+ {
+ llinfos << "no valid user directory." << llendl;
+ return;
+ }
+ llifstream file;
+ file.open(filename.c_str());
+ if (file.is_open())
+ LLSDSerialize::fromXML(tpList, file);
+ file.close();
+
+ for(int i = 0;i<(int)tpList.size();i++)
+ {
+ LLSD data = tpList[i];
+ LLScrollListCtrl* pItemPointer;
+ if(data["out"].asBoolean())
+ pItemPointer=mPlacesOutList;
+ else
+ pItemPointer=mPlacesInList;
+
+ pItemPointer->addElement(data, ADD_TOP);
+ pItemPointer->deselectAllItems(TRUE);
+ setButtonsEnabled(FALSE);
+ id++;
+ }
+}
+void LLFloaterTeleportHistory::addEntry(std::string regionName, S16 x, S16 y, S16 z,bool outList)
+{
+ LLScrollListCtrl* pItemPointer;
+ if(outList)
+ pItemPointer=mPlacesOutList;
+ else
+ pItemPointer=mPlacesInList;
+ // only if the cached scroll list pointer is valid
+ if(pItemPointer)
+ {
+ // prepare display of position
+ std::string position=llformat("%d, %d, %d", x, y, z);
+ // prepare simstring for later parsing
+ std::string simString = regionName + llformat("/%d/%d/%d", x, y, z);
+ simString = LLWeb::escapeURL(simString);
+
+ // check if we are in daylight savings time
+ std::string timeZone = "PST";
+ if(is_daylight_savings()) timeZone = "PDT";
+
+ // do all time related stuff as closely together as possible, because every other operation
+ // might change the internal tm* buffer
+ struct tm* internal_time;
+ internal_time = utc_to_pacific_time(time_corrected(), is_daylight_savings());
+ std::string timeString=llformat("%02d/%02d/%04d - %02d:%02d:%02d ",internal_time->tm_mon+1,internal_time->tm_mday,internal_time->tm_year+1900,internal_time->tm_hour, internal_time->tm_min, internal_time->tm_sec)+timeZone;
+
+ // build the list entry
+ LLSD value;
+ value["id"] = id;
+ value["columns"][0]["column"] = "region";
+ value["columns"][0]["value"] = regionName;
+ value["columns"][1]["column"] = "position";
+ value["columns"][1]["value"] = position;
+ value["columns"][2]["column"] = "visited";
+ value["columns"][2]["value"] = timeString;
+
+ // these columns are hidden and serve as data storage for simstring and SLURL
+ value["columns"][3]["column"] = "slurl";
+ value["columns"][3]["value"] = LLURLDispatcher::buildSLURL(regionName, x, y, z);
+ value["columns"][4]["column"] = "simstring";
+ value["columns"][4]["value"] = simString;
+ value["out"]=outList;
+
+// [RLVa:KB] - Alternate: Emerald-370
+ if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
+ {
+ // TODO: This is the original code from Emerald. It
+ // uses the class RlvStrings, defined in rlvcommon.cpp
+ // to load localized strings. For Imprudence we use the
+ // old fashioned way via RlvHandler with English
+ // strings only!
+ // value["columns"][0]["value"] = RlvStrings::getString(RLV_STRING_HIDDEN_REGION);
+ // value["columns"][1]["value"] = RlvStrings::getString(RLV_STRING_HIDDEN);
+ // value["columns"][3]["value"] = RlvStrings::getString(RLV_STRING_HIDDEN);
+ // value["columns"][4]["value"] = RlvStrings::getString(RLV_STRING_HIDDEN);
+
+ value["columns"][0]["value"] = RlvHandler::cstrHiddenRegion;
+ value["columns"][1]["value"] = RlvHandler::cstrHidden;
+ value["columns"][3]["value"] = RlvHandler::cstrHidden;
+ value["columns"][4]["value"] = RlvHandler::cstrHidden;
+ }
+// [/RLVa:KB]
+ saveEntry(value);
+ // add the new list entry on top of the list, deselect all and disable the buttons
+ pItemPointer->addElement(value, ADD_TOP);
+ pItemPointer->deselectAllItems(TRUE);
+ setButtonsEnabled(FALSE);
+ id++;
+ }
+ else
+ {
+ llwarns << "pointer to places list is NULL" << llendl;
+ }
+}
+
+void LLFloaterTeleportHistory::setButtonsEnabled(BOOL on)
+{
+// [RLVa:KB] - Alternate: Emerald-370
+ if (rlv_handler_t::isEnabled())
+ {
+ // TODO: This is the original code from Emerald. It
+ // uses the class RlvStrings, defined in rlvcommon.cpp
+ // to load localized strings. For Imprudence we use the
+ // old fashioned way via RlvHandler with English
+ // strings only!
+ //if ( (pItem) && (pItem->getColumn(4)) && (RlvStrings::getString(RLV_STRING_HIDDEN) == pItem->getColumn(4)->getValue().asString()) )
+ if ( (pItem) && (pItem->getColumn(4)) && (RlvHandler::cstrHidden == pItem->getColumn(4)->getValue().asString()) )
+ {
+ on = FALSE;
+ }
+ }
+// [/RLVa:K]
+
+ // enable or disable buttons
+ childSetEnabled("teleport", on);
+ childSetEnabled("show_on_map", on);
+ childSetEnabled("copy_slurl", on);
+}
+
+// virtual
+void LLFloaterTeleportHistory::onClose(bool app_quitting)
+{
+ LLFloater::setVisible(FALSE);
+}
+
+// virtual
+BOOL LLFloaterTeleportHistory::canClose()
+{
+ return !LLApp::isExiting();
+}
+
+// callbacks
+
+// static
+void LLFloaterTeleportHistory::onInPlacesSelected(LLUICtrl* /* ctrl */, void* data)
+{
+ LLFloaterTeleportHistory* self = (LLFloaterTeleportHistory*) data;
+ self->mPlacesOutList->deselectAllItems();
+ self->pItem = self->mPlacesInList->getFirstSelected();
+ // on selection change check if we need to enable or disable buttons
+ if(self->pItem)
+ {
+ self->setButtonsEnabled(TRUE);
+ }
+ else
+ {
+ self->setButtonsEnabled(FALSE);
+ }
+}
+
+// static
+void LLFloaterTeleportHistory::onOutPlacesSelected(LLUICtrl* /* ctrl */, void* data)
+{
+ LLFloaterTeleportHistory* self = (LLFloaterTeleportHistory*) data;
+ self->mPlacesInList->deselectAllItems();
+ self->pItem = self->mPlacesOutList->getFirstSelected();
+ // on selection change check if we need to enable or disable buttons
+ if(self->pItem)
+ {
+ self->setButtonsEnabled(TRUE);
+ }
+ else
+ {
+ self->setButtonsEnabled(FALSE);
+ }
+}
+
+// static
+void LLFloaterTeleportHistory::onTeleport(void* data)
+{
+ LLFloaterTeleportHistory* self = (LLFloaterTeleportHistory*) data;
+
+ // build secondlife::/app link from simstring for instant teleport to destination
+ std::string slapp="secondlife:///app/teleport/" + self->pItem->getColumn(4)->getValue().asString();
+ LLURLDispatcher::dispatch(slapp, NULL, true);
+}
+
+// static
+void LLFloaterTeleportHistory::onShowOnMap(void* data)
+{
+ LLFloaterTeleportHistory* self = (LLFloaterTeleportHistory*) data;
+
+ // get simstring from selected entry and parse it for its components
+ std::string simString = self->pItem->getColumn(4)->getValue().asString();
+ std::string region = "";
+ S32 x = 128;
+ S32 y = 128;
+ S32 z = 20;
+
+ LLURLSimString::parse(simString, ®ion, &x, &y, &z);
+
+ // point world map at position
+ gFloaterWorldMap->trackURL(region, x, y, z);
+ LLFloaterWorldMap::show(NULL, TRUE);
+}
+
+// static
+void LLFloaterTeleportHistory::onCopySLURL(void* data)
+{
+ LLFloaterTeleportHistory* self = (LLFloaterTeleportHistory*) data;
+
+ // get SLURL of the selected entry and copy it to the clipboard
+ std::string SLURL=self->pItem->getColumn(3)->getValue().asString();
+ gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(SLURL));
+}
diff --git a/linden/indra/newview/llfloaterteleporthistory.h b/linden/indra/newview/llfloaterteleporthistory.h
new file mode 100644
index 0000000..e458259
--- /dev/null
+++ b/linden/indra/newview/llfloaterteleporthistory.h
@@ -0,0 +1,93 @@
+/**
+ * @file llfloaterteleporthistory.h
+ * @author Zi Ree
+ * @brief LLFloaterTeleportHistory class definition
+ *
+ * This class implements a floater where all visited teleport locations are
+ * stored, so the resident can quickly see where they have been and go back
+ * by selecting the location from the list.
+ *
+ * $LicenseInfo:firstyear=2007&license=viewergpl$
+ *
+ * Copyright (c) 2008, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERTELEPORTHISTORY_H
+#define LL_LLFLOATERTELEPORTHISTORY_H
+
+#include "linden_common.h"
+
+#include "lldefs.h"
+#include "llfloater.h"
+#include "llscrolllistctrl.h"
+
+class LLFloaterTeleportHistory : public LLFloater
+{
+ public:
+ LLFloaterTeleportHistory();
+ virtual ~LLFloaterTeleportHistory();
+
+ /// @brief: reimplemented to check for selection changes in the places list scrolllist
+ virtual void onFocusReceived();
+
+ /// @brief: reimplemented to make the menu toggle work
+ virtual void onClose(bool app_quitting);
+
+ /// @brief: reimplemented to prevent this floater from closing while the viewer is shutting down
+ virtual BOOL canClose();
+
+ BOOL postBuild();
+
+ /// @brief: adds a teleport destination to the list of visited places
+ void addEntry(std::string regionName, S16 x, S16 y, S16 z,bool outList);
+
+ protected:
+ static void onInPlacesSelected(LLUICtrl* ctrl, void* data);
+ static void onOutPlacesSelected(LLUICtrl* ctrl, void* data);
+ static void onTeleport(void* data);
+ static void onShowOnMap(void* data);
+ static void onCopySLURL(void* data);
+
+ /// @brief: enables or disables the "Teleport", "Show On Map" and "Copy To SLURL" buttons **/
+ void setButtonsEnabled(BOOL on);
+
+ void loadEntrys();
+ void saveEntry(LLSD toSave);
+ std::string getFileName();
+
+ LLScrollListCtrl* mPlacesInList;
+ LLScrollListCtrl* mPlacesOutList;
+ LLScrollListItem* pItem;
+ S32 id;
+
+ /// @brief: to see if this was the first time setVisible() was called (at program startup)
+ BOOL firstRun;
+ LLSD tpList;
+};
+
+// globals
+extern LLFloaterTeleportHistory* gFloaterTeleportHistory;
+
+#endif
diff --git a/linden/indra/newview/llstartup.cpp b/linden/indra/newview/llstartup.cpp
index b76c5be..6622740 100644
--- a/linden/indra/newview/llstartup.cpp
+++ b/linden/indra/newview/llstartup.cpp
@@ -191,6 +191,8 @@
#include "jcfloater_animation_list.h"
#include "jcfloaterareasearch.h"
+#include "llfloaterteleporthistory.h"
+
#if LL_LIBXUL_ENABLED
#include "llmozlib.h"
#endif // LL_LIBXUL_ENABLED
@@ -2730,6 +2732,14 @@ bool idle_startup()
LLFirstUse::ClientTags();
+ // Add login location to teleport history 'teleported-into'
+ LLVector3 agent_pos=gAgent.getPositionAgent();
+ LLViewerRegion* regionp = gAgent.getRegion();
+ if (gFloaterTeleportHistory)
+ {
+ gFloaterTeleportHistory->addEntry(regionp->getName(),(S16)agent_pos.mV[0],(S16)agent_pos.mV[1],(S16)agent_pos.mV[2],false);
+ }
+
// Let the map know about the inventory.
if(gFloaterWorldMap)
{
diff --git a/linden/indra/newview/llviewermenu.cpp b/linden/indra/newview/llviewermenu.cpp
index 13d7209..e37f33e 100644
--- a/linden/indra/newview/llviewermenu.cpp
+++ b/linden/indra/newview/llviewermenu.cpp
@@ -229,6 +229,8 @@
#include "hippoGridManager.h"
#include "hippoLimits.h"
+#include "llfloaterteleporthistory.h"
+
using namespace LLVOAvatarDefines;
void init_client_menu(LLMenuGL* menu);
void init_server_menu(LLMenuGL* menu);
@@ -5912,6 +5914,11 @@ class LLShowFloater : public view_listener_t
{
LLFloaterChat::toggleInstance(LLSD());
}
+ else if (floater_name == "teleport history")
+ {
+ gFloaterTeleportHistory->setVisible(!gFloaterTeleportHistory->getVisible());
+ gFloaterTeleportHistory->setFocus(TRUE);
+ }
else if (floater_name == "im")
{
LLFloaterChatterBox::toggleInstance(LLSD());
diff --git a/linden/indra/newview/llviewermessage.cpp b/linden/indra/newview/llviewermessage.cpp
index 4cf9c87..56aed12 100755
--- a/linden/indra/newview/llviewermessage.cpp
+++ b/linden/indra/newview/llviewermessage.cpp
@@ -88,6 +88,7 @@
#include "llfloatermute.h"
#include "llfloaterpostcard.h"
#include "llfloaterpreference.h"
+#include "llfloaterteleporthistory.h"
#include "llfollowcam.h"
#include "llgroupnotify.h"
#include "llhudeffect.h"
@@ -3561,6 +3562,16 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
avatarp->clearChat();
avatarp->slamPosition();
}
+
+ // add teleport destination to the list of visited places
+ gFloaterTeleportHistory->addEntry(regionp->getName(),(S16)agent_pos.mV[0],(S16)agent_pos.mV[1],(S16)agent_pos.mV[2],false);
+ std::string lastRegion = gAgent.getLastRegion();
+ if(lastRegion != regionp->getName())
+ {
+ LLVector3 lastCoords = gAgent.getLastCoords();
+ gFloaterTeleportHistory->addEntry(lastRegion,(S16)lastCoords.mV[0],(S16)lastCoords.mV[1],(S16)lastCoords.mV[2],true);
+ }
+
}
else
{
diff --git a/linden/indra/newview/llviewerwindow.cpp b/linden/indra/newview/llviewerwindow.cpp
index c89e0c5..eb8977c 100644
--- a/linden/indra/newview/llviewerwindow.cpp
+++ b/linden/indra/newview/llviewerwindow.cpp
@@ -103,6 +103,7 @@
#include "llfloaternamedesc.h"
#include "llfloaterpreference.h"
#include "llfloatersnapshot.h"
+#include "llfloaterteleporthistory.h"
#include "llfloatertools.h"
#include "llfloaterworldmap.h"
#include "llfocusmgr.h"
@@ -1688,6 +1689,13 @@ void LLViewerWindow::initWorldUI()
gFloaterWorldMap->setVisible(FALSE);
}
+ if (!gFloaterTeleportHistory)
+ {
+ // open teleport history floater and hide it initially
+ gFloaterTeleportHistory = new LLFloaterTeleportHistory();
+ gFloaterTeleportHistory->setVisible(FALSE);
+ }
+
//
// Tools for building
//
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_teleport_history.xml b/linden/indra/newview/skins/default/xui/en-us/floater_teleport_history.xml
new file mode 100644
index 0000000..db36df5
--- /dev/null
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_teleport_history.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml b/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
index d15657e..0522981 100644
--- a/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
@@ -343,6 +343,10 @@
+
+
+
+
--
cgit v1.1
From 65429a862a1a183c099790e6c28ce0374da8c60b Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Tue, 7 Sep 2010 19:35:00 +0200
Subject: Fixed local textures on mac
---
linden/indra/newview/floaterlocalassetbrowse.cpp | 29 +++++++++++++++++++-----
1 file changed, 23 insertions(+), 6 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/floaterlocalassetbrowse.cpp b/linden/indra/newview/floaterlocalassetbrowse.cpp
index 0ff24ca..0d94e5b 100644
--- a/linden/indra/newview/floaterlocalassetbrowse.cpp
+++ b/linden/indra/newview/floaterlocalassetbrowse.cpp
@@ -122,11 +122,21 @@ LocalBitmap::LocalBitmap(std::string fullpath)
else if (temp_exten == "jpg" || temp_exten == "jpeg") { this->extension = IMG_EXTEN_JPG; }
else if (temp_exten == "png") { this->extension = IMG_EXTEN_PNG; }
else { return; } // no valid extension.
-
+
/* getting file's last modified */
- const std::time_t time = boost::filesystem::last_write_time( boost::filesystem::path( this->filename ) );
+
+ std::time_t time;
+
+#ifdef LL_DARWIN
+ struct stat temp_stat;
+ stat(fullpath.c_str(), &temp_stat);
+ time = temp_stat.st_mtime;
+#else
+ time = boost::filesystem::last_write_time( boost::filesystem::path( this->filename ) );
+#endif
+
this->last_modified = asctime( localtime(&time) );
-
+
/* checking if the bitmap is valid && decoding if it is */
LLImageRaw* raw_image = new LLImageRaw();
if ( this->decodeSelf(raw_image) )
@@ -161,7 +171,14 @@ void LocalBitmap::updateSelf()
if ( !gDirUtilp->fileExists(this->filename) ) { this->linkstatus = LINK_BROKEN; return; }
/* exists, let's check if it's lastmod has changed */
- const std::time_t temp_time = boost::filesystem::last_write_time( boost::filesystem::path( this->filename ) );
+ std::time_t temp_time;
+#ifdef LL_DARWIN
+ struct stat temp_stat;
+ stat(this->filename.c_str(), &temp_stat);
+ temp_time = temp_stat.st_mtime;
+#else
+ temp_time = boost::filesystem::last_write_time( boost::filesystem::path( this->filename ) );
+#endif
LLSD new_last_modified = asctime( localtime(&temp_time) );
if ( this->last_modified.asString() == new_last_modified.asString() ) { return; }
@@ -463,11 +480,11 @@ void LocalAssetBrowser::AddBitmap()
LocalBitmap* unit = new LocalBitmap( filename );
if ( unit->getIfValidBool() )
- {
+ {
loaded_bitmaps.push_back( unit );
change_happened = true;
}
-
+
filename = picker.getNextFile();
}
--
cgit v1.1
From 8d1c6e5634262b728c2f1662bbd8a9170b172854 Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Tue, 7 Sep 2010 22:34:40 +0200
Subject: Made the texture fix cross platform and removed boost::filesystem dep
for loaterlocalassetbrowse.cpp
---
linden/indra/newview/floaterlocalassetbrowse.cpp | 31 ++++++------------------
1 file changed, 8 insertions(+), 23 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/floaterlocalassetbrowse.cpp b/linden/indra/newview/floaterlocalassetbrowse.cpp
index 0d94e5b..c63fd2d 100644
--- a/linden/indra/newview/floaterlocalassetbrowse.cpp
+++ b/linden/indra/newview/floaterlocalassetbrowse.cpp
@@ -40,12 +40,6 @@ this feature is still a work in progress.
#include "llviewerprecompiledheaders.h"
#include "lluictrlfactory.h"
-/* boost madness from hell */
-#ifdef equivalent
- #undef equivalent
-#endif
-#include
-
/* own class header && upload floater header */
#include "floaterlocalassetbrowse.h"
//#include "floaterlocaluploader.h" <- in development.
@@ -65,6 +59,7 @@ this feature is still a work in progress.
#include "llfilepicker.h"
#include "llviewermenufile.h"
#include "llfloaterimagepreview.h"
+#include "llfile.h"
/* repeated in header */
#include "lltexturectrl.h"
@@ -125,15 +120,9 @@ LocalBitmap::LocalBitmap(std::string fullpath)
/* getting file's last modified */
- std::time_t time;
-
-#ifdef LL_DARWIN
- struct stat temp_stat;
- stat(fullpath.c_str(), &temp_stat);
- time = temp_stat.st_mtime;
-#else
- time = boost::filesystem::last_write_time( boost::filesystem::path( this->filename ) );
-#endif
+ llstat temp_stat;
+ LLFile::stat(this->filename, &temp_stat);
+ std::time_t time = temp_stat.st_mtime;
this->last_modified = asctime( localtime(&time) );
@@ -171,14 +160,10 @@ void LocalBitmap::updateSelf()
if ( !gDirUtilp->fileExists(this->filename) ) { this->linkstatus = LINK_BROKEN; return; }
/* exists, let's check if it's lastmod has changed */
- std::time_t temp_time;
-#ifdef LL_DARWIN
- struct stat temp_stat;
- stat(this->filename.c_str(), &temp_stat);
- temp_time = temp_stat.st_mtime;
-#else
- temp_time = boost::filesystem::last_write_time( boost::filesystem::path( this->filename ) );
-#endif
+ llstat temp_stat;
+ LLFile::stat(this->filename, &temp_stat);
+ std::time_t temp_time = temp_stat.st_mtime;
+
LLSD new_last_modified = asctime( localtime(&temp_time) );
if ( this->last_modified.asString() == new_last_modified.asString() ) { return; }
--
cgit v1.1
From 051a9d47d2c32ee5852f6d22af4d19dddd13a978 Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Wed, 8 Sep 2010 01:55:28 +0200
Subject: Initial hacky release of colors in chat highlighting friend chat and
when your name is typed
---
linden/indra/newview/llfloaterchat.cpp | 42 +++++++++++++++++++++++++++-------
1 file changed, 34 insertions(+), 8 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llfloaterchat.cpp b/linden/indra/newview/llfloaterchat.cpp
index f7ff3f9..c89bc86 100644
--- a/linden/indra/newview/llfloaterchat.cpp
+++ b/linden/indra/newview/llfloaterchat.cpp
@@ -76,6 +76,7 @@
#include "llfloaterhtml.h"
#include "llweb.h"
#include "llstylemap.h"
+#include "llviewermenu.h"
// Used for LCD display
extern void AddNewIMToLCD(const std::string &newLine);
@@ -551,19 +552,44 @@ LLColor4 get_text_color(const LLChat& chat)
text_color = gSavedSettings.getColor4("SystemChatColor");
break;
case CHAT_SOURCE_AGENT:
- if (chat.mFromID.isNull())
{
- text_color = gSavedSettings.getColor4("SystemChatColor");
- }
- else
- {
- if(gAgent.getID() == chat.mFromID)
+ if (chat.mFromID.isNull())
{
- text_color = gSavedSettings.getColor4("UserChatColor");
+ text_color = gSavedSettings.getColor4("SystemChatColor");
}
else
{
- text_color = gSavedSettings.getColor4("AgentChatColor");
+ if(gAgent.getID() == chat.mFromID)
+ {
+ text_color = gSavedSettings.getColor4("UserChatColor");
+ }
+ else
+ {
+ std::string my_name = gSavedSettings.getString("FirstName");
+ std::transform(my_name.begin(), my_name.end(), my_name.begin(), tolower);
+
+ std::string lower_chat = std::string(chat.mText);
+ std::transform(lower_chat.begin(), lower_chat.end(), lower_chat.begin(), tolower);
+
+ std::string blank = " ";
+
+ // yes yes, this sucks, will move to a nicer regexp as soon as i have time to make it lol
+ if (lower_chat.find(my_name + blank) == 0 || // at the beginning of the text
+ (lower_chat.find(my_name) == 0 && lower_chat.length() == my_name.length()) || // only my name in the text
+ lower_chat.find(blank + my_name + blank) != std::string::npos || // my name in the middle of the text
+ lower_chat.rfind(blank + my_name) == lower_chat.length() - (blank + my_name).length()) // my name at the end of the text
+ {
+ text_color = LLColor4::purple;
+ }
+ else if (is_agent_friend(chat.mFromID))
+ {
+ text_color = LLColor4::yellow;
+ }
+ else
+ {
+ text_color = gSavedSettings.getColor4("AgentChatColor");
+ }
+ }
}
}
break;
--
cgit v1.1
From 4a854938e1edaafcfd232a965fbb7995584a487c Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Wed, 8 Sep 2010 05:03:56 +0200
Subject: Added a Extra tab in adv. preferences to enable/disable chat colors
and to select the colors
---
linden/indra/newview/app_settings/settings.xml | 54 ++++++++++++++++++++++
linden/indra/newview/llfloaterchat.cpp | 44 ++++++++++--------
linden/indra/newview/llprefsadvanced.cpp | 10 ++++
.../xui/en-us/panel_preferences_advanced.xml | 24 ++++++++++
4 files changed, 112 insertions(+), 20 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index db44efd..6d07ece 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -4,6 +4,60 @@
+ HighlightFriendsChat
+
+ Comment
+ Show chat messages from friends in a different color
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 1
+
+ FriendsChatColor
+
+ Comment
+ Color of chat messages from friends
+ Persist
+ 1
+ Type
+ Color4
+ Value
+
+ 0.699999988079
+ 0.899999976158
+ 0.699999988079
+ 1
+
+
+ HighlightOwnNameInChat
+
+ Comment
+ Show chat messages containing your name in a different color
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 1
+
+ OwnNameChatColor
+
+ Comment
+ Color of chat messages from friends
+ Persist
+ 1
+ Type
+ Color4
+ Value
+
+ 0.8
+ 1.0
+ 0.8
+ 1
+
+
AllowMUpose
Comment
diff --git a/linden/indra/newview/llfloaterchat.cpp b/linden/indra/newview/llfloaterchat.cpp
index c89bc86..a38684a 100644
--- a/linden/indra/newview/llfloaterchat.cpp
+++ b/linden/indra/newview/llfloaterchat.cpp
@@ -565,30 +565,34 @@ LLColor4 get_text_color(const LLChat& chat)
}
else
{
- std::string my_name = gSavedSettings.getString("FirstName");
- std::transform(my_name.begin(), my_name.end(), my_name.begin(), tolower);
-
- std::string lower_chat = std::string(chat.mText);
- std::transform(lower_chat.begin(), lower_chat.end(), lower_chat.begin(), tolower);
-
- std::string blank = " ";
-
- // yes yes, this sucks, will move to a nicer regexp as soon as i have time to make it lol
- if (lower_chat.find(my_name + blank) == 0 || // at the beginning of the text
- (lower_chat.find(my_name) == 0 && lower_chat.length() == my_name.length()) || // only my name in the text
- lower_chat.find(blank + my_name + blank) != std::string::npos || // my name in the middle of the text
- lower_chat.rfind(blank + my_name) == lower_chat.length() - (blank + my_name).length()) // my name at the end of the text
+ if (gSavedSettings.getBOOL("HighlightOwnNameInChat"))
{
- text_color = LLColor4::purple;
+ std::string my_name = gSavedSettings.getString("FirstName");
+ std::transform(my_name.begin(), my_name.end(), my_name.begin(), tolower);
+
+ std::string lower_chat = std::string(chat.mText);
+ std::transform(lower_chat.begin(), lower_chat.end(), lower_chat.begin(), tolower);
+
+ std::string blank = " ";
+
+ // yes yes, this sucks, will move to a nicer regexp as soon as i have time to make it lol
+ if (lower_chat.find(my_name + blank) == 0 || // at the beginning of the text
+ (lower_chat.find(my_name) == 0 && lower_chat.length() == my_name.length()) || // only my name in the text
+ lower_chat.find(blank + my_name + blank) != std::string::npos || // my name in the middle of the text
+ lower_chat.rfind(blank + my_name) == lower_chat.length() - (blank + my_name).length()) // my name at the end of the text
+ {
+ text_color = gSavedSettings.getColor4("OwnNameChatColor");
+ break;
+ }
}
- else if (is_agent_friend(chat.mFromID))
- {
- text_color = LLColor4::yellow;
- }
- else
+
+ if (gSavedSettings.getBOOL("HighlightFriendsChat") && is_agent_friend(chat.mFromID))
{
- text_color = gSavedSettings.getColor4("AgentChatColor");
+ text_color = gSavedSettings.getColor4("FriendsChatColor");
+ break;
}
+
+ text_color = gSavedSettings.getColor4("AgentChatColor");
}
}
}
diff --git a/linden/indra/newview/llprefsadvanced.cpp b/linden/indra/newview/llprefsadvanced.cpp
index de39e01..695e604 100644
--- a/linden/indra/newview/llprefsadvanced.cpp
+++ b/linden/indra/newview/llprefsadvanced.cpp
@@ -41,6 +41,7 @@
#include "lgghunspell_wrapper.h"
#include "lggautocorrectfloater.h"
#include "llcombobox.h"
+#include "llcolorswatch.h"
#include "lluictrlfactory.h"
@@ -111,6 +112,11 @@ BOOL LLPrefsAdvanced::postBuild()
initHelpBtn("EmeraldHelp_SpellCheck", "EmeraldHelp_SpellCheck");
+ childSetValue("HighlightFriendsChat", gSavedSettings.getBOOL("HighlightFriendsChat"));
+ getChild("FriendsChatColor")->set(gSavedSettings.getColor4("FriendsChatColor"));
+ childSetValue("HighlightOwnNameInChat", gSavedSettings.getBOOL("HighlightOwnNameInChat"));
+ getChild("OwnNameChatColor")->set(gSavedSettings.getColor4("OwnNameChatColor"));
+
refresh();
return TRUE;
@@ -133,6 +139,10 @@ void LLPrefsAdvanced::apply()
gSavedSettings.setU32("LightShareAllowed",
(U32)childGetValue("lightshare_combo").asInteger());
+ gSavedSettings.setBOOL("HighlightFriendsChat", childGetValue("HighlightFriendsChat"));
+ gSavedSettings.setColor4("FriendsChatColor", getChild("FriendsChatColor")->get());
+ gSavedSettings.setBOOL("HighlightOwnNameInChat", childGetValue("HighlightOwnNameInChat"));
+ gSavedSettings.setColor4("OwnNameChatColor", getChild("OwnNameChatColor")->get());
// Need to force a rebake when ClothingLayerProtection toggled for it take effect -- MC
if (gSavedSettings.getBOOL("ShowMyClientTagToOthers") != (BOOL)childGetValue("client_name_tag_broadcast_check"))
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
index 857d1f1..65d118d 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
@@ -172,5 +172,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
--
cgit v1.1
From af338294a706e88ddad4eb0924781c2fe68e0713 Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Thu, 9 Sep 2010 18:48:15 +0200
Subject: Fixed chat colors and added group im colors
---
linden/indra/llwindow/llwindowmacosx-objc.h | 1 -
linden/indra/llwindow/llwindowmacosx-objc.mm | 1 -
linden/indra/llwindow/llwindowmacosx.cpp | 1 -
linden/indra/newview/app_settings/settings.xml | 11 +++
linden/indra/newview/llfloaterchat.cpp | 91 +++++++++++++++-------
linden/indra/newview/llfloaterchat.h | 2 +
linden/indra/newview/llimview.cpp | 38 ++++++++-
linden/indra/newview/llprefsadvanced.cpp | 2 +
.../xui/en-us/panel_preferences_advanced.xml | 6 +-
9 files changed, 117 insertions(+), 36 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/llwindow/llwindowmacosx-objc.h b/linden/indra/llwindow/llwindowmacosx-objc.h
index ed5d7b1..14cddaa 100644
--- a/linden/indra/llwindow/llwindowmacosx-objc.h
+++ b/linden/indra/llwindow/llwindowmacosx-objc.h
@@ -40,4 +40,3 @@ void setupCocoa();
CursorRef createImageCursor(const char *fullpath, int hotspotX, int hotspotY);
OSErr releaseImageCursor(CursorRef ref);
OSErr setImageCursor(CursorRef ref);
-
diff --git a/linden/indra/llwindow/llwindowmacosx-objc.mm b/linden/indra/llwindow/llwindowmacosx-objc.mm
index da01c2a..bc47164 100644
--- a/linden/indra/llwindow/llwindowmacosx-objc.mm
+++ b/linden/indra/llwindow/llwindowmacosx-objc.mm
@@ -116,4 +116,3 @@ OSErr setImageCursor(CursorRef ref)
return noErr;
}
-
diff --git a/linden/indra/llwindow/llwindowmacosx.cpp b/linden/indra/llwindow/llwindowmacosx.cpp
index 613d147..7e7e0af 100644
--- a/linden/indra/llwindow/llwindowmacosx.cpp
+++ b/linden/indra/llwindow/llwindowmacosx.cpp
@@ -3194,7 +3194,6 @@ void LLWindowMacOSX::spawnWebBrowser(const std::string& escaped_url)
}
}
-
BOOL LLWindowMacOSX::dialog_color_picker ( F32 *r, F32 *g, F32 *b)
{
BOOL retval = FALSE;
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index 6d07ece..6b1c707 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -4,6 +4,17 @@
+ HighlightOwnNameInIM
+
+ Comment
+ Show GroupIM messages containing your name in a different color
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 1
+
HighlightFriendsChat
Comment
diff --git a/linden/indra/newview/llfloaterchat.cpp b/linden/indra/newview/llfloaterchat.cpp
index a38684a..d7465fa 100644
--- a/linden/indra/newview/llfloaterchat.cpp
+++ b/linden/indra/newview/llfloaterchat.cpp
@@ -78,6 +78,8 @@
#include "llstylemap.h"
#include "llviewermenu.h"
+#include "regex.h"
+
// Used for LCD display
extern void AddNewIMToLCD(const std::string &newLine);
extern void AddNewChatToLCD(const std::string &newLine);
@@ -383,7 +385,6 @@ void LLFloaterChat::setHistoryCursorAndScrollToEnd()
}
}
-
//static
void LLFloaterChat::onClickMute(void *data)
{
@@ -452,6 +453,65 @@ void LLFloaterChat::updateSettings()
LLFloaterChat::getInstance(LLSD())->getChild("translate chat")->set(translate_chat);
}
+BOOL LLFloaterChat::isOwnNameInText(const std::string &text_line)
+{
+ std::string my_name = gSavedSettings.getString("FirstName");
+
+ std::transform(my_name.begin(), my_name.end(), my_name.begin(), tolower);
+
+ std::string lower_chat = std::string(text_line);
+ std::transform(lower_chat.begin(), lower_chat.end(), lower_chat.begin(), tolower);
+
+ std::string blank = " ";
+
+ // yes yes, this sucks, will move to a nicer regexp as soon as i have time to make it lol
+ if (lower_chat.find(my_name + blank) == 0 || // at the beginning of the text
+ (lower_chat.find(my_name) == 0 && lower_chat.length() == my_name.length()) || // only my name in the text
+ lower_chat.find(blank + my_name + blank) != std::string::npos || // my name in the middle of the text
+ lower_chat.rfind(blank + my_name) == lower_chat.length() - (blank + my_name).length()) // my name at the end of the text
+ {
+ return TRUE;
+ }
+
+/*
+ regex_t compiled;
+ // ^.*([\.\?!:;\*\(\s]+)(elektra)([,\.\?!:;\*\)\s$]+).* <--- this works :)
+ std::string pre_pattern = "^.*([\\.\\?!:;\\*\\(\\s]+)(";
+ std::string post_pattern = ")([,\\.\\?!:;\\*\\)\\s$]+).*";
+ std::string pattern_s = pre_pattern + my_name + post_pattern;
+ regcomp(&compiled, pattern_s.c_str(), REG_ICASE);
+
+ if (regexec(&compiled, text_line.c_str(), 0, NULL, 0) == 0)
+ return TRUE;
+*/
+ return FALSE;
+}
+
+LLColor4 get_extended_text_color(const LLChat& chat, LLColor4 defaultColor)
+{
+ if (gSavedSettings.getBOOL("HighlightOwnNameInChat"))
+ {
+ std::string new_line = std::string(chat.mText);
+ int name_pos = new_line.find(chat.mFromName);
+ if (name_pos == 0)
+ {
+ new_line = new_line.substr(chat.mFromName.length());
+ if (new_line.find(": ") == 0)
+ new_line = new_line.substr(2);
+ else
+ new_line = new_line.substr(1);
+ }
+
+ if (LLFloaterChat::isOwnNameInText(new_line))
+ return gSavedSettings.getColor4("OwnNameChatColor");
+ }
+
+ if (gSavedSettings.getBOOL("HighlightFriendsChat") && is_agent_friend(chat.mFromID))
+ return gSavedSettings.getColor4("FriendsChatColor");
+
+ return defaultColor;
+}
+
// Put a line of chat in all the right places
void LLFloaterChat::addChat(const LLChat& chat,
BOOL from_instant_message,
@@ -565,34 +625,7 @@ LLColor4 get_text_color(const LLChat& chat)
}
else
{
- if (gSavedSettings.getBOOL("HighlightOwnNameInChat"))
- {
- std::string my_name = gSavedSettings.getString("FirstName");
- std::transform(my_name.begin(), my_name.end(), my_name.begin(), tolower);
-
- std::string lower_chat = std::string(chat.mText);
- std::transform(lower_chat.begin(), lower_chat.end(), lower_chat.begin(), tolower);
-
- std::string blank = " ";
-
- // yes yes, this sucks, will move to a nicer regexp as soon as i have time to make it lol
- if (lower_chat.find(my_name + blank) == 0 || // at the beginning of the text
- (lower_chat.find(my_name) == 0 && lower_chat.length() == my_name.length()) || // only my name in the text
- lower_chat.find(blank + my_name + blank) != std::string::npos || // my name in the middle of the text
- lower_chat.rfind(blank + my_name) == lower_chat.length() - (blank + my_name).length()) // my name at the end of the text
- {
- text_color = gSavedSettings.getColor4("OwnNameChatColor");
- break;
- }
- }
-
- if (gSavedSettings.getBOOL("HighlightFriendsChat") && is_agent_friend(chat.mFromID))
- {
- text_color = gSavedSettings.getColor4("FriendsChatColor");
- break;
- }
-
- text_color = gSavedSettings.getColor4("AgentChatColor");
+ text_color = get_extended_text_color(chat, gSavedSettings.getColor4("AgentChatColor"));
}
}
}
diff --git a/linden/indra/newview/llfloaterchat.h b/linden/indra/newview/llfloaterchat.h
index f894675..5a26567 100644
--- a/linden/indra/newview/llfloaterchat.h
+++ b/linden/indra/newview/llfloaterchat.h
@@ -40,6 +40,7 @@
#include "llfloater.h"
#include "lllogchat.h"
+
class LLButton;
class LLChat;
class LLComboBox;
@@ -72,6 +73,7 @@ public:
// Add chat to console and history list.
// Color based on source, type, distance.
static void addChat(const LLChat& chat, BOOL from_im = FALSE, BOOL local_agent = FALSE);
+ static BOOL isOwnNameInText(const std::string &text_line);
// Add chat to history alone.
static void addChatHistory(const LLChat& chat, bool log_to_file = true);
diff --git a/linden/indra/newview/llimview.cpp b/linden/indra/newview/llimview.cpp
index e3ec5e6..b5b1df2 100644
--- a/linden/indra/newview/llimview.cpp
+++ b/linden/indra/newview/llimview.cpp
@@ -544,6 +544,26 @@ LLIMMgr::~LLIMMgr()
// Children all cleaned up by default view destructor.
}
+LLColor4 get_extended_text_color(const LLUUID session_id, const LLUUID other_partecipant_id, const std::string& msg, LLColor4 defaultColor)
+{
+ if (gSavedSettings.getBOOL("HighlightOwnNameInIM") && (other_partecipant_id != LLUUID::null))
+ {
+ LLDynamicArray::iterator i;
+ for (i = gAgent.mGroups.begin(); i != gAgent.mGroups.end(); i++)
+ {
+ if (i->mID == session_id)
+ {
+ if (LLFloaterChat::isOwnNameInText(msg))
+ return gSavedSettings.getColor4("OwnNameChatColor");
+ else
+ break;
+ }
+ }
+ }
+
+ return defaultColor;
+}
+
// Add a message to a session.
void LLIMMgr::addMessage(
const LLUUID& session_id,
@@ -660,9 +680,21 @@ void LLIMMgr::addMessage(
// now add message to floater
bool is_from_system = target_id.isNull() || (from == SYSTEM_FROM);
- const LLColor4& color = ( is_from_system ?
- gSavedSettings.getColor4("SystemChatColor") :
- gSavedSettings.getColor("IMChatColor"));
+
+ LLColor4 color;
+ if (is_from_system)
+ color = gSavedSettings.getColor4("SystemChatColor");
+ else
+ {
+ std::string new_line = std::string(msg);
+ if (new_line.find(": ") == 0)
+ new_line = new_line.substr(2);
+ else
+ new_line = new_line.substr(1);
+
+ color = get_extended_text_color(session_id, other_participant_id, msg, gSavedSettings.getColor("IMChatColor"));
+ }
+
if ( !link_name )
{
floater->addHistoryLine(msg,color); // No name to prepend, so just add the message normally
diff --git a/linden/indra/newview/llprefsadvanced.cpp b/linden/indra/newview/llprefsadvanced.cpp
index 695e604..898ba2c 100644
--- a/linden/indra/newview/llprefsadvanced.cpp
+++ b/linden/indra/newview/llprefsadvanced.cpp
@@ -112,6 +112,7 @@ BOOL LLPrefsAdvanced::postBuild()
initHelpBtn("EmeraldHelp_SpellCheck", "EmeraldHelp_SpellCheck");
+ childSetValue("HighlightOwnNameInIM", gSavedSettings.getBOOL("HighlightOwnNameInIM"));
childSetValue("HighlightFriendsChat", gSavedSettings.getBOOL("HighlightFriendsChat"));
getChild("FriendsChatColor")->set(gSavedSettings.getColor4("FriendsChatColor"));
childSetValue("HighlightOwnNameInChat", gSavedSettings.getBOOL("HighlightOwnNameInChat"));
@@ -139,6 +140,7 @@ void LLPrefsAdvanced::apply()
gSavedSettings.setU32("LightShareAllowed",
(U32)childGetValue("lightshare_combo").asInteger());
+ gSavedSettings.setBOOL("HighlightOwnNameInIM", childGetValue("HighlightOwnNameInIM"));
gSavedSettings.setBOOL("HighlightFriendsChat", childGetValue("HighlightFriendsChat"));
gSavedSettings.setColor4("FriendsChatColor", getChild("FriendsChatColor")->get());
gSavedSettings.setBOOL("HighlightOwnNameInChat", childGetValue("HighlightOwnNameInChat"));
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
index 65d118d..b344d14 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
@@ -190,7 +190,11 @@
label="Show chat messages containing your name in a different color" left="12" mouse_opaque="true"
name="HighlightOwnNameInChat" radio_style="false" width="217" />
-
+
+
--
cgit v1.1
From b38fb615dce47ab90cecac22750b23747c6903b0 Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Thu, 9 Sep 2010 18:53:32 +0200
Subject: Fixed chat colors and added group im colors
---
linden/indra/newview/llimview.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llimview.cpp b/linden/indra/newview/llimview.cpp
index b5b1df2..12a26f9 100644
--- a/linden/indra/newview/llimview.cpp
+++ b/linden/indra/newview/llimview.cpp
@@ -692,7 +692,7 @@ void LLIMMgr::addMessage(
else
new_line = new_line.substr(1);
- color = get_extended_text_color(session_id, other_participant_id, msg, gSavedSettings.getColor("IMChatColor"));
+ color = get_extended_text_color(session_id, other_participant_id, new_line, gSavedSettings.getColor("IMChatColor"));
}
if ( !link_name )
--
cgit v1.1
From 6c56f4fcb206c1494e4f7cbd6d42fcac3cd8394e Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Thu, 9 Sep 2010 19:33:36 +0200
Subject: Switched to boost::regex and wrote a regex supporting punctuation for
name matching in both chat and group ims
---
linden/indra/newview/llfloaterchat.cpp | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llfloaterchat.cpp b/linden/indra/newview/llfloaterchat.cpp
index d7465fa..4be20b5 100644
--- a/linden/indra/newview/llfloaterchat.cpp
+++ b/linden/indra/newview/llfloaterchat.cpp
@@ -78,7 +78,7 @@
#include "llstylemap.h"
#include "llviewermenu.h"
-#include "regex.h"
+#include "boost/regex.hpp"
// Used for LCD display
extern void AddNewIMToLCD(const std::string &newLine);
@@ -456,7 +456,12 @@ void LLFloaterChat::updateSettings()
BOOL LLFloaterChat::isOwnNameInText(const std::string &text_line)
{
std::string my_name = gSavedSettings.getString("FirstName");
+ std::string pattern_s = "(^|.*[\\.\\?!:;\\*\\(\\s]+)(" + my_name + ")([,\\.\\?!:;\\*\\)\\s]+.*|$)";
+ boost::smatch what;
+ boost::regex e1(pattern_s, boost::regex::icase);
+ return boost::regex_search(text_line, what, e1);
+/*
std::transform(my_name.begin(), my_name.end(), my_name.begin(), tolower);
std::string lower_chat = std::string(text_line);
@@ -473,6 +478,9 @@ BOOL LLFloaterChat::isOwnNameInText(const std::string &text_line)
return TRUE;
}
+ return FALSE;
+*/
+
/*
regex_t compiled;
// ^.*([\.\?!:;\*\(\s]+)(elektra)([,\.\?!:;\*\)\s$]+).* <--- this works :)
@@ -483,8 +491,9 @@ BOOL LLFloaterChat::isOwnNameInText(const std::string &text_line)
if (regexec(&compiled, text_line.c_str(), 0, NULL, 0) == 0)
return TRUE;
-*/
+
return FALSE;
+*/
}
LLColor4 get_extended_text_color(const LLChat& chat, LLColor4 defaultColor)
--
cgit v1.1
From 0e40e29f470fe9a8a4d7a337fd93b2237d004e5e Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Thu, 9 Sep 2010 19:40:48 +0200
Subject: Code cleanup
---
linden/indra/newview/llfloaterchat.cpp | 35 +---------------------------------
1 file changed, 1 insertion(+), 34 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llfloaterchat.cpp b/linden/indra/newview/llfloaterchat.cpp
index 4be20b5..1cf85de 100644
--- a/linden/indra/newview/llfloaterchat.cpp
+++ b/linden/indra/newview/llfloaterchat.cpp
@@ -459,41 +459,8 @@ BOOL LLFloaterChat::isOwnNameInText(const std::string &text_line)
std::string pattern_s = "(^|.*[\\.\\?!:;\\*\\(\\s]+)(" + my_name + ")([,\\.\\?!:;\\*\\)\\s]+.*|$)";
boost::smatch what;
boost::regex e1(pattern_s, boost::regex::icase);
- return boost::regex_search(text_line, what, e1);
-
-/*
- std::transform(my_name.begin(), my_name.end(), my_name.begin(), tolower);
-
- std::string lower_chat = std::string(text_line);
- std::transform(lower_chat.begin(), lower_chat.end(), lower_chat.begin(), tolower);
- std::string blank = " ";
-
- // yes yes, this sucks, will move to a nicer regexp as soon as i have time to make it lol
- if (lower_chat.find(my_name + blank) == 0 || // at the beginning of the text
- (lower_chat.find(my_name) == 0 && lower_chat.length() == my_name.length()) || // only my name in the text
- lower_chat.find(blank + my_name + blank) != std::string::npos || // my name in the middle of the text
- lower_chat.rfind(blank + my_name) == lower_chat.length() - (blank + my_name).length()) // my name at the end of the text
- {
- return TRUE;
- }
-
- return FALSE;
-*/
-
-/*
- regex_t compiled;
- // ^.*([\.\?!:;\*\(\s]+)(elektra)([,\.\?!:;\*\)\s$]+).* <--- this works :)
- std::string pre_pattern = "^.*([\\.\\?!:;\\*\\(\\s]+)(";
- std::string post_pattern = ")([,\\.\\?!:;\\*\\)\\s$]+).*";
- std::string pattern_s = pre_pattern + my_name + post_pattern;
- regcomp(&compiled, pattern_s.c_str(), REG_ICASE);
-
- if (regexec(&compiled, text_line.c_str(), 0, NULL, 0) == 0)
- return TRUE;
-
- return FALSE;
-*/
+ return boost::regex_search(text_line, what, e1);
}
LLColor4 get_extended_text_color(const LLChat& chat, LLColor4 defaultColor)
--
cgit v1.1
From 6a57c87c0d90c65c0f0d9ba5e90c20b111420c43 Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Sat, 11 Sep 2010 03:48:59 +0200
Subject: Fixed Boost.cmake and removed the boost::system and boost::filesystem
dependencies
---
linden/indra/cmake/Boost.cmake | 6 ------
1 file changed, 6 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/cmake/Boost.cmake b/linden/indra/cmake/Boost.cmake
index 692902a..7741615 100644
--- a/linden/indra/cmake/Boost.cmake
+++ b/linden/indra/cmake/Boost.cmake
@@ -6,11 +6,9 @@ set(Boost_FIND_REQUIRED ON)
if (STANDALONE)
include(FindBoost)
- set(BOOST_FILESYSTEM_LIBRARY boost_filesystem-mt)
set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-mt)
set(BOOST_REGEX_LIBRARY boost_regex-mt)
set(BOOST_SIGNALS_LIBRARY boost_signals-mt)
- set(BOOST_SYSTEM_LIBRARY boost_system-mt)
else (STANDALONE)
use_prebuilt_binary(boost)
set(Boost_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
@@ -39,16 +37,12 @@ else (STANDALONE)
debug libboost_signals-vc90-mt-gd-${BOOST_VERSION})
endif (MSVC80)
elseif (DARWIN)
- set(BOOST_FILESYSTEM_LIBRARY boost_filesystem-mt)
set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-mt)
set(BOOST_REGEX_LIBRARY boost_regex-mt)
set(BOOST_SIGNALS_LIBRARY boost_signals-mt)
- set(BOOST_SYSTEM_LIBRARY boost_system-mt)
elseif (LINUX)
- set(BOOST_FILESYSTEM_LIBRARY boost_filesystem-mt)
set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-mt)
set(BOOST_REGEX_LIBRARY boost_regex-mt)
set(BOOST_SIGNALS_LIBRARY boost_signals-mt)
- set(BOOST_SYSTEM_LIBRARY boost_system-mt)
endif (WINDOWS)
endif (STANDALONE)
--
cgit v1.1
From 45ae4881525730eece3298d3c88984ce0599a106 Mon Sep 17 00:00:00 2001
From: Nemurimasu Neiro
Date: Mon, 6 Sep 2010 00:04:56 +0000
Subject: use setenv instead of putenv
putenv requires that the string not be freed
---
linden/indra/llmedia/llmediaimplgstreamer.cpp | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/llmedia/llmediaimplgstreamer.cpp b/linden/indra/llmedia/llmediaimplgstreamer.cpp
index 2bfe4ea..7af9c9a 100644
--- a/linden/indra/llmedia/llmediaimplgstreamer.cpp
+++ b/linden/indra/llmedia/llmediaimplgstreamer.cpp
@@ -188,9 +188,6 @@ bool LLMediaImplGStreamer::startup (LLMediaManagerData* init_data)
// Protect against GStreamer resetting the locale, yuck.
static std::string saved_locale;
saved_locale = setlocale(LC_ALL, NULL);
-#if LL_DARWIN
- setenv("GST_PLUGIN_SYSTEM_PATH", "lib/gstreamer-plugins", TRUE);
-#endif
if (0 == gst_init_check(NULL, NULL, NULL))
{
LL_WARNS("MediaImpl") << "GStreamer library failed to initialize and load standard plugins." << LL_ENDL;
@@ -294,7 +291,6 @@ void LLMediaImplGStreamer::set_gst_plugin_path()
// Search both Imprudence and Imprudence\lib\gstreamer-plugins.
// But we also want to search the path the user has set, if any.
std::string plugin_path =
- "GST_PLUGIN_PATH=" +
#if LL_WINDOWS
imp_dir + "\\lib\\gstreamer-plugins" +
#elif LL_DARWIN
@@ -307,9 +303,9 @@ void LLMediaImplGStreamer::set_gst_plugin_path()
// Place GST_PLUGIN_PATH in the environment settings
#if LL_WINDOWS
- put_result = _putenv( (char*)plugin_path.c_str() );
+ put_result = _putenv_s( "GST_PLUGIN_PATH", (char*)plugin_path.c_str() );
#elif LL_DARWIN
- put_result = putenv( (char*)plugin_path.c_str() );
+ put_result = setenv( "GST_PLUGIN_PATH", (char*)plugin_path.c_str(), 1 );
#endif
if( put_result == -1 )
@@ -324,9 +320,9 @@ void LLMediaImplGStreamer::set_gst_plugin_path()
// Don't load system plugins. We only want to use ours, to avoid conflicts.
#if LL_WINDOWS
- put_result = _putenv( "GST_PLUGIN_SYSTEM_PATH=\"\"" );
+ put_result = _putenv_s( "GST_PLUGIN_SYSTEM_PATH", "" );
#elif LL_DARWIN
- put_result = putenv( "GST_PLUGIN_SYSTEM_PATH=\"\"" );
+ put_result = setenv( "GST_PLUGIN_SYSTEM_PATH", "", 1 );
#endif
if( put_result == -1 )
--
cgit v1.1
From c01c71d3b22b9acb983c238b608401f7d032ef9b Mon Sep 17 00:00:00 2001
From: Nemurimasu Neiro
Date: Mon, 6 Sep 2010 05:11:05 +0000
Subject: store our password in the Mac OS keychain
much more secure than XORing against a MAC address :)
---
linden/indra/newview/CMakeLists.txt | 2 ++
linden/indra/newview/llstartup.cpp | 45 ++++++++++++++++++++++++++++++++++---
2 files changed, 44 insertions(+), 3 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/CMakeLists.txt b/linden/indra/newview/CMakeLists.txt
index 995ef7e..313ed9f 100644
--- a/linden/indra/newview/CMakeLists.txt
+++ b/linden/indra/newview/CMakeLists.txt
@@ -955,11 +955,13 @@ if (DARWIN)
find_library(APPKIT_LIBRARY AppKit)
find_library(COCOA_LIBRARY Cocoa)
find_library(IOKIT_LIBRARY IOKit)
+ find_library(SECURITY_LIBRARY SECURITY)
set(viewer_LIBRARIES
${COCOA_LIBRARY}
${AGL_LIBRARY}
${IOKIT_LIBRARY}
+ ${SECURITY_LIBRARY}
)
# Add resource files to the project.
diff --git a/linden/indra/newview/llstartup.cpp b/linden/indra/newview/llstartup.cpp
index 6622740..606262f 100644
--- a/linden/indra/newview/llstartup.cpp
+++ b/linden/indra/newview/llstartup.cpp
@@ -2935,17 +2935,29 @@ std::string LLStartUp::loadPasswordFromDisk()
return hashed_password;
}
+ // UUID is 16 bytes, written into ASCII is 32 characters
+ // without trailing \0
+ const S32 HASHED_LENGTH = 32;
+
std::string filepath = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,
"password.dat");
LLFILE* fp = LLFile::fopen(filepath, "rb"); /* Flawfinder: ignore */
if (!fp)
{
+#if LL_DARWIN
+ UInt32 passwordLength;
+ char *passwordData;
+ OSStatus stat = SecKeychainFindGenericPassword(NULL, 10, "Imprudence", 0, NULL, &passwordLength, (void**)&passwordData, NULL);
+ if (stat == noErr)
+ {
+ if (passwordLength == HASHED_LENGTH)
+ hashed_password.assign(passwordData, HASHED_LENGTH);
+ SecKeychainItemFreeContent(NULL, passwordData);
+ }
+#endif
return hashed_password;
}
- // UUID is 16 bytes, written into ASCII is 32 characters
- // without trailing \0
- const S32 HASHED_LENGTH = 32;
U8 buffer[HASHED_LENGTH+1];
if (1 != fread(buffer, HASHED_LENGTH, 1, fp))
@@ -2969,6 +2981,10 @@ std::string LLStartUp::loadPasswordFromDisk()
{
hashed_password.assign((char*)buffer);
}
+#if LL_DARWIN
+ // we're migrating to the keychain
+ LLFile::remove(filepath);
+#endif
return hashed_password;
}
@@ -2977,6 +2993,19 @@ std::string LLStartUp::loadPasswordFromDisk()
// static
void LLStartUp::savePasswordToDisk(const std::string& hashed_password)
{
+#if LL_DARWIN
+ SecKeychainItemRef keychainItem;
+ OSStatus status = SecKeychainFindGenericPassword(NULL, 10, "Imprudence", 0, NULL, NULL, NULL, &keychainItem);
+ if (status == noErr)
+ {
+ SecKeychainItemModifyAttributesAndData(keychainItem, NULL, hashed_password.length(), hashed_password.c_str());
+ CFRelease(keychainItem);
+ }
+ else
+ {
+ SecKeychainAddGenericPassword(NULL, 10, "Imprudence", 0, NULL, hashed_password.length(), hashed_password.c_str(), NULL);
+ }
+#else
std::string filepath = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,
"password.dat");
LLFILE* fp = LLFile::fopen(filepath, "wb"); /* Flawfinder: ignore */
@@ -3000,12 +3029,22 @@ void LLStartUp::savePasswordToDisk(const std::string& hashed_password)
}
fclose(fp);
+#endif
}
// static
void LLStartUp::deletePasswordFromDisk()
{
+#if LL_DARWIN
+ SecKeychainItemRef keychainItem;
+ OSStatus status = SecKeychainFindGenericPassword(NULL, 10, "Imprudence", 0, NULL, NULL, NULL, &keychainItem);
+ if (status == noErr)
+ {
+ SecKeychainItemDelete(keychainItem);
+ CFRelease(keychainItem);
+ }
+#endif
std::string filepath = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,
"password.dat");
LLFile::remove(filepath);
--
cgit v1.1
From 0819763a22fa70a3808197ed5bedf0a98ccf1293 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Wed, 8 Sep 2010 01:17:37 -0700
Subject: Replace '>' glyph in cascading menus with a proper triangle(backport
from Viewer 2)
---
linden/indra/llui/llmenugl.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/llui/llmenugl.cpp b/linden/indra/llui/llmenugl.cpp
index e00700a..8bca58a 100644
--- a/linden/indra/llui/llmenugl.cpp
+++ b/linden/indra/llui/llmenugl.cpp
@@ -102,7 +102,7 @@ const S32 TEAROFF_SEPARATOR_HEIGHT_PIXELS = 10;
const S32 MENU_ITEM_PADDING = 4;
const std::string BOOLEAN_TRUE_PREFIX( "X" );
-const std::string BRANCH_SUFFIX( ">" );
+const std::string BRANCH_SUFFIX( "\xE2\x96\xB6" ); // U+25B6 BLACK RIGHT-POINTING TRIANGLE
const std::string ARROW_UP ("^^^^^^^");
const std::string ARROW_DOWN("vvvvvvv");
--
cgit v1.1
From 30fdc31be51f2e2f2629fded97658464ac37702b Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Wed, 8 Sep 2010 04:17:38 -0700
Subject: Increased max settable value for RenderVolumeLODFactor from 2 to 4
---
.../newview/skins/default/xui/en-us/panel_preferences_graphics1.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_graphics1.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_graphics1.xml
index 153a111..72a6438 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_graphics1.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_graphics1.xml
@@ -286,7 +286,7 @@
Value
0
+ ResetFocusOnSelfClick
+
+ Comment
+ Setting this to TRUE resets your camera when you left-click your avatar
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 0
+
RezWithLandGroup
Comment
diff --git a/linden/indra/newview/lltoolpie.cpp b/linden/indra/newview/lltoolpie.cpp
index 262c349..2887515 100644
--- a/linden/indra/newview/lltoolpie.cpp
+++ b/linden/indra/newview/lltoolpie.cpp
@@ -292,7 +292,10 @@ BOOL LLToolPie::pickAndShowMenu(BOOL always_show)
gViewerWindow->hideCursor();
LLToolCamera::getInstance()->setMouseCapture(TRUE);
LLToolCamera::getInstance()->pickCallback(mPick);
- gAgent.setFocusOnAvatar(TRUE, TRUE);
+ if (gSavedSettings.getBOOL("ResetFocusOnSelfClick"))
+ {
+ gAgent.setFocusOnAvatar(TRUE, TRUE);
+ }
return TRUE;
}
--
cgit v1.1
From b98e28160cfdc19cab4fba69f8aeb6c4a690e65c Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Wed, 8 Sep 2010 12:34:00 -0700
Subject: Changed the menu enabled 'x' to a checkmark
---
linden/indra/llui/llmenugl.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/llui/llmenugl.cpp b/linden/indra/llui/llmenugl.cpp
index 8bca58a..91bb581 100644
--- a/linden/indra/llui/llmenugl.cpp
+++ b/linden/indra/llui/llmenugl.cpp
@@ -101,7 +101,7 @@ const U32 SEPARATOR_HEIGHT_PIXELS = 8;
const S32 TEAROFF_SEPARATOR_HEIGHT_PIXELS = 10;
const S32 MENU_ITEM_PADDING = 4;
-const std::string BOOLEAN_TRUE_PREFIX( "X" );
+const std::string BOOLEAN_TRUE_PREFIX( "\xe2\x9c\x93" ); // U+2714 -- MC
const std::string BRANCH_SUFFIX( "\xE2\x96\xB6" ); // U+25B6 BLACK RIGHT-POINTING TRIANGLE
const std::string ARROW_UP ("^^^^^^^");
const std::string ARROW_DOWN("vvvvvvv");
--
cgit v1.1
From 8e52ade6dd3aaeb33b18d8a99a169633f472b973 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Wed, 8 Sep 2010 14:26:03 -0700
Subject: Ported use group name in chat feature from Emerald
---
linden/indra/newview/app_settings/settings.xml | 11 +++++++++++
linden/indra/newview/llviewermessage.cpp | 12 +++++++++++-
2 files changed, 22 insertions(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index 333a780..667f0ad 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -772,6 +772,17 @@
Value
0
+ ShowGroupNameInChatIM
+
+ Comment
+ Show the group name when receiving group IMs
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 1
+
ShowMiniMapRadar
Comment
diff --git a/linden/indra/newview/llviewermessage.cpp b/linden/indra/newview/llviewermessage.cpp
index 56aed12..ec6d4d4 100755
--- a/linden/indra/newview/llviewermessage.cpp
+++ b/linden/indra/newview/llviewermessage.cpp
@@ -2313,7 +2313,17 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
position,
true);
- chat.mText = std::string("IM: ") + name + separator_string + saved + message.substr(message_offset);
+ std::string group_name;
+ if (gAgent.isInGroup(session_id) && gSavedSettings.getBOOL("ShowGroupNameInChatIM"))
+ {
+ group_name = std::string((char*)binary_bucket);
+ chat.mText = std::string("[") + group_name + std::string("] ") + name
+ + separator_string + saved + message.substr(message_offset);
+ }
+ else
+ {
+ chat.mText = std::string("IM: ") + name + separator_string + saved + message.substr(message_offset);
+ }
LLFloaterChat::addChat(chat, TRUE, is_this_agent);
}
break;
--
cgit v1.1
From e06ab7e8e6acd094d354bd5d383abc5c8869bfc9 Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Tue, 7 Sep 2010 22:34:40 +0200
Subject: Made the texture fix cross platform and removed boost::filesystem dep
for loaterlocalassetbrowse.cpp
---
linden/indra/newview/floaterlocalassetbrowse.cpp | 25 +++++++++++++++++-------
1 file changed, 18 insertions(+), 7 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/floaterlocalassetbrowse.cpp b/linden/indra/newview/floaterlocalassetbrowse.cpp
index 0ff24ca..0c313fb 100644
--- a/linden/indra/newview/floaterlocalassetbrowse.cpp
+++ b/linden/indra/newview/floaterlocalassetbrowse.cpp
@@ -40,12 +40,6 @@ this feature is still a work in progress.
#include "llviewerprecompiledheaders.h"
#include "lluictrlfactory.h"
-/* boost madness from hell */
-#ifdef equivalent
- #undef equivalent
-#endif
-#include
-
/* own class header && upload floater header */
#include "floaterlocalassetbrowse.h"
//#include "floaterlocaluploader.h" <- in development.
@@ -65,6 +59,7 @@ this feature is still a work in progress.
#include "llfilepicker.h"
#include "llviewermenufile.h"
#include "llfloaterimagepreview.h"
+#include "llfile.h"
/* repeated in header */
#include "lltexturectrl.h"
@@ -124,7 +119,11 @@ LocalBitmap::LocalBitmap(std::string fullpath)
else { return; } // no valid extension.
/* getting file's last modified */
- const std::time_t time = boost::filesystem::last_write_time( boost::filesystem::path( this->filename ) );
+
+ llstat temp_stat;
+ LLFile::stat(this->filename, &temp_stat);
+ std::time_t time = temp_stat.st_mtime;
+
this->last_modified = asctime( localtime(&time) );
/* checking if the bitmap is valid && decoding if it is */
@@ -161,7 +160,19 @@ void LocalBitmap::updateSelf()
if ( !gDirUtilp->fileExists(this->filename) ) { this->linkstatus = LINK_BROKEN; return; }
/* exists, let's check if it's lastmod has changed */
+ std::time_t temp_time;
+#ifdef LL_DARWIN
+ struct stat temp_stat;
+ stat(this->filename.c_str(), &temp_stat);
+ temp_time = temp_stat.st_mtime;
+#else
+ temp_time = boost::filesystem::last_write_time( boost::filesystem::path( this->filename ) );
+#endif
const std::time_t temp_time = boost::filesystem::last_write_time( boost::filesystem::path( this->filename ) );
+ llstat temp_stat;
+ LLFile::stat(this->filename, &temp_stat);
+ std::time_t temp_time = temp_stat.st_mtime;
+
LLSD new_last_modified = asctime( localtime(&temp_time) );
if ( this->last_modified.asString() == new_last_modified.asString() ) { return; }
--
cgit v1.1
From 83e9f753ea2c79fa14e0e91d38eb24edd1ea64dc Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Wed, 8 Sep 2010 17:00:34 -0700
Subject: Made the local asset texture boost change work on Windows as well
---
linden/indra/newview/floaterlocalassetbrowse.cpp | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/floaterlocalassetbrowse.cpp b/linden/indra/newview/floaterlocalassetbrowse.cpp
index 0c313fb..6657334 100644
--- a/linden/indra/newview/floaterlocalassetbrowse.cpp
+++ b/linden/indra/newview/floaterlocalassetbrowse.cpp
@@ -160,18 +160,19 @@ void LocalBitmap::updateSelf()
if ( !gDirUtilp->fileExists(this->filename) ) { this->linkstatus = LINK_BROKEN; return; }
/* exists, let's check if it's lastmod has changed */
- std::time_t temp_time;
-#ifdef LL_DARWIN
+#ifdef LL_WINDOWS
+ struct _stat temp_stat;
+ _stat(this->filename.c_str(), &temp_stat);
+#else
struct stat temp_stat;
stat(this->filename.c_str(), &temp_stat);
- temp_time = temp_stat.st_mtime;
-#else
- temp_time = boost::filesystem::last_write_time( boost::filesystem::path( this->filename ) );
#endif
- const std::time_t temp_time = boost::filesystem::last_write_time( boost::filesystem::path( this->filename ) );
+ std::time_t temp_time = temp_stat.st_mtime;
+
+ /*const std::time_t temp_time = boost::filesystem::last_write_time( boost::filesystem::path( this->filename ) );
llstat temp_stat;
LLFile::stat(this->filename, &temp_stat);
- std::time_t temp_time = temp_stat.st_mtime;
+ std::time_t temp_time = temp_stat.st_mtime;*/
LLSD new_last_modified = asctime( localtime(&temp_time) );
if ( this->last_modified.asString() == new_last_modified.asString() ) { return; }
--
cgit v1.1
From aa25ecf61b9ff876646be889a32ca9eeb2506c32 Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Wed, 8 Sep 2010 01:55:28 +0200
Subject: Initial hacky release of colors in chat highlighting friend chat and
when your name is typed
---
linden/indra/newview/llfloaterchat.cpp | 42 +++++++++++++++++++++++++++-------
1 file changed, 34 insertions(+), 8 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llfloaterchat.cpp b/linden/indra/newview/llfloaterchat.cpp
index f7ff3f9..c89bc86 100644
--- a/linden/indra/newview/llfloaterchat.cpp
+++ b/linden/indra/newview/llfloaterchat.cpp
@@ -76,6 +76,7 @@
#include "llfloaterhtml.h"
#include "llweb.h"
#include "llstylemap.h"
+#include "llviewermenu.h"
// Used for LCD display
extern void AddNewIMToLCD(const std::string &newLine);
@@ -551,19 +552,44 @@ LLColor4 get_text_color(const LLChat& chat)
text_color = gSavedSettings.getColor4("SystemChatColor");
break;
case CHAT_SOURCE_AGENT:
- if (chat.mFromID.isNull())
{
- text_color = gSavedSettings.getColor4("SystemChatColor");
- }
- else
- {
- if(gAgent.getID() == chat.mFromID)
+ if (chat.mFromID.isNull())
{
- text_color = gSavedSettings.getColor4("UserChatColor");
+ text_color = gSavedSettings.getColor4("SystemChatColor");
}
else
{
- text_color = gSavedSettings.getColor4("AgentChatColor");
+ if(gAgent.getID() == chat.mFromID)
+ {
+ text_color = gSavedSettings.getColor4("UserChatColor");
+ }
+ else
+ {
+ std::string my_name = gSavedSettings.getString("FirstName");
+ std::transform(my_name.begin(), my_name.end(), my_name.begin(), tolower);
+
+ std::string lower_chat = std::string(chat.mText);
+ std::transform(lower_chat.begin(), lower_chat.end(), lower_chat.begin(), tolower);
+
+ std::string blank = " ";
+
+ // yes yes, this sucks, will move to a nicer regexp as soon as i have time to make it lol
+ if (lower_chat.find(my_name + blank) == 0 || // at the beginning of the text
+ (lower_chat.find(my_name) == 0 && lower_chat.length() == my_name.length()) || // only my name in the text
+ lower_chat.find(blank + my_name + blank) != std::string::npos || // my name in the middle of the text
+ lower_chat.rfind(blank + my_name) == lower_chat.length() - (blank + my_name).length()) // my name at the end of the text
+ {
+ text_color = LLColor4::purple;
+ }
+ else if (is_agent_friend(chat.mFromID))
+ {
+ text_color = LLColor4::yellow;
+ }
+ else
+ {
+ text_color = gSavedSettings.getColor4("AgentChatColor");
+ }
+ }
}
}
break;
--
cgit v1.1
From d529e9bac87c0423baed54f2c1b20563351e9071 Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Wed, 8 Sep 2010 05:03:56 +0200
Subject: Added a Extra tab in adv. preferences to enable/disable chat colors
and to select the colors
---
linden/indra/newview/app_settings/settings.xml | 54 ++++++++++++++++++++++
linden/indra/newview/llfloaterchat.cpp | 44 ++++++++++--------
linden/indra/newview/llprefsadvanced.cpp | 10 ++++
.../xui/en-us/panel_preferences_advanced.xml | 24 ++++++++++
4 files changed, 112 insertions(+), 20 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index 667f0ad..a459623 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -4,6 +4,60 @@
+ HighlightFriendsChat
+
+ Comment
+ Show chat messages from friends in a different color
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 1
+
+ FriendsChatColor
+
+ Comment
+ Color of chat messages from friends
+ Persist
+ 1
+ Type
+ Color4
+ Value
+
+ 0.699999988079
+ 0.899999976158
+ 0.699999988079
+ 1
+
+
+ HighlightOwnNameInChat
+
+ Comment
+ Show chat messages containing your name in a different color
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 1
+
+ OwnNameChatColor
+
+ Comment
+ Color of chat messages from friends
+ Persist
+ 1
+ Type
+ Color4
+ Value
+
+ 0.8
+ 1.0
+ 0.8
+ 1
+
+
AllowMUpose
Comment
diff --git a/linden/indra/newview/llfloaterchat.cpp b/linden/indra/newview/llfloaterchat.cpp
index c89bc86..a38684a 100644
--- a/linden/indra/newview/llfloaterchat.cpp
+++ b/linden/indra/newview/llfloaterchat.cpp
@@ -565,30 +565,34 @@ LLColor4 get_text_color(const LLChat& chat)
}
else
{
- std::string my_name = gSavedSettings.getString("FirstName");
- std::transform(my_name.begin(), my_name.end(), my_name.begin(), tolower);
-
- std::string lower_chat = std::string(chat.mText);
- std::transform(lower_chat.begin(), lower_chat.end(), lower_chat.begin(), tolower);
-
- std::string blank = " ";
-
- // yes yes, this sucks, will move to a nicer regexp as soon as i have time to make it lol
- if (lower_chat.find(my_name + blank) == 0 || // at the beginning of the text
- (lower_chat.find(my_name) == 0 && lower_chat.length() == my_name.length()) || // only my name in the text
- lower_chat.find(blank + my_name + blank) != std::string::npos || // my name in the middle of the text
- lower_chat.rfind(blank + my_name) == lower_chat.length() - (blank + my_name).length()) // my name at the end of the text
+ if (gSavedSettings.getBOOL("HighlightOwnNameInChat"))
{
- text_color = LLColor4::purple;
+ std::string my_name = gSavedSettings.getString("FirstName");
+ std::transform(my_name.begin(), my_name.end(), my_name.begin(), tolower);
+
+ std::string lower_chat = std::string(chat.mText);
+ std::transform(lower_chat.begin(), lower_chat.end(), lower_chat.begin(), tolower);
+
+ std::string blank = " ";
+
+ // yes yes, this sucks, will move to a nicer regexp as soon as i have time to make it lol
+ if (lower_chat.find(my_name + blank) == 0 || // at the beginning of the text
+ (lower_chat.find(my_name) == 0 && lower_chat.length() == my_name.length()) || // only my name in the text
+ lower_chat.find(blank + my_name + blank) != std::string::npos || // my name in the middle of the text
+ lower_chat.rfind(blank + my_name) == lower_chat.length() - (blank + my_name).length()) // my name at the end of the text
+ {
+ text_color = gSavedSettings.getColor4("OwnNameChatColor");
+ break;
+ }
}
- else if (is_agent_friend(chat.mFromID))
- {
- text_color = LLColor4::yellow;
- }
- else
+
+ if (gSavedSettings.getBOOL("HighlightFriendsChat") && is_agent_friend(chat.mFromID))
{
- text_color = gSavedSettings.getColor4("AgentChatColor");
+ text_color = gSavedSettings.getColor4("FriendsChatColor");
+ break;
}
+
+ text_color = gSavedSettings.getColor4("AgentChatColor");
}
}
}
diff --git a/linden/indra/newview/llprefsadvanced.cpp b/linden/indra/newview/llprefsadvanced.cpp
index de39e01..695e604 100644
--- a/linden/indra/newview/llprefsadvanced.cpp
+++ b/linden/indra/newview/llprefsadvanced.cpp
@@ -41,6 +41,7 @@
#include "lgghunspell_wrapper.h"
#include "lggautocorrectfloater.h"
#include "llcombobox.h"
+#include "llcolorswatch.h"
#include "lluictrlfactory.h"
@@ -111,6 +112,11 @@ BOOL LLPrefsAdvanced::postBuild()
initHelpBtn("EmeraldHelp_SpellCheck", "EmeraldHelp_SpellCheck");
+ childSetValue("HighlightFriendsChat", gSavedSettings.getBOOL("HighlightFriendsChat"));
+ getChild("FriendsChatColor")->set(gSavedSettings.getColor4("FriendsChatColor"));
+ childSetValue("HighlightOwnNameInChat", gSavedSettings.getBOOL("HighlightOwnNameInChat"));
+ getChild("OwnNameChatColor")->set(gSavedSettings.getColor4("OwnNameChatColor"));
+
refresh();
return TRUE;
@@ -133,6 +139,10 @@ void LLPrefsAdvanced::apply()
gSavedSettings.setU32("LightShareAllowed",
(U32)childGetValue("lightshare_combo").asInteger());
+ gSavedSettings.setBOOL("HighlightFriendsChat", childGetValue("HighlightFriendsChat"));
+ gSavedSettings.setColor4("FriendsChatColor", getChild("FriendsChatColor")->get());
+ gSavedSettings.setBOOL("HighlightOwnNameInChat", childGetValue("HighlightOwnNameInChat"));
+ gSavedSettings.setColor4("OwnNameChatColor", getChild("OwnNameChatColor")->get());
// Need to force a rebake when ClothingLayerProtection toggled for it take effect -- MC
if (gSavedSettings.getBOOL("ShowMyClientTagToOthers") != (BOOL)childGetValue("client_name_tag_broadcast_check"))
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
index 857d1f1..65d118d 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
@@ -172,5 +172,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
--
cgit v1.1
From 22ac59d80ea47b2f75db835dd29471f75ad661ee Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Wed, 8 Sep 2010 20:51:22 -0700
Subject: Port from Emerald: allow any key for gestures
---
linden/indra/newview/llpreviewgesture.cpp | 26 +++++++++++++++++++++++---
1 file changed, 23 insertions(+), 3 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llpreviewgesture.cpp b/linden/indra/newview/llpreviewgesture.cpp
index ff3b943..ee1b634 100644
--- a/linden/indra/newview/llpreviewgesture.cpp
+++ b/linden/indra/newview/llpreviewgesture.cpp
@@ -564,14 +564,34 @@ void LLPreviewGesture::addModifiers()
combo->setCurrentByIndex(0);
}
+std::string magic_key(KEY key)
+{
+ char buffer[2]; /* Flawfinder: ignore */
+ buffer[0] = key;
+ buffer[1] = '\0';
+ std::string res = std::string(buffer);
+ std::string lolk = LLKeyboard::stringFromKey(key);
+ if(res == lolk)
+ {
+ if( key >= ' ' && key <= '~' )
+ {
+ return lolk;
+ }else
+ {
+ return "";
+ }
+ }
+ return lolk;
+}
void LLPreviewGesture::addKeys()
{
LLComboBox* combo = mKeyCombo;
combo->add( NONE_LABEL );
- for (KEY key = KEY_F2; key <= KEY_F12; key++)
+ for (KEY key = ' '; key < KEY_NONE; key++)
{
- combo->add( LLKeyboard::stringFromKey(key), ADD_BOTTOM );
+ std::string keystr = magic_key(key);
+ if(keystr != "")combo->add( keystr, ADD_BOTTOM );
}
combo->setCurrentByIndex(0);
}
@@ -1238,7 +1258,7 @@ void LLPreviewGesture::onSaveComplete(const LLUUID& asset_uuid, void* user_data,
else
{
llwarns << "Inventory item for gesture " << info->mItemUUID
- << " is no longer in agent inventory." << llendl
+ << " is no longer in agent inventory." << llendl;
}
}
else
--
cgit v1.1
From d8a02396cad94a191a7cea0f710217615f8cfc93 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Wed, 8 Sep 2010 20:51:56 -0700
Subject: Updated the formatting for group IMs to make it clear they're IMs
---
linden/indra/newview/llviewermessage.cpp | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llviewermessage.cpp b/linden/indra/newview/llviewermessage.cpp
index ec6d4d4..bfd1045 100755
--- a/linden/indra/newview/llviewermessage.cpp
+++ b/linden/indra/newview/llviewermessage.cpp
@@ -2316,8 +2316,11 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
std::string group_name;
if (gAgent.isInGroup(session_id) && gSavedSettings.getBOOL("ShowGroupNameInChatIM"))
{
- group_name = std::string((char*)binary_bucket);
- chat.mText = std::string("[") + group_name + std::string("] ") + name
+ if (!(gCacheName->getGroupName(from_id, group_name)))
+ {
+ group_name = std::string((char*)binary_bucket);
+ }
+ chat.mText = std::string("IM [") + group_name + std::string("] ") + name
+ separator_string + saved + message.substr(message_offset);
}
else
--
cgit v1.1
From 40718fadb6e1757e5f4466da57c7b649aa54f944 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Thu, 9 Sep 2010 23:14:20 -0700
Subject: Removed Object-Object Occlusion shortcut as it interferes with the AO
---
linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml b/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
index 0522981..1de4c94 100644
--- a/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
@@ -1344,8 +1344,7 @@
+ label="Object-Object Occlusion">
--
cgit v1.1
From 0fbdd7d10de8fa253cb008504e9e8dc44ed16b29 Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Thu, 9 Sep 2010 18:48:15 +0200
Subject: Fixed chat colors and added group im colors
---
linden/indra/llwindow/llwindowmacosx-objc.h | 1 -
linden/indra/llwindow/llwindowmacosx-objc.mm | 1 -
linden/indra/newview/app_settings/settings.xml | 11 +++
linden/indra/newview/llfloaterchat.cpp | 91 +++++++++++++++-------
linden/indra/newview/llfloaterchat.h | 2 +
linden/indra/newview/llimview.cpp | 38 ++++++++-
linden/indra/newview/llprefsadvanced.cpp | 2 +
.../xui/en-us/panel_preferences_advanced.xml | 6 +-
8 files changed, 117 insertions(+), 35 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/llwindow/llwindowmacosx-objc.h b/linden/indra/llwindow/llwindowmacosx-objc.h
index ed5d7b1..14cddaa 100644
--- a/linden/indra/llwindow/llwindowmacosx-objc.h
+++ b/linden/indra/llwindow/llwindowmacosx-objc.h
@@ -40,4 +40,3 @@ void setupCocoa();
CursorRef createImageCursor(const char *fullpath, int hotspotX, int hotspotY);
OSErr releaseImageCursor(CursorRef ref);
OSErr setImageCursor(CursorRef ref);
-
diff --git a/linden/indra/llwindow/llwindowmacosx-objc.mm b/linden/indra/llwindow/llwindowmacosx-objc.mm
index da01c2a..bc47164 100644
--- a/linden/indra/llwindow/llwindowmacosx-objc.mm
+++ b/linden/indra/llwindow/llwindowmacosx-objc.mm
@@ -116,4 +116,3 @@ OSErr setImageCursor(CursorRef ref)
return noErr;
}
-
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index a459623..75f37df 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -4,6 +4,17 @@
+ HighlightOwnNameInIM
+
+ Comment
+ Show GroupIM messages containing your name in a different color
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 1
+
HighlightFriendsChat
Comment
diff --git a/linden/indra/newview/llfloaterchat.cpp b/linden/indra/newview/llfloaterchat.cpp
index a38684a..d7465fa 100644
--- a/linden/indra/newview/llfloaterchat.cpp
+++ b/linden/indra/newview/llfloaterchat.cpp
@@ -78,6 +78,8 @@
#include "llstylemap.h"
#include "llviewermenu.h"
+#include "regex.h"
+
// Used for LCD display
extern void AddNewIMToLCD(const std::string &newLine);
extern void AddNewChatToLCD(const std::string &newLine);
@@ -383,7 +385,6 @@ void LLFloaterChat::setHistoryCursorAndScrollToEnd()
}
}
-
//static
void LLFloaterChat::onClickMute(void *data)
{
@@ -452,6 +453,65 @@ void LLFloaterChat::updateSettings()
LLFloaterChat::getInstance(LLSD())->getChild("translate chat")->set(translate_chat);
}
+BOOL LLFloaterChat::isOwnNameInText(const std::string &text_line)
+{
+ std::string my_name = gSavedSettings.getString("FirstName");
+
+ std::transform(my_name.begin(), my_name.end(), my_name.begin(), tolower);
+
+ std::string lower_chat = std::string(text_line);
+ std::transform(lower_chat.begin(), lower_chat.end(), lower_chat.begin(), tolower);
+
+ std::string blank = " ";
+
+ // yes yes, this sucks, will move to a nicer regexp as soon as i have time to make it lol
+ if (lower_chat.find(my_name + blank) == 0 || // at the beginning of the text
+ (lower_chat.find(my_name) == 0 && lower_chat.length() == my_name.length()) || // only my name in the text
+ lower_chat.find(blank + my_name + blank) != std::string::npos || // my name in the middle of the text
+ lower_chat.rfind(blank + my_name) == lower_chat.length() - (blank + my_name).length()) // my name at the end of the text
+ {
+ return TRUE;
+ }
+
+/*
+ regex_t compiled;
+ // ^.*([\.\?!:;\*\(\s]+)(elektra)([,\.\?!:;\*\)\s$]+).* <--- this works :)
+ std::string pre_pattern = "^.*([\\.\\?!:;\\*\\(\\s]+)(";
+ std::string post_pattern = ")([,\\.\\?!:;\\*\\)\\s$]+).*";
+ std::string pattern_s = pre_pattern + my_name + post_pattern;
+ regcomp(&compiled, pattern_s.c_str(), REG_ICASE);
+
+ if (regexec(&compiled, text_line.c_str(), 0, NULL, 0) == 0)
+ return TRUE;
+*/
+ return FALSE;
+}
+
+LLColor4 get_extended_text_color(const LLChat& chat, LLColor4 defaultColor)
+{
+ if (gSavedSettings.getBOOL("HighlightOwnNameInChat"))
+ {
+ std::string new_line = std::string(chat.mText);
+ int name_pos = new_line.find(chat.mFromName);
+ if (name_pos == 0)
+ {
+ new_line = new_line.substr(chat.mFromName.length());
+ if (new_line.find(": ") == 0)
+ new_line = new_line.substr(2);
+ else
+ new_line = new_line.substr(1);
+ }
+
+ if (LLFloaterChat::isOwnNameInText(new_line))
+ return gSavedSettings.getColor4("OwnNameChatColor");
+ }
+
+ if (gSavedSettings.getBOOL("HighlightFriendsChat") && is_agent_friend(chat.mFromID))
+ return gSavedSettings.getColor4("FriendsChatColor");
+
+ return defaultColor;
+}
+
// Put a line of chat in all the right places
void LLFloaterChat::addChat(const LLChat& chat,
BOOL from_instant_message,
@@ -565,34 +625,7 @@ LLColor4 get_text_color(const LLChat& chat)
}
else
{
- if (gSavedSettings.getBOOL("HighlightOwnNameInChat"))
- {
- std::string my_name = gSavedSettings.getString("FirstName");
- std::transform(my_name.begin(), my_name.end(), my_name.begin(), tolower);
-
- std::string lower_chat = std::string(chat.mText);
- std::transform(lower_chat.begin(), lower_chat.end(), lower_chat.begin(), tolower);
-
- std::string blank = " ";
-
- // yes yes, this sucks, will move to a nicer regexp as soon as i have time to make it lol
- if (lower_chat.find(my_name + blank) == 0 || // at the beginning of the text
- (lower_chat.find(my_name) == 0 && lower_chat.length() == my_name.length()) || // only my name in the text
- lower_chat.find(blank + my_name + blank) != std::string::npos || // my name in the middle of the text
- lower_chat.rfind(blank + my_name) == lower_chat.length() - (blank + my_name).length()) // my name at the end of the text
- {
- text_color = gSavedSettings.getColor4("OwnNameChatColor");
- break;
- }
- }
-
- if (gSavedSettings.getBOOL("HighlightFriendsChat") && is_agent_friend(chat.mFromID))
- {
- text_color = gSavedSettings.getColor4("FriendsChatColor");
- break;
- }
-
- text_color = gSavedSettings.getColor4("AgentChatColor");
+ text_color = get_extended_text_color(chat, gSavedSettings.getColor4("AgentChatColor"));
}
}
}
diff --git a/linden/indra/newview/llfloaterchat.h b/linden/indra/newview/llfloaterchat.h
index f894675..5a26567 100644
--- a/linden/indra/newview/llfloaterchat.h
+++ b/linden/indra/newview/llfloaterchat.h
@@ -40,6 +40,7 @@
#include "llfloater.h"
#include "lllogchat.h"
+
class LLButton;
class LLChat;
class LLComboBox;
@@ -72,6 +73,7 @@ public:
// Add chat to console and history list.
// Color based on source, type, distance.
static void addChat(const LLChat& chat, BOOL from_im = FALSE, BOOL local_agent = FALSE);
+ static BOOL isOwnNameInText(const std::string &text_line);
// Add chat to history alone.
static void addChatHistory(const LLChat& chat, bool log_to_file = true);
diff --git a/linden/indra/newview/llimview.cpp b/linden/indra/newview/llimview.cpp
index e3ec5e6..b5b1df2 100644
--- a/linden/indra/newview/llimview.cpp
+++ b/linden/indra/newview/llimview.cpp
@@ -544,6 +544,26 @@ LLIMMgr::~LLIMMgr()
// Children all cleaned up by default view destructor.
}
+LLColor4 get_extended_text_color(const LLUUID session_id, const LLUUID other_partecipant_id, const std::string& msg, LLColor4 defaultColor)
+{
+ if (gSavedSettings.getBOOL("HighlightOwnNameInIM") && (other_partecipant_id != LLUUID::null))
+ {
+ LLDynamicArray::iterator i;
+ for (i = gAgent.mGroups.begin(); i != gAgent.mGroups.end(); i++)
+ {
+ if (i->mID == session_id)
+ {
+ if (LLFloaterChat::isOwnNameInText(msg))
+ return gSavedSettings.getColor4("OwnNameChatColor");
+ else
+ break;
+ }
+ }
+ }
+
+ return defaultColor;
+}
+
// Add a message to a session.
void LLIMMgr::addMessage(
const LLUUID& session_id,
@@ -660,9 +680,21 @@ void LLIMMgr::addMessage(
// now add message to floater
bool is_from_system = target_id.isNull() || (from == SYSTEM_FROM);
- const LLColor4& color = ( is_from_system ?
- gSavedSettings.getColor4("SystemChatColor") :
- gSavedSettings.getColor("IMChatColor"));
+
+ LLColor4 color;
+ if (is_from_system)
+ color = gSavedSettings.getColor4("SystemChatColor");
+ else
+ {
+ std::string new_line = std::string(msg);
+ if (new_line.find(": ") == 0)
+ new_line = new_line.substr(2);
+ else
+ new_line = new_line.substr(1);
+
+ color = get_extended_text_color(session_id, other_participant_id, msg, gSavedSettings.getColor("IMChatColor"));
+ }
+
if ( !link_name )
{
floater->addHistoryLine(msg,color); // No name to prepend, so just add the message normally
diff --git a/linden/indra/newview/llprefsadvanced.cpp b/linden/indra/newview/llprefsadvanced.cpp
index 695e604..898ba2c 100644
--- a/linden/indra/newview/llprefsadvanced.cpp
+++ b/linden/indra/newview/llprefsadvanced.cpp
@@ -112,6 +112,7 @@ BOOL LLPrefsAdvanced::postBuild()
initHelpBtn("EmeraldHelp_SpellCheck", "EmeraldHelp_SpellCheck");
+ childSetValue("HighlightOwnNameInIM", gSavedSettings.getBOOL("HighlightOwnNameInIM"));
childSetValue("HighlightFriendsChat", gSavedSettings.getBOOL("HighlightFriendsChat"));
getChild("FriendsChatColor")->set(gSavedSettings.getColor4("FriendsChatColor"));
childSetValue("HighlightOwnNameInChat", gSavedSettings.getBOOL("HighlightOwnNameInChat"));
@@ -139,6 +140,7 @@ void LLPrefsAdvanced::apply()
gSavedSettings.setU32("LightShareAllowed",
(U32)childGetValue("lightshare_combo").asInteger());
+ gSavedSettings.setBOOL("HighlightOwnNameInIM", childGetValue("HighlightOwnNameInIM"));
gSavedSettings.setBOOL("HighlightFriendsChat", childGetValue("HighlightFriendsChat"));
gSavedSettings.setColor4("FriendsChatColor", getChild("FriendsChatColor")->get());
gSavedSettings.setBOOL("HighlightOwnNameInChat", childGetValue("HighlightOwnNameInChat"));
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
index 65d118d..b344d14 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
@@ -190,7 +190,11 @@
label="Show chat messages containing your name in a different color" left="12" mouse_opaque="true"
name="HighlightOwnNameInChat" radio_style="false" width="217" />
-
+
+
--
cgit v1.1
From d35cd20e170663f0d3e6d87310d26743f2b03c4f Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Thu, 9 Sep 2010 19:33:36 +0200
Subject: Switched to boost::regex and wrote a regex supporting punctuation for
name matching in both chat and group ims
---
linden/indra/newview/llfloaterchat.cpp | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llfloaterchat.cpp b/linden/indra/newview/llfloaterchat.cpp
index d7465fa..4be20b5 100644
--- a/linden/indra/newview/llfloaterchat.cpp
+++ b/linden/indra/newview/llfloaterchat.cpp
@@ -78,7 +78,7 @@
#include "llstylemap.h"
#include "llviewermenu.h"
-#include "regex.h"
+#include "boost/regex.hpp"
// Used for LCD display
extern void AddNewIMToLCD(const std::string &newLine);
@@ -456,7 +456,12 @@ void LLFloaterChat::updateSettings()
BOOL LLFloaterChat::isOwnNameInText(const std::string &text_line)
{
std::string my_name = gSavedSettings.getString("FirstName");
+ std::string pattern_s = "(^|.*[\\.\\?!:;\\*\\(\\s]+)(" + my_name + ")([,\\.\\?!:;\\*\\)\\s]+.*|$)";
+ boost::smatch what;
+ boost::regex e1(pattern_s, boost::regex::icase);
+ return boost::regex_search(text_line, what, e1);
+/*
std::transform(my_name.begin(), my_name.end(), my_name.begin(), tolower);
std::string lower_chat = std::string(text_line);
@@ -473,6 +478,9 @@ BOOL LLFloaterChat::isOwnNameInText(const std::string &text_line)
return TRUE;
}
+ return FALSE;
+*/
+
/*
regex_t compiled;
// ^.*([\.\?!:;\*\(\s]+)(elektra)([,\.\?!:;\*\)\s$]+).* <--- this works :)
@@ -483,8 +491,9 @@ BOOL LLFloaterChat::isOwnNameInText(const std::string &text_line)
if (regexec(&compiled, text_line.c_str(), 0, NULL, 0) == 0)
return TRUE;
-*/
+
return FALSE;
+*/
}
LLColor4 get_extended_text_color(const LLChat& chat, LLColor4 defaultColor)
--
cgit v1.1
From 6fb57fa78c8ac2a4e356345d8e18bd4487ea9e5e Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Thu, 9 Sep 2010 19:40:48 +0200
Subject: Code cleanup
---
linden/indra/newview/llfloaterchat.cpp | 35 +---------------------------------
1 file changed, 1 insertion(+), 34 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llfloaterchat.cpp b/linden/indra/newview/llfloaterchat.cpp
index 4be20b5..1cf85de 100644
--- a/linden/indra/newview/llfloaterchat.cpp
+++ b/linden/indra/newview/llfloaterchat.cpp
@@ -459,41 +459,8 @@ BOOL LLFloaterChat::isOwnNameInText(const std::string &text_line)
std::string pattern_s = "(^|.*[\\.\\?!:;\\*\\(\\s]+)(" + my_name + ")([,\\.\\?!:;\\*\\)\\s]+.*|$)";
boost::smatch what;
boost::regex e1(pattern_s, boost::regex::icase);
- return boost::regex_search(text_line, what, e1);
-
-/*
- std::transform(my_name.begin(), my_name.end(), my_name.begin(), tolower);
-
- std::string lower_chat = std::string(text_line);
- std::transform(lower_chat.begin(), lower_chat.end(), lower_chat.begin(), tolower);
- std::string blank = " ";
-
- // yes yes, this sucks, will move to a nicer regexp as soon as i have time to make it lol
- if (lower_chat.find(my_name + blank) == 0 || // at the beginning of the text
- (lower_chat.find(my_name) == 0 && lower_chat.length() == my_name.length()) || // only my name in the text
- lower_chat.find(blank + my_name + blank) != std::string::npos || // my name in the middle of the text
- lower_chat.rfind(blank + my_name) == lower_chat.length() - (blank + my_name).length()) // my name at the end of the text
- {
- return TRUE;
- }
-
- return FALSE;
-*/
-
-/*
- regex_t compiled;
- // ^.*([\.\?!:;\*\(\s]+)(elektra)([,\.\?!:;\*\)\s$]+).* <--- this works :)
- std::string pre_pattern = "^.*([\\.\\?!:;\\*\\(\\s]+)(";
- std::string post_pattern = ")([,\\.\\?!:;\\*\\)\\s$]+).*";
- std::string pattern_s = pre_pattern + my_name + post_pattern;
- regcomp(&compiled, pattern_s.c_str(), REG_ICASE);
-
- if (regexec(&compiled, text_line.c_str(), 0, NULL, 0) == 0)
- return TRUE;
-
- return FALSE;
-*/
+ return boost::regex_search(text_line, what, e1);
}
LLColor4 get_extended_text_color(const LLChat& chat, LLColor4 defaultColor)
--
cgit v1.1
From f20989bff9a326d44b565d462a1ea5ff863c8548 Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Sat, 11 Sep 2010 03:48:59 +0200
Subject: Fixed Boost.cmake and removed the boost::system and boost::filesystem
dependencies
---
linden/indra/cmake/Boost.cmake | 6 ------
1 file changed, 6 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/cmake/Boost.cmake b/linden/indra/cmake/Boost.cmake
index 692902a..7741615 100644
--- a/linden/indra/cmake/Boost.cmake
+++ b/linden/indra/cmake/Boost.cmake
@@ -6,11 +6,9 @@ set(Boost_FIND_REQUIRED ON)
if (STANDALONE)
include(FindBoost)
- set(BOOST_FILESYSTEM_LIBRARY boost_filesystem-mt)
set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-mt)
set(BOOST_REGEX_LIBRARY boost_regex-mt)
set(BOOST_SIGNALS_LIBRARY boost_signals-mt)
- set(BOOST_SYSTEM_LIBRARY boost_system-mt)
else (STANDALONE)
use_prebuilt_binary(boost)
set(Boost_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
@@ -39,16 +37,12 @@ else (STANDALONE)
debug libboost_signals-vc90-mt-gd-${BOOST_VERSION})
endif (MSVC80)
elseif (DARWIN)
- set(BOOST_FILESYSTEM_LIBRARY boost_filesystem-mt)
set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-mt)
set(BOOST_REGEX_LIBRARY boost_regex-mt)
set(BOOST_SIGNALS_LIBRARY boost_signals-mt)
- set(BOOST_SYSTEM_LIBRARY boost_system-mt)
elseif (LINUX)
- set(BOOST_FILESYSTEM_LIBRARY boost_filesystem-mt)
set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-mt)
set(BOOST_REGEX_LIBRARY boost_regex-mt)
set(BOOST_SIGNALS_LIBRARY boost_signals-mt)
- set(BOOST_SYSTEM_LIBRARY boost_system-mt)
endif (WINDOWS)
endif (STANDALONE)
--
cgit v1.1
From 273b90680748ebcde4c259db6d1f05f2f9c7e0d7 Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Mon, 6 Sep 2010 15:53:12 +0200
Subject: fix: 32bit libs for linux64 are not actually downloaded
---
linden/indra/cmake/ViewerMiscLibs.cmake | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/cmake/ViewerMiscLibs.cmake b/linden/indra/cmake/ViewerMiscLibs.cmake
index 4a62ebd..7fe1040 100644
--- a/linden/indra/cmake/ViewerMiscLibs.cmake
+++ b/linden/indra/cmake/ViewerMiscLibs.cmake
@@ -4,9 +4,9 @@ include(Prebuilt)
if (NOT STANDALONE)
use_prebuilt_binary(libuuid)
use_prebuilt_binary(vivox)
- if(LINUX64)
+ if(LINUX AND ${ARCH} STREQUAL "x86_64")
use_prebuilt_binary(32bitcompatibilitylibs)
- endif(LINUX64)
+ endif(LINUX AND ${ARCH} STREQUAL "x86_64")
use_prebuilt_binary(fontconfig)
endif(NOT STANDALONE)
--
cgit v1.1
From 677059987a1c8c3359471d8657288b158f015b0f Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Thu, 9 Sep 2010 09:44:16 +0200
Subject: fix Bug #240: Make Outfit crashes the viewer in OpenSim
this was due NULL wearables - todo: grey the checkboxes out then, maybe (firstuse)warn
---
linden/indra/newview/llagent.cpp | 2 ++
1 file changed, 2 insertions(+)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llagent.cpp b/linden/indra/newview/llagent.cpp
index 03d5c65..51b6c53 100644
--- a/linden/indra/newview/llagent.cpp
+++ b/linden/indra/newview/llagent.cpp
@@ -7209,6 +7209,8 @@ void LLAgent::makeNewOutfit(
}
LLViewerInventoryItem* item = gInventory.getItem(mWearableEntry[index].mItemID);
+ if (!item) continue; //e.g. Ruth hair on OpenSim TODO: disable checkbox
+
S32 todo = addWearableToAgentInventoryCallback::CALL_NONE;
if (!found_first_item)
{
--
cgit v1.1
From 209fb2adb2091a191a124ed532596953df69dc2c Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Fri, 10 Sep 2010 10:21:15 +0200
Subject: linux64: move cxx flags from external script into 00-Common.cmake for
transparency
todo: do it less hacky
---
linden/indra/cmake/00-Common.cmake | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/cmake/00-Common.cmake b/linden/indra/cmake/00-Common.cmake
index c6b6858..d1f379c 100644
--- a/linden/indra/cmake/00-Common.cmake
+++ b/linden/indra/cmake/00-Common.cmake
@@ -169,7 +169,23 @@ if (LINUX)
add_definitions(-fno-stack-protector)
endif (NOT STANDALONE)
if (${ARCH} STREQUAL "x86_64")
- add_definitions( -DLINUX64=1 )
+ add_definitions( -DLINUX64=1
+ #this rather needs to be done elsewhere
+ #anyway these are the flags for the 64bit releases:
+ -DLL_VECTORIZE=1
+ -O2
+ -fomit-frame-pointer
+ -pipe
+ -mmmx
+ -msse
+ -mfpmath=sse
+ -msse2
+ -ffast-math
+ -ftree-vectorize
+ -fweb -fexpensive-optimizations
+ -frename-registers
+ )
+
endif (${ARCH} STREQUAL "x86_64")
endif (VIEWER)
--
cgit v1.1
From 9d572e49c4997c4fb25496fbd93bda1b99d925ec Mon Sep 17 00:00:00 2001
From: Jacek Antonelli
Date: Tue, 31 Aug 2010 07:41:38 -0500
Subject: Changed the 'bundle identifier' to org.imprudenceviewer.viewer.
This is used on Mac OS X to identify the application.
Thanks to Solo Mornington for this information.
---
linden/indra/mac_crash_logger/Info.plist | 2 +-
linden/indra/mac_updater/Info.plist | 2 +-
linden/indra/mac_updater/mac_updater.cpp | 2 +-
linden/indra/newview/Info-Imprudence.plist | 2 +-
linden/indra/newview/llappviewerlinux.cpp | 2 +-
5 files changed, 5 insertions(+), 5 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/mac_crash_logger/Info.plist b/linden/indra/mac_crash_logger/Info.plist
index f48293e..a528b64 100644
--- a/linden/indra/mac_crash_logger/Info.plist
+++ b/linden/indra/mac_crash_logger/Info.plist
@@ -11,7 +11,7 @@
CFBundleIconFile
CFBundleIdentifier
- com.secondlife.indra.crashreporter
+ org.imprudenceviewer.crashreporter
CFBundleInfoDictionaryVersion
6.0
CFBundlePackageType
diff --git a/linden/indra/mac_updater/Info.plist b/linden/indra/mac_updater/Info.plist
index bb27fdd..1e0f8cb 100644
--- a/linden/indra/mac_updater/Info.plist
+++ b/linden/indra/mac_updater/Info.plist
@@ -11,7 +11,7 @@
CFBundleIconFile
CFBundleIdentifier
- com.secondlife.indra.autoupdater
+ org.imprudenceviewer.autoupdater
CFBundleInfoDictionaryVersion
6.0
CFBundlePackageType
diff --git a/linden/indra/mac_updater/mac_updater.cpp b/linden/indra/mac_updater/mac_updater.cpp
index 18cc0be..cf9de4b 100644
--- a/linden/indra/mac_updater/mac_updater.cpp
+++ b/linden/indra/mac_updater/mac_updater.cpp
@@ -649,7 +649,7 @@ static bool isFSRefViewerBundle(FSRef *targetRef)
}
else
{
- if(CFStringCompare(targetBundleID, CFSTR("com.secondlife.indra.viewer"), 0) == kCFCompareEqualTo)
+ if(CFStringCompare(targetBundleID, CFSTR("org.imprudenceviewer.viewer"), 0) == kCFCompareEqualTo)
{
// This is the bundle we're looking for.
result = true;
diff --git a/linden/indra/newview/Info-Imprudence.plist b/linden/indra/newview/Info-Imprudence.plist
index e9728f8..419cacd 100644
--- a/linden/indra/newview/Info-Imprudence.plist
+++ b/linden/indra/newview/Info-Imprudence.plist
@@ -9,7 +9,7 @@
CFBundleIconFile
viewer.icns
CFBundleIdentifier
- com.secondlife.indra.viewer
+ org.imprudenceviewer.viewer
CFBundleInfoDictionaryVersion
6.0
CFBundleName
diff --git a/linden/indra/newview/llappviewerlinux.cpp b/linden/indra/newview/llappviewerlinux.cpp
index bb6cf9f..bfad899 100644
--- a/linden/indra/newview/llappviewerlinux.cpp
+++ b/linden/indra/newview/llappviewerlinux.cpp
@@ -270,7 +270,7 @@ static inline BOOL do_elfio_glibc_backtrace()
uintptr_t(stackarray[btpos]) < value+ssize)
{
// symbol is inside viewer
- fprintf(StraceFile, "%-32s\t", "com.secondlife.indra.viewer");
+ fprintf(StraceFile, "%-32s\t", "org.imprudenceviewer.viewer");
fprintf(StraceFile, "%p ", stackarray[btpos]);
char *demangled_str = NULL;
--
cgit v1.1
From 7460b677c3979b9ec5b913dee3abfcd4272bd297 Mon Sep 17 00:00:00 2001
From: Jacek Antonelli
Date: Tue, 31 Aug 2010 05:54:55 -0500
Subject: Added Preferences > Fonts tab, with basic font chooser.
Choosing a font sets FontChoice setting, but no real effect yet.
---
linden/indra/newview/CMakeLists.txt | 2 +
linden/indra/newview/app_settings/settings.xml | 11 +++
linden/indra/newview/impprefsfonts.cpp | 86 ++++++++++++++++++++++
linden/indra/newview/impprefsfonts.h | 45 +++++++++++
linden/indra/newview/llfloaterpreference.cpp | 15 +++-
linden/indra/newview/llfloaterpreference.h | 2 +
.../newview/skins/default/xui/en-us/fonts.xml | 14 ++++
.../skins/default/xui/en-us/notifications.xml | 7 ++
.../default/xui/en-us/panel_preferences_fonts.xml | 33 +++++++++
9 files changed, 214 insertions(+), 1 deletion(-)
create mode 100644 linden/indra/newview/impprefsfonts.cpp
create mode 100644 linden/indra/newview/impprefsfonts.h
create mode 100644 linden/indra/newview/skins/default/xui/en-us/panel_preferences_fonts.xml
(limited to 'linden/indra')
diff --git a/linden/indra/newview/CMakeLists.txt b/linden/indra/newview/CMakeLists.txt
index 313ed9f..1691095 100644
--- a/linden/indra/newview/CMakeLists.txt
+++ b/linden/indra/newview/CMakeLists.txt
@@ -87,6 +87,7 @@ set(viewer_SOURCE_FILES
hippoGridManager.cpp
hippoLimits.cpp
hippoRestRequest.cpp
+ impprefsfonts.cpp
jcfloater_animation_list.cpp
jcfloaterareasearch.cpp
lightshare.cpp
@@ -525,6 +526,7 @@ set(viewer_HEADER_FILES
hippoGridManager.h
hippoLimits.h
hippoRestRequest.h
+ impprefsfonts.h
jcfloater_animation_list.h
jcfloaterareasearch.h
lightshare.h
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index 75f37df..270bd58 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -336,6 +336,17 @@
0
+ FontChoice
+
+ Comment
+ User's font choice (Liberation or DejaVu)
+ Persist
+ 1
+ Type
+ String
+ Value
+ DejaVu
+
GoAction
Comment
diff --git a/linden/indra/newview/impprefsfonts.cpp b/linden/indra/newview/impprefsfonts.cpp
new file mode 100644
index 0000000..3ce71eb
--- /dev/null
+++ b/linden/indra/newview/impprefsfonts.cpp
@@ -0,0 +1,86 @@
+/**
+ * @file impprefsfonts.cpp
+ * @brief Font preferences panel
+ *
+ * Copyright (c) 2010, Jacek Antonelli
+ *
+ * The source code in this file ("Source Code") is provided to you
+ * under the terms of the GNU General Public License, version 2.0
+ * ("GPL"). Terms of the GPL can be found in doc/GPL-license.txt in
+ * this distribution, or online at
+ * http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL SOURCE CODE IS PROVIDED "AS IS." THE AUTHOR MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ */
+
+
+#include "llviewerprecompiledheaders.h"
+#include "impprefsfonts.h"
+
+#include "llradiogroup.h"
+#include "lluictrlfactory.h"
+
+#include "llviewercontrol.h"
+#include "llviewerwindow.h"
+
+
+ImpPrefsFonts::ImpPrefsFonts()
+{
+ LLUICtrlFactory::getInstance()->
+ buildPanel(this, "panel_preferences_fonts.xml");
+}
+
+ImpPrefsFonts::~ImpPrefsFonts()
+{
+}
+
+
+BOOL ImpPrefsFonts::postBuild()
+{
+ refresh();
+ return true;
+}
+
+
+void ImpPrefsFonts::refresh()
+{
+ LLRadioGroup* fonts = getChild("fonts");
+ if (fonts)
+ {
+ fonts->setValue( gSavedSettings.getString("FontChoice") );
+ }
+}
+
+void ImpPrefsFonts::apply()
+{
+ LLRadioGroup* fonts = getChild("fonts");
+
+ if (fonts)
+ {
+ std::string font_choice = fonts->getValue().asString();
+
+ if (font_choice != gSavedSettings.getString("FontChoice") &&
+ !font_choice.empty())
+ {
+ gSavedSettings.setString("FontChoice", font_choice);
+ LLNotifications::instance().add("ChangeFont");
+ refresh();
+ }
+ }
+}
+
+void ImpPrefsFonts::cancel()
+{
+}
diff --git a/linden/indra/newview/impprefsfonts.h b/linden/indra/newview/impprefsfonts.h
new file mode 100644
index 0000000..12aa0bb
--- /dev/null
+++ b/linden/indra/newview/impprefsfonts.h
@@ -0,0 +1,45 @@
+/**
+ * @file impprefsfonts.h
+ * @brief Font preferences panel
+ *
+ * Copyright (c) 2010, Jacek Antonelli
+ *
+ * The source code in this file ("Source Code") is provided to you
+ * under the terms of the GNU General Public License, version 2.0
+ * ("GPL"). Terms of the GPL can be found in doc/GPL-license.txt in
+ * this distribution, or online at
+ * http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL SOURCE CODE IS PROVIDED "AS IS." THE AUTHOR MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ */
+
+#ifndef IMP_PREFSFONTS_H
+#define IMP_PREFSFONTS_H
+
+#include "llpanel.h"
+
+class ImpPrefsFonts : public LLPanel
+{
+public:
+ ImpPrefsFonts();
+ virtual ~ImpPrefsFonts();
+
+ virtual BOOL postBuild();
+ void refresh();
+ void apply();
+ void cancel();
+};
+
+#endif // IMP_PREFSFONTS_H
diff --git a/linden/indra/newview/llfloaterpreference.cpp b/linden/indra/newview/llfloaterpreference.cpp
index 744c179..09336cb 100644
--- a/linden/indra/newview/llfloaterpreference.cpp
+++ b/linden/indra/newview/llfloaterpreference.cpp
@@ -48,6 +48,7 @@
#include "llspinctrl.h"
#include "message.h"
+#include "impprefsfonts.h"
#include "llcommandhandler.h"
#include "llfloaterpreference.h"
#include "llpanelnetwork.h"
@@ -133,7 +134,8 @@ LLPreferenceCore::LLPreferenceCore(LLTabContainer* tab_container, LLButton * def
mMsgPanel(NULL),
mSkinsPanel(NULL),
mLCDPanel(NULL),
- mPrefsAdvanced(NULL)
+ mPrefsAdvanced(NULL),
+ mPrefsFonts(NULL)
{
mGeneralPanel = new LLPanelGeneral();
mTabContainer->addTabPanel(mGeneralPanel, mGeneralPanel->getLabel(), FALSE, onTabChanged, mTabContainer);
@@ -197,6 +199,10 @@ LLPreferenceCore::LLPreferenceCore(LLTabContainer* tab_container, LLButton * def
mTabContainer->addTabPanel(mPrefsAdvanced, mPrefsAdvanced->getLabel(), FALSE, onTabChanged, mTabContainer);
mPrefsAdvanced->setDefaultBtn(default_btn);
+ mPrefsFonts = new ImpPrefsFonts();
+ mTabContainer->addTabPanel(mPrefsFonts, mPrefsFonts->getLabel(), FALSE, onTabChanged, mTabContainer);
+ mPrefsFonts->setDefaultBtn(default_btn);
+
if (!mTabContainer->selectTab(gSavedSettings.getS32("LastPrefTab")))
{
mTabContainer->selectFirstTab();
@@ -261,6 +267,11 @@ LLPreferenceCore::~LLPreferenceCore()
delete mPrefsAdvanced;
mPrefsAdvanced = NULL;
}
+ if (mPrefsFonts)
+ {
+ delete mPrefsFonts;
+ mPrefsFonts = NULL;
+ }
}
@@ -278,6 +289,7 @@ void LLPreferenceCore::apply()
mMsgPanel->apply();
mSkinsPanel->apply();
mPrefsAdvanced->apply();
+ mPrefsFonts->apply();
// hardware menu apply
LLFloaterHardwareSettings::instance()->apply();
@@ -307,6 +319,7 @@ void LLPreferenceCore::cancel()
mMsgPanel->cancel();
mSkinsPanel->cancel();
mPrefsAdvanced->cancel();
+ mPrefsFonts->cancel();
// cancel hardware menu
LLFloaterHardwareSettings::instance()->cancel();
diff --git a/linden/indra/newview/llfloaterpreference.h b/linden/indra/newview/llfloaterpreference.h
index 1878280..e98c45c 100644
--- a/linden/indra/newview/llfloaterpreference.h
+++ b/linden/indra/newview/llfloaterpreference.h
@@ -56,6 +56,7 @@ class LLPrefsIM;
class LLPanelMsgs;
class LLPanelSkins;
class LLPrefsAdvanced;
+class ImpPrefsFonts;
class LLScrollListCtrl;
class LLPreferenceCore
@@ -93,6 +94,7 @@ private:
LLPanelMsgs *mMsgPanel;
LLPanelLCD *mLCDPanel;
LLPrefsAdvanced *mPrefsAdvanced;
+ ImpPrefsFonts* mPrefsFonts;
};
// Floater to control preferences (display, audio, bandwidth, general.
diff --git a/linden/indra/newview/skins/default/xui/en-us/fonts.xml b/linden/indra/newview/skins/default/xui/en-us/fonts.xml
index 95070ed..5d831c6 100644
--- a/linden/indra/newview/skins/default/xui/en-us/fonts.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/fonts.xml
@@ -33,6 +33,7 @@
VeraMono.ttf
+
DejaVuSansCondensed.ttf
@@ -56,6 +57,19 @@
DejaVuSansCondensed-BoldOblique.ttf
+
+
+ LiberationSans-Regular.ttf
+
+
+
+ LiberationSans-Bold.ttf
+
+
+
arial.ttf
diff --git a/linden/indra/newview/skins/default/xui/en-us/notifications.xml b/linden/indra/newview/skins/default/xui/en-us/notifications.xml
index 0de1df5..eced647 100644
--- a/linden/indra/newview/skins/default/xui/en-us/notifications.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/notifications.xml
@@ -7084,6 +7084,13 @@ Apply this region's settings? ("Ignore" will ignore all region setting
+
+The new font will appear after you restart [VIEWER_NAME].
+
+
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_fonts.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_fonts.xml
new file mode 100644
index 0000000..e55981b
--- /dev/null
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_fonts.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+ User interface font (requires restart):
+
+
+
+
+
+ DejaVu Sans Condensed
+
+
+
+ Liberation Sans (classic Imprudence font)
+
+
+
+
+
+ Preview: The quick brown fox jumped over the lazy dog. :)
+
+
+
+ Preview: The quick brown fox jumped over the lazy dog. :)
+
+
+
--
cgit v1.1
From 0612f98a90e795724baeb1966f1e7e35c5a26289 Mon Sep 17 00:00:00 2001
From: Jacek Antonelli
Date: Wed, 8 Sep 2010 23:55:14 -0500
Subject: Added the concept of aliases to LLFontRegistry.
SansSerif is now an alias for either "DejaVu" or "Liberation",
depending on the user's FontChoice setting.
---
linden/indra/llrender/llfontregistry.cpp | 38 ++++++++++++++++++++++
linden/indra/llrender/llfontregistry.h | 14 ++++++++
.../newview/skins/default/xui/en-us/fonts.xml | 9 -----
3 files changed, 52 insertions(+), 9 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/llrender/llfontregistry.cpp b/linden/indra/llrender/llfontregistry.cpp
index 619228e..cbd0d5a 100644
--- a/linden/indra/llrender/llfontregistry.cpp
+++ b/linden/indra/llrender/llfontregistry.cpp
@@ -177,6 +177,9 @@ LLFontRegistry::LLFontRegistry(const string_vec_t& xui_paths)
// This is potentially a slow directory traversal, so we want to
// cache the result.
mUltimateFallbackList = LLWindow::getDynamicFallbackFontList();
+
+ std::string font_choice = gSavedSettings.getString("FontChoice");
+ setAlias("SansSerif", font_choice);
}
LLFontRegistry::~LLFontRegistry()
@@ -511,6 +514,13 @@ LLFontGL *LLFontRegistry::getFont(const LLFontDescriptor& orig_desc)
{
LLFontDescriptor norm_desc = orig_desc.normalize();
+ if (hasAlias(norm_desc.getName()))
+ {
+ // llinfos << "Font " << norm_desc.getName() << " is alias for "
+ // << expandAlias(norm_desc.getName()) << llendl;
+ norm_desc.setName(expandAlias(norm_desc.getName()));
+ }
+
font_reg_map_t::iterator it = mFontMap.find(norm_desc);
if (it != mFontMap.end())
return it->second;
@@ -649,3 +659,31 @@ void LLFontRegistry::dump()
}
}
}
+
+
+
+std::string LLFontRegistry::expandAlias(std::string alias_name)
+{
+ font_alias_map_t::iterator it = mFontAliases.find(alias_name);
+ if (it != mFontAliases.end())
+ {
+ return it->second;
+ }
+ return alias_name;
+}
+
+void LLFontRegistry::setAlias(std::string alias_name, std::string orig_name)
+{
+ mFontAliases[alias_name] = orig_name;
+}
+
+void LLFontRegistry::clearAlias(std::string alias_name)
+{
+ mFontAliases.erase(alias_name);
+}
+
+bool LLFontRegistry::hasAlias(std::string alias_name)
+{
+ font_alias_map_t::iterator it = mFontAliases.find(alias_name);
+ return (it != mFontAliases.end());
+}
diff --git a/linden/indra/llrender/llfontregistry.h b/linden/indra/llrender/llfontregistry.h
index 523e184..0add372 100644
--- a/linden/indra/llrender/llfontregistry.h
+++ b/linden/indra/llrender/llfontregistry.h
@@ -97,15 +97,29 @@ public:
const string_vec_t& getUltimateFallbackList() const { return mUltimateFallbackList; }
+ // If alias_name is a defined alias, returns the original name.
+ // Otherwise returns alias_name itself.
+ std::string expandAlias(std::string alias_name);
+ // Define alias_name as an alias of orig_name.
+ void setAlias(std::string alias_name, std::string orig_name);
+ // Undefines the alias alias_name. Does nothing if it's not an alias.
+ void clearAlias(std::string alias_name);
+ // True if the alias is defined.
+ bool hasAlias(std::string alias_name);
+
+
private:
LLFontGL *createFont(const LLFontDescriptor& desc);
typedef std::map font_reg_map_t;
typedef std::map font_size_map_t;
+ typedef std::map font_alias_map_t;
// Given a descriptor, look up specific font instantiation.
font_reg_map_t mFontMap;
// Given a size name, look up the point size.
font_size_map_t mFontSizes;
+ // Given an alias name, look up the original name.
+ font_alias_map_t mFontAliases;
string_vec_t mUltimateFallbackList;
string_vec_t mXUIPaths;
diff --git a/linden/indra/newview/skins/default/xui/en-us/fonts.xml b/linden/indra/newview/skins/default/xui/en-us/fonts.xml
index 5d831c6..df1356b 100644
--- a/linden/indra/newview/skins/default/xui/en-us/fonts.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/fonts.xml
@@ -18,15 +18,6 @@
-
- DejaVuSansCondensed.ttf
-
-
-
- DejaVuSansCondensed-Bold.ttf
-
--
cgit v1.1
From f42f2c7aa4f5c9b2f1db249495f66845385f7239 Mon Sep 17 00:00:00 2001
From: Jacek Antonelli
Date: Fri, 10 Sep 2010 14:39:00 -0500
Subject: Added the concept of font size multiplier (size_mult).
This compensates for inherent size differences in each font family,
so that UI text is a consistent size, no matter which font you use.
---
linden/indra/llrender/llfontregistry.cpp | 35 ++++++++++++++--------
linden/indra/llrender/llfontregistry.h | 4 +++
.../newview/skins/default/xui/en-us/fonts.xml | 18 ++++++-----
3 files changed, 38 insertions(+), 19 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/llrender/llfontregistry.cpp b/linden/indra/llrender/llfontregistry.cpp
index cbd0d5a..b1d8c5c 100644
--- a/linden/indra/llrender/llfontregistry.cpp
+++ b/linden/indra/llrender/llfontregistry.cpp
@@ -48,7 +48,8 @@ using std::map;
bool fontDescInitFromXML(LLXMLNodePtr node, LLFontDescriptor& desc);
LLFontDescriptor::LLFontDescriptor():
- mStyle(0)
+ mStyle(0),
+ mSizeMult(1.0)
{
}
@@ -59,7 +60,8 @@ LLFontDescriptor::LLFontDescriptor(const std::string& name,
mName(name),
mSize(size),
mStyle(style),
- mFileNames(file_names)
+ mFileNames(file_names),
+ mSizeMult(1.0)
{
}
@@ -68,7 +70,8 @@ LLFontDescriptor::LLFontDescriptor(const std::string& name,
const U8 style):
mName(name),
mSize(size),
- mStyle(style)
+ mStyle(style),
+ mSizeMult(1.0)
{
}
@@ -165,7 +168,9 @@ LLFontDescriptor LLFontDescriptor::normalize() const
if (removeSubString(new_name,"Italic"))
new_style |= LLFontGL::ITALIC;
- return LLFontDescriptor(new_name,new_size,new_style,getFileNames());
+ LLFontDescriptor norm(new_name,new_size,new_style,getFileNames());
+ norm.setSizeMult(mSizeMult);
+ return norm;
}
LLFontRegistry::LLFontRegistry(const string_vec_t& xui_paths)
@@ -255,6 +260,12 @@ bool fontDescInitFromXML(LLXMLNodePtr node, LLFontDescriptor& desc)
}
desc.setSize(s_template_string);
+
+ F32 attr_size_mult;
+ if (node->getAttributeF32("size_mult",attr_size_mult))
+ {
+ desc.setSizeMult(attr_size_mult);
+ }
}
LLXMLNodePtr child;
@@ -363,7 +374,6 @@ LLFontGL *LLFontRegistry::createFont(const LLFontDescriptor& desc)
return NULL;
}
llinfos << "createFont " << norm_desc.getName() << " size " << norm_desc.getSize() << " style " << ((S32) norm_desc.getStyle()) << llendl;
- F32 fallback_scale = 1.0;
// Find corresponding font template (based on same descriptor with no size specified)
LLFontDescriptor template_desc(norm_desc);
@@ -431,13 +441,13 @@ LLFontGL *LLFontRegistry::createFont(const LLFontDescriptor& desc)
LLFontGL *fontp = new LLFontGL;
std::string font_path = local_path + *file_name_it;
BOOL is_fallback = !is_first_found;
- F32 extra_scale = (is_fallback)?fallback_scale:1.0;
- if (!fontp->loadFace(font_path, extra_scale * point_size,
+ F32 size_mult = (is_fallback ? 1 : match_desc->getSizeMult());
+ if (!fontp->loadFace(font_path, point_size * size_mult,
LLFontGL::sVertDPI, LLFontGL::sHorizDPI, 2, is_fallback))
{
font_path = sys_path + *file_name_it;
- if (!fontp->loadFace(font_path, extra_scale * point_size,
+ if (!fontp->loadFace(font_path, point_size * size_mult,
LLFontGL::sVertDPI, LLFontGL::sHorizDPI, 2, is_fallback))
{
LL_INFOS_ONCE("LLFontRegistry") << "Couldn't load font " << *file_name_it << LL_ENDL;
@@ -526,12 +536,12 @@ LLFontGL *LLFontRegistry::getFont(const LLFontDescriptor& orig_desc)
return it->second;
else
{
- LLFontGL *fontp = createFont(orig_desc);
+ LLFontGL *fontp = createFont(norm_desc);
if (!fontp)
{
- llwarns << "getFont failed, name " << orig_desc.getName()
- <<" style=[" << ((S32) orig_desc.getStyle()) << "]"
- << " size=[" << orig_desc.getSize() << "]" << llendl;
+ llwarns << "getFont failed, name " << norm_desc.getName()
+ <<" style=[" << ((S32) norm_desc.getStyle()) << "]"
+ << " size=[" << norm_desc.getSize() << "]" << llendl;
}
return fontp;
}
@@ -649,6 +659,7 @@ void LLFontRegistry::dump()
llinfos << "Font: name=" << desc.getName()
<< " style=[" << ((S32)desc.getStyle()) << "]"
<< " size=[" << desc.getSize() << "]"
+ << " size_mult=[" << desc.getSizeMult() << "]"
<< " fileNames="
<< llendl;
for (string_vec_t::const_iterator file_it=desc.getFileNames().begin();
diff --git a/linden/indra/llrender/llfontregistry.h b/linden/indra/llrender/llfontregistry.h
index 0add372..67a529f 100644
--- a/linden/indra/llrender/llfontregistry.h
+++ b/linden/indra/llrender/llfontregistry.h
@@ -56,6 +56,9 @@ public:
void setName(const std::string& name) { mName = name; }
const std::string& getSize() const { return mSize; }
void setSize(const std::string& size) { mSize = size; }
+ F32 getSizeMult() const { return mSizeMult; }
+ void setSizeMult(F32 size_mult) { mSizeMult = size_mult; }
+
const std::vector& getFileNames() const { return mFileNames; }
std::vector& getFileNames() { return mFileNames; }
const U8 getStyle() const { return mStyle; }
@@ -64,6 +67,7 @@ public:
private:
std::string mName;
std::string mSize;
+ F32 mSizeMult;
string_vec_t mFileNames;
U8 mStyle;
};
diff --git a/linden/indra/newview/skins/default/xui/en-us/fonts.xml b/linden/indra/newview/skins/default/xui/en-us/fonts.xml
index df1356b..1aa44fb 100644
--- a/linden/indra/newview/skins/default/xui/en-us/fonts.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/fonts.xml
@@ -26,25 +26,29 @@
+ comment="Name of DejaVu font"
+ size_mult="1.00">
DejaVuSansCondensed.ttf
+ comment="Name of DejaVu font (bold)"
+ size_mult="1.00"
+ font_style="BOLD">
DejaVuSansCondensed-Bold.ttf
+ comment="Name of DejaVu font (italic)"
+ size_mult="1.00"
+ font_style="ITALIC">
DejaVuSansCondensed-Oblique.ttf
+ comment="Name of DejaVu font (bold italic)"
+ size_mult="1.00"
+ font_style="BOLD|ITALIC">
DejaVuSansCondensed-BoldOblique.ttf
--
cgit v1.1
From 8361020743a2e6488837bccd9f503e467421ad52 Mon Sep 17 00:00:00 2001
From: Jacek Antonelli
Date: Fri, 10 Sep 2010 20:03:45 -0500
Subject: Added Delicious and DroidSans fonts to package and preferences.
---
linden/indra/newview/app_settings/settings.xml | 2 +-
.../newview/skins/default/xui/en-us/fonts.xml | 42 ++++++++++++++++++++++
.../default/xui/en-us/panel_preferences_fonts.xml | 16 +++++++++
linden/indra/newview/viewer_manifest.py | 19 ++++++++--
4 files changed, 75 insertions(+), 4 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index 270bd58..09fd65c 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -339,7 +339,7 @@
FontChoice
Comment
- User's font choice (Liberation or DejaVu)
+ User's font choice (DejaVu, Delicious, DroidSans, or Liberation)
Persist
1
Type
diff --git a/linden/indra/newview/skins/default/xui/en-us/fonts.xml b/linden/indra/newview/skins/default/xui/en-us/fonts.xml
index 1aa44fb..15a8254 100644
--- a/linden/indra/newview/skins/default/xui/en-us/fonts.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/fonts.xml
@@ -53,6 +53,34 @@
+
+ Delicious-Roman.otf
+
+
+
+ Delicious-Bold.otf
+
+
+
+ Delicious-Italic.otf
+
+
+
+ Delicious-BoldItalic.otf
+
+
+
LiberationSans-Regular.ttf
@@ -65,6 +93,20 @@
+
+ DroidSans.ttf
+
+
+
+ DroidSans-Bold.ttf
+
+
+
arial.ttf
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_fonts.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_fonts.xml
index e55981b..869063f 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_fonts.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_fonts.xml
@@ -20,6 +20,14 @@
Liberation Sans (classic Imprudence font)
+
+ Delicious
+
+
+
+ Droid Sans
+
+
@@ -30,4 +38,12 @@
Preview: The quick brown fox jumped over the lazy dog. :)
+
+ Preview: The quick brown fox jumped over the lazy dog. :)
+
+
+
+ Preview: The quick brown fox jumped over the lazy dog. :)
+
+
diff --git a/linden/indra/newview/viewer_manifest.py b/linden/indra/newview/viewer_manifest.py
index 15172f2..7e0afd8 100755
--- a/linden/indra/newview/viewer_manifest.py
+++ b/linden/indra/newview/viewer_manifest.py
@@ -75,16 +75,29 @@ class ViewerManifest(LLManifest):
# Include our fonts
if self.prefix(src="fonts"):
+ self.path("GPL.txt")
+ self.path("Liberation-License.txt")
self.path("LiberationSans-Bold.ttf")
self.path("LiberationSans-Regular.ttf")
- self.path("VeraMono.ttf")
+
+ self.path("Delicious-License.txt")
+ self.path("Delicious-BoldItalic.otf")
+ self.path("Delicious-Bold.otf")
+ self.path("Delicious-Italic.otf")
+ self.path("Delicious-Roman.otf")
+
+ self.path("Droid-License.txt")
+ self.path("DroidSans-Bold.ttf")
+ self.path("DroidSans.ttf")
+
+ self.path("DejaVu-License.txt")
self.path("DejaVuSansCondensed-BoldOblique.ttf")
self.path("DejaVuSansCondensed-Bold.ttf")
self.path("DejaVuSansCondensed-Oblique.ttf")
self.path("DejaVuSansCondensed.ttf")
- self.path("GPL.txt")
- self.path("Liberation-License.txt")
+
self.path("Vera-License.txt")
+ self.path("VeraMono.ttf")
self.end_prefix("fonts")
# skins
--
cgit v1.1
From e145936133fe813e91867928674d537dbe776007 Mon Sep 17 00:00:00 2001
From: Jacek Antonelli
Date: Fri, 10 Sep 2010 20:18:47 -0500
Subject: Made DroidSans the new default font.
---
linden/indra/newview/app_settings/settings.xml | 8 ++++----
.../default/xui/en-us/panel_preferences_fonts.xml | 20 ++++++++++----------
2 files changed, 14 insertions(+), 14 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index 09fd65c..cae420d 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -345,7 +345,7 @@
Type
String
Value
- DejaVu
+ DroidSans
GoAction
@@ -6245,7 +6245,7 @@
Type
String
Value
- DejaVuSansCondensed.ttf
+ DroidSans.ttf
FontSansSerifBundledFallback
@@ -6256,7 +6256,7 @@
Type
String
Value
- DejaVuSansCondensed.ttf
+ DroidSans.ttf
FontSansSerifBold
@@ -6267,7 +6267,7 @@
Type
String
Value
- DejaVuSansCondensed-Bold.ttf
+ DroidSans-Bold.ttf
FontSansSerifFallback
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_fonts.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_fonts.xml
index 869063f..3a27bd1 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_fonts.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_fonts.xml
@@ -12,29 +12,29 @@
top="-30" left="20" bottom="0" right="-20"
follows="top|left|bottom|right">
-
+
+ Droid Sans
+
+
+
DejaVu Sans Condensed
-
- Liberation Sans (classic Imprudence font)
-
-
Delicious
-
- Droid Sans
+
+ Liberation Sans (classic Imprudence font)
-
+
Preview: The quick brown fox jumped over the lazy dog. :)
-
+
Preview: The quick brown fox jumped over the lazy dog. :)
@@ -42,7 +42,7 @@
Preview: The quick brown fox jumped over the lazy dog. :)
-
+
Preview: The quick brown fox jumped over the lazy dog. :)
--
cgit v1.1
From d5996a3f7cd632fea70087a8558a41e6650d8c7b Mon Sep 17 00:00:00 2001
From: Jacek Antonelli
Date: Fri, 10 Sep 2010 21:45:29 -0500
Subject: Added libhunspell-1.2.dylib to Mac manifest.
---
linden/indra/newview/viewer_manifest.py | 1 +
1 file changed, 1 insertion(+)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/viewer_manifest.py b/linden/indra/newview/viewer_manifest.py
index 7e0afd8..f66fa5b 100755
--- a/linden/indra/newview/viewer_manifest.py
+++ b/linden/indra/newview/viewer_manifest.py
@@ -544,6 +544,7 @@ class DarwinManifest(ViewerManifest):
if self.prefix(src="../../libraries/universal-darwin/lib_release", dst="MacOS/"):
self.path("libndofdev.dylib")
+ self.path("libhunspell-1.2.dylib")
self.path("libopenal.1.dylib")
self.path("libalut.0.dylib")
--
cgit v1.1
From 5b584eafadb0898ba23bf17ccb30e6d2d557c74a Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Fri, 10 Sep 2010 21:12:20 -0700
Subject: Fix for crash on bad teleports
---
linden/indra/newview/llvoavatar.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llvoavatar.cpp b/linden/indra/newview/llvoavatar.cpp
index 513d43c..c8b26be 100644
--- a/linden/indra/newview/llvoavatar.cpp
+++ b/linden/indra/newview/llvoavatar.cpp
@@ -8401,7 +8401,7 @@ LLBBox LLVOAvatar::getHUDBBox() const
{
attachment_map_t::const_iterator curiter = iter++;
LLViewerJointAttachment* attachment = curiter->second;
- if (attachment->getIsHUDAttachment() && attachment->getObject())
+ if (attachment && attachment->getIsHUDAttachment() && attachment->getObject())
{
LLViewerObject* hud_object = attachment->getObject();
--
cgit v1.1
From a1307555f61252d373b976334df8ea5385a44e97 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Fri, 10 Sep 2010 23:57:26 -0700
Subject: Added the dark and gemini skins to the skins panel (note: revert
before skin selection is merged in)
---
linden/indra/newview/llpanelskins.cpp | 18 ++++++++++
linden/indra/newview/llpanelskins.h | 2 ++
.../default/xui/en-us/panel_preferences_skins.xml | 41 ++++++++++++++++++----
3 files changed, 55 insertions(+), 6 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llpanelskins.cpp b/linden/indra/newview/llpanelskins.cpp
index 26de356..831adc8 100644
--- a/linden/indra/newview/llpanelskins.cpp
+++ b/linden/indra/newview/llpanelskins.cpp
@@ -60,6 +60,8 @@ BOOL LLPanelSkins::postBuild()
getChild("classic_preview")->setClickedCallback(onClickClassic, this);
getChild("silver_preview")->setClickedCallback(onClickSilver, this);
+ getChild("dark_preview")->setClickedCallback(onClickDark, this);
+ getChild("gemini_preview")->setClickedCallback(onClickGemini, this);
refresh();
return TRUE;
@@ -108,3 +110,19 @@ void LLPanelSkins::onClickSilver(void* data)
gSavedSettings.setString("SkinCurrent", "silver");
self->getChild("skin_selection")->setValue("silver");
}
+
+//static
+void LLPanelSkins::onClickDark(void* data)
+{
+ LLPanelSkins* self = (LLPanelSkins*)data;
+ gSavedSettings.setString("SkinCurrent", "dark");
+ self->getChild("skin_selection")->setValue("dark");
+}
+
+//static
+void LLPanelSkins::onClickGemini(void* data)
+{
+ LLPanelSkins* self = (LLPanelSkins*)data;
+ gSavedSettings.setString("SkinCurrent", "gemini");
+ self->getChild("skin_selection")->setValue("gemini");
+}
diff --git a/linden/indra/newview/llpanelskins.h b/linden/indra/newview/llpanelskins.h
index 8fd282f..8dbd556 100644
--- a/linden/indra/newview/llpanelskins.h
+++ b/linden/indra/newview/llpanelskins.h
@@ -51,6 +51,8 @@ private:
static void onSelectSkin(LLUICtrl* ctrl, void* data);
static void onClickClassic(void* data);
static void onClickSilver(void* data);
+ static void onClickDark(void* data);
+ static void onClickGemini(void* data);
private:
std::string mSkin;
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_skins.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_skins.xml
index f0b789e..0611ce3 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_skins.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_skins.xml
@@ -2,21 +2,50 @@
-
- Select a Skin (Requires Restart):
-
+ Select a skin (requires restart).
+
Default
-
+
Silver
+
+ Dark
+
+
+ Gemini
+
-
-
+
+
+
+
+
+
+
+ (Please see the skin folders for information and credits)
+
+
--
cgit v1.1
From b987829d0cc2fad2e09e1c90a251a56ab1ca5250 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Fri, 10 Sep 2010 23:58:07 -0700
Subject: Fixed crash when right clicking a landmark and selecting 'About
Landmark'. TODO: fix duplicate LM request that shouldn't happen
---
linden/indra/newview/llpanelplace.cpp | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llpanelplace.cpp b/linden/indra/newview/llpanelplace.cpp
index d7939b9..eb3d17d 100644
--- a/linden/indra/newview/llpanelplace.cpp
+++ b/linden/indra/newview/llpanelplace.cpp
@@ -383,14 +383,14 @@ void LLPanelPlace::displayParcelInfo(const LLVector3& pos_region,
std::string url = gAgent.getRegion()->getCapability("RemoteParcelRequest");
if (!url.empty())
{
- body["location"] = ll_sd_from_vector3(pos_region);
+ body["location"] = ll_sd_from_vector3(mPosRegion);
if (!region_id.isNull())
{
body["region_id"] = region_id;
}
- if (!pos_global.isExactlyZero())
+ if (!mPosGlobal.isExactlyZero())
{
- U64 region_handle = to_region_handle(pos_global);
+ U64 region_handle = to_region_handle(mPosGlobal);
body["region_handle"] = ll_sd_from_U64(region_handle);
}
LLHTTPClient::post(url, body, new LLRemoteParcelRequestResponder(this->getHandle()));
--
cgit v1.1
From eb11df5e07e2fe235b496a437d0f6cb0a62469ab Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sat, 11 Sep 2010 00:02:14 -0700
Subject: Disabled highlight for own name color by default to avoid confusion
---
linden/indra/newview/app_settings/settings.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index cae420d..8e7c029 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -13,7 +13,7 @@
Type
Boolean
Value
- 1
+ 0
HighlightFriendsChat
@@ -51,7 +51,7 @@
Type
Boolean
Value
- 1
+ 0
OwnNameChatColor
--
cgit v1.1
From b40a6c3b57968e97b06c2eec0eeb9c0f2e393b04 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sat, 11 Sep 2010 00:04:29 -0700
Subject: Made the default friend chat color the same color as friends' glyph
in the mini-map
---
linden/indra/newview/app_settings/settings.xml | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index 8e7c029..11220ed 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -36,9 +36,9 @@
Color4
Value
- 0.699999988079
- 0.899999976158
- 0.699999988079
+ 1.0
+ 1.0
+ 0.0
1
--
cgit v1.1
From c8f15cf380f910fb3b642b3089b0fd461e9fc883 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sat, 11 Sep 2010 00:08:34 -0700
Subject: Fixed color picker size being too tiny for the label
---
.../skins/default/xui/en-us/panel_preferences_advanced.xml | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
index b344d14..38033a3 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
@@ -180,10 +180,10 @@
initial_value="true" label="Show chat messages from friends in a different color" left="12"
mouse_opaque="true" name="HighlightFriendsChat" radio_style="false" width="270"/>
-
+ enabled="true" follows="left|top" height="67" label="Friends" left_delta="68"
+ mouse_opaque="true" name="FriendsChatColor" width="65" />
-
+ enabled="true" follows="left|top" height="67" label="Own Name" left_delta="68"
+ mouse_opaque="true" name="OwnNameChatColor" width="65" />
--
cgit v1.1
From da5df21793b3a5457e029b92951aa4833257daeb Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sat, 11 Sep 2010 00:08:59 -0700
Subject: Changed version to Experimental 2010.09.11
---
linden/indra/newview/app_settings/viewerversion.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/viewerversion.xml b/linden/indra/newview/app_settings/viewerversion.xml
index 3b1a7df..f5fb533 100644
--- a/linden/indra/newview/app_settings/viewerversion.xml
+++ b/linden/indra/newview/app_settings/viewerversion.xml
@@ -20,6 +20,6 @@ need to be changed manually - MC
-
+
--
cgit v1.1
From 703956fca4a299dd34464b33069cc05920046851 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sat, 11 Sep 2010 02:40:43 -0700
Subject: Fixed the layout of the fonts preferences panel's font previews
---
.../newview/skins/default/xui/en-us/panel_preferences_fonts.xml | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_fonts.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_fonts.xml
index 3a27bd1..5865bec 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_fonts.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_fonts.xml
@@ -30,19 +30,19 @@
-
+
Preview: The quick brown fox jumped over the lazy dog. :)
-
+
Preview: The quick brown fox jumped over the lazy dog. :)
-
+
Preview: The quick brown fox jumped over the lazy dog. :)
-
+
Preview: The quick brown fox jumped over the lazy dog. :)
--
cgit v1.1
From 37f9f885db6119b88044f55091fa0068f135c3ea Mon Sep 17 00:00:00 2001
From: Frederick Martian
Date: Fri, 10 Sep 2010 11:05:45 +0200
Subject: When buying land check the maturity level first and inform the agent
when the land does have a higher level than what he is currently set to
---
linden/indra/newview/llviewerparcelmgr.cpp | 14 +++++++++++++-
.../newview/skins/default/xui/en-us/notifications.xml | 9 +++++++++
2 files changed, 22 insertions(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llviewerparcelmgr.cpp b/linden/indra/newview/llviewerparcelmgr.cpp
index 21fca25..61b91fe 100644
--- a/linden/indra/newview/llviewerparcelmgr.cpp
+++ b/linden/indra/newview/llviewerparcelmgr.cpp
@@ -1071,7 +1071,19 @@ LLViewerParcelMgr::ParcelBuyInfo* LLViewerParcelMgr::setupParcelBuy(
LLNotifications::instance().add("CannotBuyLandNoRegion");
return NULL;
}
-
+
+ /* Check for maturity being not higher than the current users ability and preference. */
+ U8 sim_access = region->getSimAccess();
+ const LLAgentAccess& agent_access = gAgent.getAgentAccess();
+ // if the region is PG, we're happy already, so do nothing
+ // but if we're set to avoid either mature or adult, get us outta here
+ if (((sim_access == SIM_ACCESS_MATURE) && !agent_access.canAccessMature()) ||
+ ((sim_access == SIM_ACCESS_ADULT) && !agent_access.canAccessAdult()))
+ {
+ LLNotifications::instance().add("CannotBuyLandMaturity");
+ return NULL;
+ }
+
if (is_claim)
{
llinfos << "Claiming " << mWestSouth << " to " << mEastNorth << llendl;
diff --git a/linden/indra/newview/skins/default/xui/en-us/notifications.xml b/linden/indra/newview/skins/default/xui/en-us/notifications.xml
index eced647..9ebeec9 100644
--- a/linden/indra/newview/skins/default/xui/en-us/notifications.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/notifications.xml
@@ -1729,6 +1729,15 @@ Cannot find the region this land is in.
+Unable to buy land:
+
+Your allowed or prefered maturity level does not allow to buy this land.
+
+
+
You cannot close the Buy Land window until [GRID_NAME] estimates the price of this transaction.
--
cgit v1.1
From a0b749a7a3c3c05c842085e3b95d663fc750273a Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sat, 11 Sep 2010 18:35:19 -0700
Subject: Applied patch by Makomk Makosen for #515: Uninitialized pointer
mNextAudioSession in LLVoiceClient
---
linden/indra/newview/llvoiceclient.cpp | 1 +
1 file changed, 1 insertion(+)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llvoiceclient.cpp b/linden/indra/newview/llvoiceclient.cpp
index 660b60a..d67b9e3 100644
--- a/linden/indra/newview/llvoiceclient.cpp
+++ b/linden/indra/newview/llvoiceclient.cpp
@@ -1121,6 +1121,7 @@ LLVoiceClient::LLVoiceClient()
mMicVolume = 0;
mAudioSession = NULL;
+ mNextAudioSession = NULL;
mAudioSessionChanged = false;
// Initial dirty state
--
cgit v1.1
From 4d67fcc433be184429a6c70621d3368386bc01e2 Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Sun, 12 Sep 2010 18:18:21 +0200
Subject: Fixed the regexp to match commas before the name
---
linden/indra/newview/llfloaterchat.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llfloaterchat.cpp b/linden/indra/newview/llfloaterchat.cpp
index 1cf85de..c956aba 100644
--- a/linden/indra/newview/llfloaterchat.cpp
+++ b/linden/indra/newview/llfloaterchat.cpp
@@ -456,7 +456,7 @@ void LLFloaterChat::updateSettings()
BOOL LLFloaterChat::isOwnNameInText(const std::string &text_line)
{
std::string my_name = gSavedSettings.getString("FirstName");
- std::string pattern_s = "(^|.*[\\.\\?!:;\\*\\(\\s]+)(" + my_name + ")([,\\.\\?!:;\\*\\)\\s]+.*|$)";
+ std::string pattern_s = "(^|.*[,\\.\\?!:;\\*\\(\\s]+)(" + my_name + ")([,\\.\\?!:;\\*\\)\\s]+.*|$)";
boost::smatch what;
boost::regex e1(pattern_s, boost::regex::icase);
--
cgit v1.1
From 37aa6de0889eb864bbeba61341304b120a184eb0 Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Mon, 13 Sep 2010 04:59:36 +0200
Subject: Initial support for names autocompletion in chat using ctrl-esc
---
linden/indra/newview/llchatbar.cpp | 81 +++++++++++++++++++++++++++++++++++---
1 file changed, 76 insertions(+), 5 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llchatbar.cpp b/linden/indra/newview/llchatbar.cpp
index dc67448..88ef2b5 100644
--- a/linden/indra/newview/llchatbar.cpp
+++ b/linden/indra/newview/llchatbar.cpp
@@ -71,6 +71,8 @@
#include "chatbar_as_cmdline.h"
+#include "boost/regex.hpp"
+
//
// Globals
//
@@ -199,12 +201,83 @@ BOOL LLChatBar::handleKeyHere( KEY key, MASK mask )
}
}
// only do this in main chatbar
- else if ( KEY_ESCAPE == key && gChatBar == this)
+ else if (KEY_ESCAPE == key && mask == MASK_NONE && gChatBar == this)
{
stopChat();
-
handled = TRUE;
}
+ else if (key == KEY_ESCAPE && mask == MASK_CONTROL && gChatBar == this)
+ {
+ if (mInputEditor)
+ {
+ std::vector avatar_ids;
+ std::vector positions;
+ LLWorld::getInstance()->getAvatars(&avatar_ids, &positions);
+
+ if (!avatar_ids.empty())
+ {
+ std::string txt(mInputEditor->getText());
+
+ std::string to_match(txt);
+ std::string left_part = "";
+ std::string right_part = "";
+ S32 cursorPos = mInputEditor->getCursor();
+
+ if (cursorPos < txt.length())
+ {
+ right_part = txt.substr(cursorPos);
+ left_part = txt.substr(0, cursorPos);
+ to_match = std::string(left_part);
+ }
+ else
+ {
+ to_match = std::string(txt);
+ left_part = txt;
+ }
+
+ std::string pattern_s = "(^|.*[\\.\\?!:;,\\*\\(\\s]+)([a-z0-9]+)$";
+ boost::match_results what;
+ boost::regex expression(pattern_s, boost::regex::icase);
+ if (boost::regex_search(to_match, what, expression, boost::match_extra))
+ {
+ to_match = what[2];
+ if (to_match.length() < 3)
+ return handled;
+ }
+ else
+ return handled;
+
+ for (U32 i=0; i CHAT_NORMAL_RADIUS)
+ continue;
+*/
+
+ std::string agent_name = " ";
+ std::string agent_surname = " ";
+
+ if(!gCacheName->getName(avatar_ids[i], agent_name, agent_surname) && (agent_name == " " || agent_surname == " "))
+ continue;
+
+ std::string test_name(agent_name);
+ std::transform(test_name.begin(), test_name.end(), test_name.begin(), tolower);
+
+ if (test_name.find(to_match) == 0)
+ {
+ std::string rest_of_match = agent_name.substr(to_match.length(), agent_name.length());
+ mInputEditor->setText(left_part.substr(0, left_part.length() - to_match.length()) + agent_name + right_part);
+ mInputEditor->setSelection(cursorPos, cursorPos + rest_of_match.length());
+ return TRUE;
+ }
+ }
+ }
+ }
+ }
return handled;
}
@@ -598,9 +671,7 @@ void LLChatBar::onInputEditorKeystroke( LLLineEditor* caller, void* userdata )
KEY key = gKeyboard->currentKey();
// Ignore "special" keys, like backspace, arrows, etc.
- if (length > 1
- && raw_text[0] == '/'
- && key < KEY_SPECIAL)
+ if (length > 1 && raw_text[0] == '/' && key < KEY_SPECIAL)
{
// we're starting a gesture, attempt to autocomplete
--
cgit v1.1
From 72faf5ba993d5540efda363ce935c46e9ff762d0 Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Mon, 13 Sep 2010 05:00:58 +0200
Subject: Added ' support for punctuation matching
---
linden/indra/newview/llfloaterchat.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llfloaterchat.cpp b/linden/indra/newview/llfloaterchat.cpp
index c956aba..b1c1356 100644
--- a/linden/indra/newview/llfloaterchat.cpp
+++ b/linden/indra/newview/llfloaterchat.cpp
@@ -456,7 +456,7 @@ void LLFloaterChat::updateSettings()
BOOL LLFloaterChat::isOwnNameInText(const std::string &text_line)
{
std::string my_name = gSavedSettings.getString("FirstName");
- std::string pattern_s = "(^|.*[,\\.\\?!:;\\*\\(\\s]+)(" + my_name + ")([,\\.\\?!:;\\*\\)\\s]+.*|$)";
+ std::string pattern_s = "(^|.*[',\\.\\?!:;\\*\\(\\s]+)(" + my_name + ")([',\\.\\?!:;\\*\\)\\s]+.*|$)";
boost::smatch what;
boost::regex e1(pattern_s, boost::regex::icase);
--
cgit v1.1
From e04a000ecbfcb03b22c463f0d409d3bbf8bc7e6e Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sun, 12 Sep 2010 23:07:34 -0700
Subject: Updated German translation, part 2, by Eryn Galen
---
.../newview/skins/default/xui/de/floater_about.xml | 2 +-
.../skins/default/xui/de/floater_about_land.xml | 110 +++---
.../default/xui/de/floater_animation_preview.xml | 30 +-
.../newview/skins/default/xui/de/floater_ao.xml | 30 +-
.../skins/default/xui/de/floater_auction.xml | 2 +-
.../skins/default/xui/de/floater_avatar_picker.xml | 2 +-
.../default/xui/de/floater_avatar_textures.xml | 10 +-
.../skins/default/xui/de/floater_beacons.xml | 8 +-
.../skins/default/xui/de/floater_build_options.xml | 27 +-
.../skins/default/xui/de/floater_bulk_perms.xml | 12 +-
.../skins/default/xui/de/floater_buy_contents.xml | 4 +-
.../skins/default/xui/de/floater_buy_currency.xml | 23 +-
.../skins/default/xui/de/floater_buy_land.xml | 34 +-
.../skins/default/xui/de/floater_buy_object.xml | 4 +-
.../skins/default/xui/de/floater_chat_history.xml | 5 +-
.../default/xui/de/floater_chatterbox-vertical.xml | 10 +
.../skins/default/xui/de/floater_chatterbox.xml | 8 +
.../skins/default/xui/de/floater_critical.xml | 2 +-
.../skins/default/xui/de/floater_customize.xml | 146 ++++++--
.../skins/default/xui/de/floater_dictionaries.xml | 11 +
.../skins/default/xui/de/floater_directory.xml | 383 ++++++++++++---------
21 files changed, 535 insertions(+), 328 deletions(-)
create mode 100644 linden/indra/newview/skins/default/xui/de/floater_chatterbox-vertical.xml
create mode 100644 linden/indra/newview/skins/default/xui/de/floater_dictionaries.xml
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/de/floater_about.xml b/linden/indra/newview/skins/default/xui/de/floater_about.xml
index f7b6e70..de0c20b 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_about.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_about.xml
@@ -1,6 +1,6 @@
- Sie befinden sich in [POSITION]
+ Sie befinden sich auf [POSITION]
diff --git a/linden/indra/newview/skins/default/xui/de/floater_about_land.xml b/linden/indra/newview/skins/default/xui/de/floater_about_land.xml
index 93e7297..4d3d61e 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_about_land.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_about_land.xml
@@ -12,13 +12,13 @@
Typ:
- Mainland / Homestead
+ Kontinent / Heimstatt
Einstufung:
- Adult
+ Erwachsen
EigentĂ¼mer:
@@ -31,8 +31,8 @@
Gruppe:
-
-
+
+
Zum Verkauf:
@@ -41,7 +41,7 @@
Nicht zu verkaufen.
- Preis: [PRICE] L$ ([PRICE_PER_SQM] L$/qm.).
+ Preis: [PRICE] [CURRENCY] ([PRICE_PER_SQM] [CURRENCY]/qm.).
@@ -59,7 +59,7 @@
Gekauft am:
- Dienstag, 15. Aug. 2006, 13:47:25
+ Die 15. Aug. 13:47:25 2006
Gebiet:
@@ -75,9 +75,9 @@
-
+
-
+
Nur neue Benutzer
@@ -110,7 +110,7 @@
(öffentlich)
- (keiner)
+ (niemand)
(Wird verkauft)
@@ -128,19 +128,19 @@
Name:
- Mainland
+ Kontinent
EigentĂ¼mer:
- (keiner)
+ (niemand)
FĂ¼r dieses GrundstĂ¼ck fehlt der Vertrag.
- Letzte Ă„nderung am Mittwoch, den 31. Dez. 1969, 16:00:00
+ Letzte Ă„nderung am Mittwoch 31. Dez. 1969, 16:00:00
Region:
@@ -155,13 +155,13 @@
Typ:
- Mainland / Homestead
+ Kontinent / Heimstatt
Einstufung:
- Adult
+ Erwachsen
Wiederverkauf:
@@ -173,22 +173,22 @@
Unterteilen:
- Land in dieser Region kann nicht zusammengelegt/geteilt
-werden.
+ Land in dieser Region kann nicht zusammengelegt/geteilt werden.
Gekauftes Land in dieser Region kann wiederverkauft werden.
- Gekauftes Land in dieser Region kann nicht wiederverkauft werden.
+ Gekauftes Land in dieser Region kann nicht wiederverkauft
+werden.
- Gekauftes Land in dieser Region kann zusammengelegt und
+ Gekauftes Land in dieser Region kann zusammengelegt oder
geteilt werden.
- Gekauftes Land in dieser Region kann nicht zusammengelegt
-und geteilt werden.
+ Gekauftes Land in dieser Region kann nicht zusammengelegt oder
+geteilt werden.
@@ -196,7 +196,7 @@ und geteilt werden.
Objektbonusfaktor in Region: [BONUS]
- Primitive in Simulator:
+ Primitiva in Simulator:
[COUNT] von [MAX] ([AVAILABLE] verfĂ¼gbar)
@@ -244,7 +244,7 @@ und geteilt werden.
- Ausgewählt/gesessen auf:
+ Ausgewählt / gesessen auf:
[COUNT]
@@ -261,7 +261,7 @@ und geteilt werden.
-
+
@@ -269,8 +269,8 @@ und geteilt werden.
Anderen Einwohnern gestatten:
-
-
+
+
Objekte erstellen:
@@ -283,16 +283,16 @@ und geteilt werden.
- Skripts ausfĂ¼hren:
+ Skripte ausfĂ¼hren:
Landoptionen:
-
-
-
+
+
+
Diese Parzelle in Suchergebnissen anzeigen.
@@ -305,25 +305,25 @@ Nur groĂŸe Parzellen können in der Suche aufgefĂ¼hrt werden.
- Alle Kategorien
+ Jede Kategorie
- Lindenort
+ Linden Position
- Adult
+ Erwachsen
Kunst & Kultur
- Business
+ Gewerbe
Bildung
- Spielen
+ Spiele
Treffpunkt
@@ -332,13 +332,13 @@ Nur groĂŸe Parzellen können in der Suche aufgefĂ¼hrt werden.
Anfängergerecht
- Parks und Natur
+ Parks & Natur
Wohngebiet
- Shopping
+ Einkaufen
Sonstige
@@ -346,22 +346,22 @@ Nur groĂŸe Parzellen können in der Suche aufgefĂ¼hrt werden.
- Alle Kategorien
+ Jede Kategorie
- Lindenort
+ Linden Position
- Kunst und Kultur
+ Kunst & Kultur
- Business
+ Gewerbe
Bildung
- Spielen
+ Spiele
Treffpunkt
@@ -370,31 +370,31 @@ Nur groĂŸe Parzellen können in der Suche aufgefĂ¼hrt werden.
Anfängergerecht
- Parks und Natur
+ Parks & Natur
Wohngebiet
- Shopping
+ Einkaufen
Sonstige
-
+
- Mature-Inhalt
+ Reifer Inhalt
- Adult-Inhalt
+ Erwachsenen-Inhalt
- Die Informationen oder Inhalte Ihrer Parzelle sind â€Mature“.
+ Die Informationen oder Inhalte Ihrer Parzelle sind als â€Reif“ klassifiziert.
- Die Informationen oder Inhalte Ihrer Parzelle sind â€Adult“.
+ Die Informationen oder Inhalte Ihrer Parzelle sind als â€Erwachsen“ klassifiziert.
Foto:
@@ -406,7 +406,7 @@ Nur groĂŸe Parzellen können in der Suche aufgefĂ¼hrt werden.
(keiner)
-
+
Teleport-Route:
@@ -433,7 +433,7 @@ Nur groĂŸe Parzellen können in der Suche aufgefĂ¼hrt werden.
Medientyp:
-
+
Medien-URL:
@@ -496,7 +496,7 @@ Optionen:
Eine oder mehrere dieser Optionen gelten auf GrundstĂ¼cksebene
-
+
Jeden
@@ -505,18 +505,18 @@ Optionen:
Gruppe
-
-
+
+
Zulässige Einwohner
-
+
Verbannte Einwohner
-
+
diff --git a/linden/indra/newview/skins/default/xui/de/floater_animation_preview.xml b/linden/indra/newview/skins/default/xui/de/floater_animation_preview.xml
index 299b6a7..d25a031 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_animation_preview.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_animation_preview.xml
@@ -14,7 +14,7 @@
Handhaltung
-
+
Dehnen
@@ -22,7 +22,7 @@
Entspannt
- Beide zeigen
+ Beide zeigend
Faust
@@ -31,7 +31,7 @@
Links entspannt
- Nach links zeigen
+ Links zeigend
Linke Faust
@@ -40,7 +40,7 @@
Rechts entspannt
- Nach rechts zeigen
+ Rechts zeigend
Rechte Faust
@@ -52,7 +52,7 @@
Tippt
- Friedensrecht
+ Friedenszeichen rechts
@@ -72,7 +72,7 @@
Verärgert
- Grinst
+ Grinsen
Gelangweilt
@@ -99,7 +99,7 @@
Bäääh
- ZurĂ¼ckgestoĂŸen
+ Abgestoen
Traurig
@@ -128,27 +128,27 @@
Stehend
- Geht
+ Gehend
- Sitzt
+ Sitzend
Fliegend
-
-
-
-
+
+
+
+
Animationsdatei konnte nicht gelesen werden.
-Wir empfehlen exportierte BVH-Dateien aus Poser 4.
+Wir empfehlen aus Poser 4 exportierte BVH-Dateien.
-
+
Bewegung konnte nicht initialisiert werden
diff --git a/linden/indra/newview/skins/default/xui/de/floater_ao.xml b/linden/indra/newview/skins/default/xui/de/floater_ao.xml
index c0731ea..f080bb2 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_ao.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_ao.xml
@@ -2,28 +2,28 @@
-
- ZHAO II Konfiguration hier fallen lassen.
+
+ ZHAO II Konfiguration hier einstellen.
- Aktuell: ITEM
+ Aktuell festgesetzt: ITEM
-
+
-
-
+
+
- Stand:
+ Stände:
-
-
-
+
+
+
@@ -39,7 +39,7 @@
- Standard sitzen:
+ Standard Sitz:
@@ -47,19 +47,19 @@
- Standard geduckt:
+ Standard Hocke:
- Standard geduckt Gang:
+ Standard geduckter Gang:
- Standard fallen:
+ Standard Fall:
- Standard scheweben:
+ Standard Schweben:
diff --git a/linden/indra/newview/skins/default/xui/de/floater_auction.xml b/linden/indra/newview/skins/default/xui/de/floater_auction.xml
index 42f6a07..3117222 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_auction.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_auction.xml
@@ -4,6 +4,6 @@
- Parzellen, die bereits zum Verkauf stehen, können nicht auktioniert werden.
+ Parzellen, die bereits zum Verkauf stehen, können nicht versteigert werden.
diff --git a/linden/indra/newview/skins/default/xui/de/floater_avatar_picker.xml b/linden/indra/newview/skins/default/xui/de/floater_avatar_picker.xml
index c546d91..3d40c60 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_avatar_picker.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_avatar_picker.xml
@@ -7,7 +7,7 @@
Einwohners ein:
-
+
diff --git a/linden/indra/newview/skins/default/xui/de/floater_avatar_textures.xml b/linden/indra/newview/skins/default/xui/de/floater_avatar_textures.xml
index 823d6de..49159cd 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_avatar_textures.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_avatar_textures.xml
@@ -6,26 +6,26 @@
Zusammengesetzte Texturen
-
+
-
+
-
+
-
+
-
+
diff --git a/linden/indra/newview/skins/default/xui/de/floater_beacons.xml b/linden/indra/newview/skins/default/xui/de/floater_beacons.xml
index 0992727..37b3a98 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_beacons.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_beacons.xml
@@ -1,15 +1,15 @@
-
+
-
-
+
+
- Beacon-Breite:
+ Leitstrahl-Breite:
diff --git a/linden/indra/newview/skins/default/xui/de/floater_build_options.xml b/linden/indra/newview/skins/default/xui/de/floater_build_options.xml
index de3617e..0541116 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_build_options.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_build_options.xml
@@ -1,8 +1,27 @@
-
-
-
-
+
+
+ Rasteroptionen:
+
+
+
+
+ ObjektgrĂ¶ĂŸe:
+
+
+
+
+ Angelpunkt der Achsen:
+
+
+
+
+
+
+
+
+
+
diff --git a/linden/indra/newview/skins/default/xui/de/floater_bulk_perms.xml b/linden/indra/newview/skins/default/xui/de/floater_bulk_perms.xml
index f058a0e..828a72b 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_bulk_perms.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_bulk_perms.xml
@@ -1,5 +1,5 @@
-
+
Inhaltsarten
@@ -10,8 +10,8 @@
-
-
+
+
@@ -19,7 +19,7 @@
Neue Berechtigungen
-
+
Nächster EigentĂ¼mer kann:
@@ -36,9 +36,9 @@
Berechtigungen werden eingestellt auf [NAME]
- Start: Anforderung auf Ă„nderung der Berechtigung...
+ Start: Anforderung auf Ă„nderung der Berechtigungen...
- Ende: Anforderung auf Ă„nderung der Berechtigung.
+ Ende: Anforderung auf Ă„nderung der Berechtigungen.
diff --git a/linden/indra/newview/skins/default/xui/de/floater_buy_contents.xml b/linden/indra/newview/skins/default/xui/de/floater_buy_contents.xml
index 01858b3..8424a7f 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_buy_contents.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_buy_contents.xml
@@ -4,7 +4,7 @@
[NAME] enthält:
- [AMOUNT] L$ von [NAME] kaufen?
+ FĂ¼r[CURRENCY][AMOUNT] von [NAME] kaufen?
@@ -16,6 +16,6 @@
(kein Bearbeiten)
- (kein Transferieren)
+ (kein Ăœbertragen)
diff --git a/linden/indra/newview/skins/default/xui/de/floater_buy_currency.xml b/linden/indra/newview/skins/default/xui/de/floater_buy_currency.xml
index 787f469..d678327 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_buy_currency.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_buy_currency.xml
@@ -14,22 +14,22 @@
- LindeX wird kontaktiert...
+ Geldwechsler wird kontaktiert...
- L$ an der LindeX kaufen
+ [CURRENCY] am Geldwechsler kaufen
- [NAME] L$ [PRICE]
+ [NAME] [CURRENCY] [PRICE]
- L$ kaufen
+ [CURRENCY] kaufen
1234
- fĂ¼r ca. [USD] US$
+ fĂ¼r ca. [REALCURRENCY] [USD]
Daten werden geladen...
@@ -38,31 +38,32 @@
Sie haben zurzeit
- [AMT] L$
+ [AMT] [CURRENCY]
Sie kaufen
- [AMT] L$
+ [AMT] [CURRENCY]
Ihr neuer Kontostand:
- [AMT] L$
+ [AMT] [CURRENCY]
- Dieser Einkauf betrifft ausschlieĂŸlich Geld.
+ Bestätigen dieses Kaufs erwirbt ausschlieĂŸlich Geld.
Wiederholen Sie den Vorgang.
Sie kaufen nicht genĂ¼gend Geld.
-Kaufen Sie mehr.
+Erhöhen Sie den Betrag.
- [LINDENS] L$ fĂ¼r ca. [USD] US$ kaufen
+ [CURRENCY] [LINDENS] fĂ¼r ca. [REALCURRENCY] [USD]
+kaufen
diff --git a/linden/indra/newview/skins/default/xui/de/floater_buy_land.xml b/linden/indra/newview/skins/default/xui/de/floater_buy_land.xml
index 44ae6b0..c929470 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_buy_land.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_buy_land.xml
@@ -31,7 +31,7 @@
Wiederverkauf möglich oder nicht möglich.
- Darft oder darf nicht zusammengelegt/unterteilt werden.
+ Darf oder darf nicht zusammengelegt/unterteilt werden.
Sie mĂ¼ssen dem GrundstĂ¼cksvertrag zustimmen:
@@ -99,7 +99,7 @@ Diese Parzelle ist 512 qm groĂŸ.
Sie haben 2.100 L$.
- Mehr L$ kaufen
+ Mehr [CURRENCY] kaufen
1000
@@ -114,10 +114,10 @@ Diese Parzelle ist 512 qm groĂŸ.
- Verkauf möglich.
+ Weiterverkauf möglich.
- Verkauf nicht möglich.
+ Weiterverkauf nicht möglich.
Zusammenlegen/unterteilen möglich.
@@ -126,7 +126,7 @@ Diese Parzelle ist 512 qm groĂŸ.
Zusammenlegen/unterteilen nicht möglich.
- Sie sind nicht berechtigt, Land fĂ¼r die aktive Gruppe zu kaufen.
+ Sie sind nicht berechtigt, Land fĂ¼r Ihre aktive Gruppe zu kaufen.
Kein Land ausgewählt.
@@ -136,7 +136,7 @@ Diese Parzelle ist 512 qm groĂŸ.
Verkleinern Sie Ihre Auswahl.
- Sie sind nicht berechtigt, Land fĂ¼r die aktive Gruppe zu kaufen.
+ Sie sind nicht berechtigt, Land fĂ¼r Ihre aktive Gruppe zu kaufen.
Die ausgewählte Parzelle steht nicht zum Verkauf.
@@ -169,7 +169,7 @@ Verkleinern Sie Ihre Auswahl.
Bei Landkauf:
- Landkauf fĂ¼r Gruppe:
+ Bei Landkauf fĂ¼r Gruppe:
Kaufen jetzt nicht möglich:
@@ -181,7 +181,7 @@ Verkleinern Sie Ihre Auswahl.
nicht benötigt
- Sie mĂ¼ssen Ihr Konto upgraden, um Land kaufen zu können.
+ Sie mĂ¼ssen Ihr Konto erweitern, um Land kaufen zu können.
Mit Ihrem Konto können Sie Land kaufen.
@@ -190,10 +190,10 @@ Verkleinern Sie Ihre Auswahl.
Sie besitzen [BUYER] qm Land.
- [SELLER] [AMOUNT] L$ fĂ¼r das Land bezahlen
+ [SELLER] [AMOUNT] [CURRENCY] fĂ¼r das Land bezahlen
- [AMOUNT] L$ fĂ¼r circa [AMOUNT2] US$ kaufen,
+ [AMOUNT] [CURRENCY] fĂ¼r circa [AMOUNT2] US$ kaufen,
Diese Parzelle ist [AMOUNT] qm groĂŸ.
@@ -215,29 +215,29 @@ unterstĂ¼tzt [AMOUNT2] Objekte
Objekte nicht im Verkauf mit eingeschlossen
- [PRICE] L$
-([PRICE_PER_SQM] L$/qm)
+ [PRICE] [CURRENCY]
+([PRICE_PER_SQM] [CURRENCY] /qm)
[SOLD_WITH_OBJECTS]
Die Gruppe [GROUP] benötigt ausreichende gespendete Landnutzungsrechte, um die Parzelle abzudecken, bevor der Kauf abgeschlossen werden kann.
- Sie haben [AMOUNT] L$, genug zum Kauf dieses Landes.
+ Sie haben [AMOUNT] [CURRENCY], genug zum Kauf dieses Landes.
- Sie haben nur [AMOUNT] L$, brauchen aber mindestens [AMOUNT2] L$.
+ Sie haben nur [AMOUNT] [CURRENCY] , brauchen aber mindestens [AMOUNT2] [CURRENCY] .
- Nach dem Einkauf verbleiben Ihnen noch [AMOUNT] L$.
+ Nach dem Einkauf verbleiben Ihnen noch [AMOUNT] [CURRENCY].
- FĂ¼r dieses Land mĂ¼ssen Sie mindestens [AMOUNT] L$ kaufen.
+ FĂ¼r dieses Land mĂ¼ssen Sie mindestens [AMOUNT] [CURRENCY] kaufen.
(keine Parzelle ausgewählt)
- [LINDENS] L$ fĂ¼r ca. [USD] US$ kaufen
+ [LINDENS] [CURRENCY] fĂ¼r ca. [USD] US$ kaufen
diff --git a/linden/indra/newview/skins/default/xui/de/floater_buy_object.xml b/linden/indra/newview/skins/default/xui/de/floater_buy_object.xml
index 3cfa59f..1ec4b4b 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_buy_object.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_buy_object.xml
@@ -4,7 +4,7 @@
samt Inhalt:
- [AMOUNT] L$ von [NAME] kaufen?
+ Von [NAME] fĂ¼r [AMOUNT] [CURRENCY] kaufen?
@@ -21,6 +21,6 @@
(kein Bearbeiten)
- (kein Transferieren)
+ (kein Ăœbertragen)
diff --git a/linden/indra/newview/skins/default/xui/de/floater_chat_history.xml b/linden/indra/newview/skins/default/xui/de/floater_chat_history.xml
index d5370dc..fb136f8 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_chat_history.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_chat_history.xml
@@ -28,7 +28,7 @@
Dem Objekt â€[OBJECTNAME]“, ein Objekt von â€[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung verweigert: [PERMISSIONS].
- Linden-Dollar (L$) von Ihnen nehmen
+ Geld von Ihnen nehmen
Steuerung festlegen
@@ -68,11 +68,14 @@
+
Gesten
+
diff --git a/linden/indra/newview/skins/default/xui/de/floater_chatterbox-vertical.xml b/linden/indra/newview/skins/default/xui/de/floater_chatterbox-vertical.xml
new file mode 100644
index 0000000..de51ecc
--- /dev/null
+++ b/linden/indra/newview/skins/default/xui/de/floater_chatterbox-vertical.xml
@@ -0,0 +1,10 @@
+
+
+
+ Ungelesene IM
+
+
+ Ungelesene IMs
+
+
+
diff --git a/linden/indra/newview/skins/default/xui/de/floater_chatterbox.xml b/linden/indra/newview/skins/default/xui/de/floater_chatterbox.xml
index 548b615..de51ecc 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_chatterbox.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_chatterbox.xml
@@ -1,2 +1,10 @@
+
+ Ungelesene IM
+
+
+ Ungelesene IMs
+
+
+
diff --git a/linden/indra/newview/skins/default/xui/de/floater_critical.xml b/linden/indra/newview/skins/default/xui/de/floater_critical.xml
index 0b14792..d18d7d4 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_critical.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_critical.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/linden/indra/newview/skins/default/xui/de/floater_customize.xml b/linden/indra/newview/skins/default/xui/de/floater_customize.xml
index b27e5d2..c528b61 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_customize.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_customize.xml
@@ -1,7 +1,7 @@
-
+
@@ -12,8 +12,8 @@
-
-
+
+
Weiblich
@@ -51,10 +51,11 @@ und diese anziehen.
+
-
+
[DESC]
@@ -82,9 +83,9 @@ und diese anziehen.
Haut:
-
-
-
+
+
+
@@ -121,7 +122,7 @@ und diese anziehen.
Haare:
-
+
@@ -154,7 +155,7 @@ und diese anziehen.
Augen:
-
+
@@ -162,8 +163,8 @@ und diese anziehen.
-
-
+
+
@@ -197,8 +198,8 @@ und dieses anziehen.
-
-
+
+
@@ -258,8 +259,8 @@ und diese anziehen.
Schuhe:
-
-
+
+
@@ -328,9 +329,9 @@ und diese anziehen.
Jacke:
-
-
-
+
+
+
@@ -364,8 +365,8 @@ und diese anziehen.
Handschuhe:
-
-
+
+
@@ -399,8 +400,8 @@ und dieses anziehen.
Unterhemd:
-
-
+
+
@@ -434,8 +435,8 @@ und diese anziehen.
Unterhose:
-
-
+
+
@@ -469,16 +470,105 @@ und diesen anziehen.
Rock:
-
-
+
+
+
+
+ [DESC]
+
+
+ [DESC]: bearbeiten nicht möglich
+
+
+ [DESC]: wird geladen...
+
+
+ [DESC]: nicht getragen
+
+
+ In [PATH]
+
+
+ Ziehen Sie eine Tätowierung aus dem Inventar auf Ihren Avatar,
+um ihn zu tragen. Sie können auch eine neuen Tätowierung erstellen
+und diese anziehen.
+
+
+ Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
+
+
+ Tätowierung:
+
+
+
+
+
+
+
+
+
+
+
+ [DESC]
+
+
+ [DESC]: bearbeiten nicht möglich
+
+
+ [DESC]: wird geladen...
+
+
+ [DESC]: nicht getragen
+
+
+ In [PATH]
+
+
+ Ziehen Sie eine Transparenz-Maske aus dem Inventar auf Ihren Avatar,
+um ihn zu tragen. Sie können auch eine neue Maske erstellen
+und diese anziehen.
+
+
+ Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
+
+
+ Transparenz:
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+ Avatar GrĂ¶ĂŸe:
+
+
+ Avatar GrĂ¶ĂŸe
+
+
+ Avatar GrĂ¶ĂŸe2
+
+
+ (inkl. Schuhe)
+
+
+
+
+
+
diff --git a/linden/indra/newview/skins/default/xui/de/floater_dictionaries.xml b/linden/indra/newview/skins/default/xui/de/floater_dictionaries.xml
new file mode 100644
index 0000000..8c034b9
--- /dev/null
+++ b/linden/indra/newview/skins/default/xui/de/floater_dictionaries.xml
@@ -0,0 +1,11 @@
+
+
+
+Unten stehend ist eine Liste weiterer WörterbĂ¼cher, die
+von der Imprudence Internetseite heruntergeladen
+werden können.
+
+Suchen Sie bitte das GewĂ¼nschte aus und klicken Sie
+auf die Schaltfläche â€Herunterladen“.
+
+
\ No newline at end of file
diff --git a/linden/indra/newview/skins/default/xui/de/floater_directory.xml b/linden/indra/newview/skins/default/xui/de/floater_directory.xml
index c3bc8f0..2c61c75 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_directory.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_directory.xml
@@ -1,6 +1,37 @@
-
-
+
+
+
+
+ Suchen...
+
+
+ Nicht gefunden.
+
+
+
+
+ Finden:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Suchen...
@@ -9,13 +40,14 @@
Nicht gefunden.
- Suchen:
+ Finden:
-
+
+
Alle Kategorien
@@ -35,10 +67,12 @@
Wiki
-
-
-
-
+
+
+
+
+
+
Wird geladen...
@@ -48,7 +82,8 @@
http://secondlife.com/app/search/notfound.html
-
+ "http://secondlife.com/app/search/index.php?"
+
Suchen...
@@ -57,41 +92,41 @@
Nicht gefunden.
- Suchen:
+ Finden:
-
-
-
-
+
+
+
+
-
+
Alle Kategorien
-
- Shopping
+
+ Einkaufen
-
+
Land mieten
-
- Immobilie mieten
+
+ GrundstĂ¼ck mieten
-
+
Attraktionen
-
+
Neue Produkte
-
- Stellenangebote
+
+ Stellenangebote
-
- Gesucht
+
+ Gesucht
-
+
Dienstleistungen
-
+
Persönlich
@@ -100,15 +135,17 @@
-
-
-
-
+
+
+
+
-
-
+
+
+
-
+
Suchen...
@@ -116,9 +153,9 @@
Nicht gefunden.
- Suchen:
+ Finden:
-
+
Stattfindend und anstehend
@@ -127,14 +164,14 @@
Datum
-
+
6/6
-
-
+
+
- Kategorie:
+ Kategorie:
@@ -174,21 +211,23 @@
Sonstiges
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
+
+
+
@@ -199,13 +238,18 @@
+
+
+
Wird geladen...
Fertig
-
+ http://secondlife.com/app/search/notfound.html
+ "http://secondlife.com/app/showcase/index.php?"
+
Suchen...
@@ -214,15 +258,16 @@
Nicht gefunden.
- Land kann direkt fĂ¼r Linden Dollar (L$) oder bei einer Auktion fĂ¼r L$ oder US$ erworben werden.
+ Land kann direkt fĂ¼r in-Welt Geld oder bei einer Auktion fĂ¼r echtes oder in-Welt Geld erworben werden.
Um direkt zu kaufen, klicken Sie auf dem betreffenden Land in der Titelleiste auf den Namen.
-
- Suchen:
+
+ Finden:
-
-
-
+
+
+
+
Alle Typen
@@ -234,31 +279,33 @@ Um direkt zu kaufen, klicken Sie auf dem betreffenden Land in der Titelleiste au
Verkauf - Mainland
- Verkauf - Immobilien
+ Verkauf - GrundstĂ¼ck
-
-
- L$
-
-
-
- qm
+
+
+ [CURRENCY]
+
+
+
+ m²
-
-
-
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
+
+
+
@@ -268,145 +315,163 @@ Um direkt zu kaufen, klicken Sie auf dem betreffenden Land in der Titelleiste au
Nicht gefunden.
- Suchen:
+ Finden:
-
-
-
-
+
+
+
+
-
+
Alle Kategorien
-
- Lindenort
+
+ Linden-Position
-
- Kunst und Kultur
+
+ Kunst & Kultur
-
- Business
+
+ Gewerbe
-
+
Bildung
-
+
Spielen
-
+
Treffpunkt
-
+
Anfängergerecht
-
- Parks und Natur
+
+ Parks & Natur
-
+
Wohngebiet
-
- Shopping
+
+ Einkaufen
-
+
Sonstige
-
-
+
+
+
Alle Kategorien
-
- Lindenort
+
+ Linden-Position
-
- Adult
+
+ Erwachsen
-
+
Kunst & Kultur
-
- Business
+
+ Gewerbe
-
+
Bildung
-
+
Spielen
-
+
Treffpunkt
-
+
Anfängergerecht
-
- Parks und Natur
+
+ Parks & Natur
-
+
Wohngebiet
-
- Shopping
+
+ Einkaufen
-
+
Sonstige
-
+
-
-
-
-
+
+
+
+
-
-
+
+
+
-
+
Suchen...
Nicht gefunden.
-
- Suchen:
-
-
-
-
-
-
-
-
-
-
+
+ Finden:
+
+
+
+
+
+
+
+
+
+
+
-
+
Suchen...
Nicht gefunden.
-
- Suchen:
+
+
+
+ Finden:
-
-
-
-
-
-
-
-
- Wird geladen...
-
-
- Fertig
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
--
cgit v1.1
From eb8a075b070d2e718c5bb9113490ca0b7626592e Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Mon, 13 Sep 2010 11:57:42 -0700
Subject: Added the 'Add Friend' option to IMs and fixed the Group Profile
button showing the wrong profile (#514)
---
linden/indra/newview/llimpanel.cpp | 52 +++++++++++++++-------
linden/indra/newview/llimpanel.h | 12 +++++
.../default/xui/da/floater_instant_message.xml | 3 ++
.../default/xui/de/floater_instant_message.xml | 3 ++
.../default/xui/en-us/floater_instant_message.xml | 3 ++
.../default/xui/es/floater_instant_message.xml | 3 ++
.../default/xui/fr/floater_instant_message.xml | 3 ++
.../default/xui/hu/floater_instant_message.xml | 3 ++
.../default/xui/it/floater_instant_message.xml | 3 ++
.../default/xui/ja/floater_instant_message.xml | 3 ++
.../default/xui/ko/floater_instant_message.xml | 3 ++
.../default/xui/pl/floater_instant_message.xml | 3 ++
.../default/xui/pt/floater_instant_message.xml | 3 ++
.../default/xui/ru/floater_instant_message.xml | 3 ++
.../default/xui/tr/floater_instant_message.xml | 3 ++
.../default/xui/uk/floater_instant_message.xml | 3 ++
.../default/xui/zh/floater_instant_message.xml | 5 ++-
17 files changed, 95 insertions(+), 16 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llimpanel.cpp b/linden/indra/newview/llimpanel.cpp
index 6cf7ffb..797e997 100644
--- a/linden/indra/newview/llimpanel.cpp
+++ b/linden/indra/newview/llimpanel.cpp
@@ -59,6 +59,7 @@
#include "llfloateractivespeakers.h"
#include "llfloateravatarinfo.h"
#include "llfloaterchat.h"
+#include "llfloaterfriends.h"
#include "llkeyboard.h"
#include "lllineeditor.h"
#include "llmenucommands.h"
@@ -1133,7 +1134,8 @@ LLFloaterIMPanel::LLFloaterIMPanel(
mSpeakers(NULL),
mSpeakerPanel(NULL),
mFirstKeystrokeTimer(),
- mLastKeystrokeTimer()
+ mLastKeystrokeTimer(),
+ mIMPanelType(IM_PANEL_PLAIN)
{
mSessionInitialTargetIDs = ids;
init(session_label);
@@ -1151,27 +1153,32 @@ void LLFloaterIMPanel::init(const std::string& session_label)
mFactoryMap["active_speakers_panel"] = LLCallbackMap(createSpeakersPanel, this);
xml_filename = "floater_instant_message_group.xml";
mVoiceChannel = new LLVoiceChannelGroup(mSessionUUID, mSessionLabel);
+ mIMPanelType = IM_PANEL_GROUP;
break;
case IM_SESSION_INVITE:
mFactoryMap["active_speakers_panel"] = LLCallbackMap(createSpeakersPanel, this);
if (gAgent.isInGroup(mSessionUUID))
{
xml_filename = "floater_instant_message_group.xml";
+ mIMPanelType = IM_PANEL_GROUP;
}
else // must be invite to ad hoc IM
{
xml_filename = "floater_instant_message_ad_hoc.xml";
+ mIMPanelType = IM_PANEL_CONFERENCE;
}
mVoiceChannel = new LLVoiceChannelGroup(mSessionUUID, mSessionLabel);
break;
case IM_SESSION_P2P_INVITE:
xml_filename = "floater_instant_message.xml";
mVoiceChannel = new LLVoiceChannelP2P(mSessionUUID, mSessionLabel, mOtherParticipantUUID);
+ mIMPanelType = IM_PANEL_PLAIN;
break;
case IM_SESSION_CONFERENCE_START:
mFactoryMap["active_speakers_panel"] = LLCallbackMap(createSpeakersPanel, this);
xml_filename = "floater_instant_message_ad_hoc.xml";
mVoiceChannel = new LLVoiceChannelGroup(mSessionUUID, mSessionLabel);
+ mIMPanelType = IM_PANEL_CONFERENCE;
break;
// just received text from another user
case IM_NOTHING_SPECIAL:
@@ -1183,10 +1190,12 @@ void LLFloaterIMPanel::init(const std::string& session_label)
mCallBackEnabled = LLVoiceClient::getInstance()->isSessionCallBackPossible(mSessionUUID);
mVoiceChannel = new LLVoiceChannelP2P(mSessionUUID, mSessionLabel, mOtherParticipantUUID);
+ mIMPanelType = IM_PANEL_PLAIN;
break;
default:
llwarns << "Unknown session type" << llendl;
xml_filename = "floater_instant_message.xml";
+ mIMPanelType = IM_PANEL_PLAIN;
break;
}
@@ -1296,6 +1305,14 @@ BOOL LLFloaterIMPanel::postBuild()
// Profile combobox in floater_instant_message.xml
childSetCommitCallback("profile_callee_btn", onCommitCombo, this);
+ LLComboBox* comboBox = getChild("profile_callee_btn");
+ if (LLAvatarTracker::instance().getBuddyInfo(mOtherParticipantUUID) == NULL)
+ {
+ comboBox->add(getString("add_friend_string"), ADD_TOP);
+ }
+ comboBox->setCommitCallback(onCommitCombo);
+ comboBox->setCallbackUserData(this);
+
childSetCommitCallback("group_info_btn", onCommitCombo, this);
childSetAction("start_call_btn", onClickStartCall, this);
@@ -1875,27 +1892,32 @@ void LLFloaterIMPanel::onCommitCombo(LLUICtrl* caller, void* userdata)
}
}
}
- else if (caller->getValue().asString() == "pay_entry")
- {
- handle_pay_by_id(self->getOtherParticipantID());
- }
- else if (caller->getValue().asString() == "teleport_entry")
- {
- handle_lure(self->getOtherParticipantID());
- }
- else
+ // profile
+ else if (self->getIMType() == IM_PANEL_PLAIN)
{
- // group
- if (self->getOtherParticipantID() == self->getSessionID())
+ if (caller->getValue().asString() == "pay_entry")
{
- LLFloaterGroupInfo::showFromUUID(self->getSessionID());
+ handle_pay_by_id(self->getOtherParticipantID());
}
- // profile
- else
+ else if (caller->getValue().asString() == "teleport_entry")
+ {
+ handle_lure(self->getOtherParticipantID());
+ }
+ else if (caller->getValue().asString() == self->getString("add_friend_string"))
+ {
+ std::string fullname = self->getTitle();
+ LLPanelFriends::requestFriendshipDialog(self->getOtherParticipantID(), fullname);
+ }
+ else
{
LLFloaterAvatarInfo::showFromDirectory(self->getOtherParticipantID());
}
}
+ // group
+ else if (self->getIMType() == IM_PANEL_GROUP)
+ {
+ LLFloaterGroupInfo::showFromUUID(self->getSessionID());
+ }
}
}
diff --git a/linden/indra/newview/llimpanel.h b/linden/indra/newview/llimpanel.h
index 5887095..ddcbdc7 100644
--- a/linden/indra/newview/llimpanel.h
+++ b/linden/indra/newview/llimpanel.h
@@ -364,6 +364,18 @@ private:
typedef std::map styleMap;
static styleMap mStyleMap;
+
+ typedef enum e_im_format
+ {
+ IM_PANEL_PLAIN,
+ IM_PANEL_GROUP,
+ IM_PANEL_CONFERENCE
+ } EIMPanelType;
+
+ EIMPanelType mIMPanelType;
+
+public:
+ EIMPanelType getIMType() { return mIMPanelType; }
};
diff --git a/linden/indra/newview/skins/default/xui/da/floater_instant_message.xml b/linden/indra/newview/skins/default/xui/da/floater_instant_message.xml
index 9b695b5..27dbdcb 100644
--- a/linden/indra/newview/skins/default/xui/da/floater_instant_message.xml
+++ b/linden/indra/newview/skins/default/xui/da/floater_instant_message.xml
@@ -33,6 +33,9 @@
Tekst chat er ikke tilgængeligt i dette opkald.
+
+ Tilføj ven
+
diff --git a/linden/indra/newview/skins/default/xui/de/floater_instant_message.xml b/linden/indra/newview/skins/default/xui/de/floater_instant_message.xml
index 1e926c4..ea822e4 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_instant_message.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_instant_message.xml
@@ -33,6 +33,9 @@
FĂ¼r diese Verbindung ist kein Text-Chat verfĂ¼gbar.
+
+ Freund hinzufĂ¼gen
+
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml b/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml
index cf2a457..5e81525 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml
@@ -37,6 +37,9 @@
Text chat is not available for this call.
+
+ Add Friend
+
diff --git a/linden/indra/newview/skins/default/xui/es/floater_instant_message.xml b/linden/indra/newview/skins/default/xui/es/floater_instant_message.xml
index 30b23d1..68ed9c6 100644
--- a/linden/indra/newview/skins/default/xui/es/floater_instant_message.xml
+++ b/linden/indra/newview/skins/default/xui/es/floater_instant_message.xml
@@ -33,6 +33,9 @@
Para esta llamada no estĂ¡ disponible el chat de texto.
+
+ Añadir como amigo
+
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_instant_message.xml b/linden/indra/newview/skins/default/xui/fr/floater_instant_message.xml
index 926483b..89b6cb2 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_instant_message.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_instant_message.xml
@@ -33,6 +33,9 @@
Le chat Ă©crit n'est pas disponible pour cet appel.
+
+ Devenir amis
+
diff --git a/linden/indra/newview/skins/default/xui/hu/floater_instant_message.xml b/linden/indra/newview/skins/default/xui/hu/floater_instant_message.xml
index 3469323..09c7af6 100644
--- a/linden/indra/newview/skins/default/xui/hu/floater_instant_message.xml
+++ b/linden/indra/newview/skins/default/xui/hu/floater_instant_message.xml
@@ -33,6 +33,9 @@
Szöveges Ă¼zenetkĂ¼ldĂ©s nem elĂ©rhetÅ‘ a jelenlegi hĂvĂ¡s alatt.
+
+ BarĂ¡tokhoz ad
+
diff --git a/linden/indra/newview/skins/default/xui/it/floater_instant_message.xml b/linden/indra/newview/skins/default/xui/it/floater_instant_message.xml
index 7bdc046..511dac5 100644
--- a/linden/indra/newview/skins/default/xui/it/floater_instant_message.xml
+++ b/linden/indra/newview/skins/default/xui/it/floater_instant_message.xml
@@ -33,6 +33,9 @@
La chat di testo non è disponibile in questa chiamata.
+
+ Aggiungi come amico
+
diff --git a/linden/indra/newview/skins/default/xui/ja/floater_instant_message.xml b/linden/indra/newview/skins/default/xui/ja/floater_instant_message.xml
index c9de54e..8bba7e3 100644
--- a/linden/indra/newview/skins/default/xui/ja/floater_instant_message.xml
+++ b/linden/indra/newview/skins/default/xui/ja/floater_instant_message.xml
@@ -33,6 +33,9 @@
ă“ă®ă‚³ăƒ¼ăƒ«ă§ă¯æ–‡å—ăƒăƒ£ăƒƒăƒˆăŒåˆ©ç”¨ă§ăă¾ă›ă‚“。
+
+ ăƒ•ăƒ¬ăƒ³ăƒ‰ă«è¿½å
+
diff --git a/linden/indra/newview/skins/default/xui/ko/floater_instant_message.xml b/linden/indra/newview/skins/default/xui/ko/floater_instant_message.xml
index f1d0a48..68284be 100644
--- a/linden/indra/newview/skins/default/xui/ko/floater_instant_message.xml
+++ b/linden/indra/newview/skins/default/xui/ko/floater_instant_message.xml
@@ -21,6 +21,9 @@
ë©”́‹ ́ €ë¥¼ ́‚¬́©í•˜ë ¤ë©´ ́—¬ê¸°ë¥¼ í´ë¦í•˜́‹́‹œ́˜¤.
+
+ ́¹œêµ¬ ́¶”ê°€
+
diff --git a/linden/indra/newview/skins/default/xui/pl/floater_instant_message.xml b/linden/indra/newview/skins/default/xui/pl/floater_instant_message.xml
index 1d918b8..40b7c6e 100755
--- a/linden/indra/newview/skins/default/xui/pl/floater_instant_message.xml
+++ b/linden/indra/newview/skins/default/xui/pl/floater_instant_message.xml
@@ -24,6 +24,9 @@
[NAME] pisze...
+
+ Dodaj Znajomość
+
Rozpoczęcie rozmowy z [NAME]. Proszę czekać...
diff --git a/linden/indra/newview/skins/default/xui/pt/floater_instant_message.xml b/linden/indra/newview/skins/default/xui/pt/floater_instant_message.xml
index 983a13c..dc69246 100644
--- a/linden/indra/newview/skins/default/xui/pt/floater_instant_message.xml
+++ b/linden/indra/newview/skins/default/xui/pt/floater_instant_message.xml
@@ -33,6 +33,9 @@
Conversa por texto nĂ£o estĂ¡ disponĂvel para esta chamada.
+
+ Adicionar amigo
+
diff --git a/linden/indra/newview/skins/default/xui/ru/floater_instant_message.xml b/linden/indra/newview/skins/default/xui/ru/floater_instant_message.xml
index 7aa1c19..f0379e1 100644
--- a/linden/indra/newview/skins/default/xui/ru/floater_instant_message.xml
+++ b/linden/indra/newview/skins/default/xui/ru/floater_instant_message.xml
@@ -33,6 +33,9 @@
Đ¢ĐµĐºÑÑ‚Đ¾Đ²Ñ‹Đ¹ Ñ‡Đ°Ñ‚ Đ½ĐµĐ´Đ¾ÑÑ‚ÑƒĐ¿ĐµĐ½ Đ´Đ»Ñ ÑÑ‚Đ¾Đ³Đ¾ Đ²Ñ‹Đ·Đ¾Đ²Đ°.
+
+ Đ”Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ Đ”Ñ€ÑƒĐ³Đ°
+
diff --git a/linden/indra/newview/skins/default/xui/tr/floater_instant_message.xml b/linden/indra/newview/skins/default/xui/tr/floater_instant_message.xml
index b627271..3fcb891 100644
--- a/linden/indra/newview/skins/default/xui/tr/floater_instant_message.xml
+++ b/linden/indra/newview/skins/default/xui/tr/floater_instant_message.xml
@@ -33,6 +33,9 @@
Bu arama için yazılı sohbet mevcut deÄŸil.
+
+ ArkadaÅŸ ol
+
diff --git a/linden/indra/newview/skins/default/xui/uk/floater_instant_message.xml b/linden/indra/newview/skins/default/xui/uk/floater_instant_message.xml
index 60ac3b8..a017d38 100644
--- a/linden/indra/newview/skins/default/xui/uk/floater_instant_message.xml
+++ b/linden/indra/newview/skins/default/xui/uk/floater_instant_message.xml
@@ -33,6 +33,9 @@
Đ¢ĐµĐºÑÑ‚Đ¾Đ²Đ¸Đ¹ Ñ‡Đ°Ñ‚ Đ½ĐµĐ´Đ¾ÑÑ‚ÑƒĐ¿Đ½Đ¸Đ¹ Đ´Đ»Ñ Ñ†ÑŒĐ¾Đ³Đ¾ Đ²Đ¸ĐºĐ»Đ¸ĐºÑƒ.
+
+ Đ”Đ¾Đ´Đ°Ñ‚Đ¸ Đ”Ñ€ÑƒĐ³Đ°
+
diff --git a/linden/indra/newview/skins/default/xui/zh/floater_instant_message.xml b/linden/indra/newview/skins/default/xui/zh/floater_instant_message.xml
index ace6d8c..a59000c 100644
--- a/linden/indra/newview/skins/default/xui/zh/floater_instant_message.xml
+++ b/linden/indra/newview/skins/default/xui/zh/floater_instant_message.xml
@@ -30,7 +30,10 @@
本次é€è¯ä¸å¯ä»¥æ–‡å—èå¤©ă€‚
-
+
+ æ·»å 为好å‹
+
+
--
cgit v1.1
From d25448905ededfee2a8bcc88f9a4c76b14ddae33 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Mon, 13 Sep 2010 14:26:23 -0700
Subject: Fixed Windows compile error in autocomplete
---
linden/indra/newview/llchatbar.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llchatbar.cpp b/linden/indra/newview/llchatbar.cpp
index 88ef2b5..739c644 100644
--- a/linden/indra/newview/llchatbar.cpp
+++ b/linden/indra/newview/llchatbar.cpp
@@ -223,7 +223,7 @@ BOOL LLChatBar::handleKeyHere( KEY key, MASK mask )
std::string right_part = "";
S32 cursorPos = mInputEditor->getCursor();
- if (cursorPos < txt.length())
+ if (cursorPos < (S32)txt.length())
{
right_part = txt.substr(cursorPos);
left_part = txt.substr(0, cursorPos);
--
cgit v1.1
From 0b39dcf4c727d4c69b2b7b39ebca58ee761c1a94 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Mon, 13 Sep 2010 14:28:10 -0700
Subject: Restored the alt-H shortcut for teleport history
---
linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml b/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
index 1de4c94..fffab6c 100644
--- a/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
@@ -343,7 +343,8 @@
-
+
--
cgit v1.1
From 7d0984f71e9bdfc1502a20d928e89d11e148b6a1 Mon Sep 17 00:00:00 2001
From: Nemurimasu Neiro
Date: Mon, 13 Sep 2010 16:40:16 +0000
Subject: stay away from find_library!
due to an undocumented feature of find_xxx functions in CMake, no
additional libraries may be found after the first call to a find_xxx
function that searches the prebuilt libraries folder. CMake will request
the folder contents *at most once* and libraries added by install.py
will be missed.
---
linden/indra/cmake/JPEG.cmake | 6 +-----
linden/indra/cmake/OPENAL.cmake | 8 +++-----
2 files changed, 4 insertions(+), 10 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/cmake/JPEG.cmake b/linden/indra/cmake/JPEG.cmake
index de9667e..144f913 100644
--- a/linden/indra/cmake/JPEG.cmake
+++ b/linden/indra/cmake/JPEG.cmake
@@ -12,11 +12,7 @@ else (STANDALONE)
if (LINUX)
set(JPEG_LIBRARIES jpeg)
elseif (DARWIN)
- find_library(JPEG_LIBRARIES
- NAMES jpeg.62
- PATHS ${ARCH_PREBUILT_DIRS_RELEASE}
- NO_DEFAULT_PATH
- )
+ set(JPEG_LIBRARIES ${ARCH_PREBUILT_DIRS_RELEASE}/libjpeg.62.dylib)
elseif (WINDOWS)
set(JPEG_LIBRARIES jpeglib)
endif (LINUX)
diff --git a/linden/indra/cmake/OPENAL.cmake b/linden/indra/cmake/OPENAL.cmake
index 0ac9fb2..4f0e0cc 100644
--- a/linden/indra/cmake/OPENAL.cmake
+++ b/linden/indra/cmake/OPENAL.cmake
@@ -21,11 +21,9 @@ if (OPENAL)
elseif (DARWIN)
# Look for for system's OpenAL.framework
- find_library(OPENAL_LIB
- NAMES openal.1
- PATHS ${ARCH_PREBUILT_DIRS_RELEASE}
- NO_DEFAULT_PATH
- )
+ # Nemu: This code has never looked for the system's OpenAL.framework
+ # Nemu: should it?
+ set(OPENAL_LIB ${ARCH_PREBUILT_DIRS_RELEASE}/libopenal.1.dylib)
else (WINDOWS)
set(OPENAL_LIB openal)
endif (WINDOWS)
--
cgit v1.1
From d4cbeb3505f7aa315a226e464d556ef64ae2079f Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Mon, 13 Sep 2010 20:47:57 +0200
Subject: Henri Beauchamp: use http map if possible. Fixes broken map in SL +
http map possible for OS
---
linden/indra/newview/app_settings/settings.xml | 22 ++++++++
linden/indra/newview/llfloaterworldmap.cpp | 4 +-
linden/indra/newview/llfloaterworldmap.h | 9 +---
linden/indra/newview/llmapresponders.cpp | 29 ++++++++---
linden/indra/newview/llmapresponders.h | 2 +-
linden/indra/newview/llstartup.cpp | 11 +++-
linden/indra/newview/llviewermenu.cpp | 3 ++
linden/indra/newview/llworldmap.cpp | 60 +++++++++++++++++++---
linden/indra/newview/llworldmap.h | 8 +++
linden/indra/newview/llworldmapview.cpp | 70 +++++++++++++++-----------
linden/indra/newview/llworldmapview.h | 7 ++-
11 files changed, 169 insertions(+), 56 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index 11220ed..9550a11 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -7404,6 +7404,28 @@
Value
20.0
+ MapServerURL
+
+ Comment
+ World map URL template for locating map tiles
+ Persist
+ 0
+ Type
+ String
+ Value
+ http://map.secondlife.com.s3.amazonaws.com/
+
+ UseWebMapTiles
+
+ Comment
+ Use web map tiles whenever possible
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 1
+
MapOverlayIndex
Comment
diff --git a/linden/indra/newview/llfloaterworldmap.cpp b/linden/indra/newview/llfloaterworldmap.cpp
index 4f678c5..781cf4d 100644
--- a/linden/indra/newview/llfloaterworldmap.cpp
+++ b/linden/indra/newview/llfloaterworldmap.cpp
@@ -247,8 +247,8 @@ BOOL LLFloaterWorldMap::postBuild()
childSetAction("Clear", onClearBtn, this);
childSetAction("copy_slurl", onCopySLURL, this);
- mCurZoomVal = log(gMapScale)/log(2.f);
- childSetValue("zoom slider", gMapScale);
+ mCurZoomVal = log(LLWorldMapView::sMapScale)/log(2.f);
+ childSetValue("zoom slider", LLWorldMapView::sMapScale);
setDefaultBtn(NULL);
diff --git a/linden/indra/newview/llfloaterworldmap.h b/linden/indra/newview/llfloaterworldmap.h
index 2153921..83345ed 100644
--- a/linden/indra/newview/llfloaterworldmap.h
+++ b/linden/indra/newview/llfloaterworldmap.h
@@ -68,8 +68,6 @@ public:
static void toggle(void*);
static void hide(void*);
- static void addServer(const std::string& server);
-
/*virtual*/ void reshape( S32 width, S32 height, BOOL called_from_parent = TRUE );
/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
@@ -103,7 +101,6 @@ public:
void clearLocationSelection(BOOL clear_ui = FALSE);
void clearAvatarSelection(BOOL clear_ui = FALSE);
void clearLandmarkSelection(BOOL clear_ui = FALSE);
- void clearGridSelection(BOOL clear_ui = FALSE);
// Adjust the maximally zoomed out limit of the zoom slider so you can
// see the whole world, plus a little.
@@ -118,9 +115,8 @@ public:
protected:
static void onPanBtn( void* userdata );
- static void onGridManager(void* data);
-
static void onGoHome(void* data);
+
static void onLandmarkComboPrearrange( LLUICtrl* ctrl, void* data );
static void onLandmarkComboCommit( LLUICtrl* ctrl, void* data );
@@ -162,14 +158,13 @@ protected:
static void onLocationCommit( void* userdata );
static void onCommitLocation( LLUICtrl* ctrl, void* userdata );
static void onCommitSearchResult( LLUICtrl* ctrl, void* userdata );
- static void onSelectServer(LLUICtrl*, void* userdata);
void cacheLandmarkPosition();
protected:
LLTabContainer* mTabs;
- // Sets gMapScale, in pixels per region
+ // Sets sMapScale, in pixels per region
F32 mCurZoomVal;
LLFrameTimer mZoomTimer;
diff --git a/linden/indra/newview/llmapresponders.cpp b/linden/indra/newview/llmapresponders.cpp
index 140f390..9d974f2 100644
--- a/linden/indra/newview/llmapresponders.cpp
+++ b/linden/indra/newview/llmapresponders.cpp
@@ -4,7 +4,7 @@
*
* $LicenseInfo:firstyear=2006&license=viewergpl$
*
- * Copyright (c) 2006-2009, Linden Research, Inc.
+ * Copyright (c) 2006-2010, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
@@ -57,6 +57,8 @@ void LLMapLayerResponder::result(const LLSD& result)
LLWorldMap::getInstance()->mMapLayers[agent_flags].clear();
+ bool use_web_map_tiles = LLWorldMap::useWebMapTiles();
+
LLSD::array_const_iterator iter;
BOOL adjust = FALSE;
for(iter = result["LayerData"].beginArray(); iter != result["LayerData"].endArray(); ++iter)
@@ -65,16 +67,24 @@ void LLMapLayerResponder::result(const LLSD& result)
LLWorldMapLayer new_layer;
new_layer.LayerDefined = TRUE;
- new_layer.LayerImageID = layer_data["ImageID"];
- new_layer.LayerImage = gImageList.getImage(new_layer.LayerImageID, MIPMAP_TRUE, FALSE);
- gGL.getTexUnit(0)->bind(new_layer.LayerImage.get());
- new_layer.LayerImage->setAddressMode(LLTexUnit::TAM_CLAMP);
new_layer.LayerExtents.mLeft = layer_data["Left"];
new_layer.LayerExtents.mRight = layer_data["Right"];
new_layer.LayerExtents.mBottom = layer_data["Bottom"];
new_layer.LayerExtents.mTop = layer_data["Top"];
+ new_layer.LayerImageID = layer_data["ImageID"];
+// if (use_web_map_tiles)
+// {
+// new_layer.LayerImage = LLWorldMap::loadObjectsTile((U32)new_layer.LayerExtents.mLeft, (U32)new_layer.LayerExtents.mBottom); // no good... Maybe using of level 2 and higher web maps ?
+// }
+// else
+// {
+ new_layer.LayerImage = gImageList.getImage(new_layer.LayerImageID, MIPMAP_TRUE, FALSE);
+// }
+ gGL.getTexUnit(0)->bind(new_layer.LayerImage.get());
+ new_layer.LayerImage->setAddressMode(LLTexUnit::TAM_CLAMP);
+
F32 x_meters = F32(new_layer.LayerExtents.mLeft*REGION_WIDTH_UNITS);
F32 y_meters = F32(new_layer.LayerExtents.mBottom*REGION_WIDTH_UNITS);
adjust = LLWorldMap::getInstance()->extendAABB(U32(x_meters), U32(y_meters),
@@ -163,7 +173,14 @@ void LLMapLayerResponder::result(const LLSD& result)
siminfo->mRegionFlags = region_flags;
siminfo->mWaterHeight = (F32) water_height;
siminfo->mMapImageID[agent_flags] = image_id;
- siminfo->mCurrentImage = gImageList.getImage(siminfo->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE);
+ if (use_web_map_tiles)
+ {
+ siminfo->mCurrentImage = LLWorldMap::loadObjectsTile((U32)x_regions, (U32)y_regions);
+ }
+ else
+ {
+ siminfo->mCurrentImage = gImageList.getImage(siminfo->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE);
+ }
siminfo->mCurrentImage->setAddressMode(LLTexUnit::TAM_CLAMP);
gGL.getTexUnit(0)->bind(siminfo->mCurrentImage.get());
diff --git a/linden/indra/newview/llmapresponders.h b/linden/indra/newview/llmapresponders.h
index 8fb1fb0..b6fb8e5 100644
--- a/linden/indra/newview/llmapresponders.h
+++ b/linden/indra/newview/llmapresponders.h
@@ -4,7 +4,7 @@
*
* $LicenseInfo:firstyear=2006&license=viewergpl$
*
- * Copyright (c) 2006-2009, Linden Research, Inc.
+ * Copyright (c) 2006-2010, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
diff --git a/linden/indra/newview/llstartup.cpp b/linden/indra/newview/llstartup.cpp
index 606262f..4fd4daa 100644
--- a/linden/indra/newview/llstartup.cpp
+++ b/linden/indra/newview/llstartup.cpp
@@ -1127,6 +1127,7 @@ bool idle_startup()
requested_options.push_back("buddy-list");
requested_options.push_back("ui-config");
#endif
+ requested_options.push_back("map-server-url");
requested_options.push_back("tutorial_setting");
requested_options.push_back("login-flags");
requested_options.push_back("global-textures");
@@ -1769,7 +1770,15 @@ bool idle_startup()
LLStartUp::setShouldAutoLogin(false);
show_connect_box = true;
}
-
+
+ std::string map_server_url = LLUserAuth::getInstance()->getResponse("map-server-url");
+ if(!map_server_url.empty())
+ {
+ gSavedSettings.setString("MapServerURL", map_server_url);
+ //llwarns << "MapServerURL" << map_server_url << llendl;
+ }
+ // else llwarns << "MapServerURL empty"<< llendl;
+
// Pass the user information to the voice chat server interface.
gVoiceClient->userAuthorized(firstname, lastname, gAgentID);
}
diff --git a/linden/indra/newview/llviewermenu.cpp b/linden/indra/newview/llviewermenu.cpp
index e37f33e..fd6e842 100644
--- a/linden/indra/newview/llviewermenu.cpp
+++ b/linden/indra/newview/llviewermenu.cpp
@@ -844,6 +844,9 @@ void init_client_menu(LLMenuGL* menu)
menu->append(new LLMenuItemCallGL("Clear Group Cache",
LLGroupMgr::debugClearAllGroups));
+
+ menu->append(new LLMenuItemCheckGL("Use Web Map Tiles", menu_toggle_control, NULL, menu_check_control, (void*)"UseWebMapTiles"));
+
menu->appendSeparator();
sub_menu = new LLMenuGL("Rendering");
diff --git a/linden/indra/newview/llworldmap.cpp b/linden/indra/newview/llworldmap.cpp
index 908cd87..c6242f6 100644
--- a/linden/indra/newview/llworldmap.cpp
+++ b/linden/indra/newview/llworldmap.cpp
@@ -37,6 +37,7 @@
#include "llregionhandle.h"
#include "message.h"
+
#include "llappviewer.h" // for gPacificDaylightTime
#include "llagent.h"
#include "llmapresponders.h"
@@ -46,9 +47,8 @@
#include "llviewerimagelist.h"
#include "llviewerregion.h"
#include "llregionflags.h"
-
-#include "hippoGridManager.h"
-
+ #include "hippoGridManager.h"
+bool LLWorldMap::sGotMapURL = false;
const F32 REQUEST_ITEMS_TIMER = 10.f * 60.f; // 10 minutes
// For DEV-17507, do lazy image loading in llworldmapview.cpp instead,
@@ -86,6 +86,11 @@ LLSimInfo::LLSimInfo()
}
+LLVector3d LLSimInfo::getGlobalOrigin() const
+{
+ return from_region_handle(mHandle);
+}
+
LLVector3d LLSimInfo::getGlobalPos(LLVector3 local_pos) const
{
LLVector3d pos = from_region_handle(mHandle);
@@ -514,16 +519,13 @@ void LLWorldMap::processMapLayerReply(LLMessageSystem* msg, void**)
LLWorldMap::getInstance()->mMapLayers[agent_flags].clear();
+// bool use_web_map_tiles = useWebMapTiles();
BOOL adjust = FALSE;
for (S32 block=0; blockgetUUIDFast(_PREHASH_LayerData, _PREHASH_ImageID, new_layer.LayerImageID, block);
- new_layer.LayerImage = gImageList.getImage(new_layer.LayerImageID, MIPMAP_TRUE, FALSE);
-
- gGL.getTexUnit(0)->bind(new_layer.LayerImage.get());
- new_layer.LayerImage->setAddressMode(LLTexUnit::TAM_CLAMP);
U32 left, right, top, bottom;
msg->getU32Fast(_PREHASH_LayerData, _PREHASH_Left, left, block);
@@ -531,6 +533,18 @@ void LLWorldMap::processMapLayerReply(LLMessageSystem* msg, void**)
msg->getU32Fast(_PREHASH_LayerData, _PREHASH_Top, top, block);
msg->getU32Fast(_PREHASH_LayerData, _PREHASH_Bottom, bottom, block);
+// if (use_web_map_tiles)
+// {
+// new_layer.LayerImage = loadObjectsTile(left, bottom); // no good... Maybe using of level 2 and higher web maps ?
+// }
+// else
+// {
+ new_layer.LayerImage = gImageList.getImage(new_layer.LayerImageID, MIPMAP_TRUE, FALSE);
+// }
+
+ gGL.getTexUnit(0)->bind(new_layer.LayerImage.get());
+ new_layer.LayerImage->setAddressMode(LLTexUnit::TAM_CLAMP);
+
new_layer.LayerExtents.mLeft = left;
new_layer.LayerExtents.mRight = right;
new_layer.LayerExtents.mBottom = bottom;
@@ -550,6 +564,26 @@ void LLWorldMap::processMapLayerReply(LLMessageSystem* msg, void**)
}
// public static
+bool LLWorldMap::useWebMapTiles()
+{
+ return gSavedSettings.getBOOL("UseWebMapTiles") &&
+ (( gHippoGridManager->getConnectedGrid()->isSecondLife() || sGotMapURL) && LLWorldMap::getInstance()->mCurrentMap == 0);
+}
+
+// public static
+LLPointer LLWorldMap::loadObjectsTile(U32 grid_x, U32 grid_y)
+{
+ // Get the grid coordinates
+ std::string imageurl = gSavedSettings.getString("MapServerURL") + llformat("map-%d-%d-%d-objects.jpg", 1, grid_x, grid_y);
+
+ LLPointer img = gImageList.getImageFromUrl(imageurl);
+ img->setBoostLevel(LLViewerImageBoostLevel::BOOST_MAP);
+
+ // Return the smart pointer
+ return img;
+}
+
+// public static
void LLWorldMap::processMapBlockReply(LLMessageSystem* msg, void**)
{
U32 agent_flags;
@@ -565,6 +599,9 @@ void LLWorldMap::processMapBlockReply(LLMessageSystem* msg, void**)
bool found_null_sim = false;
+#ifdef IMMEDIATE_IMAGE_LOAD
+ bool use_web_map_tiles = useWebMapTiles();
+#endif
BOOL adjust = FALSE;
for (S32 block=0; blockmMapImageID[agent_flags] = image_id;
#ifdef IMMEDIATE_IMAGE_LOAD
- siminfo->mCurrentImage = gImageList.getImage(siminfo->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE);
+ if (use_web_map_tiles)
+ {
+ siminfo->mCurrentImage = loadObjectsTile((U32)x_regions, (U32)y_regions);
+ }
+ else
+ {
+ siminfo->mCurrentImage = gImageList.getImage(siminfo->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE);
+ }
gGL.getTexUnit(0)->bind(siminfo->mCurrentImage.get());
siminfo->mCurrentImage->setAddressMode(LLTexUnit::TAM_CLAMP);
#endif
diff --git a/linden/indra/newview/llworldmap.h b/linden/indra/newview/llworldmap.h
index 6ce66ff..b7089f3 100644
--- a/linden/indra/newview/llworldmap.h
+++ b/linden/indra/newview/llworldmap.h
@@ -76,6 +76,8 @@ public:
LLSimInfo();
LLVector3d getGlobalPos(LLVector3 local_pos) const;
+ // Get the world coordinates of the SW corner of that region
+ LLVector3d getGlobalOrigin() const;
public:
U64 mHandle;
@@ -164,6 +166,10 @@ public:
static void processMapBlockReply(LLMessageSystem*, void**);
static void processMapItemReply(LLMessageSystem*, void**);
+ static void gotMapServerURL(bool flag) { sGotMapURL = flag; }
+ static bool useWebMapTiles();
+ static LLPointer loadObjectsTile(U32 grid_x, U32 grid_y);
+
void dump();
// Extend the bounding box of the list of simulators. Returns true
@@ -226,6 +232,8 @@ private:
std::string mSLURL;
url_callback_t mSLURLCallback;
bool mSLURLTeleport;
+
+ static bool sGotMapURL;
};
#endif
diff --git a/linden/indra/newview/llworldmapview.cpp b/linden/indra/newview/llworldmapview.cpp
index d8e5b3d..e12bd08 100644
--- a/linden/indra/newview/llworldmapview.cpp
+++ b/linden/indra/newview/llworldmapview.cpp
@@ -50,7 +50,6 @@
#include "llfloatermap.h"
#include "llfloaterworldmap.h"
#include "llfocusmgr.h"
-//#include "llmutelist.h" info not being sent
#include "lltextbox.h"
#include "lltextureview.h"
#include "lltracker.h"
@@ -103,6 +102,7 @@ F32 LLWorldMapView::sTargetPanY = 0.f;
S32 LLWorldMapView::sTrackingArrowX = 0;
S32 LLWorldMapView::sTrackingArrowY = 0;
F32 LLWorldMapView::sPixelsPerMeter = 1.f;
+F32 LLWorldMapView::sMapScale = 128.f;
F32 CONE_SIZE = 0.6f;
std::map LLWorldMapView::sStringsMap;
@@ -179,7 +179,7 @@ LLWorldMapView::LLWorldMapView(const std::string& name, const LLRect& rect )
mMouseDownY( 0 ),
mSelectIDStart(0)
{
- sPixelsPerMeter = gMapScale / REGION_WIDTH_METERS;
+ sPixelsPerMeter = sMapScale / REGION_WIDTH_METERS;
clearLastClick();
const S32 DIR_WIDTH = 10;
@@ -240,14 +240,14 @@ void LLWorldMapView::cleanupTextures()
// static
void LLWorldMapView::setScale( F32 scale )
{
- if (scale != gMapScale)
+ if (scale != sMapScale)
{
- F32 old_scale = gMapScale;
+ F32 old_scale = sMapScale;
- gMapScale = scale;
- if (gMapScale == 0.f)
+ sMapScale = scale;
+ if (sMapScale == 0.f)
{
- gMapScale = 0.1f;
+ sMapScale = 0.1f;
}
F32 ratio = (scale / old_scale);
@@ -256,7 +256,7 @@ void LLWorldMapView::setScale( F32 scale )
sTargetPanX = sPanX;
sTargetPanY = sPanY;
- sPixelsPerMeter = gMapScale / REGION_WIDTH_METERS;
+ sPixelsPerMeter = sMapScale / REGION_WIDTH_METERS;
}
}
@@ -354,11 +354,11 @@ void LLWorldMapView::draw()
// Find x and y position relative to camera's center.
LLVector3d rel_region_pos = origin_global - camera_global;
- F32 relative_x = (rel_region_pos.mdV[0] / REGION_WIDTH_METERS) * gMapScale;
- F32 relative_y = (rel_region_pos.mdV[1] / REGION_WIDTH_METERS) * gMapScale;
+ F32 relative_x = (rel_region_pos.mdV[0] / REGION_WIDTH_METERS) * sMapScale;
+ F32 relative_y = (rel_region_pos.mdV[1] / REGION_WIDTH_METERS) * sMapScale;
- F32 pix_width = gMapScale*(layer->LayerExtents.getWidth() + 1);
- F32 pix_height = gMapScale*(layer->LayerExtents.getHeight() + 1);
+ F32 pix_width = sMapScale*(layer->LayerExtents.getWidth() + 1);
+ F32 pix_height = sMapScale*(layer->LayerExtents.getHeight() + 1);
// When the view isn't panned, 0,0 = center of rectangle
F32 bottom = sPanY + half_height + relative_y;
@@ -439,6 +439,8 @@ void LLWorldMapView::draw()
const S32 MIN_REQUEST_PER_TICK = 1;
S32 textures_requested_this_tick = 0;
+ bool use_web_map_tiles = LLWorldMap::useWebMapTiles();
+
for (LLWorldMap::sim_info_map_t::iterator it = LLWorldMap::getInstance()->mSimInfoMap.begin();
it != LLWorldMap::getInstance()->mSimInfoMap.end(); ++it)
{
@@ -448,7 +450,7 @@ void LLWorldMapView::draw()
LLViewerImage* simimage = info->mCurrentImage;
LLViewerImage* overlayimage = info->mOverlayImage;
- if (gMapScale < SIM_MAP_SCALE)
+ if (sMapScale < SIM_MAP_SCALE)
{
if (simimage != NULL) simimage->setBoostLevel(0);
if (overlayimage != NULL) overlayimage->setBoostLevel(0);
@@ -460,14 +462,14 @@ void LLWorldMapView::draw()
// Find x and y position relative to camera's center.
LLVector3d rel_region_pos = origin_global - camera_global;
- F32 relative_x = (rel_region_pos.mdV[0] / REGION_WIDTH_METERS) * gMapScale;
- F32 relative_y = (rel_region_pos.mdV[1] / REGION_WIDTH_METERS) * gMapScale;
+ F32 relative_x = (rel_region_pos.mdV[0] / REGION_WIDTH_METERS) * sMapScale;
+ F32 relative_y = (rel_region_pos.mdV[1] / REGION_WIDTH_METERS) * sMapScale;
// When the view isn't panned, 0,0 = center of rectangle
F32 bottom = sPanY + half_height + relative_y;
F32 left = sPanX + half_width + relative_x;
- F32 top = bottom + gMapScale ;
- F32 right = left + gMapScale ;
+ F32 top = bottom + sMapScale ;
+ F32 right = left + sMapScale ;
// Switch to world map texture (if available for this region) if either:
// 1. Tiles are zoomed out small enough, or
@@ -478,10 +480,10 @@ void LLWorldMapView::draw()
map_scale_cutoff = SIM_NULL_MAP_SCALE;
}
- info->mShowAgentLocations = (gMapScale >= SIM_MAP_AGENT_SCALE);
+ info->mShowAgentLocations = (sMapScale >= SIM_MAP_AGENT_SCALE);
bool sim_visible =
- (gMapScale >= map_scale_cutoff) &&
+ (sMapScale >= map_scale_cutoff) &&
(simimage != NULL) &&
(simimage->getHasGLTexture());
@@ -521,7 +523,15 @@ void LLWorldMapView::draw()
(textures_requested_this_tick < MAX_REQUEST_PER_TICK)))
{
textures_requested_this_tick++;
- info->mCurrentImage = gImageList.getImage(info->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE);
+ if (use_web_map_tiles)
+ {
+ LLVector3d region_pos = info->getGlobalOrigin();
+ info->mCurrentImage = LLWorldMap::loadObjectsTile((U32)(region_pos.mdV[VX] / REGION_WIDTH_UNITS), (U32)(region_pos.mdV[VY] / REGION_WIDTH_UNITS));
+ }
+ else
+ {
+ info->mCurrentImage = gImageList.getImage(info->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE);
+ }
info->mCurrentImage->setAddressMode(LLTexUnit::TAM_CLAMP);
simimage = info->mCurrentImage;
gGL.getTexUnit(0)->bind(simimage);
@@ -554,7 +564,7 @@ void LLWorldMapView::draw()
center_global.mdV[VX] += 128.0;
center_global.mdV[VY] += 128.0;
- S32 draw_size = llround(gMapScale);
+ S32 draw_size = llround(sMapScale);
if (simimage != NULL)
{
simimage->setBoostLevel(LLViewerImageBoostLevel::BOOST_MAP);
@@ -670,10 +680,10 @@ void LLWorldMapView::draw()
LLFontGL* font = LLFontGL::getFontSansSerifSmall();
std::string mesg;
- if (gMapScale < sThresholdA)
+ if (sMapScale < sThresholdA)
{
}
- else if (gMapScale < sThresholdB)
+ else if (sMapScale < sThresholdB)
{
// mesg = llformat( info->mAgents);
}
@@ -794,13 +804,13 @@ void LLWorldMapView::draw()
gGL.setSceneBlendType(LLRender::BT_ALPHA);
// Infohubs
- if (gSavedSettings.getBOOL("MapShowInfohubs")) //(gMapScale >= sThresholdB)
+ if (gSavedSettings.getBOOL("MapShowInfohubs")) //(sMapScale >= sThresholdB)
{
drawGenericItems(LLWorldMap::getInstance()->mInfohubs, sInfohubImage);
}
// Telehubs
- if (gSavedSettings.getBOOL("MapShowTelehubs")) //(gMapScale >= sThresholdB)
+ if (gSavedSettings.getBOOL("MapShowTelehubs")) //(sMapScale >= sThresholdB)
{
drawGenericItems(LLWorldMap::getInstance()->mTelehubs, sTelehubImage);
}
@@ -972,7 +982,7 @@ void LLWorldMapView::drawImageStack(const LLVector3d& global_pos, LLUIImagePtr i
void LLWorldMapView::drawAgents()
{
- F32 agents_scale = (gMapScale * 0.9f) / 256.f;
+ F32 agents_scale = (sMapScale * 0.9f) / 256.f;
LLColor4 avatar_color = gColors.getColor( "MapAvatar" );
/*LLColor4 friend_color = gColors.getColor( "MapFriend" );
@@ -1112,7 +1122,7 @@ void LLWorldMapView::drawEvents()
void LLWorldMapView::drawFrustum()
{
// Draw frustum
- F32 meters_to_pixels = gMapScale/ REGION_WIDTH_METERS;
+ F32 meters_to_pixels = sMapScale/ REGION_WIDTH_METERS;
F32 horiz_fov = LLViewerCamera::getInstance()->getView() * LLViewerCamera::getInstance()->getAspect();
F32 far_clip_meters = LLViewerCamera::getInstance()->getFar();
@@ -1241,7 +1251,7 @@ LLVector3d LLWorldMapView::viewPosToGlobal( S32 x, S32 y )
LLVector3 pos_local( (F32)x, (F32)y, 0.f );
- pos_local *= ( REGION_WIDTH_METERS / gMapScale );
+ pos_local *= ( REGION_WIDTH_METERS / sMapScale );
LLVector3d pos_global;
pos_global.setVec( pos_local );
@@ -1875,7 +1885,7 @@ U32 LLWorldMapView::updateBlock(S32 block_x, S32 block_y)
U32 LLWorldMapView::updateVisibleBlocks()
{
- if (gMapScale < SIM_MAP_SCALE)
+ if (sMapScale < SIM_MAP_SCALE)
{
// We don't care what is loaded if we're zoomed out
return 0;
@@ -1883,7 +1893,7 @@ U32 LLWorldMapView::updateVisibleBlocks()
LLVector3d camera_global = gAgent.getCameraPositionGlobal();
- F32 pixels_per_region = gMapScale;
+ F32 pixels_per_region = sMapScale;
const S32 width = getRect().getWidth();
const S32 height = getRect().getHeight();
// Convert pan to sim coordinates
diff --git a/linden/indra/newview/llworldmapview.h b/linden/indra/newview/llworldmapview.h
index 3245838..4814767 100644
--- a/linden/indra/newview/llworldmapview.h
+++ b/linden/indra/newview/llworldmapview.h
@@ -30,7 +30,10 @@
* $/LicenseInfo$
*/
-// Global map of the world.
+// View of the global map of the world
+
+// The data (model) for the global map (a singleton, unique to the application instance) is
+// in LLWorldMap and is typically accessed using LLWorldMap::getInstance()
#ifndef LL_LLWORLDMAPVIEW_H
#define LL_LLWORLDMAPVIEW_H
@@ -161,6 +164,8 @@ public:
static F32 sThresholdB;
static F32 sPixelsPerMeter; // world meters to map pixels
+ static F32 sMapScale; // scale = size of a region in pixels
+
BOOL mItemPicked;
static F32 sPanX; // in pixels
--
cgit v1.1
From dffea2e5bf09d486ef36b7d657313fdf16aab4a8 Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Mon, 13 Sep 2010 21:39:47 +0200
Subject: add libhunspell to viewer_manifest for linux*
---
linden/indra/newview/viewer_manifest.py | 2 ++
1 file changed, 2 insertions(+)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/viewer_manifest.py b/linden/indra/newview/viewer_manifest.py
index f66fa5b..6b5e800 100755
--- a/linden/indra/newview/viewer_manifest.py
+++ b/linden/indra/newview/viewer_manifest.py
@@ -922,6 +922,7 @@ class Linux_i686Manifest(LinuxManifest):
self.path("libdb-4.2.so")
self.path("libcrypto.so.0.9.7")
self.path("libexpat.so.1")
+ self.path("libhunspell-1.2.so.0.0.0", "libhunspell-1.2.so.0")
self.path("libssl.so.0.9.7")
self.path("libuuid.so", "libuuid.so.1")
self.path("libSDL-1.2.so.0")
@@ -1047,6 +1048,7 @@ class Linux_x86_64Manifest(LinuxManifest):
self.path("libdb-4.2.so")
self.path("libcrypto.so.0.9.8")
self.path("libexpat.so.1")
+ self.path("libhunspell-1.2.so.0.0.0", "libhunspell-1.2.so.0")
self.path("libssl.so.0.9.8")
self.path("libuuid.so", "libuuid.so.1")
self.path("libSDL-1.2.so.0")
--
cgit v1.1
From f266d11ad88c1f9e1feef2714d4996fb03b147fa Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Mon, 13 Sep 2010 14:44:21 -0700
Subject: Moved web map settings to the imprudence section of settings.xml
---
linden/indra/newview/app_settings/settings.xml | 46 +++++++++++++-------------
1 file changed, 23 insertions(+), 23 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index 9550a11..2b61a19 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -445,7 +445,18 @@
F32
Value
30
-
+
+ MapServerURL
+
+ Comment
+ World map URL template for locating map tiles
+ Persist
+ 0
+ Type
+ String
+ Value
+ http://map.secondlife.com.s3.amazonaws.com/
+
MapShowAgentCount
Comment
@@ -1002,6 +1013,17 @@
Value
0
+ UseWebMapTiles
+
+ Comment
+ Use web map tiles whenever possible
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 1
+
VerticalIMTabs
Comment
@@ -7404,28 +7426,6 @@
Value
20.0
- MapServerURL
-
- Comment
- World map URL template for locating map tiles
- Persist
- 0
- Type
- String
- Value
- http://map.secondlife.com.s3.amazonaws.com/
-
- UseWebMapTiles
-
- Comment
- Use web map tiles whenever possible
- Persist
- 1
- Type
- Boolean
- Value
- 1
-
MapOverlayIndex
Comment
--
cgit v1.1
From 18c0346ddf402dedcf6faa6a699a8e31bf21f6b5 Mon Sep 17 00:00:00 2001
From: thickbrick
Date: Tue, 14 Sep 2010 01:11:19 +0200
Subject: SNOW-282: prevent the toolbox from showing up uninvited and grabbing
in-world click events after login. Window focus changes can leave gToolNull
as the active tool (it should only be active when the window is unfocused.)
This prevents doing keyboard override in that case.
---
linden/indra/newview/lltoolmgr.cpp | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/lltoolmgr.cpp b/linden/indra/newview/lltoolmgr.cpp
index 5ba7217..3a776d1 100644
--- a/linden/indra/newview/lltoolmgr.cpp
+++ b/linden/indra/newview/lltoolmgr.cpp
@@ -105,6 +105,8 @@ void LLToolMgr::initTools()
gBasicToolset->addTool( LLToolCompInspect::getInstance() );
gFaceEditToolset->addTool( LLToolCamera::getInstance() );
+ // In case window focus was lost before we got here
+ clearSavedTool();
// On startup, use "select" tool
setCurrentToolset(gBasicToolset);
@@ -188,9 +190,11 @@ LLTool* LLToolMgr::getCurrentTool()
}
else
{
- mOverrideTool = mBaseTool ? mBaseTool->getOverrideTool(override_mask) : NULL;
+ // due to window management weirdness we can get here with gToolNull
+ bool can_override = mBaseTool && (mBaseTool != gToolNull);
+ mOverrideTool = can_override ? mBaseTool->getOverrideTool(override_mask) : NULL;
- // use override tool if available otherwise drop back to base tool
+ // use keyboard-override tool if available otherwise drop back to base tool
cur_tool = mOverrideTool ? mOverrideTool : mBaseTool;
}
--
cgit v1.1
From 8d53e655a6e81e4655cae2ebad46a57cdcf62ac5 Mon Sep 17 00:00:00 2001
From: thickbrick
Date: Tue, 14 Sep 2010 02:34:39 +0200
Subject: Prevent double-click teleport when double-clicking touch-scripted
objects or objects with non-default click action (sit, buy, etc.)
---
linden/indra/newview/lltoolpie.cpp | 13 +++++++++++++
1 file changed, 13 insertions(+)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/lltoolpie.cpp b/linden/indra/newview/lltoolpie.cpp
index 2887515..2b63a24 100644
--- a/linden/indra/newview/lltoolpie.cpp
+++ b/linden/indra/newview/lltoolpie.cpp
@@ -727,6 +727,19 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask)
LL_DEBUGS("DoubleClicks") << "Double clicked other Avatar" << LL_ENDL;
return FALSE;// or what about open profile or IM session or ...
}
+
+ if (final_click_action(object))
+ {
+ LL_DEBUGS("DoubleClicks") << "Double clicked an object with a click action" << LL_ENDL;
+ return FALSE;
+ }
+
+ LLViewerObject* parent = object->getRootEdit();
+ if (object->flagHandleTouch() || (parent && parent->flagHandleTouch()))
+ {
+ LL_DEBUGS("DoubleClicks") << "Double clicked a touch-scripted object" << LL_ENDL;
+ return FALSE;
+ }
}
std::string action = gSavedSettings.getString("DoubleClickAction");
--
cgit v1.1
From 8e62bdb857568a0d9c4bc524aa55236b6999cf8a Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Tue, 14 Sep 2010 04:31:37 +0200
Subject: Small bugfix, no dropdown yet
---
linden/indra/newview/llchatbar.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llchatbar.cpp b/linden/indra/newview/llchatbar.cpp
index 88ef2b5..4a8afef 100644
--- a/linden/indra/newview/llchatbar.cpp
+++ b/linden/indra/newview/llchatbar.cpp
@@ -266,12 +266,12 @@ BOOL LLChatBar::handleKeyHere( KEY key, MASK mask )
std::string test_name(agent_name);
std::transform(test_name.begin(), test_name.end(), test_name.begin(), tolower);
+ std::transform(to_match.begin(), to_match.end(), to_match.begin(), tolower);
if (test_name.find(to_match) == 0)
{
- std::string rest_of_match = agent_name.substr(to_match.length(), agent_name.length());
mInputEditor->setText(left_part.substr(0, left_part.length() - to_match.length()) + agent_name + right_part);
- mInputEditor->setSelection(cursorPos, cursorPos + rest_of_match.length());
+ mInputEditor->setSelection(cursorPos, cursorPos + (agent_name.length() - to_match.length()));
return TRUE;
}
}
--
cgit v1.1
From 45400260212b300a7fd4fb3aff1898c8053594e1 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Tue, 14 Sep 2010 16:40:00 -0700
Subject: Added checkboxes to the group list for receiving group notices,
joining group chat, and listing group in profile
---
linden/indra/newview/llfloatergroups.cpp | 82 +++++++++++++++++++---
linden/indra/newview/llfloatergroups.h | 1 +
.../skins/default/xui/en-us/panel_groups.xml | 13 +++-
3 files changed, 82 insertions(+), 14 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llfloatergroups.cpp b/linden/indra/newview/llfloatergroups.cpp
index f00489c..4ddacfd 100644
--- a/linden/indra/newview/llfloatergroups.cpp
+++ b/linden/indra/newview/llfloatergroups.cpp
@@ -65,7 +65,7 @@
std::map LLFloaterGroupPicker::sInstances;
// helper functions
-void init_group_list(LLScrollListCtrl* ctrl, const LLUUID& highlight_id, const std::string& none_text, U64 powers_mask = GP_ALL_POWERS);
+void init_group_list(LLScrollListCtrl* ctrl, const LLUUID& highlight_id, const std::string& none_text, bool group_picker, U64 powers_mask = GP_ALL_POWERS);
///----------------------------------------------------------------------------
/// Class LLFloaterGroupPicker
@@ -121,7 +121,7 @@ void LLFloaterGroupPicker::setPowersMask(U64 powers_mask)
BOOL LLFloaterGroupPicker::postBuild()
{
const std::string none_text = getString("none");
- init_group_list(getChild("group list"), gAgent.getGroupID(), none_text, mPowersMask);
+ init_group_list(getChild("group list"), gAgent.getGroupID(), none_text, true, mPowersMask);
childSetAction("OK", onBtnOK, this);
@@ -206,7 +206,7 @@ void LLPanelGroups::reset()
childSetTextArg("groupcount", "[MAX]", llformat("%d", gHippoLimits->getMaxAgentGroups()));
const std::string none_text = getString("none");
- init_group_list(getChild("group list"), gAgent.getGroupID(), none_text);
+ init_group_list(getChild("group list"), gAgent.getGroupID(), none_text, false);
enableButtons();
}
@@ -218,7 +218,7 @@ BOOL LLPanelGroups::postBuild()
childSetTextArg("groupcount", "[MAX]", llformat("%d", gHippoLimits->getMaxAgentGroups()));
const std::string none_text = getString("none");
- init_group_list(getChild("group list"), gAgent.getGroupID(), none_text);
+ init_group_list(getChild("group list"), gAgent.getGroupID(), none_text, false);
childSetAction("Activate", onBtnActivate, this);
@@ -344,13 +344,13 @@ void LLPanelGroups::onBtnTitles(void* userdata)
void LLPanelGroups::create()
{
- llinfos << "LLPanelGroups::create" << llendl;
+ //llinfos << "LLPanelGroups::create" << llendl;
LLFloaterGroupInfo::showCreateGroup(NULL);
}
void LLPanelGroups::activate()
{
- llinfos << "LLPanelGroups::activate" << llendl;
+ //llinfos << "LLPanelGroups::activate" << llendl;
LLCtrlListInterface *group_list = childGetListInterface("group list");
LLUUID group_id;
if (group_list)
@@ -368,7 +368,7 @@ void LLPanelGroups::activate()
void LLPanelGroups::info()
{
- llinfos << "LLPanelGroups::info" << llendl;
+ //llinfos << "LLPanelGroups::info" << llendl;
LLCtrlListInterface *group_list = childGetListInterface("group list");
LLUUID group_id;
if (group_list && (group_id = group_list->getCurrentID()).notNull())
@@ -406,7 +406,7 @@ void LLPanelGroups::startIM()
void LLPanelGroups::leave()
{
- llinfos << "LLPanelGroups::leave" << llendl;
+ //llinfos << "LLPanelGroups::leave" << llendl;
LLCtrlListInterface *group_list = childGetListInterface("group list");
LLUUID group_id;
if (group_list && (group_id = group_list->getCurrentID()).notNull())
@@ -446,7 +446,7 @@ void LLPanelGroups::invite()
group_id = group_list->getCurrentID();
}
- LLFloaterGroupInvite::showForGroup(group_id);
+ LLFloaterGroupInvite::showForGroup(group_id);
}
void LLPanelGroups::titles()
@@ -477,10 +477,15 @@ bool LLPanelGroups::callbackLeaveGroup(const LLSD& notification, const LLSD& res
void LLPanelGroups::onGroupList(LLUICtrl* ctrl, void* userdata)
{
LLPanelGroups* self = (LLPanelGroups*)userdata;
- if(self) self->enableButtons();
+ if (self)
+ {
+ self->enableButtons();
+ // check to see if group checkboxes have changed
+ self->applyChangesToGroups();
+ }
}
-void init_group_list(LLScrollListCtrl* ctrl, const LLUUID& highlight_id, const std::string& none_text, U64 powers_mask)
+void init_group_list(LLScrollListCtrl* ctrl, const LLUUID& highlight_id, const std::string& none_text, bool group_picker, U64 powers_mask)
{
S32 count = gAgent.mGroups.count();
LLUUID id;
@@ -501,6 +506,11 @@ void init_group_list(LLScrollListCtrl* ctrl, const LLUUID& highlight_id, const s
style = "BOLD";
}
+ // 0 - Group Name
+ // 1 - Group Notices
+ // 2 - Group Chat
+ // 3 - Group Listing in Profile
+
LLSD element;
element["id"] = id;
element["columns"][0]["column"] = "name";
@@ -508,6 +518,24 @@ void init_group_list(LLScrollListCtrl* ctrl, const LLUUID& highlight_id, const s
element["columns"][0]["font"] = "SANSSERIF";
element["columns"][0]["font-style"] = style;
+ if (!group_picker)
+ {
+ LLSD& receive_notices_column = element["columns"][1];
+ receive_notices_column["column"] = "receive_notices";
+ receive_notices_column["type"] = "checkbox";
+ receive_notices_column["value"] = group_datap->mAcceptNotices;
+
+ LLSD& join_group_chat_column = element["columns"][2];
+ join_group_chat_column["column"] = "join_group_chat";
+ join_group_chat_column["type"] = "checkbox";
+ join_group_chat_column["value"] = !gIMMgr->getIgnoreGroup(id);
+
+ LLSD& list_in_profile_column = element["columns"][3];
+ list_in_profile_column["column"] = "list_in_profile";
+ list_in_profile_column["type"] = "checkbox";
+ list_in_profile_column["value"] = group_datap->mListInProfile;
+ }
+
group_list->addElement(element, ADD_SORTED);
}
}
@@ -532,3 +560,35 @@ void init_group_list(LLScrollListCtrl* ctrl, const LLUUID& highlight_id, const s
group_list->selectByValue(highlight_id);
}
+void LLPanelGroups::applyChangesToGroups()
+{
+ LLScrollListCtrl* group_list = getChild("group list");
+ if (group_list)
+ {
+ // just in case we want to allow selecting multiple groups ever
+ std::vector selected = group_list->getAllSelected();
+ for (std::vector::iterator itr = selected.begin(); itr != selected.end(); ++itr)
+ {
+ LLUUID group_id = (*itr)->getValue();
+ BOOL receive_notices = (*itr)->getColumn(1)->getValue().asBoolean();
+ BOOL join_group_chat = (*itr)->getColumn(2)->getValue().asBoolean();
+ BOOL list_in_profile = (*itr)->getColumn(3)->getValue().asBoolean();
+
+ LLGroupData group_datap;
+ if (gAgent.getGroupData(group_id, group_datap))
+ {
+ // notices and profile
+ if ((receive_notices != group_datap.mAcceptNotices) || (list_in_profile != group_datap.mListInProfile))
+ {
+ gAgent.setUserGroupFlags(group_id, receive_notices, list_in_profile);
+ }
+
+ // chat
+ if (join_group_chat != (!gIMMgr->getIgnoreGroup(group_id)))
+ {
+ gIMMgr->updateIgnoreGroup(group_id, join_group_chat);
+ }
+ }
+ }
+ }
+}
diff --git a/linden/indra/newview/llfloatergroups.h b/linden/indra/newview/llfloatergroups.h
index c0d06e7..91021f0 100644
--- a/linden/indra/newview/llfloatergroups.h
+++ b/linden/indra/newview/llfloatergroups.h
@@ -102,6 +102,7 @@ protected:
// highlight_id is a group id to highlight
void enableButtons();
+ void applyChangesToGroups();
static void onGroupList(LLUICtrl* ctrl, void* userdata);
static void onBtnCreate(void* userdata);
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_groups.xml b/linden/indra/newview/skins/default/xui/en-us/panel_groups.xml
index e6b78fb..22967dc 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_groups.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_groups.xml
@@ -1,12 +1,19 @@
+ name="groups" width="350" min_width="350">
-
+
+
+
+
addElement(element, ADD_TOP);
+ style = "BOLD";
}
+ LLSD element;
+ element["id"] = LLUUID::null;
+ element["columns"][0]["column"] = "name";
+ //UGLY hack to make sure "none" is always on top -- MC
+ element["columns"][0]["value"] = " (" + none_text + ")";
+ element["columns"][0]["font"] = "SANSSERIF";
+ element["columns"][0]["font-style"] = style;
+
+ if (!group_picker)
+ {
+ LLSD& receive_notices_column = element["columns"][1];
+ receive_notices_column["column"] = "receive_notices";
+ receive_notices_column["type"] = "checkbox";
+ receive_notices_column["value"] = FALSE;
+ receive_notices_column["enabled"] = FALSE;
+
+ LLSD& join_group_chat_column = element["columns"][2];
+ join_group_chat_column["column"] = "join_group_chat";
+ join_group_chat_column["type"] = "checkbox";
+ join_group_chat_column["value"] = FALSE;
+ join_group_chat_column["enabled"] = FALSE;
+
+ LLSD& list_in_profile_column = element["columns"][3];
+ list_in_profile_column["column"] = "list_in_profile";
+ list_in_profile_column["type"] = "checkbox";
+ list_in_profile_column["value"] = FALSE;
+ list_in_profile_column["enabled"] = FALSE;
+ }
+
+ group_list->addElement(element, ADD_TOP);
group_list->selectByValue(highlight_id);
}
@@ -565,7 +585,7 @@ void LLPanelGroups::applyChangesToGroups()
LLScrollListCtrl* group_list = getChild("group list");
if (group_list)
{
- // just in case we want to allow selecting multiple groups ever
+ // just in case we want to allow selecting multiple groups ever -- MC
std::vector selected = group_list->getAllSelected();
for (std::vector::iterator itr = selected.begin(); itr != selected.end(); ++itr)
{
--
cgit v1.1
From 13cf1aef5915ab3e7b4738d300d79f76c79a63e7 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Tue, 14 Sep 2010 23:04:18 -0700
Subject: Removed GOVERNOR_LINDEN check to allow land auctions on OpenSim
---
linden/indra/newview/llfloaterland.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llfloaterland.cpp b/linden/indra/newview/llfloaterland.cpp
index cc398da..066b739 100644
--- a/linden/indra/newview/llfloaterland.cpp
+++ b/linden/indra/newview/llfloaterland.cpp
@@ -570,7 +570,7 @@ void LLPanelLandGeneral::refresh()
mTextClaimDate->setEnabled(is_leased);
BOOL enable_auction = (gAgent.getGodLevel() >= GOD_LIAISON)
- && (owner_id == GOVERNOR_LINDEN_ID)
+ /*&& (owner_id == GOVERNOR_LINDEN_ID) -- MC*/
&& (parcel->getAuctionID() == 0);
mBtnStartAuction->setEnabled(enable_auction);
}
--
cgit v1.1
From de22344a3e3d879c09c50e74e6d5ae98336bb0f1 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Tue, 14 Sep 2010 23:49:47 -0700
Subject: Clarified that a restart is required to change spell checking
settings
---
.../newview/skins/default/xui/en-us/panel_preferences_advanced.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
index 38033a3..073ed42 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
@@ -160,11 +160,11 @@
-
To spellcheck, right click a misspelled word
(red or not) and click on its replacement
--
cgit v1.1
From 1ff3be3388347556136b21d86c98936cfceaf007 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Wed, 15 Sep 2010 03:31:23 -0700
Subject: Updated CannotBuyLandMaturity notification with info on how to fix
the problem
---
linden/indra/newview/skins/default/xui/en-us/notifications.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/notifications.xml b/linden/indra/newview/skins/default/xui/en-us/notifications.xml
index 9ebeec9..d7b078c 100644
--- a/linden/indra/newview/skins/default/xui/en-us/notifications.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/notifications.xml
@@ -1733,7 +1733,7 @@ Cannot find the region this land is in.
type="alertmodal">
Unable to buy land:
-Your allowed or prefered maturity level does not allow to buy this land.
+Your allowed/preferred maturity level does not permit you to buy this land. You may need to your maturity level in Preferences first.
0 );
@@ -546,19 +546,19 @@ void LLLineEditor::spell_show(void * data)
SpellMenuBind* tempBind = (SpellMenuBind*)data;
LLLineEditor* line = tempBind->origin;
- if(tempBind && line)
+ if( tempBind && line)
{
- if(tempBind->word=="Show Misspellings")
+ if (tempBind->word=="Show Misspellings")
{
- line->setOverRideAndShowMisspellings(TRUE);
- }else
+ line->setShowMisspellings(TRUE);
+ }
+ else
{
- line->setOverRideAndShowMisspellings(FALSE);
+ line->setShowMisspellings(FALSE);
}
}
-
-
}
+
std::vector LLLineEditor::getMisspelledWordsPositions()
{
std::vector thePosesOfBadWords;
@@ -604,25 +604,29 @@ std::vector LLLineEditor::getMisspelledWordsPositions()
}
return thePosesOfBadWords;
}
+
void LLLineEditor::spell_add(void* data)
{
SpellMenuBind* tempBind = (SpellMenuBind*)data;
- if(tempBind)
+ if (tempBind)
{
glggHunSpell->addWordToCustomDictionary(tempBind->word);
tempBind->origin->mPrevSpelledText="";//make it update
}
}
+
void LLLineEditor::context_paste(void* data)
{
LLLineEditor* line = (LLLineEditor*)data;
if(line)line->paste();
}
+
void LLLineEditor::context_delete(void* data)
{
LLLineEditor* line = (LLLineEditor*)data;
if(line)line->doDelete();
}
+
void LLLineEditor::context_selectall(void* data)
{
LLLineEditor* line = (LLLineEditor*)data;
@@ -728,16 +732,17 @@ BOOL LLLineEditor::handleRightMouseDown( S32 x, S32 y, MASK mask )
S32 wordStart = 0;
S32 wordEnd = calculateCursorFromMouse(x);
-
LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get();
if (menu)
{
if(menu->isOpen())
+ {
menu->setVisible(FALSE);
- for(int i = 0;i<(int)suggestionMenuItems.size();i++)
+ }
+ for (int i = 0;i<(int)suggestionMenuItems.size();i++)
{
SpellMenuBind * tempBind = suggestionMenuItems[i];
- if(tempBind)
+ if (tempBind)
{
menu->remove((LLMenuItemCallGL *)tempBind->menuItem);
((LLMenuItemCallGL *)tempBind->menuItem)->die();
@@ -748,69 +753,74 @@ BOOL LLLineEditor::handleRightMouseDown( S32 x, S32 y, MASK mask )
}
suggestionMenuItems.clear();
- menu->setItemVisible("Translate To",!mReadOnly);
- menu->setItemVisible("Transep",!mReadOnly);
+ menu->setItemVisible("Translate To", !mReadOnly);
+ menu->setItemVisible("Transep", !mReadOnly);
- const LLWString& text = mText.getWString();
- if(( LLTextEditor::isPartOfWord( text[wordEnd] ) )
- &&(!mReadOnly))
+ // spell_check="true" in xui
+ if (!mReadOnly && mShowMisspellings)
{
- // Select word the cursor is over
- while ((wordEnd > 0) && LLTextEditor::isPartOfWord(text[wordEnd-1]))
- {
- wordEnd--;
- }
- wordStart=wordEnd;
- //startSelection();
+ const LLWString& text = mText.getWString();
- while ((wordEnd < (S32)text.length()) && LLTextEditor::isPartOfWord( text[wordEnd] ) )
+ // search for word matches
+ if (LLTextEditor::isPartOfWord(text[wordEnd]))
{
- wordEnd++;
- }
- std::string selectedWord(std::string(text.begin(),
- text.end()).substr(wordStart,wordEnd-wordStart));
- if(!glggHunSpell->isSpelledRight(selectedWord))
- {
- //misspelled word here, and you have just right clicked on it!
- std::vector suggs = glggHunSpell->getSuggestionList(selectedWord);
- //menu->setItemVisible("Transep",(suggs.size()>0));
+ // Select word the cursor is over
+ while ((wordEnd > 0) && LLTextEditor::isPartOfWord(text[wordEnd-1]))
+ {
+ wordEnd--;
+ }
+ wordStart = wordEnd;
+ //startSelection();
- for(int i = 0;i<(int)suggs.size();i++)
+ while ((wordEnd < (S32)text.length()) && LLTextEditor::isPartOfWord( text[wordEnd] ) )
{
+ wordEnd++;
+ }
+ std::string selectedWord(std::string(text.begin(), text.end()).substr(wordStart,wordEnd-wordStart));
+
+ if (!glggHunSpell->isSpelledRight(selectedWord))
+ {
+ //misspelled word here, and you have just right clicked on it!
+ std::vector suggs = glggHunSpell->getSuggestionList(selectedWord);
+ //menu->setItemVisible("Transep",(suggs.size()>0));
+
+ for (int i = 0; i<(int)suggs.size() ;i++)
+ {
+ SpellMenuBind * tempStruct = new SpellMenuBind;
+ tempStruct->origin = this;
+ tempStruct->word = suggs[i];
+ tempStruct->wordPositionEnd = wordEnd;
+ tempStruct->wordPositionStart=wordStart;
+ LLMenuItemCallGL * suggMenuItem = new LLMenuItemCallGL(
+ tempStruct->word, spell_correct, NULL, tempStruct);
+ //new LLMenuItemCallGL("Select All", context_selectall, NULL, this));
+ tempStruct->menuItem = suggMenuItem;
+ suggestionMenuItems.push_back(tempStruct);
+ menu->append(suggMenuItem);
+ }
SpellMenuBind * tempStruct = new SpellMenuBind;
tempStruct->origin = this;
- tempStruct->word = suggs[i];
+ tempStruct->word = selectedWord;
tempStruct->wordPositionEnd = wordEnd;
tempStruct->wordPositionStart=wordStart;
LLMenuItemCallGL * suggMenuItem = new LLMenuItemCallGL(
- tempStruct->word, spell_correct, NULL, tempStruct);
- //new LLMenuItemCallGL("Select All", context_selectall, NULL, this));
+ "Add Word", spell_add, NULL, tempStruct);
tempStruct->menuItem = suggMenuItem;
suggestionMenuItems.push_back(tempStruct);
menu->append(suggMenuItem);
}
- SpellMenuBind * tempStruct = new SpellMenuBind;
- tempStruct->origin = this;
- tempStruct->word = selectedWord;
- tempStruct->wordPositionEnd = wordEnd;
- tempStruct->wordPositionStart=wordStart;
- LLMenuItemCallGL * suggMenuItem = new LLMenuItemCallGL(
- "Add Word", spell_add, NULL, tempStruct);
- tempStruct->menuItem = suggMenuItem;
- suggestionMenuItems.push_back(tempStruct);
- menu->append(suggMenuItem);
}
- }
- if((!mReadOnly)&&((!glggHunSpell->highlightInRed)
- ||(mOverRideAndShowMisspellings)))
- {
SpellMenuBind * tempStruct = new SpellMenuBind;
tempStruct->origin = this;
- if(mOverRideAndShowMisspellings)
+ if (glggHunSpell->mSpellCheckHighlight)
+ {
tempStruct->word = "Hide Misspellings";
+ }
else
+ {
tempStruct->word = "Show Misspellings";
+ }
LLMenuItemCallGL * suggMenuItem = new LLMenuItemCallGL(
tempStruct->word, spell_show, NULL, tempStruct);
tempStruct->menuItem = suggMenuItem;
@@ -1838,36 +1848,43 @@ void LLLineEditor::doDelete()
}
}
}
+
void LLLineEditor::autoCorrectText()
{
static BOOL *doAnything = rebind_llcontrol("EmeraldEnableAutoCorrect", &gSavedSettings, true);
- if( (!mReadOnly) && (*doAnything) && (isSpellDirty()))
+ if (!mReadOnly && *doAnything && isSpellDirty())
{
S32 wordStart = 0;
S32 wordEnd = mCursorPos-1;
//llinfos <<"Checking Word, Cursor is at "< 0) && (' '!=text[wordEnd-1]))
{
wordEnd--;
}
- wordStart=wordEnd;
+ wordStart = wordEnd;
while ((wordEnd < (S32)text.length()) && (' '!=text[wordEnd] ) )
{
wordEnd++;
}
std::string lastTypedWord(std::string(text.begin(),
- text.end()).substr(wordStart,wordEnd-wordStart));
+ text.end()).substr(wordStart, wordEnd-wordStart));
//llinfos << " The last typed word has been chosen, it is "<replaceWord(lastTypedWord));
- if(correctedWord!=lastTypedWord)
+ if(correctedWord != lastTypedWord)
{
int dif = correctedWord.length()-lastTypedWord.length();
std::string regText(mText);
@@ -1879,53 +1896,56 @@ void LLLineEditor::autoCorrectText()
}
}
}
+
void LLLineEditor::drawMisspelled(LLRect background)
{
- if((glggHunSpell->highlightInRed || mOverRideAndShowMisspellings)
- &&(!mReadOnly))
+ if (!mReadOnly && mShowMisspellings)
{
- S32 newStartSpellHere =mScrollHPos;
- S32 cursorloc =calculateCursorFromMouse(mMaxHPixels);
- S32 newStopSpellHere = ( ((S32)mText.length())>cursorloc)?cursorloc:(S32)mText.length();
+ S32 newStartSpellHere = mScrollHPos;
+ S32 cursorloc = calculateCursorFromMouse(mMaxHPixels);
+ S32 newStopSpellHere = (((S32)mText.length())>cursorloc) ? cursorloc : (S32)mText.length();
F32 elapsed = mSpellTimer.getElapsedTimeF32();
- if(S32(elapsed / 1) & 1)
+ if (S32(elapsed / 1) & 1)
{
- if(isSpellDirty()||(newStartSpellHere!=mStartSpellHere)||(newStopSpellHere!=mEndSpellHere))
+ if (isSpellDirty() || (newStartSpellHere != mStartSpellHere) || ( newStopSpellHere != mEndSpellHere))
{
- mStartSpellHere=newStartSpellHere;
- mEndSpellHere= newStopSpellHere;
+ mStartSpellHere = newStartSpellHere;
+ mEndSpellHere = newStopSpellHere;
resetSpellDirty();
misspellLocations=getMisspelledWordsPositions();
}
}
- for(int i =0;i<(int)misspellLocations.size();i++)
- {
- S32 wstart =findPixelNearestPos( misspellLocations[i]-getCursor());
- S32 wend = findPixelNearestPos(misspellLocations[++i]-getCursor());
- S32 maxw = getRect().getWidth();
- if(wend > maxw)
- {
- wend=maxw;
- }
- if(wstart > maxw)
- {
- wstart=maxw;
- }
- gGL.color4ub(255,0,0,200);
- //3 line zig zags..
- while(wstartmSpellCheckHighlight)
+ {
+ for (int i =0; i<(int)misspellLocations.size(); i++)
{
- gl_line_2d(wstart,background.mBottom-1,wstart+3,background.mBottom+2);
- gl_line_2d(wstart+3,background.mBottom+2,wstart+6,background.mBottom-1);
- wstart+=6;
- }
+ S32 wstart =findPixelNearestPos( misspellLocations[i]-getCursor());
+ S32 wend = findPixelNearestPos(misspellLocations[++i]-getCursor());
+ S32 maxw = getRect().getWidth();
+ if (wend > maxw)
+ {
+ wend = maxw;
+ }
+ if (wstart > maxw)
+ {
+ wstart = maxw;
+ }
+ gGL.color4ub(255,0,0,200);
+ //3 line zig zags..
+ while (wstart < wend)
+ {
+ gl_line_2d(wstart, background.mBottom-1, wstart+3, background.mBottom+2);
+ gl_line_2d(wstart+3, background.mBottom+2, wstart+6, background.mBottom-1);
+ wstart+=6;
+ }
+ }
}
}
-
}
+
void LLLineEditor::draw()
{
autoCorrectText();
@@ -2797,6 +2817,11 @@ LLView* LLLineEditor::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory
{
line_editor->setCommitOnFocusLost(commit_on_focus_lost);
}
+ BOOL show_misspellings = FALSE;
+ if (node->getAttributeBOOL("spell_check", show_misspellings))
+ {
+ line_editor->setShowMisspellings(show_misspellings);
+ }
line_editor->setColorParameters(node);
diff --git a/linden/indra/llui/lllineeditor.h b/linden/indra/llui/lllineeditor.h
index 6de57ec..1d24803 100644
--- a/linden/indra/llui/lllineeditor.h
+++ b/linden/indra/llui/lllineeditor.h
@@ -198,7 +198,7 @@ public:
void setWriteableBgColor( const LLColor4& c ) { mWriteableBgColor = c; }
void setReadOnlyBgColor( const LLColor4& c ) { mReadOnlyBgColor = c; }
void setFocusBgColor(const LLColor4& c) { mFocusBgColor = c; }
- void setOverRideAndShowMisspellings(BOOL b) { mOverRideAndShowMisspellings =b;}
+ void setShowMisspellings(BOOL b) { mShowMisspellings = b;}
const LLColor4& getFgColor() const { return mFgColor; }
const LLColor4& getReadOnlyFgColor() const { return mReadOnlyFgColor; }
@@ -293,7 +293,7 @@ protected:
std::vector misspellLocations; // where all the mispelled words are
S32 mStartSpellHere; // the position of the first char on the screen, stored so we know when to update
S32 mEndSpellHere; // the location of the last char on the screen
- BOOL mOverRideAndShowMisspellings;
+ BOOL mShowMisspellings;
LLFrameTimer mSpellTimer;
//to keep track of what we have to remove before showing menu
std::vector suggestionMenuItems;
diff --git a/linden/indra/llui/lltexteditor.cpp b/linden/indra/llui/lltexteditor.cpp
index 6e5cdc4..d2469c3 100644
--- a/linden/indra/llui/lltexteditor.cpp
+++ b/linden/indra/llui/lltexteditor.cpp
@@ -323,7 +323,7 @@ LLTextEditor::LLTextEditor(
mLastSelectionY(-1),
mReflowNeeded(FALSE),
mScrollNeeded(FALSE),
- mOverRideAndShowMisspellings(FALSE)
+ mShowMisspellings(FALSE)
{
mSourceID.generate();
@@ -490,10 +490,10 @@ void LLTextEditor::spell_show(void * data)
{
if(tempBind->word=="Show Misspellings")
{
- line->setOverRideAndShowMisspellings(TRUE);
+ line->setShowMisspellings(TRUE);
}else
{
- line->setOverRideAndShowMisspellings(FALSE);
+ line->setShowMisspellings(FALSE);
}
}
}
@@ -1426,7 +1426,6 @@ BOOL LLTextEditor::handleMouseDown(S32 x, S32 y, MASK mask)
}
BOOL LLTextEditor::handleRightMouseDown( S32 x, S32 y, MASK mask )
{
-
setFocus(TRUE);
//setCursorAtLocalPos( x, y, TRUE );
@@ -1450,69 +1449,73 @@ BOOL LLTextEditor::handleRightMouseDown( S32 x, S32 y, MASK mask )
}
suggestionMenuItems.clear();
- menu->setItemVisible("Translate To",!mReadOnly);
- menu->setItemVisible("Transep",!mReadOnly);
-
- const LLWString &text = mWText;
+ menu->setItemVisible("Translate To", !mReadOnly);
+ menu->setItemVisible("Transep", !mReadOnly);
- if(( isPartOfWord( text[wordEnd] ) )&&(!mReadOnly))
+ // spell_check="true" in xui
+ if (!mReadOnly && mShowMisspellings)
{
- // Select word the cursor is over
- while ((wordEnd > 0) && isPartOfWord(text[wordEnd-1]))
- {
- wordEnd--;
- }
- wordStart=wordEnd;
- //startSelection();
-
- while ((wordEnd < (S32)text.length()) && isPartOfWord( text[wordEnd] ) )
- {
- wordEnd++;
- }
- std::string selectedWord(std::string(text.begin(), text.end()).substr(wordStart,wordEnd-wordStart));
- if(!glggHunSpell->isSpelledRight(selectedWord))
+ const LLWString &text = mWText;
+
+ if (isPartOfWord(text[wordEnd]) && !mReadOnly)
{
- //misspelled word here, and you have just right clicked on it!
- std::vector suggs = glggHunSpell->getSuggestionList(selectedWord);
+ // Select word the cursor is over
+ while ((wordEnd > 0) && isPartOfWord(text[wordEnd-1]))
+ {
+ wordEnd--;
+ }
+ wordStart = wordEnd;
+ //startSelection();
- //menu->setItemVisible("Transep",(suggs.size()>0));
- for(int i = 0;i<(int)suggs.size();i++)
+ while ((wordEnd < (S32)text.length()) && isPartOfWord( text[wordEnd] ) )
+ {
+ wordEnd++;
+ }
+ std::string selectedWord(std::string(text.begin(), text.end()).substr(wordStart,wordEnd-wordStart));
+ if (!glggHunSpell->isSpelledRight(selectedWord))
{
+ //misspelled word here, and you have just right clicked on it!
+ std::vector suggs = glggHunSpell->getSuggestionList(selectedWord);
+
+ //menu->setItemVisible("Transep",(suggs.size()>0));
+ for (int i = 0; i<(int)suggs.size(); i++)
+ {
+ SpellMenuBind * tempStruct = new SpellMenuBind;
+ tempStruct->origin = this;
+ tempStruct->word = suggs[i];
+ tempStruct->wordPositionEnd = wordEnd;
+ tempStruct->wordPositionStart=wordStart;
+ tempStruct->wordY=y;
+ LLMenuItemCallGL * suggMenuItem = new LLMenuItemCallGL(
+ tempStruct->word, spell_correct, NULL, tempStruct);
+ tempStruct->menuItem = suggMenuItem;
+ suggestionMenuItems.push_back(tempStruct);
+ menu->append(suggMenuItem);
+ }
SpellMenuBind * tempStruct = new SpellMenuBind;
tempStruct->origin = this;
- tempStruct->word = suggs[i];
+ tempStruct->word = selectedWord;
tempStruct->wordPositionEnd = wordEnd;
tempStruct->wordPositionStart=wordStart;
tempStruct->wordY=y;
LLMenuItemCallGL * suggMenuItem = new LLMenuItemCallGL(
- tempStruct->word, spell_correct, NULL, tempStruct);
+ "Add Word", spell_add, NULL, tempStruct);
tempStruct->menuItem = suggMenuItem;
suggestionMenuItems.push_back(tempStruct);
menu->append(suggMenuItem);
}
- SpellMenuBind * tempStruct = new SpellMenuBind;
- tempStruct->origin = this;
- tempStruct->word = selectedWord;
- tempStruct->wordPositionEnd = wordEnd;
- tempStruct->wordPositionStart=wordStart;
- tempStruct->wordY=y;
- LLMenuItemCallGL * suggMenuItem = new LLMenuItemCallGL(
- "Add Word", spell_add, NULL, tempStruct);
- tempStruct->menuItem = suggMenuItem;
- suggestionMenuItems.push_back(tempStruct);
- menu->append(suggMenuItem);
}
- }
- if((!mReadOnly)&&((!glggHunSpell->highlightInRed)
- ||(mOverRideAndShowMisspellings)||(mShowLineNumbers)))
- {
SpellMenuBind * tempStruct = new SpellMenuBind;
tempStruct->origin = this;
- if(mOverRideAndShowMisspellings)
+ if (glggHunSpell->mSpellCheckHighlight)
+ {
tempStruct->word = "Hide Misspellings";
+ }
else
+ {
tempStruct->word = "Show Misspellings";
+ }
LLMenuItemCallGL * suggMenuItem = new LLMenuItemCallGL(
tempStruct->word, spell_show, NULL, tempStruct);
tempStruct->menuItem = suggMenuItem;
@@ -3077,51 +3080,57 @@ void LLTextEditor::drawSelectionBackground()
}
}
}
+
void LLTextEditor::autoCorrectText()
-{
-
+{
static BOOL *doAnything = rebind_llcontrol("EmeraldEnableAutoCorrect", &gSavedSettings, true);
- if( (!mReadOnly) && (*doAnything) && (isSpellDirty()) )
+ if (!mReadOnly && *doAnything && isSpellDirty())
{
S32 wordStart = 0;
S32 wordEnd = mCursorPos-1;
- if(wordEnd<1)return;
+ if (wordEnd < 1)
+ {
+ return;
+ }
LLWString& text = mWText;
- if(text.size()<1)return;
- if( LLTextEditor::isPartOfWord( text[wordEnd] )) return;//we only check on word breaks
+ if (text.size() < 1 || LLTextEditor::isPartOfWord(text[wordEnd]))
+ {
+ return;//we only check on word breaks
+ }
+
wordEnd--;
- if( LLTextEditor::isPartOfWord( text[wordEnd] ) )
+ if (LLTextEditor::isPartOfWord(text[wordEnd]))
{
while ((wordEnd > 0) && (text[wordEnd-1]!=' '))
{
wordEnd--;
}
- wordStart=wordEnd;
+ wordStart = wordEnd;
while ((wordEnd < (S32)text.length()) && (' '!= text[wordEnd] ) )
{
wordEnd++;
}
std::string lastTypedWord(std::string(text.begin(),
- text.end()).substr(wordStart,wordEnd-wordStart));
+ text.end()).substr(wordStart, wordEnd-wordStart));
- std::string regText(text.begin(),text.end());
+ std::string regText(text.begin(), text.end());
std::string correctedWord(LGGAutoCorrect::getInstance()->replaceWord(lastTypedWord));
- if(correctedWord!=lastTypedWord)
+ if (correctedWord != lastTypedWord)
{
- int dif = correctedWord.length()-lastTypedWord.length();
- regText.replace(wordStart,lastTypedWord.length(),correctedWord);
- mWText=utf8str_to_wstring(regText);
- mCursorPos+=dif;
+ int dif = correctedWord.length() - lastTypedWord.length();
+ regText.replace(wordStart, lastTypedWord.length(), correctedWord);
+ mWText = utf8str_to_wstring(regText);
+ mCursorPos += dif;
needsReflow();
}
}
}
}
+
void LLTextEditor::drawMisspelled()
{
- if(mReadOnly)return;
- if(glggHunSpell->highlightInRed || mOverRideAndShowMisspellings)
+ if (!mReadOnly && mShowMisspellings)
{
if(
( ((getLength()<400)||(false)) &&( (S32(mSpellTimer.getElapsedTimeF32() / 1) & 1) ))
@@ -3132,80 +3141,86 @@ void LLTextEditor::drawMisspelled()
S32 newSpellStart = getLineStart(mScrollbar->getDocPos());//start at the scroll start
S32 newSpellEnd = getLineStart(mScrollbar->getDocPos() + 1 + mScrollbar->getDocSize()-mScrollbar->getDocPosMax());//end at the end o.o
- if(mScrollbar->getDocPos() == mScrollbar->getDocPosMax())
+ if (mScrollbar->getDocPos() == mScrollbar->getDocPosMax())
{
- newSpellEnd=(S32)mWText.length();
+ newSpellEnd = (S32)mWText.length();
}
- if((isSpellDirty())||(newSpellEnd!=spellEnd || newSpellStart!=spellStart))
+ if (isSpellDirty() || (newSpellEnd!=spellEnd || newSpellStart!=spellStart))
{
spellEnd = newSpellEnd;
spellStart = newSpellStart;
- misspellLocations=getMisspelledWordsPositions();
+ misspellLocations = getMisspelledWordsPositions();
}
}
//draw
- for(int i =0;i<(int)misspellLocations.size();i++)
+ if (glggHunSpell->mSpellCheckHighlight)
{
- S32 wstart = misspellLocations[i];
- S32 wend = misspellLocations[++i];
- //start curor code mod
- const LLWString &text = mWText;
- const S32 text_len = getLength();
- // Skip through the lines we aren't drawing.
- S32 search_pos = mScrollbar->getDocPos();
- S32 num_lines = getLineCount();
- if (search_pos >= num_lines)return;
- S32 line_start = getLineStart(search_pos);
- F32 line_height = mGLFont->getLineHeight();
- F32 text_y = (F32)(mTextRect.mTop) - line_height;
-
- F32 word_left = 0.f;
- F32 word_right = 0.f;
- F32 word_bottom = 0.f;
- BOOL word_visible = FALSE;
-
- S32 line_end = 0;
- // Determine if the cursor is visible and if so what its coordinates are.
- while( (mTextRect.mBottom <= llround(text_y)) && (search_pos < num_lines))
+ for (int i = 0; i<(int)misspellLocations.size() ;i++)
{
- line_end = text_len + 1;
- S32 next_line = -1;
-
- if ((search_pos + 1) < num_lines)
+ S32 wstart = misspellLocations[i];
+ S32 wend = misspellLocations[++i];
+ //start curor code mod
+ const LLWString &text = mWText;
+ const S32 text_len = getLength();
+ // Skip through the lines we aren't drawing.
+ S32 search_pos = mScrollbar->getDocPos();
+ S32 num_lines = getLineCount();
+ if (search_pos >= num_lines)
{
- next_line = getLineStart(search_pos + 1);
- line_end = next_line - 1;
+ return;
}
- const llwchar* line = text.c_str() + line_start;
- // Find the cursor and selection bounds
- if( line_start <= wstart && wend <= line_end )
+ S32 line_start = getLineStart(search_pos);
+ F32 line_height = mGLFont->getLineHeight();
+ F32 text_y = (F32)(mTextRect.mTop) - line_height;
+
+ F32 word_left = 0.f;
+ F32 word_right = 0.f;
+ F32 word_bottom = 0.f;
+ BOOL word_visible = FALSE;
+
+ S32 line_end = 0;
+ // Determine if the cursor is visible and if so what its coordinates are.
+ while( (mTextRect.mBottom <= llround(text_y)) && (search_pos < num_lines))
{
- word_visible = TRUE;
- word_left = (F32)mTextRect.mLeft + mGLFont->getWidthF32(line, 0, wstart - line_start, mAllowEmbeddedItems )-1.f;
- word_right = (F32)mTextRect.mLeft + mGLFont->getWidthF32(line, 0, wend - line_start, mAllowEmbeddedItems )+1.f;
- word_bottom = text_y;
- break;
+ line_end = text_len + 1;
+ S32 next_line = -1;
+
+ if ((search_pos + 1) < num_lines)
+ {
+ next_line = getLineStart(search_pos + 1);
+ line_end = next_line - 1;
+ }
+ const llwchar* line = text.c_str() + line_start;
+ // Find the cursor and selection bounds
+ if( line_start <= wstart && wend <= line_end )
+ {
+ word_visible = TRUE;
+ word_left = (F32)mTextRect.mLeft + mGLFont->getWidthF32(line, 0, wstart - line_start, mAllowEmbeddedItems )-1.f;
+ word_right = (F32)mTextRect.mLeft + mGLFont->getWidthF32(line, 0, wend - line_start, mAllowEmbeddedItems )+1.f;
+ word_bottom = text_y;
+ break;
+ }
+ // move down one line
+ text_y -= line_height;
+ line_start = next_line;
+ search_pos++;
}
- // move down one line
- text_y -= line_height;
- line_start = next_line;
- search_pos++;
- }
- if(mShowLineNumbers)
- {
- word_left += UI_TEXTEDITOR_LINE_NUMBER_MARGIN;
- word_right += UI_TEXTEDITOR_LINE_NUMBER_MARGIN;
- }
- // Draw the cursor
- if( word_visible )
- {
- //end cursos code mod
- gGL.color4ub(255,0,0,200);
- while(word_leftgetAttributeBOOL("track_bottom", mTrackBottom);
+ node->getAttributeBOOL("spell_check", mShowMisspellings);
+
LLColor4 color;
if (LLUICtrlFactory::getAttributeColor(node,"cursor_color", color))
{
diff --git a/linden/indra/llui/lltexteditor.h b/linden/indra/llui/lltexteditor.h
index 6b372d7..c5c3af8 100644
--- a/linden/indra/llui/lltexteditor.h
+++ b/linden/indra/llui/lltexteditor.h
@@ -229,7 +229,7 @@ public:
void setThumbColor( const LLColor4& color );
void setHighlightColor( const LLColor4& color );
void setShadowColor( const LLColor4& color );
- void setOverRideAndShowMisspellings(BOOL b){ mOverRideAndShowMisspellings =b;}
+ void setShowMisspellings(BOOL b) { mShowMisspellings = b; }
// Hacky methods to make it into a word-wrapping, potentially scrolling,
// read-only text box.
@@ -526,7 +526,7 @@ private:
S32 spellStart;
S32 spellEnd;
std::vector misspellLocations; // where all the mispelled words are
- BOOL mOverRideAndShowMisspellings;
+ BOOL mShowMisspellings; // set in xui as "spell_check". Default value for a field
S32 mMaxTextByteLength; // Maximum length mText is allowed to be in bytes
diff --git a/linden/indra/newview/lgghunspell_wrapper.cpp b/linden/indra/newview/lgghunspell_wrapper.cpp
index 5879bac..632c117 100644
--- a/linden/indra/newview/lgghunspell_wrapper.cpp
+++ b/linden/indra/newview/lgghunspell_wrapper.cpp
@@ -468,53 +468,64 @@ static char * languageCodesraw[]={
};
//#define LANGUAGE_CODES_RAW_SIZE ((__LINE__ - 1 - LANGUAGE_CODES_RAW_START_LINE) * 2)
#define LANGUAGE_CODES_RAW_SIZE 368
+
lggHunSpell_Wrapper::lggHunSpell_Wrapper()
+ :
+ mSpellCheckHighlight(false)
{
- highlightInRed=false;
//languageCodes(begin(languageCodesraw), end(languageCodesraw));
}
-lggHunSpell_Wrapper::~lggHunSpell_Wrapper(){}
+
+lggHunSpell_Wrapper::~lggHunSpell_Wrapper()
+{
+}
+
std::string lggHunSpell_Wrapper::getCorrectPath(std::string file)
{
//finds out if it is in user dir, if not, takes it from app dir
std::string dicpath1(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries", file).c_str());
- if(!gDirUtilp->fileExists(dicpath1))
+ if (!gDirUtilp->fileExists(dicpath1))
+ {
dicpath1=gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "dictionaries", file).c_str();
-
+ }
return dicpath1;
}
+
void lggHunSpell_Wrapper::setNewDictionary(std::string newDict)
{
llinfos << "Setting new base dictionary long name is-> " << newDict.c_str() << llendl;
- currentBaseDic=newDict;
+ currentBaseDic = newDict;
//expecting a full name comming in
newDict = fullName2DictName(newDict);
- if(myHunspell)delete myHunspell;
+ if (myHunspell)
+ {
+ delete myHunspell;
+ }
- std::string dicaffpath=getCorrectPath(newDict+".aff");
- std::string dicdicpath=getCorrectPath(newDict+".dic");
+ std::string dicaffpath = getCorrectPath(newDict+".aff");
+ std::string dicdicpath = getCorrectPath(newDict+".dic");
llinfos << "Setting new base dictionary -> " << dicaffpath.c_str() << llendl;
- myHunspell = new Hunspell(dicaffpath.c_str(),dicdicpath.c_str());
+ myHunspell = new Hunspell(dicaffpath.c_str(), dicdicpath.c_str());
llinfos << "Adding custom dictionary " << llendl;
createCustomDic();
addDictionary("custom");
std::vector toInstall = getInstalledDicts();
- for(int i =0;i<(int)toInstall.size();i++)
+ for (int i = 0; i < (int)toInstall.size(); i++)
+ {
addDictionary(toInstall[i]);
-
-
+ }
}
+
void lggHunSpell_Wrapper::createCustomDic()
{
- std::string filename(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,
- "dictionaries", "custom.dic"));
- if(!gDirUtilp->fileExists(filename))
+ std::string filename(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries", "custom.dic"));
+ if (!gDirUtilp->fileExists(filename))
{
llofstream export_file;
export_file.open(filename);
@@ -523,49 +534,67 @@ void lggHunSpell_Wrapper::createCustomDic()
export_file.close();
}
}
+
void lggHunSpell_Wrapper::addWordToCustomDictionary(std::string wordToAdd)
{
- if(!myHunspell)return;
+ if (!myHunspell)
+ {
+ return;
+ }
+
myHunspell->add(wordToAdd.c_str());
std::string filename(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries", "custom.dic"));
std::vector lines;
- if(gDirUtilp->fileExists(filename))
+ if (gDirUtilp->fileExists(filename))
{
//get words already there..
llifstream importer(filename);
std::string line;
- if(getline( importer, line ))//ignored the size
+ if (getline( importer, line ))//ignored the size
{
- while( getline( importer, line ) ) lines.push_back(line);
+ while ( getline( importer, line ) ) lines.push_back(line);
}
importer.close();
}
+
llofstream export_file;
export_file.open(filename);
- std::string sizePart(llformat("%i",(int)(lines.size()+1))+"\n");
- export_file.write(sizePart.c_str(),sizePart.length());
- for(int i=0;i<(int)lines.size();i++)
+ std::string sizePart(llformat("%i", (int)(lines.size()+1)) + "\n");
+ export_file.write(sizePart.c_str(), sizePart.length());
+ for (int i = 0; i < (int)lines.size() ;i++)
+ {
export_file.write(std::string(lines[i]+"\n").c_str(),lines[i].length()+1);
+ }
//LLStringUtil::toLower(wordToAdd);
- wordToAdd=wordToAdd+std::string("\n");
- export_file.write(wordToAdd.c_str(),wordToAdd.length());
+ wordToAdd = wordToAdd+std::string("\n");
+ export_file.write(wordToAdd.c_str(), wordToAdd.length());
//export_file << std::hex << 10 ;
export_file.close();
}
+
BOOL lggHunSpell_Wrapper::isSpelledRight(std::string wordToCheck)
{
- if(!myHunspell)return TRUE;
- if(wordToCheck.length()<3)return TRUE;
+ if (!myHunspell || wordToCheck.length() < 3)
+ {
+ return TRUE;
+ }
return myHunspell->spell(wordToCheck.c_str());
}
+
std::vector lggHunSpell_Wrapper::getSuggestionList(std::string badWord)
{
std::vector toReturn;
- if(!myHunspell)return toReturn;
- char ** suggestionList;
+ if (!myHunspell)
+ {
+ return toReturn;
+ }
+
+ char** suggestionList;
int numberOfSuggestions = myHunspell->suggest(&suggestionList, badWord.c_str());
- if(numberOfSuggestions <= 0)
- return toReturn;
+ if (numberOfSuggestions <= 0)
+ {
+ return toReturn;
+ }
for (int i = 0; i < numberOfSuggestions; i++)
{
std::string tempSugg(suggestionList[i]);
@@ -574,14 +603,16 @@ std::vector lggHunSpell_Wrapper::getSuggestionList(std::string badW
myHunspell->free_list(&suggestionList,numberOfSuggestions);
return toReturn;
}
+
void lggHunSpell_Wrapper::debugTest(std::string testWord)
{
llinfos << "Testing to see if " << testWord.c_str() << " is spelled correct" << llendl;
- if( isSpelledRight(testWord))
+ if (isSpelledRight(testWord))
{
llinfos << testWord.c_str() << " is spelled correctly" << llendl;
- }else
+ }
+ else
{
llinfos << testWord.c_str() << " is not spelled correctly, getting suggestions" << llendl;
std::vector suggList;
@@ -589,148 +620,167 @@ void lggHunSpell_Wrapper::debugTest(std::string testWord)
suggList = getSuggestionList(testWord);
llinfos << "Got suggestions.. " << llendl;
- for(int i = 0; i<(int)suggList.size();i++)
+ for (int i = 0; i < (int)suggList.size(); i++)
{
llinfos << "Suggestion for " << testWord.c_str() << ":" << suggList[i].c_str() << llendl;
}
-
}
-
}
+
void lggHunSpell_Wrapper::initSettings()
{
glggHunSpell = new lggHunSpell_Wrapper();
glggHunSpell->processSettings();
}
+
void lggHunSpell_Wrapper::processSettings()
{
//expects everything to already be in saved settings
//this will also reload and read the installed dicts
setNewDictionary(gSavedSettings.getString("EmeraldSpellBase"));
- highlightInRed= gSavedSettings.getBOOL("EmeraldSpellDisplay");
+ mSpellCheckHighlight = gSavedSettings.getBOOL("EmeraldSpellDisplay");
}
+
void lggHunSpell_Wrapper::addDictionary(std::string additionalDictionary)
{
- if(!myHunspell)return;
- if(additionalDictionary=="")return;
+ if (!myHunspell || additionalDictionary.empty())
+ {
+ return;
+ }
+
//expecting a full name here
- std::string dicpath=getCorrectPath(fullName2DictName(additionalDictionary)+".dic");
- if(gDirUtilp->fileExists(dicpath))
+ std::string dicpath = getCorrectPath(fullName2DictName(additionalDictionary)+".dic");
+ if (gDirUtilp->fileExists(dicpath))
{
llinfos << "Adding additional dictionary -> " << dicpath.c_str() << llendl;
myHunspell->add_dic(dicpath.c_str());
}
}
+
std::string lggHunSpell_Wrapper::dictName2FullName(std::string dictName)
{
- if(dictName==std::string(""))return std::string("");
- std::string countryCode="";
- std::string languageCode="";
+ if (dictName.empty())
+ {
+ return dictName;
+ }
+
+ std::string countryCode("");
+ std::string languageCode("");
+
//remove extension
dictName = dictName.substr(0,dictName.find("."));
+
//break it up by - or _
S32 breakPoint = dictName.find("-");
- if(breakPoint==std::string::npos)
+ if (breakPoint == std::string::npos)
+ {
breakPoint = dictName.find("_");
- if(breakPoint==std::string::npos)
+ }
+ if (breakPoint == std::string::npos)
{
//no country code given
- languageCode=dictName;
- }else
+ languageCode = dictName;
+ }
+ else
{
- languageCode=dictName.substr(0,breakPoint);
- countryCode=dictName.substr(breakPoint+1);
+ languageCode = dictName.substr(0,breakPoint);
+ countryCode = dictName.substr(breakPoint+1);
}
+
//get long language code
- for(int i =0;i lggHunSpell_Wrapper::getDicts()
{
std::vector names;
std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "dictionaries", ""));
bool found = true;
- while(found)
+ while (found)
{
std::string name;
found = gDirUtilp->getNextFileInDir(path_name, "*.aff", name, false);
- if(found)
+ if (found)
{
names.push_back(dictName2FullName(name));
}
}
- path_name=gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries", "");
- found=true;
- while(found)
+ path_name = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries", "");
+ found = true;
+ while (found)
{
std::string name;
found = gDirUtilp->getNextFileInDir(path_name, "*.aff", name, false);
- if(found)
+ if (found)
{
names.push_back(dictName2FullName(name));
}
@@ -738,123 +788,159 @@ std::vector lggHunSpell_Wrapper::getDicts()
return names;
}
+
std::vector lggHunSpell_Wrapper::getExtraDicts()
{
std::vector names;
std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "dictionaries", ""));
bool found = true;
- while(found)
+ while (found)
{
std::string name;
found = gDirUtilp->getNextFileInDir(path_name, "*.dic", name, false);
- if(found)
+ if (found)
{
names.push_back(dictName2FullName(name));
}
}
- path_name=gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries", "");
- found=true;
- while(found)
+ path_name = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries", "");
+ found = true;
+ while (found)
{
std::string name;
found = gDirUtilp->getNextFileInDir(path_name, "*.dic", name, false);
- if(found)
+ if (found)
{
names.push_back(dictName2FullName(name));
}
}
return names;
}
+
std::vector lggHunSpell_Wrapper::getInstalledDicts()
{
std::vector toReturn;
//expecting short names to be stored...
- std::vector shortNames = CSV2VEC(gSavedSettings.getString("EmeraldSpellInstalled"));
- for(int i =0;i<(int)shortNames.size();i++)
+ std::vector shortNames = CSV2VEC(gSavedSettings.getString("EmeraldSpellInstalled"));
+ for (int i =0; i < (int)shortNames.size(); i++)
+ {
toReturn.push_back(dictName2FullName(shortNames[i]));
+ }
return toReturn;
}
+
std::vector lggHunSpell_Wrapper::getAvailDicts()
{
std::vector toReturn;
std::vector dics = getExtraDicts();
std::vector installedDics = getInstalledDicts();
- for(int i =0;i<(int)dics.size();i++)
+ for (int i = 0; i < (int)dics.size(); i++)
{
bool found = false;
- for(int j=0;j<(int)installedDics.size();j++)
+ for (int j = 0; j < (int)installedDics.size(); j++)
+ {
+ if (0 == LLStringUtil::compareInsensitive(dics[i], installedDics[j]))
+ {
+ found = true;//this dic is already installed
+ }
+ }
+ if (0 == LLStringUtil::compareInsensitive(dics[i], currentBaseDic))
{
- if(0==LLStringUtil::compareInsensitive(dics[i],installedDics[j]))
- found=true;//this dic is already installed
+ found = true;
+ }
+ if (0 == LLStringUtil::compareInsensitive(dics[i], "Emerald (CUSTOM)"))
+ {
+ found = true;
+ }
+ if (!found)
+ {
+ toReturn.push_back(dics[i]);
}
- if(0==LLStringUtil::compareInsensitive(dics[i],currentBaseDic))
- found=true;
- if(0==LLStringUtil::compareInsensitive(dics[i],"Emerald (CUSTOM)"))
- found=true;
- if(!found)toReturn.push_back(dics[i]);
}
return toReturn;
}
+
std::vector lggHunSpell_Wrapper::CSV2VEC(std::string csv)
{
std::vector toReturn;
boost::regex re(",");
boost::sregex_token_iterator i(csv.begin(), csv.end(), re, -1);
boost::sregex_token_iterator j;
- while(i != j)
+ while (i != j)
+ {
toReturn.push_back(*i++);
+ }
return toReturn;
}
+
std::string lggHunSpell_Wrapper::VEC2CSV(std::vector vec)
{
- std::string toReturn="";
- if(vec.size()<1)return toReturn;
- for(int i = 0;i<(int)vec.size();i++)
- toReturn+=vec[i]+",";
+ std::string toReturn("");
+ if (vec.size() < 1)
+ {
+ return toReturn;
+ }
+
+ for (int i = 0;i < (int)vec.size() ;i++)
+ {
+ toReturn += vec[i] + ",";
+ }
return toReturn.erase(toReturn.length()-1);
}
+
void lggHunSpell_Wrapper::addButton(std::string selection)
{
- if(selection=="")return;
+ if (selection.empty())
+ {
+ return;
+ }
addDictionary(selection);
std::vector alreadyInstalled = CSV2VEC(gSavedSettings.getString("EmeraldSpellInstalled"));
alreadyInstalled.push_back(fullName2DictName(selection));
- gSavedSettings.setString("EmeraldSpellInstalled",VEC2CSV(alreadyInstalled));
+ gSavedSettings.setString("EmeraldSpellInstalled", VEC2CSV(alreadyInstalled));
}
+
void lggHunSpell_Wrapper::removeButton(std::string selection)
{
- if(selection=="")return;
+ if (selection.empty())
+ {
+ return;
+ }
std::vector newInstalledDics;
std::vector currentlyInstalled = getInstalledDicts();
- for(int i =0;i<(int)currentlyInstalled.size();i++)
+ for (int i = 0; i < (int)currentlyInstalled.size(); i++)
{
- if(0!=LLStringUtil::compareInsensitive(selection,currentlyInstalled[i]))
+ if (0 != LLStringUtil::compareInsensitive(selection, currentlyInstalled[i]))
+ {
newInstalledDics.push_back(fullName2DictName(currentlyInstalled[i]));
+ }
}
- gSavedSettings.setString("EmeraldSpellInstalled",VEC2CSV(newInstalledDics));
+ gSavedSettings.setString("EmeraldSpellInstalled", VEC2CSV(newInstalledDics));
processSettings();
}
+
void lggHunSpell_Wrapper::newDictSelection(std::string selection)
{
- currentBaseDic=selection;
- gSavedSettings.setString("EmeraldSpellBase",selection);
+ currentBaseDic = selection;
+ gSavedSettings.setString("EmeraldSpellBase", selection);
//better way to do this would be to check and see if there is a installed conflict
//and then only remove that one.. messy
- gSavedSettings.setString("EmeraldSpellInstalled","en_sl");
+ gSavedSettings.setString("EmeraldSpellInstalled", "en_sl");
processSettings();
}
-void lggHunSpell_Wrapper::getMoreButton(void * data)
+
+void lggHunSpell_Wrapper::getMoreButton(void* data)
{
std::vector shortNames;
std::vector longNames;
LLSD response = LLHTTPClient::blockingGet(gSavedSettings.getString("DicDownloadBaseURL")+"dic_list.xml");
- if(response.has("body"))
+ if (response.has("body"))
{
const LLSD &dict_list = response["body"];
- if(dict_list.has("isComplete"))
+ if (dict_list.has("isComplete"))
{
LLSD dics = dict_list["data"];
- for(int i = 0; i < dics.size(); i++)
+ for (int i = 0; i < dics.size(); i++)
{
std::string dicFullName = dictName2FullName(dics[i].asString());
longNames.push_back(dicFullName);
@@ -864,11 +950,12 @@ void lggHunSpell_Wrapper::getMoreButton(void * data)
}
}
}
+
void lggHunSpell_Wrapper::editCustomButton()
{
std::string dicdicpath(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries", std::string("custom.dic")).c_str());
- if(!gDirUtilp->fileExists(dicdicpath))
+ if (!gDirUtilp->fileExists(dicdicpath))
{
createCustomDic();
//glggHunSpell->addWordToCustomDictionary("temp");
@@ -877,7 +964,7 @@ void lggHunSpell_Wrapper::editCustomButton()
gViewerWindow->getWindow()->ShellEx(dicdicpath);
}
-void lggHunSpell_Wrapper::setNewHighlightSetting( BOOL highlight )
+void lggHunSpell_Wrapper::setNewHighlightSetting(BOOL highlight)
{
- highlightInRed=highlight;
+ mSpellCheckHighlight = highlight;
}
diff --git a/linden/indra/newview/lgghunspell_wrapper.h b/linden/indra/newview/lgghunspell_wrapper.h
index 348f479..4d07ff8 100644
--- a/linden/indra/newview/lgghunspell_wrapper.h
+++ b/linden/indra/newview/lgghunspell_wrapper.h
@@ -28,9 +28,9 @@ class lggHunSpell_Wrapper
{
public:
- static Hunspell * myHunspell;
+ static Hunspell* myHunspell;
- BOOL highlightInRed;
+ BOOL mSpellCheckHighlight;
static void initSettings();
void processSettings();
@@ -69,6 +69,6 @@ private:
//std::vector countryCodes;
};
-extern lggHunSpell_Wrapper *glggHunSpell; // the singleton hunspell wrapper
+extern lggHunSpell_Wrapper* glggHunSpell; // the singleton hunspell wrapper
#endif
--
cgit v1.1
From 0acb4dcea8e312a25fde92436413e7ac69b8b1a5 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Wed, 15 Sep 2010 03:58:03 -0700
Subject: Removed unused panel_voice_options.xml file
---
.../default/xui/en-us/panel_voice_options.xml | 43 ----------------------
1 file changed, 43 deletions(-)
delete mode 100644 linden/indra/newview/skins/default/xui/en-us/panel_voice_options.xml
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_voice_options.xml b/linden/indra/newview/skins/default/xui/en-us/panel_voice_options.xml
deleted file mode 100644
index 4c6edfd..0000000
--- a/linden/indra/newview/skins/default/xui/en-us/panel_voice_options.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
- Use the options below to configure your Voice Chat experience.
-
-
-
- Hear Voice Chat from camera position.
-
-
- Hear Voice Chat from avatar position.
-
-
-
-
-
- Push-to-Talk trigger:
-
-
-
-
-
--
cgit v1.1
From 7312060678f78dbb8abdba319e9ebf9af631d09b Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Wed, 15 Sep 2010 04:18:26 -0700
Subject: Added spell_check to panel_*.xml line editors
---
linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml | 6 +++---
.../newview/skins/default/xui/en-us/panel_avatar_classified.xml | 2 +-
.../indra/newview/skins/default/xui/en-us/panel_avatar_pick.xml | 2 +-
linden/indra/newview/skins/default/xui/en-us/panel_chat_bar.xml | 2 +-
linden/indra/newview/skins/default/xui/en-us/panel_classified.xml | 2 +-
.../indra/newview/skins/default/xui/en-us/panel_group_general.xml | 2 +-
.../indra/newview/skins/default/xui/en-us/panel_group_notices.xml | 5 +++--
.../indra/newview/skins/default/xui/en-us/panel_group_roles.xml | 8 ++++----
linden/indra/newview/skins/default/xui/en-us/panel_status_bar.xml | 4 ++--
linden/indra/newview/skins/default/xui/en-us/panel_top_pick.xml | 2 +-
10 files changed, 18 insertions(+), 17 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml b/linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml
index 5c794c0..7f5f0aa 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml
@@ -243,7 +243,7 @@
-
-
Languages:
-
-
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_avatar_pick.xml b/linden/indra/newview/skins/default/xui/en-us/panel_avatar_pick.xml
index af8b58c..d5468a6 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_avatar_pick.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_avatar_pick.xml
@@ -23,7 +23,7 @@
Sort:
+ name="sort_order_editor" width="25" spell_check="true" />
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_chat_bar.xml b/linden/indra/newview/skins/default/xui/en-us/panel_chat_bar.xml
index 780da86..dd5bf2d 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_chat_bar.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_chat_bar.xml
@@ -13,7 +13,7 @@
max_val="1000000" min_val="0" mouse_opaque="true" name="channel_control"
width="100" tool_tip="Set the default channel for inworld chat"/>
+ width="400" spell_check="true" />
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_group_general.xml b/linden/indra/newview/skins/default/xui/en-us/panel_group_general.xml
index a967a90..db1e65a 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_group_general.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_group_general.xml
@@ -18,7 +18,7 @@ Hover your mouse over the options for more help.
bottom="-24" drop_shadow_visible="true" follows="left|top" font="SansSerif"
h_pad="0" halign="left" height="16" label="Type your new group name here"
left="7" max_length="35" mouse_opaque="true" name="group_name_editor"
- prevalidate="ascii" v_pad="0" width="300" />
+ prevalidate="ascii" v_pad="0" width="300" spell_check="true" />
+ name="create_subject" prevalidate="printable_not_pipe" width="264"
+ spell_check="true" />
+ width="211" spell_check="true" />
+ name="search_text" width="100" spell_check="true" />
+ name="search_text" width="100" spell_check="true" />
+ width="145" spell_check="true">
Employees
+ width="145" spell_check="true">
(waiting)
+ select_on_focus="false" tab_group="1" tool_tip="Inworld search"
+ width="78" spell_check="true"/>
+ name="sort_order_editor" width="25" spell_check="true" />
--
cgit v1.1
From 3a320c248a893db046d636127986c0174e134a0b Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Wed, 15 Sep 2010 04:20:50 -0700
Subject: Removed unused panel_voice_enable.xml file
---
.../skins/default/xui/en-us/panel_voice_enable.xml | 37 ----------------------
1 file changed, 37 deletions(-)
delete mode 100644 linden/indra/newview/skins/default/xui/en-us/panel_voice_enable.xml
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_voice_enable.xml b/linden/indra/newview/skins/default/xui/en-us/panel_voice_enable.xml
deleted file mode 100644
index a5de96c..0000000
--- a/linden/indra/newview/skins/default/xui/en-us/panel_voice_enable.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
- Welcome to Second Life Voice Chat! Voice Chat enables you to speak with other Residents. This wizard will guide you through the steps necessary to set up Voice Chat. Using Voice Chat requires audio speakers and, if you wish to speak with others, a microphone or stereo headset with microphone.
-
-
- Voice Chat is enabled by default. Do you wish to continue using Voice Chat?
-
-
-
- Yes, continue using Voice Chat.
-
-
- No, disable Voice Chat.
-
-
-
- You can enable Voice Chat at any time by going to the Voice Chat tab in Preferences.
-
-
- Click the Next button to configure Voice Chat preferences or click Finish to continue using Second Life.
-
-
\ No newline at end of file
--
cgit v1.1
From d8ed480a26a3ffd9ac036698c85668a9ce12b32b Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Wed, 15 Sep 2010 04:30:03 -0700
Subject: Added spell_check to panel_*.xml text editors
---
linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml | 6 +++---
.../newview/skins/default/xui/en-us/panel_avatar_classified.xml | 2 +-
linden/indra/newview/skins/default/xui/en-us/panel_avatar_pick.xml | 2 +-
linden/indra/newview/skins/default/xui/en-us/panel_classified.xml | 2 +-
linden/indra/newview/skins/default/xui/en-us/panel_event.xml | 2 +-
.../indra/newview/skins/default/xui/en-us/panel_group_general.xml | 2 +-
.../indra/newview/skins/default/xui/en-us/panel_group_notices.xml | 4 ++--
linden/indra/newview/skins/default/xui/en-us/panel_group_roles.xml | 4 ++--
linden/indra/newview/skins/default/xui/en-us/panel_group_voting.xml | 4 ++--
linden/indra/newview/skins/default/xui/en-us/panel_place.xml | 2 +-
linden/indra/newview/skins/default/xui/en-us/panel_place_small.xml | 2 +-
.../indra/newview/skins/default/xui/en-us/panel_preferences_im.xml | 2 +-
.../indra/newview/skins/default/xui/en-us/panel_region_covenant.xml | 2 +-
linden/indra/newview/skins/default/xui/en-us/panel_top_pick.xml | 2 +-
14 files changed, 19 insertions(+), 19 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml b/linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml
index 7f5f0aa..9bc4d7e 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml
@@ -143,7 +143,7 @@
+ name="about" width="235" word_wrap="true" spell_check="true" />
+ name="about" width="378" word_wrap="true" spell_check="true" />
@@ -373,7 +373,7 @@
+ word_wrap="false" spell_check="true" />
+ name="desc_editor" width="280" word_wrap="true" spell_check="true" />
+ name="desc_editor" width="290" word_wrap="true" spell_check="true" />
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_classified.xml b/linden/indra/newview/skins/default/xui/en-us/panel_classified.xml
index ef281fe..ecfa468 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_classified.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_classified.xml
@@ -9,7 +9,7 @@
width="400" spell_check="true" />
+ name="desc_editor" width="400" word_wrap="true" spell_check="true" />
+ name="event_desc" width="400" spell_check="true" />
+ width="265" word_wrap="true" spell_check="true">
Group Charter
+ width="346" word_wrap="true" spell_check="true" />
+ word_wrap="true" spell_check="true" />
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_group_roles.xml b/linden/indra/newview/skins/default/xui/en-us/panel_group_roles.xml
index 3729f5b..e5b621e 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_group_roles.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_group_roles.xml
@@ -200,7 +200,7 @@ things in this group. There's a broad variety of Abilities.
border_visible="false" bottom_delta="-16" drop_shadow_visible="false"
follows="left|top" font="SansSerifSmall" height="16" is_unicode="false"
left="0" max_length="20" mouse_opaque="true" name="role_name"
- width="145" spell_check="true">
+ width="145">
Employees
+ word_wrap="true" spell_check="true">
(waiting)
+ name="proposal_text" width="289" word_wrap="true" spell_check="true" />
@@ -180,7 +180,7 @@ vote on open proposals, and view old proposals.
hide_scrollbar="true" is_unicode="false" left="10" max_length="1024"
mouse_opaque="true" name="vote_text"
text_wrap="true" v_pad="0"
- width="396" word_wrap="false" />
+ width="396" word_wrap="false" spell_check="true" />
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_place.xml b/linden/indra/newview/skins/default/xui/en-us/panel_place.xml
index d50aa53..96d9dd5 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_place.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_place.xml
@@ -14,7 +14,7 @@
+ width="400" word_wrap="true" spell_check="true" />
Information:
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_place_small.xml b/linden/indra/newview/skins/default/xui/en-us/panel_place_small.xml
index 94024f9..64ab9f3 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_place_small.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_place_small.xml
@@ -14,7 +14,7 @@
+ width="360" word_wrap="true" spell_check="true" />
Information:
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml
index c2b8c2b..bb5002b 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml
@@ -61,7 +61,7 @@
+ mouse_opaque="true" name="busy_response" width="330" word_wrap="true" spell_check="true" />
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_region_covenant.xml b/linden/indra/newview/skins/default/xui/en-us/panel_region_covenant.xml
index 5e28bdc..9bbdbd3 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_region_covenant.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_region_covenant.xml
@@ -48,7 +48,7 @@
+ width="340" word_wrap="true" spell_check="true">
There is no Covenant provided for this Estate.
+ width="400" word_wrap="true" spell_check="true" />
--
cgit v1.1
From d8a7c40ef2e2faff6b55eb1f457042d90237b1bc Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Wed, 15 Sep 2010 04:43:11 -0700
Subject: Added spell_check to floater_*.xml text editors
---
linden/indra/newview/skins/default/xui/en-us/floater_about_land.xml | 4 ++--
linden/indra/newview/skins/default/xui/en-us/floater_busy.xml | 2 +-
linden/indra/newview/skins/default/xui/en-us/floater_buy_land.xml | 2 +-
.../indra/newview/skins/default/xui/en-us/floater_chat_history.xml | 6 ++++--
linden/indra/newview/skins/default/xui/en-us/floater_group_info.xml | 4 ++--
.../newview/skins/default/xui/en-us/floater_instant_message.xml | 4 ++--
.../skins/default/xui/en-us/floater_instant_message_ad_hoc.xml | 4 ++--
.../skins/default/xui/en-us/floater_instant_message_group.xml | 4 ++--
linden/indra/newview/skins/default/xui/en-us/floater_postcard.xml | 2 +-
.../newview/skins/default/xui/en-us/floater_preview_notecard.xml | 2 +-
.../default/xui/en-us/floater_preview_notecard_keep_discard.xml | 2 +-
.../indra/newview/skins/default/xui/en-us/floater_report_abuse.xml | 2 +-
linden/indra/newview/skins/default/xui/en-us/floater_report_bug.xml | 2 +-
.../newview/skins/default/xui/en-us/floater_script_ed_panel.xml | 2 +-
14 files changed, 22 insertions(+), 20 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_about_land.xml b/linden/indra/newview/skins/default/xui/en-us/floater_about_land.xml
index 966dc2d..071d0ff 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_about_land.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_about_land.xml
@@ -32,7 +32,7 @@
font="SansSerifSmall" handle_edit_keys_directly="false" height="52"
left="96" max_length="255" mouse_opaque="true" name="Description"
select_all_on_focus_received="false" select_on_focus="false"
- width="350" word_wrap="true" />
+ width="350" word_wrap="true" spell_check="true" />
About Land or select another parcel to show its details.
+ width="330" word_wrap="true" spell_check="true">
There is no Covenant provided for this Estate.
+ mouse_opaque="true" name="im_response" width="245" word_wrap="true" spell_check="true" />
+ width="271" word_wrap="true" spell_check="true">
Loading...
+ text_readonly_color="ChatHistoryTextColor" width="299" word_wrap="true"
+ spell_check="true" />
+ text_readonly_color="ChatHistoryTextColor" width="300" word_wrap="true"
+ spell_check="true" />
Gestures
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_group_info.xml b/linden/indra/newview/skins/default/xui/en-us/floater_group_info.xml
index d0e11d6..667cb04 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_group_info.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_group_info.xml
@@ -71,7 +71,7 @@
+ text_readonly_color="1, 1, 1, 1" width="361" word_wrap="true" spell_check="true" />
@@ -332,7 +332,7 @@ create a new proposal.
bottom_delta="40" embedded_items="false" follows="left|top"
font="SansSerif" height="94" left="87" max_length="255" mouse_opaque="true"
name="proposal_text" text_readonly_color="1, 1, 1, 1" width="290"
- word_wrap="false" />
+ word_wrap="false" spell_check="true" />
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml b/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml
index 5e81525..73ea5c8 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml
@@ -77,8 +77,8 @@
follows="left|top|right|bottom" font="SansSerif" height="221" left="5"
max_length="2147483647" mouse_opaque="true" name="im_history"
text_color="ChatHistoryTextColor"
- track_bottom="true"
- text_readonly_color="ChatHistoryTextColor" width="487" word_wrap="true" />
+ track_bottom="true"
+ text_readonly_color="ChatHistoryTextColor" width="487" word_wrap="true" spell_check="true" />
+ text_readonly_color="ChatHistoryTextColor" width="490" word_wrap="true" spell_check="true" />
+ word_wrap="true" spell_check="true" />
+ max_length="700" name="msg_form" width="420" spell_check="true">
Type your message here.
+ name="Notecard Editor" width="392" word_wrap="true" spell_check="true">
Loading...
+ name="Notecard Editor" width="392" word_wrap="true" spell_check="true">
Loading...
+ width="356" word_wrap="true" spell_check="true" />
+ width="356" word_wrap="true" spell_check="true">
Steps to reproduce the bug:
Observed results:
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_script_ed_panel.xml b/linden/indra/newview/skins/default/xui/en-us/floater_script_ed_panel.xml
index 82a65b8..50721ab 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_script_ed_panel.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_script_ed_panel.xml
@@ -5,7 +5,7 @@
embedded_items="false" enabled="true" follows="left|top|right|bottom"
font="Monospace" height="376" ignore_tab="false" left="4"
max_length="65536" mouse_opaque="true" name="Script Editor" width="492" border_drop_shadow_visible="false" border_visible="false" bevel_style="none" border_style="line" border_thickness="0"
- word_wrap="true" show_line_numbers="true">
+ word_wrap="true" show_line_numbers="true" spell_check="true">
Loading...
+ tool_tip="Text displayed next to play/load button" spell_check="true" />
Replace
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_animation_preview.xml b/linden/indra/newview/skins/default/xui/en-us/floater_animation_preview.xml
index f2c5d34..80a0468 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_animation_preview.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_animation_preview.xml
@@ -13,7 +13,7 @@
Description:
+ max_length="254" name="description_form" right="-10" spell_check="true" />
+ font="SansSerifSmall" max_length="256" mouse_opaque="true" spell_check="true" />
Owner search string:
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml b/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml
index 3fff0b2..3437ed3 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml
@@ -113,7 +113,7 @@
handle_edit_keys_directly="false" height="20" label="Click here to chat."
left="0" max_length="2147483647" mouse_opaque="true" name="Chat Editor"
right="-70" select_all_on_focus_received="false" select_on_focus="false"
- tab_group="1" />
+ tab_group="1" spell_check="true" />
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_directory.xml b/linden/indra/newview/skins/default/xui/en-us/floater_directory.xml
index 3e300da..0424b72 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_directory.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_directory.xml
@@ -27,7 +27,7 @@
+ max_length="63" mouse_opaque="true" name="name" width="128" spell_check="true" />
@@ -83,7 +83,7 @@
label="Search" left_delta="56" max_length="254" mouse_opaque="true"
name="search_editor" select_all_on_focus_received="false"
select_on_focus="false" tab_group="1" tool_tip="Search the web"
- width="160" />
+ width="160" spell_check="true" />
+ max_length="63" mouse_opaque="true" name="name" width="160" spell_check="true" />
+ max_length="63" mouse_opaque="true" name="event_search_text" width="160" spell_check="true" />
+ max_length="63" mouse_opaque="true" name="name" width="160" spell_check="true" />
+ max_length="63" mouse_opaque="true" name="name" width="160" spell_check="true" />
@@ -694,7 +694,7 @@ To buy direct, visit the land and click on the place name in the title bar.
+ max_length="63" mouse_opaque="true" name="name" width="200" spell_check="true" />
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_group_info.xml b/linden/indra/newview/skins/default/xui/en-us/floater_group_info.xml
index 667cb04..282a2f5 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_group_info.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_group_info.xml
@@ -119,7 +119,7 @@
+ text_readonly_color="1, 1, 1, 1" width="105" spell_check="true" />
+ text_readonly_color="1, 1, 1, 1" width="105" spell_check="true" />
+ name="description_form" width="280" spell_check="true" />
Preview image as:
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml b/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml
index 73ea5c8..eaad0cc 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml
@@ -83,7 +83,7 @@
follows="left|right|bottom" font="SansSerif" height="20"
label="Click here to instant message" left="5" max_length="1022"
mouse_opaque="true" name="chat_editor" select_all_on_focus_received="false"
- select_on_focus="false" tab_group="1" width="423" />
+ select_on_focus="false" tab_group="1" width="423" spell_check="true" />
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_instant_message_ad_hoc.xml b/linden/indra/newview/skins/default/xui/en-us/floater_instant_message_ad_hoc.xml
index b6b9357..80e0846 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_instant_message_ad_hoc.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_instant_message_ad_hoc.xml
@@ -56,7 +56,7 @@
handle_edit_keys_directly="false" height="20"
label="Click here to instant message" left="5" max_length="1022"
mouse_opaque="true" name="chat_editor" select_all_on_focus_received="false"
- select_on_focus="false" tab_group="1" width="426" />
+ select_on_focus="false" tab_group="1" width="426" spell_check="true" />
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_instant_message_group.xml b/linden/indra/newview/skins/default/xui/en-us/floater_instant_message_group.xml
index 811d1e3..48986da 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_instant_message_group.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_instant_message_group.xml
@@ -74,7 +74,7 @@
enabled="true" follows="left|right|bottom" font="SansSerif" height="20"
left="5" max_length="1022" mouse_opaque="true" name="chat_editor"
select_all_on_focus_received="false" select_on_focus="false" tab_group="1"
- width="106" />
+ width="106" spell_check="true" />
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_inventory_item_properties.xml b/linden/indra/newview/skins/default/xui/en-us/floater_inventory_item_properties.xml
index 5b111eb..88992a2 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_inventory_item_properties.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_inventory_item_properties.xml
@@ -24,7 +24,7 @@
+ name="LabelItemDesc" width="252" spell_check="true" />
+ width="280" spell_check="true" />
+ select_on_focus="false" width="489" spell_check="true">
New Outfit
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_pay.xml b/linden/indra/newview/skins/default/xui/en-us/floater_pay.xml
index be53b41..3938a90 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_pay.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_pay.xml
@@ -43,7 +43,7 @@
+ follows="left|top|right" font="SansSerif" spell_check="true" />
+ name="subject_form" width="150" spell_check="true" />
Message:
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_preview_animation.xml b/linden/indra/newview/skins/default/xui/en-us/floater_preview_animation.xml
index 657898a..3eef081 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_preview_animation.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_preview_animation.xml
@@ -6,7 +6,7 @@
enabled="true" follows="left|top|right" font="SansSerif"
handle_edit_keys_directly="false" height="19" left="93" max_length="127"
mouse_opaque="true" name="desc" select_all_on_focus_received="false"
- select_on_focus="false" width="194" />
+ select_on_focus="false" width="194" spell_check="true" />
+ name="desc" width="330" spell_check="true" />
Trigger:
@@ -34,7 +34,7 @@
+ width="130" spell_check="true" />
Shortcut Key:
@@ -78,7 +78,7 @@ unless you add wait steps.
+ name="chat_editor" width="100" spell_check="true" />
+ select_on_focus="false" width="294" spell_check="true" />
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_preview_notecard_keep_discard.xml b/linden/indra/newview/skins/default/xui/en-us/floater_preview_notecard_keep_discard.xml
index 12e8de5..f2be796 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_preview_notecard_keep_discard.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_preview_notecard_keep_discard.xml
@@ -16,7 +16,7 @@
enabled="true" follows="left|top|right" font="SansSerif"
handle_edit_keys_directly="false" height="19" left="93" max_length="127"
mouse_opaque="true" name="desc" select_all_on_focus_received="false"
- select_on_focus="false" width="294" />
+ select_on_focus="false" width="294" spell_check="true" />
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_preview_sound.xml b/linden/indra/newview/skins/default/xui/en-us/floater_preview_sound.xml
index 9ac36d3..0c422f1 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_preview_sound.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_preview_sound.xml
@@ -6,7 +6,7 @@
enabled="true" follows="left|top|right" font="SansSerif"
handle_edit_keys_directly="false" height="19" left="95" max_length="127"
mouse_opaque="true" name="desc" select_all_on_focus_received="false"
- select_on_focus="false" width="192" />
+ select_on_focus="false" width="192" spell_check="true" />
+ select_on_focus="false" width="229" spell_check="true" />
+ select_on_focus="false" width="194" spell_check="true" />
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_report_abuse.xml b/linden/indra/newview/skins/default/xui/en-us/floater_report_abuse.xml
index 72fd99d..7dad867 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_report_abuse.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_report_abuse.xml
@@ -206,7 +206,7 @@ Other
border_thickness="1" bottom_delta="-18" follows="left|top"
font="SansSerifSmall" height="16" left="16" max_length="64"
mouse_opaque="true" name="summary_edit"
- width="356" />
+ width="356" spell_check="true" />
+ width="356" spell_check="true" />
+ select_on_focus="false" width="394" spell_check="true" />
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_search_replace.xml b/linden/indra/newview/skins/default/xui/en-us/floater_search_replace.xml
index 930cf37..f31f357 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_search_replace.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_search_replace.xml
@@ -31,10 +31,10 @@
enabled="true" follows="left|top" font="SansSerifSmall"
handle_edit_keys_directly="false" height="16" left="55" max_length="254"
mouse_opaque="true" name="search_text" select_all_on_focus_received="false"
- select_on_focus="false" width="240" />
+ select_on_focus="false" width="240" spell_check="true" />
+ select_all_on_focus_received="false" select_on_focus="false" width="240" spell_check="true" />
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_sound_preview.xml b/linden/indra/newview/skins/default/xui/en-us/floater_sound_preview.xml
index 3738077..0a755e8 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_sound_preview.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_sound_preview.xml
@@ -19,7 +19,7 @@
+ max_length="127" mouse_opaque="true" name="description_form" width="280" spell_check="true" />
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml b/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
index e473ad7..0cb4a59 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
@@ -348,7 +348,7 @@
+ select_all_on_focus_received="true" width="172" spell_check="true" />
+ text_readonly_color="ChatHistoryTextColor" width="299" word_wrap="true" />
+ text_readonly_color="ChatHistoryTextColor" width="300" word_wrap="true" />
Gestures
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml b/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml
index eaad0cc..4ccfe60 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml
@@ -78,7 +78,7 @@
max_length="2147483647" mouse_opaque="true" name="im_history"
text_color="ChatHistoryTextColor"
track_bottom="true"
- text_readonly_color="ChatHistoryTextColor" width="487" word_wrap="true" spell_check="true" />
+ text_readonly_color="ChatHistoryTextColor" width="487" word_wrap="true" />
+ text_readonly_color="ChatHistoryTextColor" width="490" word_wrap="true" />
+ word_wrap="true" />
lNames;
LLPrefsAdvanced * empanel;
};
+
lggDicDownloadFloater::~lggDicDownloadFloater()
{
}
+
lggDicDownloadFloater::lggDicDownloadFloater(const LLSD& seed)
{
LLUICtrlFactory::getInstance()->buildFloater(this, "floater_dictionaries.xml");
@@ -89,96 +92,96 @@ lggDicDownloadFloater::lggDicDownloadFloater(const LLSD& seed)
{
center();
}
-
}
BOOL lggDicDownloadFloater::postBuild(void)
{
- childSetAction("Emerald_dic_download",onClickDownload,this);
+ childSetAction("Emerald_dic_download", onClickDownload, this);
return true;
}
-void lggDicDownloadFloater::setData(std::vector shortNames, std::vector longNames, void * data)
+
+void lggDicDownloadFloater::setData(std::vector shortNames, std::vector longNames, void* data)
{
- sNames=shortNames;
- lNames=longNames;
+ sNames = shortNames;
+ lNames = longNames;
empanel = (LLPrefsAdvanced*)data;
LLComboBox* comboBox = getChild("Emerald_combo_dics");
- if(comboBox != NULL)
+ if (comboBox != NULL)
{
comboBox->removeall();
- comboBox->add("");
- for(int i = 0; i < (int)lNames.size(); i++)
+ for (int i = 0; i < (int)lNames.size(); i++)
{
- comboBox->add(lNames[i]);
+ comboBox->add(lNames[i], ADD_BOTTOM);
}
comboBox->setCurrentByIndex(0);
+ comboBox->add("", ADD_BOTTOM);
}
}
+
void lggDicDownloadFloater::onClickDownload(void* data)
{
lggDicDownloadFloater* self = (lggDicDownloadFloater*)data;
- if(self)
+ if (self)
{
//std::string selection = self->childGetValue("Emerald_combo_dics").asString();
LLComboBox* comboBox = self->getChild("Emerald_combo_dics");
- if(comboBox != NULL)
+ if (comboBox != NULL)
{
- int index = comboBox->getCurrentIndex();
- if(index!=0)
+ if (!comboBox->getSelectedItemLabel().empty())
{
- index--;
- std::string newDict(self->sNames[index]);
+ std::string newDict(self->sNames[comboBox->getCurrentIndex()]);
LLHTTPClient::get(gSavedSettings.getString("DicDownloadBaseURL")+newDict+".aff", new EmeraldDicDownloader(self,newDict+".aff"));
LLHTTPClient::get(gSavedSettings.getString("DicDownloadBaseURL")+newDict+".dic", new EmeraldDicDownloader(NULL,newDict+".dic"));
- LLButton* butt = self->getChild("Emerald_dic_download");
- if(butt)
+ LLButton* button = self->getChild("Emerald_dic_download");
+ if (button)
{
- butt->setLabel(LLStringExplicit("Downloading... Please Wait"));
- butt->setEnabled(FALSE);
+ // TODO: move this to xml
+ button->setLabel(LLStringExplicit("Downloading... Please Wait"));
+ button->setEnabled(FALSE);
}
-
}
}
- }
-
-
+ }
}
void LggDicDownload::show(BOOL showin, std::vector shortNames, std::vector longNames, void * data)
{
- if(showin)
+ if (showin)
{
lggDicDownloadFloater* dic_floater = lggDicDownloadFloater::showInstance();
dic_floater->setData(shortNames,longNames,data);
}
}
-EmeraldDicDownloader::EmeraldDicDownloader(lggDicDownloadFloater* spanel, std::string sname):
-panel(spanel),name(sname){}
+
+EmeraldDicDownloader::EmeraldDicDownloader(lggDicDownloadFloater* spanel, std::string sname)
+ :
+ panel(spanel),
+ name(sname)
+{
+}
void EmeraldDicDownloader::completedRaw(U32 status, const std::string& reason, const LLChannelDescriptors& channels, const LLIOPipe::buffer_ptr_t& buffer)
{
- if(status < 200 || status >= 300)
+ if (status < 200 || status >= 300)
{
return;
}
LLBufferStream istr(channels, buffer.get());
- std::string dicpath(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries",
- name.c_str()));
-
-
+ std::string dicpath(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries", name.c_str()));
+
llofstream ostr(dicpath, std::ios::binary);
- while(istr.good() && ostr.good())
+ while (istr.good() && ostr.good())
+ {
ostr << istr.rdbuf();
+ }
ostr.close();
- if(panel)
+ if (panel)
{
panel->empanel->refresh();
panel->close();
}
-
-
}
--
cgit v1.1
From c486017bf54a4938de8a4b33d1cf26896a3f99fc Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Wed, 15 Sep 2010 07:52:49 -0700
Subject: Fixed spellcheck comboboxes showing up as blank (do we even want
comboboxes here?)
---
linden/indra/newview/llprefsadvanced.cpp | 33 ++++++++++++++++++--------------
1 file changed, 19 insertions(+), 14 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llprefsadvanced.cpp b/linden/indra/newview/llprefsadvanced.cpp
index 898ba2c..73a5827 100644
--- a/linden/indra/newview/llprefsadvanced.cpp
+++ b/linden/indra/newview/llprefsadvanced.cpp
@@ -239,41 +239,39 @@ void LLPrefsAdvanced::refresh()
}
LLComboBox* comboBox = getChild("EmeraldSpellBase");
- if(comboBox != NULL)
+ if (comboBox != NULL)
{
comboBox->removeall();
std::vector names = glggHunSpell->getDicts();
- for(int i=0; i<(int)names.size(); i++)
+ for (int i = 0; i < (int)names.size(); i++)
{
comboBox->add(names[i]);
}
comboBox->setSimple(gSavedSettings.getString("EmeraldSpellBase"));
}
comboBox = getChild("EmSpell_Avail");
- if(comboBox != NULL)
+ if (comboBox != NULL)
{
+ LLSD selected = comboBox->getSelectedValue();
comboBox->removeall();
-
- comboBox->add("");
std::vector names = glggHunSpell->getAvailDicts();
- for(int i=0; i<(int)names.size(); i++)
+ for (int i = 0; i < (int)names.size(); i++)
{
comboBox->add(names[i]);
}
- comboBox->setSimple(std::string(""));
+ comboBox->selectByValue(selected);
}
comboBox = getChild("EmSpell_Installed");
- if(comboBox != NULL)
+ if (comboBox != NULL)
{
+ LLSD selected = comboBox->getSelectedValue();
comboBox->removeall();
-
- comboBox->add("");
std::vector names = glggHunSpell->getInstalledDicts();
- for(int i=0; i<(int)names.size(); i++)
+ for (int i = 0; i < (int)names.size(); i++)
{
comboBox->add(names[i]);
}
- comboBox->setSimple(std::string(""));
+ comboBox->selectByValue(selected);
}
}
@@ -311,6 +309,7 @@ void LLPrefsAdvanced::onSpellAdd(void* data)
}
panel->refresh();
}
+
void LLPrefsAdvanced::onSpellRemove(void* data)
{
LLPrefsAdvanced* panel = (LLPrefsAdvanced*)data;
@@ -320,23 +319,29 @@ void LLPrefsAdvanced::onSpellRemove(void* data)
}
panel->refresh();
}
+
void LLPrefsAdvanced::onSpellGetMore(void* data)
{
glggHunSpell->getMoreButton(data);
}
+
void LLPrefsAdvanced::onSpellEditCustom(void* data)
{
glggHunSpell->editCustomButton();
}
+
void LLPrefsAdvanced::onSpellBaseComboBoxCommit(LLUICtrl* ctrl, void* userdata)
{
LLComboBox* box = (LLComboBox*)ctrl;
- if(box)
+ if (box)
{
glggHunSpell->newDictSelection(box->getValue().asString());
//LLPanelEmerald* panel = (LLPanelEmerald*)userdata;//box->getParent();
- if(sInstance)sInstance->refresh();
+ if (sInstance)
+ {
+ sInstance->refresh();
+ }
}
//LLPanelEmerald* panel = (LLPanelEmerald*)userdata;
//if(panel)panel->refresh();
--
cgit v1.1
From 7ebda8b147bc9a354dacc10625d437d47d0f0d3c Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Wed, 15 Sep 2010 08:12:20 -0700
Subject: Fixed up the spellcheck preferences labels to something more easily
understandable (TODO: make them make sense, create a decent layout)
---
.../xui/en-us/panel_preferences_advanced.xml | 59 ++++++++++++----------
1 file changed, 33 insertions(+), 26 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
index 073ed42..d877c2d 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
@@ -138,39 +138,46 @@
- Base Language
-
+
+ Current language (dictionary):
+
+
- Additional installed dictionaries
+
+ Downloaded languages (dictionaries):
+
-
- Available dictionaries
-
-
-
-
+
+
+
+ Additional custom languages (dictionaries):
+
+
+
-
- To spellcheck, right click a misspelled word
- (red or not) and click on its replacement
+To use spellcheck, right-click a misspelled word
+(red or otherwise) and select its replacement
-
+
word=="Show Misspellings")
+ if (tempBind->word == "Show Misspellings")
{
line->setShowMisspellings(TRUE);
}
@@ -813,7 +813,7 @@ BOOL LLLineEditor::handleRightMouseDown( S32 x, S32 y, MASK mask )
SpellMenuBind * tempStruct = new SpellMenuBind;
tempStruct->origin = this;
- if (glggHunSpell->mSpellCheckHighlight)
+ if (glggHunSpell->getSpellCheckHighlight())
{
tempStruct->word = "Hide Misspellings";
}
@@ -1917,7 +1917,7 @@ void LLLineEditor::drawMisspelled(LLRect background)
}
}
- if (glggHunSpell->mSpellCheckHighlight)
+ if (glggHunSpell->getSpellCheckHighlight())
{
for (int i =0; i<(int)misspellLocations.size(); i++)
{
diff --git a/linden/indra/llui/lltexteditor.cpp b/linden/indra/llui/lltexteditor.cpp
index d2469c3..cf35ee7 100644
--- a/linden/indra/llui/lltexteditor.cpp
+++ b/linden/indra/llui/lltexteditor.cpp
@@ -486,12 +486,13 @@ void LLTextEditor::spell_show(void * data)
SpellMenuBind* tempBind = (SpellMenuBind*)data;
LLTextEditor* line = tempBind->origin;
- if(tempBind && line)
+ if (tempBind && line)
{
- if(tempBind->word=="Show Misspellings")
+ if (tempBind->word == "Show Misspellings")
{
line->setShowMisspellings(TRUE);
- }else
+ }
+ else
{
line->setShowMisspellings(FALSE);
}
@@ -1508,7 +1509,7 @@ BOOL LLTextEditor::handleRightMouseDown( S32 x, S32 y, MASK mask )
SpellMenuBind * tempStruct = new SpellMenuBind;
tempStruct->origin = this;
- if (glggHunSpell->mSpellCheckHighlight)
+ if (glggHunSpell->getSpellCheckHighlight())
{
tempStruct->word = "Hide Misspellings";
}
@@ -3153,7 +3154,7 @@ void LLTextEditor::drawMisspelled()
}
}
//draw
- if (glggHunSpell->mSpellCheckHighlight)
+ if (glggHunSpell->getSpellCheckHighlight())
{
for (int i = 0; i<(int)misspellLocations.size() ;i++)
{
diff --git a/linden/indra/newview/lgghunspell_wrapper.cpp b/linden/indra/newview/lgghunspell_wrapper.cpp
index 632c117..f800043 100644
--- a/linden/indra/newview/lgghunspell_wrapper.cpp
+++ b/linden/indra/newview/lgghunspell_wrapper.cpp
@@ -964,7 +964,7 @@ void lggHunSpell_Wrapper::editCustomButton()
gViewerWindow->getWindow()->ShellEx(dicdicpath);
}
-void lggHunSpell_Wrapper::setNewHighlightSetting(BOOL highlight)
+void lggHunSpell_Wrapper::setSpellCheckHighlight(BOOL highlight)
{
mSpellCheckHighlight = highlight;
}
diff --git a/linden/indra/newview/lgghunspell_wrapper.h b/linden/indra/newview/lgghunspell_wrapper.h
index 4d07ff8..b5f3ddb 100644
--- a/linden/indra/newview/lgghunspell_wrapper.h
+++ b/linden/indra/newview/lgghunspell_wrapper.h
@@ -30,8 +30,6 @@ class lggHunSpell_Wrapper
public:
static Hunspell* myHunspell;
- BOOL mSpellCheckHighlight;
-
static void initSettings();
void processSettings();
@@ -49,7 +47,6 @@ public:
static std::string dictName2FullName(std::string dictName);
static std::string fullName2DictName(std::string fullName);
void setNewDictionary(std::string newDict);
- void setNewHighlightSetting(BOOL highlight);
BOOL isSpelledRight(std::string wordToCheck);
std::vector getSuggestionList(std::string badWord);
S32 findNextError(std::string haystack, int startAt);
@@ -57,6 +54,9 @@ public:
std::vector CSV2VEC(std::string csv);
std::string VEC2CSV(std::vector vec);
+ void setSpellCheckHighlight(BOOL highlight);
+ BOOL getSpellCheckHighlight() { return mSpellCheckHighlight; }
+
private:
void createCustomDic();
std::string getCorrectPath(std::string file);
@@ -67,6 +67,7 @@ private:
std::string currentBaseDic;
//std::vector languageCodes;
//std::vector countryCodes;
+ BOOL mSpellCheckHighlight;
};
extern lggHunSpell_Wrapper* glggHunSpell; // the singleton hunspell wrapper
--
cgit v1.1
From 6149ce350ab27ba70ddb46a2976473fa7f371531 Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Wed, 15 Sep 2010 20:43:38 +0200
Subject: Added TAB as name completion hotkey, to be used after at least 3
chars otherwise it reverts to the default widgets-switching behaviour
---
linden/indra/newview/llchatbar.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llchatbar.cpp b/linden/indra/newview/llchatbar.cpp
index 92340ec..2009905 100644
--- a/linden/indra/newview/llchatbar.cpp
+++ b/linden/indra/newview/llchatbar.cpp
@@ -206,7 +206,8 @@ BOOL LLChatBar::handleKeyHere( KEY key, MASK mask )
stopChat();
handled = TRUE;
}
- else if (key == KEY_ESCAPE && mask == MASK_CONTROL && gChatBar == this)
+ // else if (key == KEY_ESCAPE && mask == MASK_CONTROL && gChatBar == this)
+ else if (key == KEY_TAB && gChatBar == this)
{
if (mInputEditor)
{
--
cgit v1.1
From 74363f85fa96f76c0ba83586a0d97af35bed4b4a Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Wed, 15 Sep 2010 21:14:55 +0200
Subject: Added more punctuation support to both names autocomplete and names
highlight in chat
---
linden/indra/newview/llchatbar.cpp | 2 +-
linden/indra/newview/llfloaterchat.cpp | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llchatbar.cpp b/linden/indra/newview/llchatbar.cpp
index 2009905..c7391d9 100644
--- a/linden/indra/newview/llchatbar.cpp
+++ b/linden/indra/newview/llchatbar.cpp
@@ -236,7 +236,7 @@ BOOL LLChatBar::handleKeyHere( KEY key, MASK mask )
left_part = txt;
}
- std::string pattern_s = "(^|.*[\\.\\?!:;,\\*\\(\\s]+)([a-z0-9]+)$";
+ std::string pattern_s = "(^|.*[_=&\\|\\<\\>#@\\[\\]\\-\\+\"',\\.\\?!:;\\*\\(\\)\\s]+)([a-z0-9]+)$";
boost::match_results what;
boost::regex expression(pattern_s, boost::regex::icase);
if (boost::regex_search(to_match, what, expression, boost::match_extra))
diff --git a/linden/indra/newview/llfloaterchat.cpp b/linden/indra/newview/llfloaterchat.cpp
index b1c1356..f352926 100644
--- a/linden/indra/newview/llfloaterchat.cpp
+++ b/linden/indra/newview/llfloaterchat.cpp
@@ -456,7 +456,7 @@ void LLFloaterChat::updateSettings()
BOOL LLFloaterChat::isOwnNameInText(const std::string &text_line)
{
std::string my_name = gSavedSettings.getString("FirstName");
- std::string pattern_s = "(^|.*[',\\.\\?!:;\\*\\(\\s]+)(" + my_name + ")([',\\.\\?!:;\\*\\)\\s]+.*|$)";
+ std::string pattern_s = "(^|.*[_=&\\|\\<\\>#@\\[\\]\\-\\+\"',\\.\\?!:;\\*\\(\\)\\s]+)(" + my_name + ")([_=&\\|\\<\\>#@\\[\\]\\-\\+\"',\\.\\?!:;\\*\\(\\)\\s]+.*|$)";
boost::smatch what;
boost::regex e1(pattern_s, boost::regex::icase);
--
cgit v1.1
From fcc21b7f78a63f07630c69207e6da9455ee2f87b Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Wed, 15 Sep 2010 23:46:09 +0200
Subject: Added support for autocompletion of names also in the 'local chat'
window
---
linden/indra/newview/llchatbar.cpp | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llchatbar.cpp b/linden/indra/newview/llchatbar.cpp
index c7391d9..8015e10 100644
--- a/linden/indra/newview/llchatbar.cpp
+++ b/linden/indra/newview/llchatbar.cpp
@@ -206,8 +206,7 @@ BOOL LLChatBar::handleKeyHere( KEY key, MASK mask )
stopChat();
handled = TRUE;
}
- // else if (key == KEY_ESCAPE && mask == MASK_CONTROL && gChatBar == this)
- else if (key == KEY_TAB && gChatBar == this)
+ else if (key == KEY_TAB)
{
if (mInputEditor)
{
--
cgit v1.1
From 215327d375c72d07949314a164faa0fdcbad94dc Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Thu, 16 Sep 2010 00:21:54 -0700
Subject: Fixed up the logic for the Hide Misspellings/Show Misspellings menu
options. They now toggle spell check for a specific line/text editor
consistently
---
linden/indra/llui/lllineeditor.cpp | 28 ++++++++++++++++++----------
linden/indra/llui/lllineeditor.h | 5 +++--
linden/indra/llui/lltexteditor.cpp | 22 +++++++++++++++-------
linden/indra/llui/lltexteditor.h | 5 +++--
4 files changed, 39 insertions(+), 21 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/llui/lllineeditor.cpp b/linden/indra/llui/lllineeditor.cpp
index 9c68fec..66ef4c6 100644
--- a/linden/indra/llui/lllineeditor.cpp
+++ b/linden/indra/llui/lllineeditor.cpp
@@ -171,7 +171,8 @@ LLLineEditor::LLLineEditor(const std::string& name, const LLRect& rect,
mHaveHistory(FALSE),
mImage( sImage ),
mReplaceNewlinesWithSpaces( TRUE ),
- mShowMisspellings( FALSE )
+ mSpellCheckable( FALSE ),
+ mShowMisspellings(FALSE)
{
llassert( max_length_bytes > 0 );
@@ -209,6 +210,13 @@ LLLineEditor::LLLineEditor(const std::string& name, const LLRect& rect,
sImage = LLUI::getUIImage("sm_rounded_corners_simple.tga");
}
mImage = sImage;
+
+ // in other words, highlighting requires a restart
+ if (glggHunSpell->getSpellCheckHighlight())
+ {
+ mShowMisspellings = TRUE;
+ }
+
// make the popup menu available
//LLMenuGL* menu = LLUICtrlFactory::getInstance()->buildMenu("menu_texteditor.xml", parent_view);
LLMenuGL* menu = new LLMenuGL("wot");
@@ -550,11 +558,11 @@ void LLLineEditor::spell_show(void * data)
{
if (tempBind->word == "Show Misspellings")
{
- line->setShowMisspellings(TRUE);
+ line->mShowMisspellings = TRUE;
}
else
{
- line->setShowMisspellings(FALSE);
+ line->mShowMisspellings = FALSE;
}
}
}
@@ -757,7 +765,7 @@ BOOL LLLineEditor::handleRightMouseDown( S32 x, S32 y, MASK mask )
menu->setItemVisible("Transep", !mReadOnly);
// spell_check="true" in xui
- if (!mReadOnly && mShowMisspellings)
+ if (!mReadOnly && mSpellCheckable)
{
const LLWString& text = mText.getWString();
@@ -813,7 +821,7 @@ BOOL LLLineEditor::handleRightMouseDown( S32 x, S32 y, MASK mask )
SpellMenuBind * tempStruct = new SpellMenuBind;
tempStruct->origin = this;
- if (glggHunSpell->getSpellCheckHighlight())
+ if (mShowMisspellings)
{
tempStruct->word = "Hide Misspellings";
}
@@ -1899,7 +1907,7 @@ void LLLineEditor::autoCorrectText()
void LLLineEditor::drawMisspelled(LLRect background)
{
- if (!mReadOnly && mShowMisspellings)
+ if (!mReadOnly && mSpellCheckable)
{
S32 newStartSpellHere = mScrollHPos;
S32 cursorloc = calculateCursorFromMouse(mMaxHPixels);
@@ -1917,7 +1925,7 @@ void LLLineEditor::drawMisspelled(LLRect background)
}
}
- if (glggHunSpell->getSpellCheckHighlight())
+ if (mShowMisspellings)
{
for (int i =0; i<(int)misspellLocations.size(); i++)
{
@@ -2817,10 +2825,10 @@ LLView* LLLineEditor::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory
{
line_editor->setCommitOnFocusLost(commit_on_focus_lost);
}
- BOOL show_misspellings = FALSE;
- if (node->getAttributeBOOL("spell_check", show_misspellings))
+ BOOL spell_checking = FALSE;
+ if (node->getAttributeBOOL("spell_check", spell_checking))
{
- line_editor->setShowMisspellings(show_misspellings);
+ line_editor->setSpellCheckable(spell_checking);
}
line_editor->setColorParameters(node);
diff --git a/linden/indra/llui/lllineeditor.h b/linden/indra/llui/lllineeditor.h
index 1d24803..147b232 100644
--- a/linden/indra/llui/lllineeditor.h
+++ b/linden/indra/llui/lllineeditor.h
@@ -198,7 +198,7 @@ public:
void setWriteableBgColor( const LLColor4& c ) { mWriteableBgColor = c; }
void setReadOnlyBgColor( const LLColor4& c ) { mReadOnlyBgColor = c; }
void setFocusBgColor(const LLColor4& c) { mFocusBgColor = c; }
- void setShowMisspellings(BOOL b) { mShowMisspellings = b;}
+ void setSpellCheckable(BOOL b) { mSpellCheckable = b; }
const LLColor4& getFgColor() const { return mFgColor; }
const LLColor4& getReadOnlyFgColor() const { return mReadOnlyFgColor; }
@@ -293,7 +293,8 @@ protected:
std::vector misspellLocations; // where all the mispelled words are
S32 mStartSpellHere; // the position of the first char on the screen, stored so we know when to update
S32 mEndSpellHere; // the location of the last char on the screen
- BOOL mShowMisspellings;
+ BOOL mSpellCheckable; // set in xui as "spell_check". Default value for a field
+ BOOL mShowMisspellings; // show misspellings as highlighted (initialized in the ctor)
LLFrameTimer mSpellTimer;
//to keep track of what we have to remove before showing menu
std::vector suggestionMenuItems;
diff --git a/linden/indra/llui/lltexteditor.cpp b/linden/indra/llui/lltexteditor.cpp
index cf35ee7..b101588 100644
--- a/linden/indra/llui/lltexteditor.cpp
+++ b/linden/indra/llui/lltexteditor.cpp
@@ -323,6 +323,7 @@ LLTextEditor::LLTextEditor(
mLastSelectionY(-1),
mReflowNeeded(FALSE),
mScrollNeeded(FALSE),
+ mSpellCheckable(FALSE),
mShowMisspellings(FALSE)
{
mSourceID.generate();
@@ -375,6 +376,13 @@ LLTextEditor::LLTextEditor(
mParseHTML=FALSE;
mHTML.clear();
+
+ // in other words, highlighting requires a restart
+ if (glggHunSpell->getSpellCheckHighlight())
+ {
+ mShowMisspellings = TRUE;
+ }
+
// make the popup menu available
//LLMenuGL* menu = LLUICtrlFactory::getInstance()->buildMenu("menu_texteditor.xml", parent_view);
LLMenuGL* menu = new LLMenuGL("wot");
@@ -490,11 +498,11 @@ void LLTextEditor::spell_show(void * data)
{
if (tempBind->word == "Show Misspellings")
{
- line->setShowMisspellings(TRUE);
+ glggHunSpell->setSpellCheckHighlight(TRUE);
}
else
{
- line->setShowMisspellings(FALSE);
+ glggHunSpell->setSpellCheckHighlight(FALSE);
}
}
}
@@ -1454,7 +1462,7 @@ BOOL LLTextEditor::handleRightMouseDown( S32 x, S32 y, MASK mask )
menu->setItemVisible("Transep", !mReadOnly);
// spell_check="true" in xui
- if (!mReadOnly && mShowMisspellings)
+ if (!mReadOnly && mSpellCheckable)
{
const LLWString &text = mWText;
@@ -1509,7 +1517,7 @@ BOOL LLTextEditor::handleRightMouseDown( S32 x, S32 y, MASK mask )
SpellMenuBind * tempStruct = new SpellMenuBind;
tempStruct->origin = this;
- if (glggHunSpell->getSpellCheckHighlight())
+ if (mShowMisspellings)
{
tempStruct->word = "Hide Misspellings";
}
@@ -3131,7 +3139,7 @@ void LLTextEditor::autoCorrectText()
void LLTextEditor::drawMisspelled()
{
- if (!mReadOnly && mShowMisspellings)
+ if (!mReadOnly && mSpellCheckable)
{
if(
( ((getLength()<400)||(false)) &&( (S32(mSpellTimer.getElapsedTimeF32() / 1) & 1) ))
@@ -3154,7 +3162,7 @@ void LLTextEditor::drawMisspelled()
}
}
//draw
- if (glggHunSpell->getSpellCheckHighlight())
+ if (mShowMisspellings)
{
for (int i = 0; i<(int)misspellLocations.size() ;i++)
{
@@ -4891,7 +4899,7 @@ void LLTextEditor::setTextEditorParameters(LLXMLNodePtr node)
node->getAttributeBOOL("track_bottom", mTrackBottom);
- node->getAttributeBOOL("spell_check", mShowMisspellings);
+ node->getAttributeBOOL("spell_check", mSpellCheckable);
LLColor4 color;
if (LLUICtrlFactory::getAttributeColor(node,"cursor_color", color))
diff --git a/linden/indra/llui/lltexteditor.h b/linden/indra/llui/lltexteditor.h
index c5c3af8..57a6bbd 100644
--- a/linden/indra/llui/lltexteditor.h
+++ b/linden/indra/llui/lltexteditor.h
@@ -229,7 +229,7 @@ public:
void setThumbColor( const LLColor4& color );
void setHighlightColor( const LLColor4& color );
void setShadowColor( const LLColor4& color );
- void setShowMisspellings(BOOL b) { mShowMisspellings = b; }
+ void setSpellCheckable(BOOL b) { mSpellCheckable = b; }
// Hacky methods to make it into a word-wrapping, potentially scrolling,
// read-only text box.
@@ -526,7 +526,8 @@ private:
S32 spellStart;
S32 spellEnd;
std::vector misspellLocations; // where all the mispelled words are
- BOOL mShowMisspellings; // set in xui as "spell_check". Default value for a field
+ BOOL mSpellCheckable; // set in xui as "spell_check". Default value for a field
+ BOOL mShowMisspellings; // show misspellings as highlighted (initialized in the ctor)
S32 mMaxTextByteLength; // Maximum length mText is allowed to be in bytes
--
cgit v1.1
From 79f7c4c58e355fe78114a940d8c6efcd1e3ff15d Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Thu, 16 Sep 2010 12:39:58 +0200
Subject: Added CHAT_NORMAL_RADIUS check for autocompletion and deleted
selection of last part upon new autocomplete attempt
---
linden/indra/newview/llchatbar.cpp | 20 +++++++++++++++++---
1 file changed, 17 insertions(+), 3 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llchatbar.cpp b/linden/indra/newview/llchatbar.cpp
index 8015e10..875153a 100644
--- a/linden/indra/newview/llchatbar.cpp
+++ b/linden/indra/newview/llchatbar.cpp
@@ -68,6 +68,7 @@
#include "llmultigesture.h"
#include "llui.h"
#include "lluictrlfactory.h"
+#include "llvoavatar.h"
#include "chatbar_as_cmdline.h"
@@ -216,6 +217,8 @@ BOOL LLChatBar::handleKeyHere( KEY key, MASK mask )
if (!avatar_ids.empty())
{
+ mInputEditor->deleteSelection(); // Clean up prev completion before attempting a new one
+
std::string txt(mInputEditor->getText());
std::string to_match(txt);
@@ -251,12 +254,23 @@ BOOL LLChatBar::handleKeyHere( KEY key, MASK mask )
{
if (avatar_ids[i] == gAgent.getID() || avatar_ids[i].isNull())
continue;
-/*
- // Commented out for now... doesn't work above 1024 meters as usual
+
+ // Grab the pos again from the objects-in-view cache... LLWorld doesn't work above 1024 meters as usual :(
+ LLVector3d real_pos = positions[i];
+ if (real_pos[2] == 0.0f)
+ {
+ LLViewerObject *av_obj = gObjectList.findObject(avatar_ids[i]);
+ if (av_obj != NULL && av_obj->isAvatar())
+ {
+ LLVOAvatar* avatarp = (LLVOAvatar*)av_obj;
+ if (avatarp != NULL)
+ real_pos = avatarp->getPositionGlobal();
+ }
+ }
+
F32 dist = F32(dist_vec(positions[i], gAgent.getPositionGlobal()));
if (dist > CHAT_NORMAL_RADIUS)
continue;
-*/
std::string agent_name = " ";
std::string agent_surname = " ";
--
cgit v1.1
From 93b9816a3e9b2318024661d57ba44abca6ce23c2 Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Thu, 16 Sep 2010 16:32:20 +0200
Subject: Added names cycling using TAB. Only 1 char now necessary to trigger
completion. Otherwise TAB reverts to cycle through widgets.
---
linden/indra/newview/llchatbar.cpp | 79 +++++++++++++++++++++++---------------
linden/indra/newview/llchatbar.h | 4 ++
2 files changed, 53 insertions(+), 30 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llchatbar.cpp b/linden/indra/newview/llchatbar.cpp
index 875153a..52397b4 100644
--- a/linden/indra/newview/llchatbar.cpp
+++ b/linden/indra/newview/llchatbar.cpp
@@ -115,7 +115,10 @@ LLChatBar::LLChatBar()
mObserver(NULL)
{
setIsChrome(TRUE);
-
+
+ current_index = 0;
+ last_initials = "";
+
#if !LL_RELEASE_FOR_DOWNLOAD
childDisplayNotFound();
#endif
@@ -220,7 +223,6 @@ BOOL LLChatBar::handleKeyHere( KEY key, MASK mask )
mInputEditor->deleteSelection(); // Clean up prev completion before attempting a new one
std::string txt(mInputEditor->getText());
-
std::string to_match(txt);
std::string left_part = "";
std::string right_part = "";
@@ -244,51 +246,68 @@ BOOL LLChatBar::handleKeyHere( KEY key, MASK mask )
if (boost::regex_search(to_match, what, expression, boost::match_extra))
{
to_match = what[2];
- if (to_match.length() < 3)
+ if (to_match.length() < 1)
return handled;
}
else
return handled;
- for (U32 i=0; iisAvatar())
+ if (avatar_ids[i] == gAgent.getID() || avatar_ids[i].isNull())
+ continue;
+
+ // Grab the pos again from the objects-in-view cache... LLWorld doesn't work above 1024 meters as usual :(
+ LLVector3d real_pos = positions[i];
+ if (real_pos[2] == 0.0f)
{
- LLVOAvatar* avatarp = (LLVOAvatar*)av_obj;
- if (avatarp != NULL)
- real_pos = avatarp->getPositionGlobal();
+ LLViewerObject *av_obj = gObjectList.findObject(avatar_ids[i]);
+ if (av_obj != NULL && av_obj->isAvatar())
+ {
+ LLVOAvatar* avatarp = (LLVOAvatar*)av_obj;
+ if (avatarp != NULL)
+ real_pos = avatarp->getPositionGlobal();
+ }
}
- }
- F32 dist = F32(dist_vec(positions[i], gAgent.getPositionGlobal()));
- if (dist > CHAT_NORMAL_RADIUS)
- continue;
+ F32 dist = F32(dist_vec(positions[i], gAgent.getPositionGlobal()));
+ if (dist > CHAT_SHOUT_RADIUS)
+ continue;
- std::string agent_name = " ";
- std::string agent_surname = " ";
+ std::string agent_name = " ";
+ std::string agent_surname = " ";
- if(!gCacheName->getName(avatar_ids[i], agent_name, agent_surname) && (agent_name == " " || agent_surname == " "))
- continue;
+ if(!gCacheName->getName(avatar_ids[i], agent_name, agent_surname) && (agent_name == " " || agent_surname == " "))
+ continue;
- std::string test_name(agent_name);
- std::transform(test_name.begin(), test_name.end(), test_name.begin(), tolower);
- std::transform(to_match.begin(), to_match.end(), to_match.begin(), tolower);
+ std::string test_name(agent_name);
+ std::transform(test_name.begin(), test_name.end(), test_name.begin(), tolower);
+ std::transform(to_match.begin(), to_match.end(), to_match.begin(), tolower);
- if (test_name.find(to_match) == 0)
- {
- mInputEditor->setText(left_part.substr(0, left_part.length() - to_match.length()) + agent_name + right_part);
- mInputEditor->setSelection(cursorPos, cursorPos + (agent_name.length() - to_match.length()));
- return TRUE;
+ if (test_name.find(to_match) == 0)
+ names.push_back(agent_name);
}
}
+
+ std::string current_name = names[current_index];
+ mInputEditor->setText(left_part.substr(0, left_part.length() - to_match.length()) + current_name + right_part);
+ mInputEditor->setSelection(cursorPos, cursorPos + (current_name.length() - to_match.length()));
+
+ current_index++;
+
+ if (current_index == names.size())
+ current_index = 0;
+
+ return TRUE;
}
}
}
diff --git a/linden/indra/newview/llchatbar.h b/linden/indra/newview/llchatbar.h
index 13332c7..202b006 100644
--- a/linden/indra/newview/llchatbar.h
+++ b/linden/indra/newview/llchatbar.h
@@ -117,6 +117,10 @@ protected:
private:
BOOL mChanCtrlEnabled;
LLSpinCtrl* mChannelControl;
+
+ std::vector names;
+ std::string last_initials;
+ int current_index;
};
extern LLChatBar *gChatBar;
--
cgit v1.1
From e54613da226abdf1e31a404761aac7085e65cb7c Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Thu, 16 Sep 2010 17:23:48 +0200
Subject: Fixed a bug related to the names cache clearing :P
---
linden/indra/newview/llchatbar.cpp | 79 +++++++++++++++++++-------------------
1 file changed, 39 insertions(+), 40 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llchatbar.cpp b/linden/indra/newview/llchatbar.cpp
index 52397b4..9d56638 100644
--- a/linden/indra/newview/llchatbar.cpp
+++ b/linden/indra/newview/llchatbar.cpp
@@ -252,62 +252,61 @@ BOOL LLChatBar::handleKeyHere( KEY key, MASK mask )
else
return handled;
- std::string to_match_test(to_match);
- std::transform(to_match_test.begin(), to_match_test.end(), to_match_test.begin(), tolower);
+ names.clear();
- if (last_initials != to_match_test)
+ for (U32 i=0; iisAvatar())
{
- LLViewerObject *av_obj = gObjectList.findObject(avatar_ids[i]);
- if (av_obj != NULL && av_obj->isAvatar())
- {
- LLVOAvatar* avatarp = (LLVOAvatar*)av_obj;
- if (avatarp != NULL)
- real_pos = avatarp->getPositionGlobal();
- }
+ LLVOAvatar* avatarp = (LLVOAvatar*)av_obj;
+ if (avatarp != NULL)
+ real_pos = avatarp->getPositionGlobal();
}
+ }
- F32 dist = F32(dist_vec(positions[i], gAgent.getPositionGlobal()));
- if (dist > CHAT_SHOUT_RADIUS)
- continue;
+ F32 dist = F32(dist_vec(positions[i], gAgent.getPositionGlobal()));
+ if (dist > CHAT_SHOUT_RADIUS)
+ continue;
- std::string agent_name = " ";
- std::string agent_surname = " ";
+ std::string agent_name = " ";
+ std::string agent_surname = " ";
- if(!gCacheName->getName(avatar_ids[i], agent_name, agent_surname) && (agent_name == " " || agent_surname == " "))
- continue;
+ if(!gCacheName->getName(avatar_ids[i], agent_name, agent_surname) && (agent_name == " " || agent_surname == " "))
+ continue;
- std::string test_name(agent_name);
- std::transform(test_name.begin(), test_name.end(), test_name.begin(), tolower);
- std::transform(to_match.begin(), to_match.end(), to_match.begin(), tolower);
+ std::string test_name(agent_name);
+ std::transform(test_name.begin(), test_name.end(), test_name.begin(), tolower);
+ std::transform(to_match.begin(), to_match.end(), to_match.begin(), tolower);
+
+ if (test_name.find(to_match) == 0)
+ names.push_back(agent_name);
+ }
- if (test_name.find(to_match) == 0)
- names.push_back(agent_name);
- }
+ if (current_index >= names.size() || to_match != last_initials)
+ {
+ current_index = 0;
+ last_initials = to_match;
}
- std::string current_name = names[current_index];
- mInputEditor->setText(left_part.substr(0, left_part.length() - to_match.length()) + current_name + right_part);
- mInputEditor->setSelection(cursorPos, cursorPos + (current_name.length() - to_match.length()));
+ if (names.size() > 0)
+ {
+ std::string current_name = names[current_index];
- current_index++;
+ mInputEditor->setText(left_part.substr(0, left_part.length() - to_match.length()) + current_name + right_part);
+ mInputEditor->setSelection(cursorPos, cursorPos + (current_name.length() - to_match.length()));
- if (current_index == names.size())
- current_index = 0;
+ current_index++;
- return TRUE;
+ return TRUE;
+ }
}
}
}
--
cgit v1.1
From e3734349d2aa0dc4f6b9c7e00616cb95861bb73d Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Thu, 16 Sep 2010 18:09:52 +0200
Subject: Moved all the variables to a struct to keep code more clean and added
a check to run the regex match only if the text in chat changes, so it's a
bit lighter
---
linden/indra/newview/llchatbar.cpp | 80 ++++++++++++++++++++------------------
linden/indra/newview/llchatbar.h | 14 +++++--
2 files changed, 53 insertions(+), 41 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llchatbar.cpp b/linden/indra/newview/llchatbar.cpp
index 9d56638..ffd5afa 100644
--- a/linden/indra/newview/llchatbar.cpp
+++ b/linden/indra/newview/llchatbar.cpp
@@ -116,8 +116,9 @@ LLChatBar::LLChatBar()
{
setIsChrome(TRUE);
- current_index = 0;
- last_initials = "";
+ mCompletionHolder.current_index = 0;
+ mCompletionHolder.last_match = "";
+ mCompletionHolder.last_txt = "";
#if !LL_RELEASE_FOR_DOWNLOAD
childDisplayNotFound();
@@ -222,37 +223,40 @@ BOOL LLChatBar::handleKeyHere( KEY key, MASK mask )
{
mInputEditor->deleteSelection(); // Clean up prev completion before attempting a new one
- std::string txt(mInputEditor->getText());
- std::string to_match(txt);
- std::string left_part = "";
- std::string right_part = "";
S32 cursorPos = mInputEditor->getCursor();
+ std::string txt(mInputEditor->getText());
- if (cursorPos < (S32)txt.length())
- {
- right_part = txt.substr(cursorPos);
- left_part = txt.substr(0, cursorPos);
- to_match = std::string(left_part);
- }
- else
+ if (mCompletionHolder.last_txt != mInputEditor->getText())
{
- to_match = std::string(txt);
- left_part = txt;
- }
+ mCompletionHolder.last_txt = std::string(mInputEditor->getText());
- std::string pattern_s = "(^|.*[_=&\\|\\<\\>#@\\[\\]\\-\\+\"',\\.\\?!:;\\*\\(\\)\\s]+)([a-z0-9]+)$";
- boost::match_results what;
- boost::regex expression(pattern_s, boost::regex::icase);
- if (boost::regex_search(to_match, what, expression, boost::match_extra))
- {
- to_match = what[2];
- if (to_match.length() < 1)
+ if (cursorPos < (S32)txt.length())
+ {
+ mCompletionHolder.right = txt.substr(cursorPos);
+ mCompletionHolder.left = txt.substr(0, cursorPos);
+ mCompletionHolder.match = std::string(mCompletionHolder.left);
+ }
+ else
+ {
+ mCompletionHolder.right = "";
+ mCompletionHolder.match = std::string(txt);
+ mCompletionHolder.left = txt;
+ }
+
+ std::string pattern_s = "(^|.*[_=&\\|\\<\\>#@\\[\\]\\-\\+\"',\\.\\?!:;\\*\\(\\)\\s]+)([a-z0-9]+)$";
+ boost::match_results what;
+ boost::regex expression(pattern_s, boost::regex::icase);
+ if (boost::regex_search(mCompletionHolder.match, what, expression, boost::match_extra))
+ {
+ mCompletionHolder.match = what[2];
+ if (mCompletionHolder.match.length() < 1)
+ return handled;
+ }
+ else
return handled;
}
- else
- return handled;
- names.clear();
+ mCompletionHolder.names.clear();
for (U32 i=0; i= names.size() || to_match != last_initials)
+ if (mCompletionHolder.current_index >= mCompletionHolder.names.size() || mCompletionHolder.match != mCompletionHolder.last_match)
{
- current_index = 0;
- last_initials = to_match;
+ mCompletionHolder.current_index = 0;
+ mCompletionHolder.last_match = mCompletionHolder.match;
}
- if (names.size() > 0)
+ if (mCompletionHolder.names.size() > 0)
{
- std::string current_name = names[current_index];
+ std::string current_name = mCompletionHolder.names[mCompletionHolder.current_index];
- mInputEditor->setText(left_part.substr(0, left_part.length() - to_match.length()) + current_name + right_part);
- mInputEditor->setSelection(cursorPos, cursorPos + (current_name.length() - to_match.length()));
+ mInputEditor->setText(mCompletionHolder.left.substr(0, mCompletionHolder.left.length() - mCompletionHolder.match.length()) + current_name + mCompletionHolder.right);
+ mInputEditor->setSelection(cursorPos, cursorPos + (current_name.length() - mCompletionHolder.match.length()));
- current_index++;
+ mCompletionHolder.current_index++;
return TRUE;
}
diff --git a/linden/indra/newview/llchatbar.h b/linden/indra/newview/llchatbar.h
index 202b006..135881f 100644
--- a/linden/indra/newview/llchatbar.h
+++ b/linden/indra/newview/llchatbar.h
@@ -46,6 +46,16 @@ class LLChatBarGestureObserver;
class LLComboBox;
class LLSpinCtrl;
+typedef struct {
+ std::string left;
+ std::string right;
+ std::string match;
+ std::vector names;
+ std::string last_txt;
+ std::string last_match;
+ int current_index;
+} CompletionHolder;
+
class LLChatBar
: public LLPanel
{
@@ -118,9 +128,7 @@ private:
BOOL mChanCtrlEnabled;
LLSpinCtrl* mChannelControl;
- std::vector names;
- std::string last_initials;
- int current_index;
+ CompletionHolder mCompletionHolder;
};
extern LLChatBar *gChatBar;
--
cgit v1.1
From 6485376d3ddc34e3a974dc2405b82bf5dab88a47 Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Thu, 16 Sep 2010 18:24:53 +0200
Subject: Switched struct declaration to a more C++esque way... Aleric hit me
with a stick :P
---
linden/indra/newview/llchatbar.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llchatbar.h b/linden/indra/newview/llchatbar.h
index 135881f..5542d8a 100644
--- a/linden/indra/newview/llchatbar.h
+++ b/linden/indra/newview/llchatbar.h
@@ -46,7 +46,7 @@ class LLChatBarGestureObserver;
class LLComboBox;
class LLSpinCtrl;
-typedef struct {
+struct CompletionHolder {
std::string left;
std::string right;
std::string match;
@@ -54,7 +54,7 @@ typedef struct {
std::string last_txt;
std::string last_match;
int current_index;
-} CompletionHolder;
+};
class LLChatBar
: public LLPanel
--
cgit v1.1
From 05ed2862aa0f2c288e5b298c634fb8fe0ffc8eb5 Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Thu, 16 Sep 2010 20:34:09 +0200
Subject: Commented out the checks for distance, above 1024mts seems like i
can't make them work fine :(
---
linden/indra/newview/llchatbar.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llchatbar.cpp b/linden/indra/newview/llchatbar.cpp
index ffd5afa..2981958 100644
--- a/linden/indra/newview/llchatbar.cpp
+++ b/linden/indra/newview/llchatbar.cpp
@@ -262,7 +262,7 @@ BOOL LLChatBar::handleKeyHere( KEY key, MASK mask )
{
if (avatar_ids[i] == gAgent.getID() || avatar_ids[i].isNull())
continue;
-
+/*
// Grab the pos again from the objects-in-view cache... LLWorld doesn't work above 1024 meters as usual :(
LLVector3d real_pos = positions[i];
if (real_pos[2] == 0.0f)
@@ -279,7 +279,7 @@ BOOL LLChatBar::handleKeyHere( KEY key, MASK mask )
F32 dist = F32(dist_vec(positions[i], gAgent.getPositionGlobal()));
if (dist > CHAT_SHOUT_RADIUS)
continue;
-
+*/
std::string agent_name = " ";
std::string agent_surname = " ";
--
cgit v1.1
From 9cae845499cd22a73c9521fcc6a2a9500770bee0 Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Thu, 16 Sep 2010 20:44:00 +0200
Subject: Added nicknames support for chat highlighting (up to 3) in
prefs->adv->extra
---
linden/indra/newview/app_settings/settings.xml | 33 ++++++++++++++++++++++
linden/indra/newview/llfloaterchat.cpp | 28 ++++++++++++++----
linden/indra/newview/llprefsadvanced.cpp | 19 ++++++++++++-
.../xui/en-us/panel_preferences_advanced.xml | 24 ++++++++++++++++
4 files changed, 98 insertions(+), 6 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index 2b61a19..7a22e7e 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -4,6 +4,39 @@
+ nick01
+
+ Comment
+ First Nickname for Chat Highlight
+ Persist
+ 1
+ Type
+ String
+ Value
+
+
+ nick02
+
+ Comment
+ Second Nickname for Chat Highlight
+ Persist
+ 1
+ Type
+ String
+ Value
+
+
+ nick03
+
+ Comment
+ Third Nickname for Chat Highlight
+ Persist
+ 1
+ Type
+ String
+ Value
+
+
HighlightOwnNameInIM
Comment
diff --git a/linden/indra/newview/llfloaterchat.cpp b/linden/indra/newview/llfloaterchat.cpp
index f352926..59f4d70 100644
--- a/linden/indra/newview/llfloaterchat.cpp
+++ b/linden/indra/newview/llfloaterchat.cpp
@@ -453,14 +453,32 @@ void LLFloaterChat::updateSettings()
LLFloaterChat::getInstance(LLSD())->getChild("translate chat")->set(translate_chat);
}
-BOOL LLFloaterChat::isOwnNameInText(const std::string &text_line)
+BOOL checkStringInText(const std::string &text_line, std::string textToMatch)
{
- std::string my_name = gSavedSettings.getString("FirstName");
- std::string pattern_s = "(^|.*[_=&\\|\\<\\>#@\\[\\]\\-\\+\"',\\.\\?!:;\\*\\(\\)\\s]+)(" + my_name + ")([_=&\\|\\<\\>#@\\[\\]\\-\\+\"',\\.\\?!:;\\*\\(\\)\\s]+.*|$)";
boost::smatch what;
- boost::regex e1(pattern_s, boost::regex::icase);
+ std::string pattern_s = "(^|.*[_=&\\|\\<\\>#@\\[\\]\\-\\+\"',\\.\\?!:;\\*\\(\\)\\s]+)(" + textToMatch + ")([_=&\\|\\<\\>#@\\[\\]\\-\\+\"',\\.\\?!:;\\*\\(\\)\\s]+.*|$)";
+ boost::regex expression(pattern_s, boost::regex::icase);
+ return boost::regex_search(text_line, what, expression);
+}
+
+BOOL LLFloaterChat::isOwnNameInText(const std::string &text_line)
+{
+ if (checkStringInText(text_line, gSavedSettings.getString("FirstName")))
+ return TRUE;
+
+ for (int i=1; i<=3; i++)
+ {
+ std::stringstream key;
+ key << "nick0" << i;
+ std::string nick = gSavedSettings.getString(key.str());
+ if (! nick.empty())
+ {
+ if (checkStringInText(text_line, nick))
+ return TRUE;
+ }
+ }
- return boost::regex_search(text_line, what, e1);
+ return FALSE;
}
LLColor4 get_extended_text_color(const LLChat& chat, LLColor4 defaultColor)
diff --git a/linden/indra/newview/llprefsadvanced.cpp b/linden/indra/newview/llprefsadvanced.cpp
index 898ba2c..ed0b432 100644
--- a/linden/indra/newview/llprefsadvanced.cpp
+++ b/linden/indra/newview/llprefsadvanced.cpp
@@ -45,6 +45,8 @@
#include "lluictrlfactory.h"
+#include "boost/algorithm/string.hpp"
+
LLPrefsAdvanced* LLPrefsAdvanced::sInstance;
LLPrefsAdvanced::LLPrefsAdvanced()
@@ -117,11 +119,14 @@ BOOL LLPrefsAdvanced::postBuild()
getChild("FriendsChatColor")->set(gSavedSettings.getColor4("FriendsChatColor"));
childSetValue("HighlightOwnNameInChat", gSavedSettings.getBOOL("HighlightOwnNameInChat"));
getChild("OwnNameChatColor")->set(gSavedSettings.getColor4("OwnNameChatColor"));
+ childSetValue("nick01", gSavedSettings.getString("nick01"));
+ childSetValue("nick02", gSavedSettings.getString("nick02"));
+ childSetValue("nick03", gSavedSettings.getString("nick03"));
refresh();
return TRUE;
-}
+}
void LLPrefsAdvanced::apply()
{
@@ -146,6 +151,18 @@ void LLPrefsAdvanced::apply()
gSavedSettings.setBOOL("HighlightOwnNameInChat", childGetValue("HighlightOwnNameInChat"));
gSavedSettings.setColor4("OwnNameChatColor", getChild("OwnNameChatColor")->get());
+ std::string nick01 = childGetValue("nick01");
+ boost::trim(nick01);
+ gSavedSettings.setString("nick01", nick01);
+
+ std::string nick02 = childGetValue("nick02");
+ boost::trim(nick02);
+ gSavedSettings.setString("nick02", nick02);
+
+ std::string nick03 = childGetValue("nick03");
+ boost::trim(nick03);
+ gSavedSettings.setString("nick03", nick03);
+
// Need to force a rebake when ClothingLayerProtection toggled for it take effect -- MC
if (gSavedSettings.getBOOL("ShowMyClientTagToOthers") != (BOOL)childGetValue("client_name_tag_broadcast_check"))
{
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
index 073ed42..cac3ef1 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_advanced.xml
@@ -199,6 +199,30 @@
enabled="true" follows="left|top" height="67" label="Own Name" left_delta="68"
mouse_opaque="true" name="OwnNameChatColor" width="65" />
+
+
+ Nick 1
+
+
+
+ Nick 2
+
+
+
+ Nick 3
+
--
cgit v1.1
From 162cf8240158d2d487d014bdac77f58a8c75595f Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Thu, 16 Sep 2010 06:08:15 -0700
Subject: Added search bars for friends and groups lists, based on a feature in
the Ascent viewer by Charley Levenque
---
linden/indra/newview/llcallingcard.cpp | 5 +++
linden/indra/newview/llcallingcard.h | 3 ++
linden/indra/newview/llfloaterfriends.cpp | 52 ++++++++++++++++++++++
linden/indra/newview/llfloaterfriends.h | 4 +-
linden/indra/newview/llfloatergroups.cpp | 52 +++++++++++++++++++++-
linden/indra/newview/llfloatergroups.h | 3 +-
.../skins/default/xui/en-us/panel_friends.xml | 39 ++++++++--------
.../skins/default/xui/en-us/panel_groups.xml | 7 ++-
8 files changed, 142 insertions(+), 23 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llcallingcard.cpp b/linden/indra/newview/llcallingcard.cpp
index db28c7a..155fb60 100644
--- a/linden/indra/newview/llcallingcard.cpp
+++ b/linden/indra/newview/llcallingcard.cpp
@@ -357,6 +357,11 @@ void LLAvatarTracker::setBuddyOnline(const LLUUID& id, bool is_online)
}
}
+S32 LLAvatarTracker::getBuddyCount()
+{
+ return mBuddyInfo.size();
+}
+
bool LLAvatarTracker::isBuddyOnline(const LLUUID& id) const
{
LLRelationship* info = get_ptr_in_map(mBuddyInfo, id);
diff --git a/linden/indra/newview/llcallingcard.h b/linden/indra/newview/llcallingcard.h
index 85a1ab6..0db5376 100644
--- a/linden/indra/newview/llcallingcard.h
+++ b/linden/indra/newview/llcallingcard.h
@@ -129,6 +129,9 @@ public:
void setBuddyOnline(const LLUUID& id, bool is_online);
bool isBuddyOnline(const LLUUID& id) const;
+ // get count of buddies
+ S32 getBuddyCount();
+
// simple empowered status
void setBuddyEmpowered(const LLUUID& id, bool is_empowered);
bool isBuddyEmpowered(const LLUUID& id) const;
diff --git a/linden/indra/newview/llfloaterfriends.cpp b/linden/indra/newview/llfloaterfriends.cpp
index e18e705..479da89 100644
--- a/linden/indra/newview/llfloaterfriends.cpp
+++ b/linden/indra/newview/llfloaterfriends.cpp
@@ -183,6 +183,52 @@ void LLPanelFriends::updateFriends(U32 changed_mask)
mShowMaxSelectWarning = true;
}
+void LLPanelFriends::filterContacts(const std::string& search_string)
+{
+ std::string search = search_string;
+ LLStringUtil::toLower(search);
+
+ if (search.empty())
+ {
+ // repopulate
+ refreshNames(LLFriendObserver::ADD);
+ }
+ else
+ {
+ // just in case someone else emptied us, tsk
+ if (mFriendsList->isEmpty() && LLAvatarTracker::instance().getBuddyCount() > 0)
+ {
+ refreshNames(LLFriendObserver::ADD);
+ }
+
+ // don't worry about maintaining selection since we're searching
+ std::vector vFriends(mFriendsList->getAllData());
+
+ // this should really REALLY use deleteAllItems() to rebuild the list instead
+ std::string friend_name;
+ for (std::vector::iterator itr = vFriends.begin(); itr != vFriends.end(); ++itr)
+ {
+ friend_name = (*itr)->getColumn(LIST_FRIEND_NAME)->getValue().asString();
+ LLStringUtil::toLower(friend_name);
+ BOOL show_entry = (friend_name.find(search) != std::string::npos);
+ if (!show_entry)
+ {
+ mFriendsList->deleteItems((*itr)->getValue());
+ }
+ }
+ }
+ refreshUI();
+}
+
+void LLPanelFriends::onContactSearchKeystroke(const std::string& search_string, void* user_data)
+{
+ LLPanelFriends* panelp = (LLPanelFriends*)user_data;
+ if (panelp)
+ {
+ panelp->filterContacts(search_string);
+ }
+}
+
// virtual
BOOL LLPanelFriends::postBuild()
{
@@ -193,6 +239,12 @@ BOOL LLPanelFriends::postBuild()
childSetCommitCallback("friend_list", onSelectName, this);
childSetDoubleClickCallback("friend_list", onClickIM);
+ LLSearchEditor* buddy_search = getChild("buddy_search");
+ if (buddy_search)
+ {
+ buddy_search->setSearchCallback(&onContactSearchKeystroke, this);
+ }
+
U32 changed_mask = LLFriendObserver::ADD | LLFriendObserver::REMOVE | LLFriendObserver::ONLINE;
refreshNames(changed_mask);
diff --git a/linden/indra/newview/llfloaterfriends.h b/linden/indra/newview/llfloaterfriends.h
index f7f0b32..9a1feba 100644
--- a/linden/indra/newview/llfloaterfriends.h
+++ b/linden/indra/newview/llfloaterfriends.h
@@ -101,6 +101,8 @@ private:
// protected members
typedef std::map rights_map_t;
void refreshNames(U32 changed_mask);
+ void filterContacts(const std::string& search_string);
+
BOOL refreshNamesSync(const LLAvatarTracker::buddy_map_t & all_buddies);
BOOL refreshNamesPresence(const LLAvatarTracker::buddy_map_t & all_buddies);
void refreshUI();
@@ -126,7 +128,7 @@ private:
static bool callbackAddFriendWithMessage(const LLSD& notification, const LLSD& response);
static void onPickAvatar(const std::vector& names, const std::vector& ids, void* user_data);
static void onMaximumSelect(void* user_data);
-
+ static void onContactSearchKeystroke(const std::string& search_string, void* user_data);
static void onClickIM(void* user_data);
static void onClickProfile(void* user_data);
static void onClickAddFriend(void* user_data);
diff --git a/linden/indra/newview/llfloatergroups.cpp b/linden/indra/newview/llfloatergroups.cpp
index daf1709..b3fbb1b 100644
--- a/linden/indra/newview/llfloatergroups.cpp
+++ b/linden/indra/newview/llfloatergroups.cpp
@@ -214,6 +214,12 @@ BOOL LLPanelGroups::postBuild()
{
childSetCommitCallback("group list", onGroupList, this);
+ LLSearchEditor* group_search = getChild("group_search");
+ if (group_search)
+ {
+ group_search->setSearchCallback(&onGroupSearchKeystroke, this);
+ }
+
childSetTextArg("groupcount", "[COUNT]", llformat("%d",gAgent.mGroups.count()));
childSetTextArg("groupcount", "[MAX]", llformat("%d", gHippoLimits->getMaxAgentGroups()));
@@ -379,7 +385,7 @@ void LLPanelGroups::info()
void LLPanelGroups::startIM()
{
- //llinfos << "LLPanelFriends::onClickIM()" << llendl;
+ //llinfos << "LLPanelGroups::onClickIM()" << llendl;
LLCtrlListInterface *group_list = childGetListInterface("group list");
LLUUID group_id;
@@ -612,3 +618,47 @@ void LLPanelGroups::applyChangesToGroups()
}
}
}
+
+void LLPanelGroups::filterContacts(const std::string& search_string)
+{
+ std::string search = search_string;
+ LLStringUtil::toLower(search);
+
+ if (search.empty())
+ {
+ // repopulate
+ reset();
+ }
+ else
+ {
+ LLScrollListCtrl* group_list = getChild("group list");
+ if (group_list)
+ {
+ // don't worry about maintaining selection since we're searching
+ std::vector vGroups(group_list->getAllData());
+
+ // this should really REALLY use deleteAllItems() to rebuild the list instead
+ std::string group_name;
+ for (std::vector::iterator itr = vGroups.begin(); itr != vGroups.end(); ++itr)
+ {
+ group_name = (*itr)->getColumn(0)->getValue().asString();
+ LLStringUtil::toLower(group_name);
+ BOOL show_entry = (group_name.find(search) != std::string::npos);
+ if (!show_entry)
+ {
+ group_list->deleteItems((*itr)->getValue());
+ }
+ }
+ enableButtons();
+ }
+ }
+}
+
+void LLPanelGroups::onGroupSearchKeystroke(const std::string& search_string, void* user_data)
+{
+ LLPanelGroups* panelp = (LLPanelGroups*)user_data;
+ if (panelp)
+ {
+ panelp->filterContacts(search_string);
+ }
+}
diff --git a/linden/indra/newview/llfloatergroups.h b/linden/indra/newview/llfloatergroups.h
index 91021f0..5dc7ad8 100644
--- a/linden/indra/newview/llfloatergroups.h
+++ b/linden/indra/newview/llfloatergroups.h
@@ -115,6 +115,7 @@ protected:
static void onBtnInvite(void* userdata);
static void onBtnTitles(void* userdata);
static void onDoubleClickGroup(void* userdata);
+ static void onGroupSearchKeystroke(const std::string& search_string, void* user_data);
void create();
void activate();
@@ -125,9 +126,9 @@ protected:
void callVote();
void invite();
void titles();
+ void filterContacts(const std::string& search_string);
static bool callbackLeaveGroup(const LLSD& notification, const LLSD& response);
-
};
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_friends.xml b/linden/indra/newview/skins/default/xui/en-us/panel_friends.xml
index 0854c99..a64560f 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_friends.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_friends.xml
@@ -3,43 +3,46 @@
Multiple friends...
-
-
+
-
-
+
-
-
-
-
-
-
-
-
+
+
+
-
-
-
-
-
+
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_groups.xml b/linden/indra/newview/skins/default/xui/en-us/panel_groups.xml
index 22967dc..9303852 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_groups.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_groups.xml
@@ -4,7 +4,7 @@
-
+
none
--
cgit v1.1
From cf9eb8dbd7f1cd0125cd01b74351068dafaf9398 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Thu, 16 Sep 2010 23:58:52 -0700
Subject: Reset scroll position on search in contacts/groups lists
---
linden/indra/newview/llfloaterfriends.cpp | 1 +
linden/indra/newview/llfloatergroups.cpp | 1 +
2 files changed, 2 insertions(+)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llfloaterfriends.cpp b/linden/indra/newview/llfloaterfriends.cpp
index 479da89..a151a33 100644
--- a/linden/indra/newview/llfloaterfriends.cpp
+++ b/linden/indra/newview/llfloaterfriends.cpp
@@ -217,6 +217,7 @@ void LLPanelFriends::filterContacts(const std::string& search_string)
}
}
}
+ mFriendsList->setScrollPos(0);
refreshUI();
}
diff --git a/linden/indra/newview/llfloatergroups.cpp b/linden/indra/newview/llfloatergroups.cpp
index b3fbb1b..c89e066 100644
--- a/linden/indra/newview/llfloatergroups.cpp
+++ b/linden/indra/newview/llfloatergroups.cpp
@@ -649,6 +649,7 @@ void LLPanelGroups::filterContacts(const std::string& search_string)
group_list->deleteItems((*itr)->getValue());
}
}
+ group_list->setScrollPos(0);
enableButtons();
}
}
--
cgit v1.1
From fa6a74463d36a92e81254dd5dba016e6ebfe23ff Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Fri, 17 Sep 2010 00:19:15 -0700
Subject: Updated de translations to third and fourth batches by Eryn
---
.../skins/default/xui/de/floater_env_settings.xml | 2 +-
.../skins/default/xui/de/floater_font_test.xml | 85 ++++++++++
.../skins/default/xui/de/floater_gesture.xml | 4 +-
.../skins/default/xui/de/floater_god_tools.xml | 26 +--
.../xui/de/floater_grid_default_selector.xml | 9 ++
.../skins/default/xui/de/floater_grid_manager.xml | 119 ++++++++++++++
.../skins/default/xui/de/floater_group_info.xml | 35 ++--
.../skins/default/xui/de/floater_group_titles.xml | 8 +
.../newview/skins/default/xui/de/floater_html.xml | 1 -
.../skins/default/xui/de/floater_image_preview.xml | 3 +-
.../skins/default/xui/de/floater_inspect.xml | 2 +-
.../default/xui/de/floater_instant_message.xml | 13 ++
.../xui/de/floater_instant_message_ad_hoc.xml | 100 +++++-------
.../xui/de/floater_instant_message_group.xml | 147 ++++++++---------
.../skins/default/xui/de/floater_inventory.xml | 63 +++++++-
.../xui/de/floater_inventory_item_properties.xml | 6 +-
.../xui/de/floater_inventory_view_finder.xml | 10 +-
.../skins/default/xui/de/floater_joystick.xml | 178 +++++++++++----------
18 files changed, 541 insertions(+), 270 deletions(-)
create mode 100644 linden/indra/newview/skins/default/xui/de/floater_grid_default_selector.xml
create mode 100644 linden/indra/newview/skins/default/xui/de/floater_grid_manager.xml
create mode 100644 linden/indra/newview/skins/default/xui/de/floater_group_titles.xml
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/de/floater_env_settings.xml b/linden/indra/newview/skins/default/xui/de/floater_env_settings.xml
index 3717ff6..923b9af 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_env_settings.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_env_settings.xml
@@ -4,7 +4,7 @@
Tageszeit
- 12:00
+ Tageszeit
Wolkendecke
diff --git a/linden/indra/newview/skins/default/xui/de/floater_font_test.xml b/linden/indra/newview/skins/default/xui/de/floater_font_test.xml
index 54278fc..cea1fd4 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_font_test.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_font_test.xml
@@ -1,5 +1,90 @@
+
+
+SansSerif, keine GrĂ¶ĂŸe oder Stil (sollte gleich medium sein)
+
+
+
+SansSerifGroĂŸ
+
+
+
+SansSerifExtraGroĂŸ
+
+
+
+Monospace GrĂ¶ĂŸe=GroĂŸ
+
+
+
+SansSerifGroĂŸ Stil=FETT
+
+
+
+SansSerifFett
+
+
+
+SansSerif Stil=FETT (sollte gleich SansSerifFett sein)
+
+
+
+SansSerif Stil=KURSIV
+
+
+
+SansSerif Stil=FETT|KURSIV
+
+
+
+SansSerif Stil=FETT|KURSIV|SANFTER_SCHATTEN
+
+
+
+SansSerif Stil=UNTERSTRICHEN
+
+
+
+SansSerif Stil=SCHATTEN
+
+
+
+SansSerif Stil=SANFTER_SCHATTEN
+
+
+
+DejaVu Stil=FETT
+
+
+
+DejaVu Stil=KURSIV
+
+
+
+DejaVu Stil=FETT|KURSIV
+
+
+
+DejaVu GrĂ¶ĂŸe=GroĂŸ Stil=FETT|KURSIV
+
+
+
+Helvetica Stil=FETT
+
+
+
+Helvetica Stil=KURSIV
+
+
+
+Helvetica Stil=FETT|KURSIV
+
+
+
+Helvetica GrĂ¶ĂŸe=GroĂŸ Stil=FETT|KURSIV
+
+
OverrideTest, sollte hier als Times angezeigt werden. (Aus default/xui/en-us)
diff --git a/linden/indra/newview/skins/default/xui/de/floater_gesture.xml b/linden/indra/newview/skins/default/xui/de/floater_gesture.xml
index bdee3b8..bccd66f 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_gesture.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_gesture.xml
@@ -4,8 +4,8 @@
Doppelklicken Sie auf eine Geste, um Animationen und Sound
abzuspielen.
-
-
+
+
diff --git a/linden/indra/newview/skins/default/xui/de/floater_god_tools.xml b/linden/indra/newview/skins/default/xui/de/floater_god_tools.xml
index dcb6982..a96aeae 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_god_tools.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_god_tools.xml
@@ -12,11 +12,11 @@
Sim-Name:
-
-
@@ -25,7 +25,7 @@
+ tool_tip="Das Terraformen von Land verbieten (Benutzen Sie dies, um Leuten das Terraformen ihres Landes zu verbieten)" />
- L$ pro qm:
+ [CURRENCY] pro qm:
@@ -76,8 +76,8 @@
Welsh
-
+
+ tool_tip="Alle dem Ziel gehörenden geskripteten Objekte auf Land, das nicht dem Ziel gehört löschen. Objekte (nicht kopierfähig) werden zurĂ¼ckgegeben." />
-
-
+
+ tool_tip="Zeigt eine Liste aller Skripte mit Häufigkeit an." width="130" />
@@ -130,7 +130,7 @@
Kollisionsobjekte <Schritte>
- Skripts <Zähler>,<Optionales Muster>
+ Skripte <Zähler>,<Optionales Muster>
Objekte <Muster>
@@ -142,7 +142,7 @@
Parameter:
-
+
diff --git a/linden/indra/newview/skins/default/xui/de/floater_grid_default_selector.xml b/linden/indra/newview/skins/default/xui/de/floater_grid_default_selector.xml
new file mode 100644
index 0000000..21a4b36
--- /dev/null
+++ b/linden/indra/newview/skins/default/xui/de/floater_grid_default_selector.xml
@@ -0,0 +1,9 @@
+
+
+
+ Oder den Netz-Manager benutzen, um ein neues hinzuzufĂ¼gen
+
+
+
+
\ No newline at end of file
diff --git a/linden/indra/newview/skins/default/xui/de/floater_grid_manager.xml b/linden/indra/newview/skins/default/xui/de/floater_grid_manager.xml
new file mode 100644
index 0000000..dee3233
--- /dev/null
+++ b/linden/indra/newview/skins/default/xui/de/floater_grid_manager.xml
@@ -0,0 +1,119 @@
+
+
+
+
+
+ Netz aussuchen:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Netzname:
+
+
+
+
+
+ Einwahl-URI:
+
+
+
+
+
+
+ Netzinfo URLs:
+
+
+ Einwahl-Seite:
+
+
+
+ Helfer-URI:
+
+
+
+ Internet-Seite:
+
+
+
+ Support:
+
+
+
+ Konto:
+
+
+
+ Passwort:
+
+
+
+ Internetsuche:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/linden/indra/newview/skins/default/xui/de/floater_group_info.xml b/linden/indra/newview/skins/default/xui/de/floater_group_info.xml
index ff5abe9..d1c5163 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_group_info.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_group_info.xml
@@ -15,10 +15,10 @@
Jede Person kann eine Gruppe erstellen. Eine Person kann maximal zu 15 Gruppen gehören.
- Gruppen mĂ¼ssen aus mindestens 3 Mitgliedern bestehen.
+ Aktive Gruppen mĂ¼ssen aus mindestens 3 Mitgliedern bestehen.
- Die GrĂ¼ndung einer Gruppe kostet 100 L$.
+ Die GrĂ¼ndung einer Gruppe kostet 100 [CURRENCY].
Name:
@@ -33,20 +33,20 @@
-
+
Gruppentitel
- Gruppen können Officer und Mitglieder haben, jeweils mit besonderen Titeln.
+ Gruppen können Offiziere und Mitglieder haben, jeweils mit besonderen Titeln.
Die Titel werden in der Welt, beim Chat und in IM vor dem Namen angezeigt.
- Officer-Titel:
+ Offizierstitel:
Mitgliedstitel:
@@ -61,13 +61,13 @@
Gruppenmitglieder
- Aktuelle Officers und Gruppenmitglieder.
+ Aktuelle Offiziere und Gruppenmitglieder.
Klicken Sie auf einen Namen, um das Mitgliedsprofil anzuzeigen.
- Officers:
+ Offiziere:
Mitglieder:
@@ -82,7 +82,7 @@
Klicken Sie auf â€Wahl starten“, um eine neue Wahl zu starten.
-Zu den Kandidaten gehören alle Mitglieder, die keine Officer sind.
+Zu den Kandidaten gehören alle Mitglieder, die keine Offiziere sind.
Kandidaten:
@@ -100,7 +100,7 @@ Zu den Kandidaten gehören alle Mitglieder, die keine Officer sind.
Mehrheit:
-
+
Einfache Mehrheit
@@ -116,7 +116,7 @@ Zu den Kandidaten gehören alle Mitglieder, die keine Officer sind.
- Tage
+ Tag
Beginn der Wahl:
@@ -130,7 +130,7 @@ Zu den Kandidaten gehören alle Mitglieder, die keine Officer sind.
Gruppenanfragen
- Keine aktiven Anfragen. Klicken Sie auf â€Neue Anfrage“,
+ Keine aktiven Anfragen. Klicken Sie auf â€Neue Anfrage“,
um eine neue Anfrage zu erstellen.
@@ -153,7 +153,7 @@ um eine neue Anfrage zu erstellen.
Mehrheit:
-
+
Einfache Mehrheit
@@ -183,7 +183,7 @@ um eine neue Anfrage zu erstellen.
Alte Gruppenabstimmungen
- Sie können die Abstimmergebisse anzeigen, indem Sie die Abstimmung auswählen und auf
+ Sie können alte Abstimmergebisse anzeigen, indem Sie die Abstimmung auswählen und auf
â€Objekt anzeigen“ klicken.
@@ -210,9 +210,9 @@ um eine neue Anfrage zu erstellen.
Klicken Sie auf â€HinzufĂ¼gen“, um Benutzer zur Liste hinzuzufĂ¼gen.
- Officers:
+ Offiziere:
-
+
Mitglieder:
@@ -222,7 +222,7 @@ um eine neue Anfrage zu erstellen.
BeitrittsgebĂ¼hr:
-
+
@@ -245,7 +245,8 @@ um eine neue Anfrage zu erstellen.
-
+
+
diff --git a/linden/indra/newview/skins/default/xui/de/floater_group_titles.xml b/linden/indra/newview/skins/default/xui/de/floater_group_titles.xml
new file mode 100644
index 0000000..4d3430d
--- /dev/null
+++ b/linden/indra/newview/skins/default/xui/de/floater_group_titles.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/linden/indra/newview/skins/default/xui/de/floater_html.xml b/linden/indra/newview/skins/default/xui/de/floater_html.xml
index 37f9ea5..7bf1bad 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_html.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_html.xml
@@ -2,7 +2,6 @@
-
diff --git a/linden/indra/newview/skins/default/xui/de/floater_image_preview.xml b/linden/indra/newview/skins/default/xui/de/floater_image_preview.xml
index 145e0bb..a851da8 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_image_preview.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_image_preview.xml
@@ -47,6 +47,7 @@
Speichern Sie das Bild als 24 Bit Targa (.tga).
+
-
+
diff --git a/linden/indra/newview/skins/default/xui/de/floater_inspect.xml b/linden/indra/newview/skins/default/xui/de/floater_inspect.xml
index f8c9b62..d27ac9d 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_inspect.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_inspect.xml
@@ -1,7 +1,7 @@
+ tool_tip="Wählen Sie ein Objekt aus dieser Liste, um es in der Welt zu markieren">
diff --git a/linden/indra/newview/skins/default/xui/de/floater_instant_message.xml b/linden/indra/newview/skins/default/xui/de/floater_instant_message.xml
index ea822e4..fb40e39 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_instant_message.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_instant_message.xml
@@ -37,8 +37,21 @@
Freund hinzufĂ¼gen
+
+ Verlauf anzeigen
+
+
+ Bezahlen
+
+
+ Teleport anbieten
+
+
+
+ Inventar hier hereinziehen (Drag & Drop), um es zu senden
+
diff --git a/linden/indra/newview/skins/default/xui/de/floater_instant_message_ad_hoc.xml b/linden/indra/newview/skins/default/xui/de/floater_instant_message_ad_hoc.xml
index 9407e94..a3ad922 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_instant_message_ad_hoc.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_instant_message_ad_hoc.xml
@@ -1,57 +1,43 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Rumpelstilzchen Megakrass
-
-
- Stummschalten:
-
-
-
-
-
-
-
- Voice-Chat wird beigetreten...
-
-
- Verbunden. Klicken Sie auf Anruf beenden, um die Verbindung zu trennen
-
-
- Voice-Chat verlassen
-
-
- icn_voice-groupfocus.tga
-
-
- FĂ¼r Instant Message hier klicken.
-
-
- *** Willkommen bei Help Request ***
-Bitte werfen Sie zuerst einen Blick auf unsere SL-Hilfeseiten. DrĂ¼cken Sie dazu F1. Oder rufen Sie unter http://secondlife.com/knowledgebase/ die Knowledge Base auf.
-Falls Sie die gesuchte Antwort dort nicht finden, geben Sie Ihre Frage ein. Warten Sie dann einen Moment, bis ein verfĂ¼gbarer Helfer antwortet.
--=-=- Die Antwortzeiten variieren. Insbesondere zur Hauptbetriebszeit kann die Antwort etwas länger dauern. -=-=-
-
-
- Instant Message an [NAME]
-
-
- [NAME] tippt...
-
-
- Beginne Sitzung mit [NAME], bitte warten.
-
-
+
+
+
+ Voice-Chat wird beigetreten...
+
+
+ Verbunden. Klicken Sie auf Anruf beenden, um die Verbindung zu trennen
+
+
+ Voice-Chat verlassen
+
+
+ icn_voice-groupfocus.tga
+
+
+ Instant Message an [NAME]
+
+
+ [NAME] tippt...
+
+
+ Beginne Sitzung mit [NAME], bitte warten.
+
+
+ FĂ¼r Instant Message hier klicken.
+
+
+
+
+
+
+
+
+
+
+
+
+ *** Willkommen bei Help Request ***
+Bitte werfen Sie zuerst einen Blick auf unsere SL-Hilfeseiten. DrĂ¼cken Sie dazu F1. Oder rufen Sie unter http://secondlife.com/knowledgebase/ die Knowledge Base auf.
+Falls Sie die gesuchte Antwort dort nicht finden, geben Sie Ihre Frage ein. Warten Sie dann einen Moment, bis ein verfĂ¼gbarer Helfer antwortet.
+-=-=- Die Antwortzeiten variieren. Insbesondere zur Hauptbetriebszeit kann die Antwort etwas länger dauern. -=-=-
+
+
diff --git a/linden/indra/newview/skins/default/xui/de/floater_instant_message_group.xml b/linden/indra/newview/skins/default/xui/de/floater_instant_message_group.xml
index c7e5542..04a8b08 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_instant_message_group.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_instant_message_group.xml
@@ -1,79 +1,68 @@
-
-
-
-
-
-
-
-
-
-
-
- *** Willkommen bei Help Request ***
- Bitte werfen Sie zuerst einen Blick auf unsere SL-Hilfeseiten. DrĂ¼cken Sie dazu F1. Oder rufen Sie unter http://secondlife.com/knowledgebase/ die Knowledge Base auf.
- Falls Sie die gesuchte Antwort dort nicht finden, geben Sie Ihre Frage ein. Warten Sie dann einen Moment, bis ein verfĂ¼gbarer Helfer antwortet.
- -=-=- Die Antwortzeiten variieren. Insbesondere zur Hauptbetriebszeit kann die Antwort etwas länger dauern. -=-=-
-
-
- Instant Message an [NAME]
-
-
- [NAME] tippt...
-
-
- Beginne Sitzung mit [NAME], bitte warten.
-
-
-
-
-
-
-
-
- Rumpelstilzchen Megakrass
-
-
- Stummschalten:
-
-
-
-
-
-
-
- Voice-Chat wird beigetreten...
-
-
- Verbunden. Klicken Sie auf â€Anruf beenden“, um die Verbindung zu trennen
-
-
- Voice-Chat verlassen
-
-
- icn_voice-groupfocus.tga
-
-
- *** Willkommen bei Help Request ***
- Bitte werfen Sie zuerst einen Blick auf unsere SL-Hilfeseiten. DrĂ¼cken Sie dazu F1. Oder rufen Sie unter http://secondlife.com/knowledgebase/ die Knowledge Base auf.
- Falls Sie die gesuchte Antwort dort nicht finden, geben Sie Ihre Frage ein. Warten Sie dann einen Moment, bis die verfĂ¼gbaren Helfer antworten.
- -=-=- Die Antwortzeiten variieren. Insbesondere zur Hauptbetriebszeit kann die Antwort etwas länger dauern. -=-=-
-
-
- Instant Message an [NAME]
-
-
- [NAME] tippt...
-
-
- Beginne Sitzung mit [NAME], bitte warten.
-
-
- (Moderiert: Voice-Chat standardmĂ¤ĂŸig abschaltet)
-
-
- FĂ¼r Instant Message hier klicken.
-
-
- Ihr Text-Chat wurde von einem Gruppenmoderator deaktiviert.
-
-
+
+
+
+ Voice-Chat wird beigetreten...
+
+
+ Verbunden. Klicken Sie auf â€Anruf beenden“, um die Verbindung zu trennen
+
+
+ Voice-Chat verlassen
+
+
+ icn_voice-groupfocus.tga
+
+
+ *** Willkommen bei Help Request ***
+ Bitte werfen Sie zuerst einen Blick auf unsere SL-Hilfeseiten. DrĂ¼cken Sie dazu F1. Oder rufen Sie unter http://secondlife.com/knowledgebase/ die Knowledge Base auf.
+ Falls Sie die gesuchte Antwort dort nicht finden, geben Sie Ihre Frage ein. Warten Sie dann einen Moment, bis die verfĂ¼gbaren Helfer antworten.
+ -=-=- Die Antwortzeiten variieren. Insbesondere zur Hauptbetriebszeit kann die Antwort etwas länger dauern. -=-=-
+
+
+ Instant Message an [NAME]
+
+
+ [NAME] tippt...
+
+
+ Beginne Sitzung mit [NAME], bitte warten.
+
+
+ (Moderiert: Voice-Chat standardmĂ¤ĂŸig abschaltet)
+
+
+ FĂ¼r Instant Message hier klicken.
+
+
+ Ihr Text-Chat wurde von einem Gruppenmoderator deaktiviert.
+
+
+
+
+
+ Verlauf anzeigen
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Rumpelstilzchen Megakrass
+
+
+ Stummschalten:
+
+
+
+
+
+
+
diff --git a/linden/indra/newview/skins/default/xui/de/floater_inventory.xml b/linden/indra/newview/skins/default/xui/de/floater_inventory.xml
index c8c6724..50d6f13 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_inventory.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_inventory.xml
@@ -1,10 +1,52 @@
-
+
+
+
+ Schnellfilter:
+
+
+
+ Alle Arten
+ Animationen
+ Körperteile
+ Visitenkarten
+ Kleidung
+ Gesten
+ Landmarken
+ Notizkarten
+ Objekte
+ Skripte
+ Klänge
+ Texturen
+ Fotos
+ Anpassen...
+
+
+ Alle Arten
+
+ Animationen
+ Körperteile
+ Visitenkarten
+ Kleidung
+ Gesten
+ Landmarken
+ Notizkarten
+ Objekte
+ Skripte
+ Klänge
+ Texturen
+ Fotos
+
+ Anpassen...
+
+
-
-
+
+
+
+
diff --git a/linden/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml b/linden/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
index 0028f1d..7219ce6 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
@@ -56,7 +56,7 @@
- Objekt markieren:
+ Artikel markieren:
@@ -64,11 +64,11 @@
Original
- Kopieren
+ Kopie
- Preis: L$
+ Preis: [CURRENCY]
(unbekannt)
diff --git a/linden/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml b/linden/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml
index aa24231..6ec5a08 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml
@@ -1,16 +1,18 @@
-
+
+
-
-
+
+
+
@@ -18,7 +20,9 @@
- ODER -
+
+
diff --git a/linden/indra/newview/skins/default/xui/de/floater_joystick.xml b/linden/indra/newview/skins/default/xui/de/floater_joystick.xml
index 2759115..cd1a465 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_joystick.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_joystick.xml
@@ -1,86 +1,92 @@
-
-
-
- Joystick aktivieren:
-
-
-
-
-
-
-
-
-
-
-
-
-
- Steuermodi:
-
-
- Avatar
-
-
- Bauen
-
-
- Flycam
-
-
- X-Skala
-
-
- Y-Skala
-
-
- Z-Skala
-
-
- Neigungsskala
-
-
- Gierskala
-
-
- Rollskala
-
-
- X-Totzone
-
-
- Y-Totzone
-
-
- Z-Totzone
-
-
- Neigen-Totzone
-
-
- Gieren-Totzone
-
-
- Rollen-Totzone
-
-
- Auslaufen
-
-
- Zoom-Skala
-
-
- Zoom-Totzone
-
-
-
-
-
- Joystick-Monitor
-
-
- Achse [NUM]
-
-
- Kein Gerät erkannt
-
-
+
+
+
+ Joystick aktivieren:
+
+
+
+ Joystick Autom. aktivieren
+
+
+
+
+
+
+
+
+
+
+
+
+ Steuermodi:
+
+
+
+ Avatar
+
+
+ Bauen
+
+
+ Flycam
+
+
+
+ X-Skala
+
+
+ Y-Skala
+
+
+ Z-Skala
+
+
+ Neigungsskala
+
+
+ Gierskala
+
+
+ Rollskala
+
+
+ X-Totzone
+
+
+ Y-Totzone
+
+
+ Z-Totzone
+
+
+ Neigen-Totzone
+
+
+ Gieren-Totzone
+
+
+ Rollen-Totzone
+
+
+ Auslaufen
+
+
+ Zoom-Skala
+
+
+ Zoom-Totzone
+
+
+
+
+
+
+ Joystick-Monitor
+
+
+ Achse [NUM]
+
+
+ Kein Gerät erkannt
+
+
--
cgit v1.1
From 3329e607a6d20fcccd3a23258610e729376f5e6b Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Fri, 17 Sep 2010 01:25:49 -0700
Subject: Fixed missing [CURRENCY] in god tools and deleted an unused xml file
(thanks Eryn)
---
linden/indra/newview/llfloatergodtools.cpp | 4 +
.../skins/default/xui/en-us/floater_god_tools.xml | 2 +-
.../skins/default/xui/en-us/floater_group_info.xml | 657 ---------------------
3 files changed, 5 insertions(+), 658 deletions(-)
delete mode 100644 linden/indra/newview/skins/default/xui/en-us/floater_group_info.xml
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llfloatergodtools.cpp b/linden/indra/newview/llfloatergodtools.cpp
index 4959a29..2bbbc65 100644
--- a/linden/indra/newview/llfloatergodtools.cpp
+++ b/linden/indra/newview/llfloatergodtools.cpp
@@ -77,6 +77,8 @@
#include "lltransfertargetfile.h"
#include "lltransfersourcefile.h"
+#include "hippoGridManager.h"
+
const F32 SECONDS_BETWEEN_UPDATE_REQUESTS = 5.0f;
static LLFloaterGodTools* sGodTools = NULL;
@@ -135,6 +137,8 @@ LLFloaterGodTools::LLFloaterGodTools()
sendRegionInfoRequest();
childShowTab("GodTools Tabs", "region");
+
+ childSetTextArg("land cost text", "[CURRENCY]", gHippoGridManager->getConnectedGrid()->getCurrencySymbol());
}
// static
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_god_tools.xml b/linden/indra/newview/skins/default/xui/en-us/floater_god_tools.xml
index ee70387..9ce4b54 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_god_tools.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_god_tools.xml
@@ -133,7 +133,7 @@
bottom="-146" drop_shadow_visible="true" follows="left|top"
font="SansSerif" h_pad="0" halign="left" height="16" left_delta="-108"
mouse_opaque="true" name="land cost text" v_pad="0" width="110">
- L$ per sq. meter:
+ [CURRENCY] per sq. meter:
-
-
-
-
- Group Info
-
-
- Groups are a fun way to collaborate with your friends.
-
-
- Groups let you have titles and insignia and vote.
-
-
- Anyone may create a group. Each person may belong to up to 15 groups.
-
-
- Groups must have at least 3 members to stay active.
-
-
- Creating a group costs L$100.
-
-
- Name:
-
-
-
- Founder:
-
-
-
- Charter:
-
-
-
-
-
-
-
-
-
-
- Group Titles
-
-
- Groups can have officers and members, both of whom can have special titles.
-
-
- These titles appear before their names in the world, in chat, and in IM.
-
-
- Officer Title:
-
-
-
- Member Title:
-
-
-
- Drag a texture out of your inventory to set the group's insignia.
-
-
-
-
-
- Group Members
-
-
- Current Group officers and members.
-
-
- Click on a name to view to the member's profile.
-
-
- Officers:
-
-
-
- Members:
-
-
-
-
-
-
-
-
- Group Election
-
-
- Press the Start Election button to start a new election.
-The candidates will include all non-officer group members.
-
-
- Candidates:
-
-
-
-
-
-
- Quorum:
-
-
-
- out of 111 total group members.
-
-
- Majority:
-
-
-
- Simple Majority
-
-
- 2/3 Majority
-
-
- Unanimous
-
-
-
- Duration:
-
-
-
- days
-
-
- Election Start:
-
-
-
- Election Ends:
-
-
-
-
-
- Group Proposals
-
-
- There are no active proposals. Press the Create Proposal button to
-create a new proposal.
-
-
- Proposals:
-
-
-
-
-
-
-
-
-
-
-
- Quorum:
-
-
-
- out of 111 total group members.
-
-
- Majority:
-
-
-
- Simple Majority
-
-
- 2/3 Majority
-
-
- Unanimous
-
-
-
- Duration:
-
-
-
- days
-
-
- Voting Start:
-
-
-
- Voting Ends:
-
-
-
-
-
- Group Voting History
-
-
- You may view past group vote results by selecting the vote and.
-
-
- pressing View Item.
-
-
- Past Votes:
-
-
-
- Vote Results:
-
-
-
-
-
-
-
-
-
- Group Invitations
-
-
- Invitations are sent via instant message.
-
-
- Click on the add button to add users to the list.
-
-
- Officers:
-
-
-
-
-
- Members:
-
-
-
-
-
- Signup Fee:
-
-
-
-
-
-
- Group Owned Land
-
-
-
- Total Contributed Land:
-
-
-
-
- Total Land In Use:
-
-
-
- Land Available:
-
-
-
-
-
-
- WARNING: Group maintains too much land. Group members need to contribute more.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
--
cgit v1.1
From 54274b8f70f23212fa6cfa25bf5171ae0c76bf77 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Fri, 17 Sep 2010 03:00:01 -0700
Subject: Let's not put so many spaces in front of (none)
---
linden/indra/newview/llfloatergroups.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llfloatergroups.cpp b/linden/indra/newview/llfloatergroups.cpp
index c89e066..a85ce9d 100644
--- a/linden/indra/newview/llfloatergroups.cpp
+++ b/linden/indra/newview/llfloatergroups.cpp
@@ -556,7 +556,7 @@ void init_group_list(LLScrollListCtrl* ctrl, const LLUUID& highlight_id, const s
element["id"] = LLUUID::null;
element["columns"][0]["column"] = "name";
//UGLY hack to make sure "none" is always on top -- MC
- element["columns"][0]["value"] = " (" + none_text + ")";
+ element["columns"][0]["value"] = " (" + none_text + ")";
element["columns"][0]["font"] = "SANSSERIF";
element["columns"][0]["font-style"] = style;
--
cgit v1.1
From 15112113f159d5efbb6d96c549ce7c83fe443541 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Fri, 17 Sep 2010 03:14:00 -0700
Subject: Made searching contacts suck a lot less
---
linden/indra/newview/llfloaterfriends.cpp | 82 +++++++++++++++++--------------
linden/indra/newview/llfloaterfriends.h | 2 +-
2 files changed, 47 insertions(+), 37 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llfloaterfriends.cpp b/linden/indra/newview/llfloaterfriends.cpp
index a151a33..67d9626 100644
--- a/linden/indra/newview/llfloaterfriends.cpp
+++ b/linden/indra/newview/llfloaterfriends.cpp
@@ -151,7 +151,7 @@ void LLPanelFriends::updateFriends(U32 changed_mask)
LLDynamicArray selected_friends = getSelectedIDs();
if(changed_mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE | LLFriendObserver::ONLINE))
{
- refreshNames(changed_mask);
+ refreshNames(changed_mask, "");
}
else if(changed_mask & LLFriendObserver::POWERS)
{
@@ -185,39 +185,14 @@ void LLPanelFriends::updateFriends(U32 changed_mask)
void LLPanelFriends::filterContacts(const std::string& search_string)
{
- std::string search = search_string;
- LLStringUtil::toLower(search);
-
- if (search.empty())
+ if (search_string.empty())
{
- // repopulate
- refreshNames(LLFriendObserver::ADD);
+ refreshNames(LLFriendObserver::ADD, "");
}
else
{
- // just in case someone else emptied us, tsk
- if (mFriendsList->isEmpty() && LLAvatarTracker::instance().getBuddyCount() > 0)
- {
- refreshNames(LLFriendObserver::ADD);
- }
-
- // don't worry about maintaining selection since we're searching
- std::vector vFriends(mFriendsList->getAllData());
-
- // this should really REALLY use deleteAllItems() to rebuild the list instead
- std::string friend_name;
- for (std::vector::iterator itr = vFriends.begin(); itr != vFriends.end(); ++itr)
- {
- friend_name = (*itr)->getColumn(LIST_FRIEND_NAME)->getValue().asString();
- LLStringUtil::toLower(friend_name);
- BOOL show_entry = (friend_name.find(search) != std::string::npos);
- if (!show_entry)
- {
- mFriendsList->deleteItems((*itr)->getValue());
- }
- }
+ refreshNames(LLFriendObserver::ADD, search_string);
}
- mFriendsList->setScrollPos(0);
refreshUI();
}
@@ -247,7 +222,7 @@ BOOL LLPanelFriends::postBuild()
}
U32 changed_mask = LLFriendObserver::ADD | LLFriendObserver::REMOVE | LLFriendObserver::ONLINE;
- refreshNames(changed_mask);
+ refreshNames(changed_mask, "");
childSetAction("im_btn", onClickIM, this);
childSetAction("profile_btn", onClickProfile, this);
@@ -454,7 +429,7 @@ struct SortFriendsByID
}
};
-void LLPanelFriends::refreshNames(U32 changed_mask)
+void LLPanelFriends::refreshNames(U32 changed_mask, const std::string& filter_string)
{
LLDynamicArray selected_ids = getSelectedIDs();
S32 pos = mFriendsList->getScrollPos();
@@ -465,14 +440,49 @@ void LLPanelFriends::refreshNames(U32 changed_mask)
BOOL have_names = TRUE;
- if(changed_mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE))
+ // I hate doing it this way. There's no need for it. I blame LL -- MC
+ if (filter_string.empty())
{
- have_names &= refreshNamesSync(all_buddies);
- }
+ if(changed_mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE))
+ {
+ have_names &= refreshNamesSync(all_buddies);
+ }
- if(changed_mask & LLFriendObserver::ONLINE)
+ if(changed_mask & LLFriendObserver::ONLINE)
+ {
+ have_names &= refreshNamesPresence(all_buddies);
+ }
+ }
+ else
{
- have_names &= refreshNamesPresence(all_buddies);
+ std::string firstname;
+ std::string lastname;
+ utf8str_tolower(filter_string);
+ LLAvatarTracker::buddy_map_t temp_buddies;
+
+ for (LLAvatarTracker::buddy_map_t::reverse_iterator bIt = all_buddies.rbegin();
+ bIt != all_buddies.rend(); ++bIt)
+ {
+ llinfos << (*bIt).first << llendl;
+ if (gCacheName->getName((*bIt).first, firstname, lastname))
+ {
+ std::string test_name(firstname + " " + lastname);
+ if ((utf8str_tolower(test_name)).find(filter_string) != std::string::npos)
+ {
+ llinfos << "inserting: " << test_name << " from filter: " << filter_string << llendl;
+ temp_buddies.insert(temp_buddies.begin(), *bIt);
+ }
+ }
+ }
+ if(changed_mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE))
+ {
+ have_names &= refreshNamesSync(temp_buddies);
+ }
+
+ if(changed_mask & LLFriendObserver::ONLINE)
+ {
+ have_names &= refreshNamesPresence(temp_buddies);
+ }
}
if (!have_names)
diff --git a/linden/indra/newview/llfloaterfriends.h b/linden/indra/newview/llfloaterfriends.h
index 9a1feba..8206362 100644
--- a/linden/indra/newview/llfloaterfriends.h
+++ b/linden/indra/newview/llfloaterfriends.h
@@ -100,7 +100,7 @@ private:
// protected members
typedef std::map rights_map_t;
- void refreshNames(U32 changed_mask);
+ void refreshNames(U32 changed_mask, const std::string& filter_string);
void filterContacts(const std::string& search_string);
BOOL refreshNamesSync(const LLAvatarTracker::buddy_map_t & all_buddies);
--
cgit v1.1
From 3dabba456bda99d88fe069f2e5c5e2cc3d02288e Mon Sep 17 00:00:00 2001
From: Nemurimasu Neiro
Date: Thu, 2 Sep 2010 03:34:17 +0000
Subject: "fix" null sound channel crash
---
linden/indra/llaudio/audioengine.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/llaudio/audioengine.cpp b/linden/indra/llaudio/audioengine.cpp
index 728f054..1900c38 100644
--- a/linden/indra/llaudio/audioengine.cpp
+++ b/linden/indra/llaudio/audioengine.cpp
@@ -762,7 +762,7 @@ LLAudioChannel * LLAudioEngine::getFreeChannel(const F32 priority)
{
LLAudioChannel *channelp = mChannels[i];
LLAudioSource *sourcep = channelp->getSource();
- if (sourcep->getPriority() < min_priority)
+ if (sourcep && sourcep->getPriority() < min_priority)
{
min_channelp = channelp;
min_priority = sourcep->getPriority();
--
cgit v1.1
From 53212cb2c4365fc4bf1ed9c1900e90088cbc35fe Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Fri, 17 Sep 2010 04:45:59 -0700
Subject: Updated the profile button heights
---
.../newview/skins/default/xui/en-us/panel_avatar.xml | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml b/linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml
index 9bc4d7e..2360e6b 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml
@@ -54,30 +54,30 @@
mouse_opaque="true" name="online_no" v_pad="0" width="200">
Currently: Offline
-
-
-
-
-
-
-
Born:
--
cgit v1.1
From 896a9bbe4c4bba4e27d6d90ba8100a6335beb664 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Fri, 17 Sep 2010 05:12:05 -0700
Subject: Added links to the blog and forums to the login screen's help menu
---
.../newview/skins/default/xui/en-us/menu_login.xml | 42 +++++++++++-----------
1 file changed, 22 insertions(+), 20 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/skins/default/xui/en-us/menu_login.xml b/linden/indra/newview/skins/default/xui/en-us/menu_login.xml
index 454774e..d9a9c4c 100644
--- a/linden/indra/newview/skins/default/xui/en-us/menu_login.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/menu_login.xml
@@ -1,32 +1,34 @@
-
-
-
+
+
+
-
-
+
+
-
-
+
+
-
+
+
+
+
+
+
+
+
+
--
cgit v1.1
From d871f00ecedddd0a8d67c143d80c5b32a80d5b62 Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Fri, 17 Sep 2010 19:34:41 +0200
Subject: Added a check to avoid triggering completion tests if text in chatbar
is empty.
---
linden/indra/newview/llchatbar.cpp | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llchatbar.cpp b/linden/indra/newview/llchatbar.cpp
index 2981958..eaa8cc8 100644
--- a/linden/indra/newview/llchatbar.cpp
+++ b/linden/indra/newview/llchatbar.cpp
@@ -215,16 +215,17 @@ BOOL LLChatBar::handleKeyHere( KEY key, MASK mask )
{
if (mInputEditor)
{
+ std::string txt(mInputEditor->getText());
+
std::vector avatar_ids;
std::vector positions;
LLWorld::getInstance()->getAvatars(&avatar_ids, &positions);
- if (!avatar_ids.empty())
+ if (!avatar_ids.empty() && !txt.empty())
{
mInputEditor->deleteSelection(); // Clean up prev completion before attempting a new one
S32 cursorPos = mInputEditor->getCursor();
- std::string txt(mInputEditor->getText());
if (mCompletionHolder.last_txt != mInputEditor->getText())
{
--
cgit v1.1
From 88ff3a278918d915cd09b568f8a177c417809d39 Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Fri, 17 Sep 2010 19:54:49 +0200
Subject: Fixed path separators for im history so it's multiplatform now
---
linden/indra/newview/llimpanel.cpp | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llimpanel.cpp b/linden/indra/newview/llimpanel.cpp
index 797e997..3080a9e 100644
--- a/linden/indra/newview/llimpanel.cpp
+++ b/linden/indra/newview/llimpanel.cpp
@@ -1875,7 +1875,14 @@ void LLFloaterIMPanel::onCommitCombo(LLUICtrl* caller, void* userdata)
std::string fullname = self->getTitle();
//gCacheName->getFullName(self->mOtherParticipantUUID, fullname);
//if(fullname == "(Loading...)")
- std::string file = gDirUtilp->getPerAccountChatLogsDir() + "\\" + fullname + ".txt";
+ std::string separator;
+#ifdef LL_WINDOWS
+ separator = "\\";
+#else
+ separator = "/";
+#endif
+ std::string file = gDirUtilp->getPerAccountChatLogsDir() + separator + fullname + ".txt";
+ llinfos << "File is: '" << file << "'" << llendl;
llstat stat_info;
if (LLFile::stat(file.c_str(), &stat_info))
--
cgit v1.1
From 000312255527c155e3ff49d0a4f6b85b2c5ac0ab Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Fri, 17 Sep 2010 19:56:06 +0200
Subject: Ooops forgot to remove a debug printout :P
---
linden/indra/newview/llimpanel.cpp | 1 -
1 file changed, 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llimpanel.cpp b/linden/indra/newview/llimpanel.cpp
index 3080a9e..808a2c9 100644
--- a/linden/indra/newview/llimpanel.cpp
+++ b/linden/indra/newview/llimpanel.cpp
@@ -1882,7 +1882,6 @@ void LLFloaterIMPanel::onCommitCombo(LLUICtrl* caller, void* userdata)
separator = "/";
#endif
std::string file = gDirUtilp->getPerAccountChatLogsDir() + separator + fullname + ".txt";
- llinfos << "File is: '" << file << "'" << llendl;
llstat stat_info;
if (LLFile::stat(file.c_str(), &stat_info))
--
cgit v1.1
From fec7893de067992b496025e2eb922785a557a368 Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Fri, 17 Sep 2010 20:34:46 +0200
Subject: Fixed events handling on osx to behave correctly on 10.5+ compilation
runs. Added ShellEx(std::string &) method to execute local applications based
on file type.
---
linden/indra/llwindow/llwindowmacosx.cpp | 35 ++++++++++++++++++++++++++------
linden/indra/llwindow/llwindowmacosx.h | 1 +
2 files changed, 30 insertions(+), 6 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/llwindow/llwindowmacosx.cpp b/linden/indra/llwindow/llwindowmacosx.cpp
index 7e7e0af..7efba51 100644
--- a/linden/indra/llwindow/llwindowmacosx.cpp
+++ b/linden/indra/llwindow/llwindowmacosx.cpp
@@ -1153,16 +1153,15 @@ void LLWindowMacOSX::gatherInput()
}
break;
- case kHighLevelEvent:
- AEProcessAppleEvent (&evt);
- break;
-
case updateEvt:
// We shouldn't be getting these regularly (since our window will be buffered), but we need to handle them correctly...
BeginUpdate((WindowRef)evt.message);
EndUpdate((WindowRef)evt.message);
break;
+ default:
+ AEProcessAppleEvent (&evt);
+ break;
}
}
}
@@ -3163,8 +3162,6 @@ void LLWindowMacOSX::spawnWebBrowser(const std::string& escaped_url)
OSStatus result = noErr;
CFURLRef urlRef = NULL;
- llinfos << "Opening URL " << escaped_url << llendl;
-
CFStringRef stringRef = CFStringCreateWithCString(NULL, escaped_url.c_str(), kCFStringEncodingUTF8);
if (stringRef)
{
@@ -3194,6 +3191,32 @@ void LLWindowMacOSX::spawnWebBrowser(const std::string& escaped_url)
}
}
+void LLWindowMacOSX::ShellEx(const std::string& command)
+{
+ OSStatus result = noErr;
+ CFURLRef urlRef = NULL;
+
+ CFStringRef stringRef = CFStringCreateWithCString(NULL, command.c_str(), kCFStringEncodingUTF8);
+ if (stringRef)
+ {
+ urlRef = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, stringRef, kCFURLPOSIXPathStyle, false);
+ CFRelease(stringRef);
+ }
+
+ if (urlRef)
+ {
+ result = LSOpenCFURLRef(urlRef, NULL);
+ if (result != noErr)
+ llinfos << "Error " << result << " on open." << llendl;
+
+ CFRelease(urlRef);
+ }
+ else
+ {
+ llinfos << "Error: couldn't create URL." << llendl;
+ }
+}
+
BOOL LLWindowMacOSX::dialog_color_picker ( F32 *r, F32 *g, F32 *b)
{
BOOL retval = FALSE;
diff --git a/linden/indra/llwindow/llwindowmacosx.h b/linden/indra/llwindow/llwindowmacosx.h
index bf5bfc0..9e87e9f 100644
--- a/linden/indra/llwindow/llwindowmacosx.h
+++ b/linden/indra/llwindow/llwindowmacosx.h
@@ -113,6 +113,7 @@ public:
/*virtual*/ void allowLanguageTextInput(LLPreeditor *preeditor, BOOL b);
/*virtual*/ void interruptLanguageTextInput();
/*virtual*/ void spawnWebBrowser(const std::string& escaped_url);
+ /*virtual*/ void ShellEx(const std::string& command);
static std::vector getDynamicFallbackFontList();
--
cgit v1.1
From 0008208ce02f7612735d7a599a29b821cbc2a083 Mon Sep 17 00:00:00 2001
From: Jacek Antonelli
Date: Fri, 17 Sep 2010 18:43:26 -0500
Subject: UI Scale Reset button finds the actual default, not hardcoded.
---
linden/indra/newview/llpanelgeneral.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llpanelgeneral.cpp b/linden/indra/newview/llpanelgeneral.cpp
index 287ee41..a2cba4c 100644
--- a/linden/indra/newview/llpanelgeneral.cpp
+++ b/linden/indra/newview/llpanelgeneral.cpp
@@ -214,7 +214,8 @@ void LLPanelGeneral::cancel()
void LLPanelGeneral::onClickResetUISize(void* user_data)
{
LLPanelGeneral* self = (LLPanelGeneral*)user_data;
- self->childSetValue("ui_scale_slider", 1.002f);
+ F32 def = gSavedSettings.getControl("UIScaleFactor")->getDefault().asReal();
+ self->childSetValue("ui_scale_slider", def);
}
// static
--
cgit v1.1
From 4d253c518640969138ed2f4047fc5f497908b373 Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Fri, 17 Sep 2010 14:15:00 +0200
Subject: Default upload animation preview to own avatar
---
linden/indra/newview/app_settings/settings.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index 7a22e7e..0a27aa2 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -647,7 +647,7 @@
Type
Boolean
Value
- 0
+ 1
PrivateLookAtTarget
--
cgit v1.1
From 282885ee97004e5ba81cebb2c6ead68aad9e3743 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sat, 18 Sep 2010 03:35:47 -0700
Subject: Fixed windows compile error on autocomplete
---
linden/indra/newview/llchatbar.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llchatbar.cpp b/linden/indra/newview/llchatbar.cpp
index eaa8cc8..0a4ca34 100644
--- a/linden/indra/newview/llchatbar.cpp
+++ b/linden/indra/newview/llchatbar.cpp
@@ -295,7 +295,7 @@ BOOL LLChatBar::handleKeyHere( KEY key, MASK mask )
mCompletionHolder.names.push_back(agent_name);
}
- if (mCompletionHolder.current_index >= mCompletionHolder.names.size() || mCompletionHolder.match != mCompletionHolder.last_match)
+ if (mCompletionHolder.current_index >= (S32)mCompletionHolder.names.size() || mCompletionHolder.match != mCompletionHolder.last_match)
{
mCompletionHolder.current_index = 0;
mCompletionHolder.last_match = mCompletionHolder.match;
--
cgit v1.1
From 76db5e4c7d1e243164b249e3cf7792d0873a8b6a Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sat, 18 Sep 2010 03:36:39 -0700
Subject: Fixed contacts search not working on uppercase names
---
linden/indra/newview/llfloaterfriends.cpp | 13 +++++++------
linden/indra/newview/llfloaterfriends.h | 2 +-
2 files changed, 8 insertions(+), 7 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llfloaterfriends.cpp b/linden/indra/newview/llfloaterfriends.cpp
index 67d9626..e2d3f7c 100644
--- a/linden/indra/newview/llfloaterfriends.cpp
+++ b/linden/indra/newview/llfloaterfriends.cpp
@@ -429,7 +429,7 @@ struct SortFriendsByID
}
};
-void LLPanelFriends::refreshNames(U32 changed_mask, const std::string& filter_string)
+void LLPanelFriends::refreshNames(U32 changed_mask, const std::string& search_string)
{
LLDynamicArray selected_ids = getSelectedIDs();
S32 pos = mFriendsList->getScrollPos();
@@ -441,7 +441,7 @@ void LLPanelFriends::refreshNames(U32 changed_mask, const std::string& filter_st
BOOL have_names = TRUE;
// I hate doing it this way. There's no need for it. I blame LL -- MC
- if (filter_string.empty())
+ if (search_string.empty())
{
if(changed_mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE))
{
@@ -457,7 +457,8 @@ void LLPanelFriends::refreshNames(U32 changed_mask, const std::string& filter_st
{
std::string firstname;
std::string lastname;
- utf8str_tolower(filter_string);
+ std::string filter = search_string;
+ LLStringUtil::toLower(filter);
LLAvatarTracker::buddy_map_t temp_buddies;
for (LLAvatarTracker::buddy_map_t::reverse_iterator bIt = all_buddies.rbegin();
@@ -467,10 +468,10 @@ void LLPanelFriends::refreshNames(U32 changed_mask, const std::string& filter_st
if (gCacheName->getName((*bIt).first, firstname, lastname))
{
std::string test_name(firstname + " " + lastname);
- if ((utf8str_tolower(test_name)).find(filter_string) != std::string::npos)
+ LLStringUtil::toLower(test_name);
+ if (test_name.find(filter) != std::string::npos)
{
- llinfos << "inserting: " << test_name << " from filter: " << filter_string << llendl;
- temp_buddies.insert(temp_buddies.begin(), *bIt);
+ temp_buddies.insert(temp_buddies.begin(), std::pair((*bIt).first, (*bIt).second));
}
}
}
diff --git a/linden/indra/newview/llfloaterfriends.h b/linden/indra/newview/llfloaterfriends.h
index 8206362..d2317b7 100644
--- a/linden/indra/newview/llfloaterfriends.h
+++ b/linden/indra/newview/llfloaterfriends.h
@@ -100,7 +100,7 @@ private:
// protected members
typedef std::map rights_map_t;
- void refreshNames(U32 changed_mask, const std::string& filter_string);
+ void refreshNames(U32 changed_mask, const std::string& search_string);
void filterContacts(const std::string& search_string);
BOOL refreshNamesSync(const LLAvatarTracker::buddy_map_t & all_buddies);
--
cgit v1.1
From 1a93c7b878edab04a40387769a25899833221d83 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sat, 18 Sep 2010 03:38:16 -0700
Subject: Changed version to Experimental 2010.09.18
---
linden/indra/newview/app_settings/viewerversion.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/viewerversion.xml b/linden/indra/newview/app_settings/viewerversion.xml
index f5fb533..351f86b 100644
--- a/linden/indra/newview/app_settings/viewerversion.xml
+++ b/linden/indra/newview/app_settings/viewerversion.xml
@@ -20,6 +20,6 @@ need to be changed manually - MC
-
+
--
cgit v1.1
From ebdf44ec4bb94ee8f6db8ca3045a15617b252945 Mon Sep 17 00:00:00 2001
From: elektrahesse
Date: Sat, 18 Sep 2010 13:33:24 +0200
Subject: Fixed a regression bug due to a refactor
---
linden/indra/newview/llchatbar.cpp | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llchatbar.cpp b/linden/indra/newview/llchatbar.cpp
index 0a4ca34..a22fd8f 100644
--- a/linden/indra/newview/llchatbar.cpp
+++ b/linden/indra/newview/llchatbar.cpp
@@ -215,6 +215,7 @@ BOOL LLChatBar::handleKeyHere( KEY key, MASK mask )
{
if (mInputEditor)
{
+ mInputEditor->deleteSelection(); // Clean up prev completion before attempting a new one
std::string txt(mInputEditor->getText());
std::vector avatar_ids;
@@ -223,8 +224,6 @@ BOOL LLChatBar::handleKeyHere( KEY key, MASK mask )
if (!avatar_ids.empty() && !txt.empty())
{
- mInputEditor->deleteSelection(); // Clean up prev completion before attempting a new one
-
S32 cursorPos = mInputEditor->getCursor();
if (mCompletionHolder.last_txt != mInputEditor->getText())
--
cgit v1.1
From d3d73852ec3d75a70534d34aaee59217d0037f02 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sun, 19 Sep 2010 00:56:33 -0700
Subject: Changed ResetFocusOnSelfClick to default to false. TODO: investigate
a better way of handling this
---
linden/indra/newview/app_settings/settings.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index 0a27aa2..a0f33cb 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -746,7 +746,7 @@
Type
Boolean
Value
- 0
+ 1
RezWithLandGroup
--
cgit v1.1
From 23e3e4f5353a280944992bd2839e3aecadca3412 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sun, 19 Sep 2010 01:13:22 -0700
Subject: Show start location on the login screen by default
---
linden/indra/newview/app_settings/settings.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index a0f33cb..ee8f76e 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -10672,7 +10672,7 @@
Type
Boolean
Value
- 0
+ 1
ShowTangentBasis
--
cgit v1.1
From 7d524c7470b9846148cac9516a7686ba0d9608f7 Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Sun, 19 Sep 2010 08:16:14 -0700
Subject: Added safety checks for when snapshot window goes out of sync with
the main UI, as well as a few backported changes from Viewer 2
---
linden/indra/newview/llfloatersnapshot.cpp | 219 ++++++++++++++++-------------
1 file changed, 121 insertions(+), 98 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llfloatersnapshot.cpp b/linden/indra/newview/llfloatersnapshot.cpp
index f67340e..9e8c38b 100644
--- a/linden/indra/newview/llfloatersnapshot.cpp
+++ b/linden/indra/newview/llfloatersnapshot.cpp
@@ -366,6 +366,7 @@ void LLSnapshotLivePreview::setSnapshotQuality(S32 quality)
{
mSnapshotQuality = quality;
gSavedSettings.setS32("SnapshotQuality", quality);
+ mSnapshotUpToDate = FALSE;
}
}
@@ -777,8 +778,7 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
previewp->getWindow()->incBusyCount();
previewp->mImageScaled[previewp->mCurImageIndex] = FALSE;
- int res = 1;
- res = (gSavedSettings.getBOOL("HighResSnapshot") && previewp->getSnapshotType() == SNAPSHOT_LOCAL) ? 2 : 1;
+ int res = (gSavedSettings.getBOOL("HighResSnapshot") && previewp->getSnapshotType() == SNAPSHOT_LOCAL) ? 2 : 1;
if(gViewerWindow->rawSnapshot(
previewp->mPreviewImage,
@@ -891,16 +891,16 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
previewp->mPosTakenGlobal = gAgent.getCameraPositionGlobal();
previewp->mShineCountdown = 4; // wait a few frames to avoid animation glitch due to readback this frame
}
- previewp->getWindow()->decBusyCount();
- // only show fullscreen preview when in freeze frame mode
- previewp->setVisible(gSavedSettings.getBOOL("UseFreezeFrame"));
- previewp->mSnapshotDelayTimer.stop();
- previewp->mSnapshotActive = FALSE;
+ }
+ previewp->getWindow()->decBusyCount();
+ // only show fullscreen preview when in freeze frame mode
+ previewp->setVisible(gSavedSettings.getBOOL("UseFreezeFrame"));
+ previewp->mSnapshotDelayTimer.stop();
+ previewp->mSnapshotActive = FALSE;
- if(!previewp->getThumbnailUpToDate())
- {
- previewp->generateThumbnailImage() ;
- }
+ if(!previewp->getThumbnailUpToDate())
+ {
+ previewp->generateThumbnailImage() ;
}
return TRUE;
@@ -1025,7 +1025,8 @@ class LLFloaterSnapshot::Impl
public:
Impl()
: mAvatarPauseHandles(),
- mLastToolset(NULL)
+ mLastToolset(NULL),
+ mAspectRatioCheckOff(false)
{
}
~Impl()
@@ -1064,9 +1065,6 @@ public:
static void updateLayout(LLFloaterSnapshot* floater);
static void updateResolutionTextEntry(LLFloaterSnapshot* floater);
- static LLHandle sPreviewHandle;
- static BOOL sAspectRatioCheckOff ;
-
private:
static LLSnapshotLivePreview::ESnapshotType getTypeIndex(LLFloaterSnapshot* floater);
static ESnapshotFormat getFormatIndex(LLFloaterSnapshot* floater);
@@ -1079,18 +1077,14 @@ public:
std::vector mAvatarPauseHandles;
LLToolset* mLastToolset;
+ LLHandle mPreviewHandle;
+ bool mAspectRatioCheckOff ;
};
// static
-LLHandle LLFloaterSnapshot::Impl::sPreviewHandle;
-
-//static
-BOOL LLFloaterSnapshot::Impl::sAspectRatioCheckOff = FALSE ;
-
-// static
LLSnapshotLivePreview* LLFloaterSnapshot::Impl::getPreviewView(LLFloaterSnapshot *floater)
{
- LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)sPreviewHandle.get();
+ LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)floater->impl.mPreviewHandle.get();
return previewp;
}
@@ -1098,14 +1092,17 @@ LLSnapshotLivePreview* LLFloaterSnapshot::Impl::getPreviewView(LLFloaterSnapshot
LLSnapshotLivePreview::ESnapshotType LLFloaterSnapshot::Impl::getTypeIndex(LLFloaterSnapshot* floater)
{
LLSnapshotLivePreview::ESnapshotType index = LLSnapshotLivePreview::SNAPSHOT_POSTCARD;
- LLSD value = floater->childGetValue("snapshot_type_radio");
- const std::string id = value.asString();
- if (id == "postcard")
- index = LLSnapshotLivePreview::SNAPSHOT_POSTCARD;
- else if (id == "texture")
- index = LLSnapshotLivePreview::SNAPSHOT_TEXTURE;
- else if (id == "local")
- index = LLSnapshotLivePreview::SNAPSHOT_LOCAL;
+ LLRadioGroup* snapshot_type_radio = floater->getChild("snapshot_type_radio");
+ if (snapshot_type_radio)
+ {
+ const std::string id = snapshot_type_radio->getSelectedValue().asString();
+ if (id == "postcard")
+ index = LLSnapshotLivePreview::SNAPSHOT_POSTCARD;
+ else if (id == "texture")
+ index = LLSnapshotLivePreview::SNAPSHOT_TEXTURE;
+ else if (id == "local")
+ index = LLSnapshotLivePreview::SNAPSHOT_LOCAL;
+ }
return index;
}
@@ -1114,16 +1111,19 @@ LLSnapshotLivePreview::ESnapshotType LLFloaterSnapshot::Impl::getTypeIndex(LLFlo
LLFloaterSnapshot::ESnapshotFormat LLFloaterSnapshot::Impl::getFormatIndex(LLFloaterSnapshot* floater)
{
ESnapshotFormat index = SNAPSHOT_FORMAT_PNG;
- LLSD value = floater->childGetValue("local_format_combo");
- const std::string id = value.asString();
- if (id == "PNG")
- index = SNAPSHOT_FORMAT_PNG;
- else if (id == "JPEG")
- index = SNAPSHOT_FORMAT_JPEG;
- else if (id == "TGA")
- index = SNAPSHOT_FORMAT_TGA;
- else if (id == "BMP")
- index = SNAPSHOT_FORMAT_BMP;
+ if(floater->hasChild("local_format_combo"))
+ {
+ LLComboBox* local_format_combo = floater->getChild("local_format_combo");
+ const std::string id = local_format_combo->getSelectedItemLabel();
+ if (id == "PNG")
+ index = SNAPSHOT_FORMAT_PNG;
+ else if (id == "JPEG")
+ index = SNAPSHOT_FORMAT_JPEG;
+ else if (id == "TGA")
+ index = SNAPSHOT_FORMAT_TGA;
+ else if (id == "BMP")
+ index = SNAPSHOT_FORMAT_BMP;
+ }
return index;
}
@@ -1133,14 +1133,17 @@ LLFloaterSnapshot::ESnapshotFormat LLFloaterSnapshot::Impl::getFormatIndex(LLFlo
LLViewerWindow::ESnapshotType LLFloaterSnapshot::Impl::getLayerType(LLFloaterSnapshot* floater)
{
LLViewerWindow::ESnapshotType type = LLViewerWindow::SNAPSHOT_TYPE_COLOR;
- LLSD value = floater->childGetValue("layer_types");
- const std::string id = value.asString();
- if (id == "colors")
- type = LLViewerWindow::SNAPSHOT_TYPE_COLOR;
- else if (id == "depth")
- type = LLViewerWindow::SNAPSHOT_TYPE_DEPTH;
- else if (id == "objects")
- type = LLViewerWindow::SNAPSHOT_TYPE_OBJECT_ID;
+ if(floater->hasChild("layer_types"))
+ {
+ LLComboBox* layer_types = floater->getChild("layer_types");
+ const std::string id = layer_types->getSelectedItemLabel();
+ if (id == "colors")
+ type = LLViewerWindow::SNAPSHOT_TYPE_COLOR;
+ else if (id == "depth")
+ type = LLViewerWindow::SNAPSHOT_TYPE_DEPTH;
+ else if (id == "objects")
+ type = LLViewerWindow::SNAPSHOT_TYPE_OBJECT_ID;
+ }
return type;
}
@@ -1199,7 +1202,7 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
iter != LLCharacter::sInstances.end(); ++iter)
{
avatarp = *iter;
- sInstance->impl.mAvatarPauseHandles.push_back(avatarp->requestPause());
+ floaterp->impl.mAvatarPauseHandles.push_back(avatarp->requestPause());
}
// freeze everything else
@@ -1207,7 +1210,7 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
if (LLToolMgr::getInstance()->getCurrentToolset() != gCameraToolset)
{
- sInstance->impl.mLastToolset = LLToolMgr::getInstance()->getCurrentToolset();
+ floaterp->impl.mLastToolset = LLToolMgr::getInstance()->getCurrentToolset();
LLToolMgr::getInstance()->setCurrentToolset(gCameraToolset);
}
}
@@ -1222,15 +1225,15 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
}
//RN: thaw all avatars
- sInstance->impl.mAvatarPauseHandles.clear();
+ floaterp->impl.mAvatarPauseHandles.clear();
// thaw everything else
gSavedSettings.setBOOL("FreezeTime", FALSE);
// restore last tool (e.g. pie menu, etc)
- if (sInstance->impl.mLastToolset)
+ if (floaterp->impl.mLastToolset)
{
- LLToolMgr::getInstance()->setCurrentToolset(sInstance->impl.mLastToolset);
+ LLToolMgr::getInstance()->setCurrentToolset(floaterp->impl.mLastToolset);
}
}
}
@@ -1243,8 +1246,28 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
// static
void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
{
+ std::string fee = gHippoGridManager->getConnectedGrid()->getUploadFee();
+ floater->childSetLabelArg("upload_btn", "[UPLOADFEE]", fee);
+
LLRadioGroup* snapshot_type_radio = floater->getChild("snapshot_type_radio");
- snapshot_type_radio->setSelectedIndex(gSavedSettings.getS32("LastSnapshotType"));
+ if (snapshot_type_radio)
+ {
+ snapshot_type_radio->setSelectedIndex(gSavedSettings.getS32("LastSnapshotType"));
+
+ const child_list_t *childs = snapshot_type_radio->getChildList();
+ if (childs)
+ {
+ child_list_t::const_iterator it, end=childs->end();
+ for (it=childs->begin(); it!=end; ++it)
+ {
+ LLRadioCtrl *ctrl = dynamic_cast(*it);
+ if (ctrl && (ctrl->getName() == "texture"))
+ {
+ ctrl->setLabelArg("[UPLOADFEE]", fee);
+ }
+ }
+ }
+ }
LLSnapshotLivePreview::ESnapshotType shot_type = getTypeIndex(floater);
ESnapshotFormat shot_format = (ESnapshotFormat)gSavedSettings.getS32("SnapshotFormat"); //getFormatIndex(floater); LLViewerWindow::ESnapshotType layer_type = getLayerType(floater);
LLViewerWindow::ESnapshotType layer_type = getLayerType(floater);
@@ -1258,25 +1281,10 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
floater->getChild("local_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotLocalLastResolution"));
floater->getChild("local_format_combo")->selectNthItem(gSavedSettings.getS32("SnapshotFormat"));
- std::string fee = gHippoGridManager->getConnectedGrid()->getUploadFee();
- floater->childSetLabelArg("upload_btn", "[UPLOADFEE]", fee);
-
- if (snapshot_type_radio) {
- const child_list_t *childs = snapshot_type_radio->getChildList();
- if (childs) {
- child_list_t::const_iterator it, end=childs->end();
- for (it=childs->begin(); it!=end; ++it) {
- LLRadioCtrl *ctrl = dynamic_cast(*it);
- if (ctrl && (ctrl->getName() == "texture"))
- ctrl->setLabelArg("[UPLOADFEE]", fee);
- }
- }
- }
-
floater->childSetVisible("upload_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE);
floater->childSetVisible("send_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD);
floater->childSetVisible("save_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL);
- floater->childSetEnabled("keep_aspect_check", shot_type != LLSnapshotLivePreview::SNAPSHOT_TEXTURE && !sAspectRatioCheckOff);
+ floater->childSetEnabled("keep_aspect_check", shot_type != LLSnapshotLivePreview::SNAPSHOT_TEXTURE && !floater->impl.mAspectRatioCheckOff);
floater->childSetEnabled("layer_types", shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL);
if(shot_type != LLSnapshotLivePreview::SNAPSHOT_TEXTURE)
{
@@ -1308,7 +1316,7 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
LLSnapshotLivePreview* previewp = getPreviewView(floater);
BOOL got_bytes = previewp && previewp->getDataSize() > 0;
- BOOL got_snap = previewp->getSnapshotUpToDate();
+ BOOL got_snap = previewp && previewp->getSnapshotUpToDate();
BOOL show_slider =
shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD
@@ -1321,7 +1329,10 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
LLLocale locale(LLLocale::USER_LOCALE);
std::string bytes_string;
- LLResMgr::getInstance()->getIntegerString(bytes_string, (previewp->getDataSize()) >> 10 );
+ if (got_snap)
+ {
+ LLResMgr::getInstance()->getIntegerString(bytes_string, (previewp->getDataSize()) >> 10 );
+ }
S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
floater->childSetLabelArg("texture", "[AMOUNT]", llformat("%d",upload_cost));
floater->childSetLabelArg("upload_btn", "[AMOUNT]", llformat("%d",upload_cost));
@@ -1652,7 +1663,7 @@ void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 inde
if(0 == index) //current window size
{
- sAspectRatioCheckOff = TRUE ;
+ view->impl.mAspectRatioCheckOff = true ;
view->childSetEnabled("keep_aspect_check", FALSE) ;
if(previewp)
@@ -1662,7 +1673,7 @@ void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 inde
}
else if(-1 == index) //custom
{
- sAspectRatioCheckOff = FALSE ;
+ view->impl.mAspectRatioCheckOff = false ;
//if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE != gSavedSettings.getS32("LastSnapshotType"))
{
view->childSetEnabled("keep_aspect_check", TRUE) ;
@@ -1675,7 +1686,7 @@ void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 inde
}
else
{
- sAspectRatioCheckOff = TRUE ;
+ view->impl.mAspectRatioCheckOff = true ;
view->childSetEnabled("keep_aspect_check", FALSE) ;
if(previewp)
@@ -1832,23 +1843,25 @@ void LLFloaterSnapshot::Impl::onCommitSnapshotFormat(LLUICtrl* ctrl, void* data)
void LLFloaterSnapshot::Impl::comboSetCustom(LLFloaterSnapshot* floater, const std::string& comboname)
{
LLComboBox* combo = floater->getChild(comboname);
+ if (combo)
+ {
+ combo->setCurrentByIndex(combo->getItemCount() - 1); // "custom" is always the last index
- combo->setCurrentByIndex(combo->getItemCount() - 1); // "custom" is always the last index
+ if(comboname == "postcard_size_combo")
+ {
+ gSavedSettings.setS32("SnapshotPostcardLastResolution", combo->getCurrentIndex());
+ }
+ else if(comboname == "texture_size_combo")
+ {
+ gSavedSettings.setS32("SnapshotTextureLastResolution", combo->getCurrentIndex());
+ }
+ else if(comboname == "local_size_combo")
+ {
+ gSavedSettings.setS32("SnapshotLocalLastResolution", combo->getCurrentIndex());
+ }
- if(comboname == "postcard_size_combo")
- {
- gSavedSettings.setS32("SnapshotPostcardLastResolution", combo->getCurrentIndex());
- }
- else if(comboname == "texture_size_combo")
- {
- gSavedSettings.setS32("SnapshotTextureLastResolution", combo->getCurrentIndex());
+ checkAspectRatio(floater, -1); // -1 means custom
}
- else if(comboname == "local_size_combo")
- {
- gSavedSettings.setS32("SnapshotLocalLastResolution", combo->getCurrentIndex());
- }
-
- checkAspectRatio(floater, -1); // -1 means custom
}
@@ -2015,6 +2028,7 @@ LLFloaterSnapshot::LLFloaterSnapshot()
: LLFloater(std::string("Snapshot Floater")),
impl (*(new Impl))
{
+ //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_snapshot.xml", FALSE);
}
// Destroys the object
@@ -2022,8 +2036,7 @@ LLFloaterSnapshot::~LLFloaterSnapshot()
{
if (sInstance == this)
{
- LLView::deleteViewByHandle(Impl::sPreviewHandle);
- Impl::sPreviewHandle = LLHandle();
+ LLView::deleteViewByHandle(impl.mPreviewHandle);
sInstance = NULL;
}
@@ -2092,20 +2105,27 @@ BOOL LLFloaterSnapshot::postBuild()
childSetCommitCallback("texture_size_combo", Impl::onCommitResolution, this);
childSetCommitCallback("local_size_combo", Impl::onCommitResolution, this);
+ gSavedSettings.setBOOL("EmeraldTemporaryUpload",FALSE);
+ childSetValue("temp_check",FALSE);
+
// create preview window
- LLRect full_screen_rect = sInstance->getRootView()->getRect();
+ LLRect full_screen_rect = getRootView()->getRect();
LLSnapshotLivePreview* previewp = new LLSnapshotLivePreview(full_screen_rect);
- sInstance->getRootView()->removeChild(gSnapshotFloaterView);
+ LLView* parent_view = gSnapshotFloaterView->getParent();
+
+ parent_view->removeChild(gSnapshotFloaterView);
// make sure preview is below snapshot floater
- sInstance->getRootView()->addChild(previewp);
- sInstance->getRootView()->addChild(gSnapshotFloaterView);
+ parent_view->addChild(previewp);
+ parent_view->addChild(gSnapshotFloaterView);
- gSavedSettings.setBOOL("EmeraldTemporaryUpload",FALSE);
- childSetValue("temp_check",FALSE);
+ impl.mPreviewHandle = previewp->getHandle();
- Impl::sPreviewHandle = previewp->getHandle();
+ //move snapshot floater to special purpose snapshotfloaterview
+ //gFloaterView->removeChild(this);
+ //gSnapshotFloaterView->addChild(this);
impl.updateControls(this);
+ impl.updateLayout(this);
return TRUE;
}
@@ -2282,6 +2302,9 @@ void LLFloaterSnapshot::hide(void*)
//static
void LLFloaterSnapshot::update()
{
+ if (!sInstance)
+ return;
+
BOOL changed = FALSE;
for (std::set::iterator iter = LLSnapshotLivePreview::sList.begin();
iter != LLSnapshotLivePreview::sList.end(); ++iter)
--
cgit v1.1
From 070a8e6c351ac115c3063615a1a7c8a31ef33a48 Mon Sep 17 00:00:00 2001
From: thickbrick
Date: Tue, 21 Sep 2010 18:23:43 +0200
Subject: Double-click teleport: - clean up duplicated (and subtly and
needlessly different) code. - keep the camera heading in inter-sim
double-click teleport in a hackish way, since SL sims give LookAt info
that is kind of random in AgentMovementComplete.
---
linden/indra/newview/chatbar_as_cmdline.cpp | 4 +-
linden/indra/newview/llagent.cpp | 81 ++++++++++++++---------------
linden/indra/newview/llagent.h | 9 +++-
linden/indra/newview/llviewermenu.cpp | 4 +-
linden/indra/newview/llviewermessage.cpp | 8 ++-
5 files changed, 58 insertions(+), 48 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/chatbar_as_cmdline.cpp b/linden/indra/newview/chatbar_as_cmdline.cpp
index 59804c0..9359444 100644
--- a/linden/indra/newview/chatbar_as_cmdline.cpp
+++ b/linden/indra/newview/chatbar_as_cmdline.cpp
@@ -16,7 +16,7 @@
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
- * THIS SOFTWARE IS PROVIDED BY MODULAR SYSTEMS AND CONTRIBUTORS “AS IS”
+ * THIS SOFTWARE IS PROVIDED BY MODULAR SYSTEMS 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 MODULAR SYSTEMS OR CONTRIBUTORS
@@ -331,7 +331,7 @@ bool cmd_line_chat(std::string revised_text, EChatType type)
}
else if(command == *sCmdLineChatbarTeleportToCam)
{
- gAgent.teleportViaLocation(gAgent.getCameraPositionGlobal());
+ gAgent.teleportViaLocationLookAt(gAgent.getCameraPositionGlobal());
return false;
}
/*else if(command == *sCmdLineChatbarUndeform)
diff --git a/linden/indra/newview/llagent.cpp b/linden/indra/newview/llagent.cpp
index 51b6c53..077da53 100644
--- a/linden/indra/newview/llagent.cpp
+++ b/linden/indra/newview/llagent.cpp
@@ -400,7 +400,8 @@ LLAgent::LLAgent() :
mAgentWearablesUpdateSerialNum(0),
mWearablesLoaded(FALSE),
mTextureCacheQueryID(0),
- mAppearanceSerialNum(0)
+ mAppearanceSerialNum(0),
+ mbTeleportKeepsLookAt(false)
{
U32 i;
for (i = 0; i < TOTAL_CONTROLS; i++)
@@ -6099,16 +6100,21 @@ bool LLAgent::teleportCore(bool is_local)
void LLAgent::teleportRequest(
const U64& region_handle,
- const LLVector3& pos_local)
+ const LLVector3& pos_local,
+ bool keep_look_at)
{
LLViewerRegion* regionp = getRegion();
-
+ if (!regionp)
+ {
+ return;
+ }
// Set last region data for teleport history
gAgent.setLastRegionData(regionp->getName(),gAgent.getPositionAgent());
- if(regionp && teleportCore())
+ bool is_local = (region_handle == to_region_handle(getPositionGlobal()));
+ if(teleportCore(is_local))
{
- llinfos << "TeleportRequest: '" << region_handle << "':" << pos_local
+ llinfos << "TeleportLocationRequest: '" << region_handle << "':" << pos_local
<< llendl;
LLMessageSystem* msg = gMessageSystem;
msg->newMessage("TeleportLocationRequest");
@@ -6119,6 +6125,10 @@ void LLAgent::teleportRequest(
msg->addU64("RegionHandle", region_handle);
msg->addVector3("Position", pos_local);
LLVector3 look_at(0,1,0);
+ if (keep_look_at)
+ {
+ look_at = LLViewerCamera::getInstance()->getAtAxis();
+ }
msg->addVector3("LookAt", look_at);
sendReliableMessage();
}
@@ -6219,46 +6229,29 @@ void LLAgent::teleportViaLocation(const LLVector3d& pos_global)
}
// [/RLVa:KB]
- LLViewerRegion* regionp = getRegion();
- LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromPosGlobal(pos_global);
- if(regionp && info)
- {
- U32 x_pos;
- U32 y_pos;
- from_region_handle(info->mHandle, &x_pos, &y_pos);
- LLVector3 pos_local(
- (F32)(pos_global.mdV[VX] - x_pos),
- (F32)(pos_global.mdV[VY] - y_pos),
- (F32)(pos_global.mdV[VZ]));
- teleportRequest(info->mHandle, pos_local);
- }
- else if(regionp &&
- teleportCore(regionp->getHandle() == to_region_handle_global((F32)pos_global.mdV[VX], (F32)pos_global.mdV[VY])))
- {
- llwarns << "Using deprecated teleportlocationrequest." << llendl;
- // send the message
- LLMessageSystem* msg = gMessageSystem;
- msg->newMessageFast(_PREHASH_TeleportLocationRequest);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, getID());
- msg->addUUIDFast(_PREHASH_SessionID, getSessionID());
+ U64 region_handle = to_region_handle(pos_global);
+ LLVector3 pos_local = (LLVector3)(pos_global - from_region_handle(region_handle));
+ teleportRequest(region_handle, pos_local, false);
+}
- msg->nextBlockFast(_PREHASH_Info);
- F32 width = regionp->getWidth();
- LLVector3 pos(fmod((F32)pos_global.mdV[VX], width),
- fmod((F32)pos_global.mdV[VY], width),
- (F32)pos_global.mdV[VZ]);
- F32 region_x = (F32)(pos_global.mdV[VX]);
- F32 region_y = (F32)(pos_global.mdV[VY]);
- U64 region_handle = to_region_handle_global(region_x, region_y);
- msg->addU64Fast(_PREHASH_RegionHandle, region_handle);
- msg->addVector3Fast(_PREHASH_Position, pos);
- pos.mV[VX] += 1;
- msg->addVector3Fast(_PREHASH_LookAt, pos);
- sendReliableMessage();
+// Teleport to global position, but keep facing in the same direction
+void LLAgent::teleportViaLocationLookAt(const LLVector3d& pos_global)
+{
+ // RLVa stuff copied from LLAgent::teleportViaLocation
+ if ( (rlv_handler_t::isEnabled()) &&
+ ( (gRlvHandler.hasBehaviourExcept(RLV_BHVR_TPLOC, gRlvHandler.getCurrentObject())) ||
+ ( (mAvatarObject.notNull()) && (mAvatarObject->mIsSitting) &&
+ (gRlvHandler.hasBehaviourExcept(RLV_BHVR_UNSIT, gRlvHandler.getCurrentObject()))) ) )
+ {
+ return;
}
-}
+ mbTeleportKeepsLookAt = true;
+ setFocusOnAvatar(FALSE, ANIMATE); // detach camera form avatar, so it keeps direction
+ U64 region_handle = to_region_handle(pos_global);
+ LLVector3 pos_local = (LLVector3)(pos_global - from_region_handle(region_handle));
+ teleportRequest(region_handle, pos_local, mbTeleportKeepsLookAt);
+}
void LLAgent::teleportHome()
{
@@ -6286,6 +6279,10 @@ bool LLAgent::teleportHomeCallback( const LLSD& notification, const LLSD& respon
void LLAgent::setTeleportState(ETeleportState state)
{
mTeleportState = state;
+ if (mTeleportState == TELEPORT_NONE)
+ {
+ mbTeleportKeepsLookAt = false;
+ }
if (mTeleportState > TELEPORT_NONE && gSavedSettings.getBOOL("FreezeTime"))
{
LLFloaterSnapshot::hide(0);
diff --git a/linden/indra/newview/llagent.h b/linden/indra/newview/llagent.h
index 3a39448..f1cad9c 100644
--- a/linden/indra/newview/llagent.h
+++ b/linden/indra/newview/llagent.h
@@ -496,7 +496,8 @@ public:
// go to a named location home
void teleportRequest(
const U64& region_handle,
- const LLVector3& pos_local);
+ const LLVector3& pos_local,
+ bool keep_look_at);
// teleport to a landmark
void teleportViaLandmark(const LLUUID& landmark_id);
@@ -513,6 +514,9 @@ public:
// deprecated.
void teleportViaLocation(const LLVector3d& pos_global);
+ // to a global location, preserving camera rotation
+ void teleportViaLocationLookAt(const LLVector3d& pos_global);
+
// cancel the teleport, may or may not be allowed by server
void teleportCancel();
@@ -521,6 +525,8 @@ public:
const std::string getTeleportSourceSLURL() const { return mTeleportSourceSLURL; }
+ // whether look-at resets after this teleport
+ bool getTeleportKeepsLookAt() const { return mbTeleportKeepsLookAt; }
// Setting the ability for this avatar to proxy for another avatar.
//static void processAddModifyAbility(LLMessageSystem* msg, void**);
@@ -781,6 +787,7 @@ public:
EDoubleTapRunMode mDoubleTapRunMode;
private:
+ bool mbTeleportKeepsLookAt;
bool mbAlwaysRun; // should the avatar run by default rather than walk
bool mbRunning; // is the avatar trying to run right now
diff --git a/linden/indra/newview/llviewermenu.cpp b/linden/indra/newview/llviewermenu.cpp
index fd6e842..71938d9 100644
--- a/linden/indra/newview/llviewermenu.cpp
+++ b/linden/indra/newview/llviewermenu.cpp
@@ -2576,9 +2576,9 @@ bool handle_go_to_callback(const LLSD& notification, const LLSD& response)
if (action == "teleport")
{
- LLVector3d hips_offset(0.0f, 0.0f, 1.2f);
+ pos.mdV[VZ] += gAgent.getAvatarObject()->getPelvisToFoot() + 0.2f;
gAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
- gAgent.teleportViaLocation(pos + hips_offset);
+ gAgent.teleportViaLocationLookAt(pos);
}
else if (action == "move")
{
diff --git a/linden/indra/newview/llviewermessage.cpp b/linden/indra/newview/llviewermessage.cpp
index bfd1045..e216c44 100755
--- a/linden/indra/newview/llviewermessage.cpp
+++ b/linden/indra/newview/llviewermessage.cpp
@@ -3540,6 +3540,12 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
if( is_teleport )
{
+ if (gAgent.getTeleportKeepsLookAt())
+ {
+ // *NOTE: the LookAt data we get from the sim here doesn't
+ // seem to be useful, so get it from the camera instead.
+ look_at = LLViewerCamera::getInstance()->getAtAxis();
+ }
// Force the camera back onto the agent, don't animate.
gAgent.setFocusOnAvatar(TRUE, FALSE);
gAgent.slamLookAt(look_at);
@@ -3601,7 +3607,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
{
LLTracker::stopTracking(NULL);
}
- else if ( is_teleport )
+ else if ( is_teleport && !gAgent.getTeleportKeepsLookAt() )
{
//look at the beacon
LLVector3 global_agent_pos = agent_pos;
--
cgit v1.1
From 721c25d85b39a7b013a182cb0f60e159bfc28807 Mon Sep 17 00:00:00 2001
From: thickbrick
Date: Tue, 21 Sep 2010 23:55:50 +0200
Subject: More sanity checks in OpenJPEG decodes for #355 Patch by Carjay
McGinnis from VWR-1815. This fixes decoding lossless and small textures where
the viewer's assumption about compressed size breaks (i.e. discard level only
half there), and also encoding small lossy textures.
This relys on a patched OpenJPEG to work
(see openjpeg_top_corner_fix.diff from VWR-1815.)
---
linden/indra/llimagej2coj/llimagej2coj.cpp | 45 +++++++++++++++++++++++-------
1 file changed, 35 insertions(+), 10 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/llimagej2coj/llimagej2coj.cpp b/linden/indra/llimagej2coj/llimagej2coj.cpp
index b7a1b82..829dceb 100644
--- a/linden/indra/llimagej2coj/llimagej2coj.cpp
+++ b/linden/indra/llimagej2coj/llimagej2coj.cpp
@@ -152,8 +152,13 @@ BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod
/* open a byte stream */
cio = opj_cio_open((opj_common_ptr)dinfo, base.getData(), base.getDataSize());
- /* decode the stream and fill the image structure */
- image = opj_decode(dinfo, cio);
+ /* decode the stream and fill the image structure, also fill in an additional
+ structure to get the decoding result. This structure is a bit unusual in that
+ it is not received through opj, but still has some dynamically allocated fields
+ that need to be cleared up at the end by calling a destroy function. */
+ opj_codestream_info_t cinfo;
+ memset(&cinfo, 0, sizeof(opj_codestream_info_t));
+ image = opj_decode_with_info(dinfo, cio, &cinfo);
/* close the byte stream */
opj_cio_close(cio);
@@ -180,6 +185,7 @@ BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod
LL_DEBUGS("Openjpeg") << "ERROR -> decodeImpl: failed to decode image wrong number of components: " << img_components << LL_ENDL;
if (image)
{
+ opj_destroy_cstr_info(&cinfo);
opj_image_destroy(image);
}
@@ -187,23 +193,40 @@ BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod
}
// sometimes we get bad data out of the cache - check to see if the decode succeeded
- for (S32 i = 0; i < img_components; i++)
+ int decompdifference = 0;
+ if (cinfo.numdecompos) // sanity
{
- if (image->comps[i].factor != base.getRawDiscardLevel())
+ for (int comp = 0; comp < image->numcomps; comp++)
+ { /* get maximum decomposition level difference, first field is from the COD header and the second
+ is what is actually met in the codestream, NB: if everything was ok, this calculation will
+ return what was set in the cp_reduce value! */
+ decompdifference = std::max(decompdifference, cinfo.numdecompos[comp] - image->comps[comp].resno_decoded);
+ }
+ if (decompdifference < 0) // sanity
{
- // if we didn't get the discard level we're expecting, fail
- if (image) //anyway somthing odd with the image, better check than crash
- opj_image_destroy(image);
- base.mDecoding = FALSE;
- return TRUE;
+ decompdifference = 0;
}
}
+
+ /* if OpenJPEG failed to decode all requested decomposition levels
+ the difference will be greater than this level */
+ if (decompdifference > base.getRawDiscardLevel())
+ {
+ llwarns << "not enough data for requested discard level, setting mDecoding to FALSE, difference: " << (decompdifference - base.getRawDiscardLevel()) << llendl;
+ opj_destroy_cstr_info(&cinfo);
+ opj_image_destroy(image);
+ base.mDecoding = FALSE;
+ return TRUE;
+ }
+
if(img_components <= first_channel)
{
+ // sanity
LL_DEBUGS("Openjpeg") << "trying to decode more channels than are present in image: numcomps: " << img_components << " first_channel: " << first_channel << LL_ENDL;
if (image)
{
+ opj_destroy_cstr_info(&cinfo);
opj_image_destroy(image);
}
@@ -252,15 +275,17 @@ BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod
else // Some rare OpenJPEG versions have this bug.
{
llwarns << "ERROR -> decodeImpl: failed to decode image! (NULL comp data - OpenJPEG bug)" << llendl;
+ opj_destroy_cstr_info(&cinfo);
opj_image_destroy(image);
return TRUE; // done
}
}
- /* free image data structure */
+ /* free opj data structures */
if (image)
{
+ opj_destroy_cstr_info(&cinfo);
opj_image_destroy(image);
}
--
cgit v1.1
From ceca2fbeb58be924902471ab58f5ad8a8c1fd157 Mon Sep 17 00:00:00 2001
From: Patrick Sapinski
Date: Tue, 21 Sep 2010 21:40:23 -0400
Subject: Added handler for new OpenSim function "OpenRegionInfo", more info at
http://imprudenceviewer.org/wiki/Opensim_information_needed Currently only
supports a fraction of the provided parameters.
---
linden/indra/newview/CMakeLists.txt | 1 +
linden/indra/newview/app_settings/settings.xml | 14 ++++++++++++++
linden/indra/newview/hippoLimits.h | 2 +-
linden/indra/newview/llviewermenu.cpp | 15 ++++++++++-----
.../indra/newview/skins/default/xui/en-us/menu_viewer.xml | 2 +-
5 files changed, 27 insertions(+), 7 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/CMakeLists.txt b/linden/indra/newview/CMakeLists.txt
index 1691095..b071795 100644
--- a/linden/indra/newview/CMakeLists.txt
+++ b/linden/indra/newview/CMakeLists.txt
@@ -90,6 +90,7 @@ set(viewer_SOURCE_FILES
impprefsfonts.cpp
jcfloater_animation_list.cpp
jcfloaterareasearch.cpp
+ kowopenregionsettings.cpp
lightshare.cpp
llagent.cpp
llagentaccess.cpp
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index ee8f76e..70659f8 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -1168,6 +1168,20 @@
1
+
+
+ ToggleTeenMode
+
+ Comment
+ Allow the toggle of Teen Mode via debug options
+ Persist
+ 0
+ Type
+ Boolean
+ Value
+ 1
+
+
AOEnabled
diff --git a/linden/indra/newview/hippoLimits.h b/linden/indra/newview/hippoLimits.h
index f76e7e9..a5fe351 100644
--- a/linden/indra/newview/hippoLimits.h
+++ b/linden/indra/newview/hippoLimits.h
@@ -19,7 +19,6 @@ public:
void setLimits();
-private:
S32 mMaxAgentGroups;
F32 mMaxHeight;
@@ -29,6 +28,7 @@ private:
F32 mMinPrimScale;
S32 mMaxLinkedPrims;
+private:
void setOpenSimLimits();
void setSecondLifeLimits();
};
diff --git a/linden/indra/newview/llviewermenu.cpp b/linden/indra/newview/llviewermenu.cpp
index fd6e842..681216a 100644
--- a/linden/indra/newview/llviewermenu.cpp
+++ b/linden/indra/newview/llviewermenu.cpp
@@ -7137,11 +7137,16 @@ void handle_test_female(void*)
void handle_toggle_pg(void*)
{
- gAgent.setTeen( !gAgent.isTeen() );
-
- LLFloaterWorldMap::reloadIcons(NULL);
-
- llinfos << "PG status set to " << (S32)gAgent.isTeen() << llendl;
+ if(gSavedSettings.getBOOL("ToggleTeenMode"))
+ {
+ gAgent.setTeen( !gAgent.isTeen() );
+ LLFloaterWorldMap::reloadIcons(NULL);
+ llinfos << "PG status set to " << (S32)gAgent.isTeen() << llendl;
+ }
+ else
+ {
+ llinfos << "Teen mode cannot be toggled on this region" << llendl;
+ }
}
void handle_dump_attachments(void*)
diff --git a/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml b/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
index fffab6c..0a27f85 100644
--- a/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
@@ -1803,7 +1803,7 @@
-
+
setLimits();
+
+ //limits are also reset in llviewermessage.cpp when we detect a new server
+ //version, in case the destination simulator does not support OpenRegionInfo.
+
+ BOOL limitschanged = FALSE;
+
+ if ( body.has("AllowMinimap") )
+ {
+ //IMPLEMENT ME
+ }
+ if ( body.has("AllowPhysicalPrims") )
+ {
+ //IMPLEMENT ME
+ }
+ if ( body.has("DrawDistance") )
+ {
+ //IMPLEMENT ME
+ }
+ if ( body.has("ForceDrawDistance") )
+ {
+ //IMPLEMENT ME
+ }
+ if ( body.has("LSLFunctions") )
+ {
+ //IMPLEMENT ME
+ }
+ if ( body.has("MaxDragDistance") )
+ {
+ //IMPLEMENT ME
+ }
+ if ( body.has("MinHoleSize") )
+ {
+ gHippoLimits->mMinHoleSize = body["MinHoleSize"].asReal();
+ }
+ if ( body.has("MaxHollowSize") )
+ {
+ gHippoLimits->mMaxHollow = body["MaxHollowSize"].asReal();
+ }
+ if ( body.has("MaxInventoryItemsTransfer") )
+ {
+ //IMPLEMENT ME
+ }
+ if ( body.has("MaxLinkCount") )
+ {
+ gHippoLimits->mMaxLinkedPrims = body["MaxLinkCount"].asInteger();
+ }
+ if ( body.has("MaxLinkCountPhys") )
+ {
+ //IMPLEMENT ME
+ }
+ if ( body.has("MaxPhysPrimScale") )
+ {
+ //IMPLEMENT ME
+ }
+ if ( body.has("MaxPos") )
+ {
+ //IMPLEMENT ME
+ }
+ if ( body.has("MaxPrimScale") )
+ {
+ gHippoLimits->mMaxPrimScale = body["MaxPrimScale"].asReal();
+ limitschanged = TRUE;
+ }
+ if ( body.has("MinPos") )
+ {
+ //IMPLEMENT ME
+ }
+ if ( body.has("MinPrimScale") )
+ {
+ gHippoLimits->mMinPrimScale = body["MinPrimScale"].asReal();
+ limitschanged = TRUE;
+ }
+ if ( body.has("OffsetOfUTC") )
+ {
+ //IMPLEMENT ME
+ }
+ if ( body.has("RenderWater") )
+ {
+ gSavedSettings.setBOOL("RenderWater", body["RenderWater"].asBoolean());
+ }
+ if ( body.has("SayDistance") )
+ {
+ //IMPLEMENT ME
+ }
+ if ( body.has("ShoutDistance") )
+ {
+ //IMPLEMENT ME
+ }
+ if ( body.has("ToggleTeenMode") )
+ {
+ gSavedSettings.setBOOL("ToggleTeenMode", body["ToggleTeenMode"].asBoolean());
+
+ }
+ if ( body.has("WhisperDistance") )
+ {
+ //IMPLEMENT ME
+ }
+
+ if (limitschanged)
+ gFloaterTools->updateToolsSizeLimits();
+ }
+};
+
+LLHTTPRegistration
+gHTTPRegistrationOpenRegionInfoUpdate(
+ "/message/OpenRegionInfo");
\ No newline at end of file
--
cgit v1.1
From ba087058b8b5de11c8f5d641d0da89da7b4b09ef Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Mon, 20 Sep 2010 18:25:33 +0200
Subject: fix: "Random" is no integer
---
linden/indra/newview/app_settings/settings.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index 0a27aa2..8bc8289 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -422,7 +422,7 @@
Type
String
Value
- Random
+ Random
LastTree
@@ -433,7 +433,7 @@
Type
String
Value
- Random
+ Random
LastSelectedGrid
--
cgit v1.1
From 306be84a044f123315d5881e0acb7c77fbd93042 Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Sun, 19 Sep 2010 21:51:40 +0200
Subject: fix: cached trees + grass white on opensim
issues remaining: windlight water is "flat"
---
linden/indra/newview/llvograss.cpp | 5 +++--
linden/indra/newview/llvograss.h | 2 +-
linden/indra/newview/llvotree.cpp | 2 +-
3 files changed, 5 insertions(+), 4 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llvograss.cpp b/linden/indra/newview/llvograss.cpp
index 08f2717..35eb8fc 100644
--- a/linden/indra/newview/llvograss.cpp
+++ b/linden/indra/newview/llvograss.cpp
@@ -108,7 +108,9 @@ void LLVOGrass::updateSpecies()
SpeciesMap::const_iterator it = sSpeciesTable.begin();
mSpecies = (*it).first;
}
- setTEImage(0, gImageList.getImageFromFile(sSpeciesTable[mSpecies]->mTextureName));
+
+ mGrassImage = gImageList.getImageFromFile(sSpeciesTable[mSpecies]->mTextureName, TRUE, TRUE);
+ setTEImage(0, mGrassImage);
}
@@ -162,7 +164,6 @@ void LLVOGrass::initClass()
GrassSpeciesData* newGrass = new GrassSpeciesData();
-
std::string textureName;
static LLStdStringHandle texture_name_string = LLXmlTree::addAttributeString("texture_name");
diff --git a/linden/indra/newview/llvograss.h b/linden/indra/newview/llvograss.h
index 682fbdb..b5182cc 100644
--- a/linden/indra/newview/llvograss.h
+++ b/linden/indra/newview/llvograss.h
@@ -128,7 +128,7 @@ private:
void updateSpecies();
F32 mLastHeight; // For cheap update hack
S32 mNumBlades;
-
+ LLPointer mGrassImage;
static SpeciesMap sSpeciesTable;
};
#endif // LL_VO_GRASS_
diff --git a/linden/indra/newview/llvotree.cpp b/linden/indra/newview/llvotree.cpp
index 208086f..ab14a3d 100644
--- a/linden/indra/newview/llvotree.cpp
+++ b/linden/indra/newview/llvotree.cpp
@@ -324,7 +324,7 @@ U32 LLVOTree::processUpdateMessage(LLMessageSystem *mesgsys,
//
// Load Species-Specific data
//
- mTreeImagep = gImageList.getImageFromFile(sSpeciesTable[mSpecies]->mTextureName);
+ mTreeImagep = gImageList.getImageFromFile(sSpeciesTable[mSpecies]->mTextureName, TRUE, TRUE);
if (mTreeImagep)
{
gGL.getTexUnit(0)->bind(mTreeImagep.get());
--
cgit v1.1
From abb58b072a54c57da2c5afe8edbc7d30b7633f98 Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Mon, 20 Sep 2010 11:48:27 +0200
Subject: one more poke on trees+grass + fix the windlight water
---
linden/indra/newview/llviewerimagelist.cpp | 2 +-
linden/indra/newview/llvograss.cpp | 9 +++++++--
linden/indra/newview/llvograss.h | 2 +-
linden/indra/newview/llvotree.cpp | 2 +-
4 files changed, 10 insertions(+), 5 deletions(-)
(limited to 'linden/indra')
diff --git a/linden/indra/newview/llviewerimagelist.cpp b/linden/indra/newview/llviewerimagelist.cpp
index 703d233..cb02b09 100644
--- a/linden/indra/newview/llviewerimagelist.cpp
+++ b/linden/indra/newview/llviewerimagelist.cpp
@@ -156,7 +156,7 @@ void LLViewerImageList::doPreloadImages()
image->setAddressMode(LLTexUnit::TAM_WRAP);
mImagePreloads.insert(image);
}
- image = getImage(DEFAULT_WATER_NORMAL, MIPMAP_YES, IMMEDIATE_YES);
+ image = getImageFromFile(DEFAULT_WATER_NORMAL.asString()+".j2c", MIPMAP_YES, IMMEDIATE_YES,0,0,DEFAULT_WATER_NORMAL);
if (image)
{
image->setAddressMode(LLTexUnit::TAM_WRAP);
diff --git a/linden/indra/newview/llvograss.cpp b/linden/indra/newview/llvograss.cpp
index 35eb8fc..f738872 100644
--- a/linden/indra/newview/llvograss.cpp
+++ b/linden/indra/newview/llvograss.cpp
@@ -109,8 +109,8 @@ void LLVOGrass::updateSpecies()
mSpecies = (*it).first;
}
- mGrassImage = gImageList.getImageFromFile(sSpeciesTable[mSpecies]->mTextureName, TRUE, TRUE);
- setTEImage(0, mGrassImage);
+ LLViewerImage* grass_image = gImageList.getImageFromFile(sSpeciesTable[mSpecies]->mTextureName, TRUE, TRUE, 0, 0, sSpeciesTable[mSpecies]->mTextureID);
+ setTEImage(0, grass_image);
}
@@ -170,6 +170,11 @@ void LLVOGrass::initClass()
success &= grass_def->getFastAttributeString(texture_name_string, textureName);
newGrass->mTextureName = textureName;
+ std::string textureID;
+ static LLStdStringHandle texture_id = LLXmlTree::addAttributeString("texture_id");
+ success &= grass_def->getFastAttributeString(texture_id, textureID);
+ newGrass->mTextureID = LLUUID(textureID);
+
static LLStdStringHandle blade_sizex_string = LLXmlTree::addAttributeString("blade_size_x");
success &= grass_def->getFastAttributeF32(blade_sizex_string, F32_val);
newGrass->mBladeSizeX = F32_val;
diff --git a/linden/indra/newview/llvograss.h b/linden/indra/newview/llvograss.h
index b5182cc..25fa04c 100644
--- a/linden/indra/newview/llvograss.h
+++ b/linden/indra/newview/llvograss.h
@@ -128,7 +128,7 @@ private:
void updateSpecies();
F32 mLastHeight; // For cheap update hack
S32 mNumBlades;
- LLPointer mGrassImage;
+// LLPointer mGrassImage;
static SpeciesMap sSpeciesTable;
};
#endif // LL_VO_GRASS_
diff --git a/linden/indra/newview/llvotree.cpp b/linden/indra/newview/llvotree.cpp
index ab14a3d..0a7cc92 100644
--- a/linden/indra/newview/llvotree.cpp
+++ b/linden/indra/newview/llvotree.cpp
@@ -324,7 +324,7 @@ U32 LLVOTree::processUpdateMessage(LLMessageSystem *mesgsys,
//
// Load Species-Specific data
//
- mTreeImagep = gImageList.getImageFromFile(sSpeciesTable[mSpecies]->mTextureName, TRUE, TRUE);
+ mTreeImagep = gImageList.getImageFromFile(sSpeciesTable[mSpecies]->mTextureName, TRUE, TRUE, 0, 0, sSpeciesTable[mSpecies]->mTextureID);
if (mTreeImagep)
{
gGL.getTexUnit(0)->bind(mTreeImagep.get());
--
cgit v1.1
From 35df5441d3e2789663532c948731aff3a1e04728 Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Mon, 14 Jun 2010 12:04:49 +0200
Subject: llmediaplugins first step
---
linden/indra/CMakeLists.txt | 10 +-
linden/indra/cmake/00-Common.cmake | 4 +-
linden/indra/cmake/FindNDOF.cmake | 39 +
linden/indra/cmake/GStreamer010Plugin.cmake | 39 +
linden/indra/cmake/Glui.cmake | 28 +
linden/indra/cmake/Glut.cmake | 19 +
linden/indra/cmake/LLAudio.cmake | 2 -
linden/indra/cmake/LLMedia.cmake | 13 -
linden/indra/cmake/LLPlugin.cmake | 8 +
linden/indra/cmake/MediaPluginBase.cmake | 8 +
linden/indra/cmake/Mozlib.cmake | 47 -
linden/indra/cmake/NDOF.cmake | 32 +-
linden/indra/cmake/OPENAL.cmake | 13 +-
linden/indra/cmake/OPENAL.cmake.imp | 115 ++
linden/indra/cmake/PluginAPI.cmake | 16 +
linden/indra/cmake/QuickTimePlugin.cmake | 46 +
linden/indra/cmake/WebKitLibPlugin.cmake | 55 +
...den%2findra%2fcmake%2fCopyWinLibs.cmake.rej.txt | 257 +++
linden/indra/llaudio/CMakeLists.txt | 43 +-
linden/indra/llaudio/audioengine.cpp | 1904 -----------------
linden/indra/llaudio/audioengine.h | 466 -----
linden/indra/llaudio/audioengine_fmod.cpp | 1093 ----------
linden/indra/llaudio/audioengine_fmod.h | 161 --
linden/indra/llaudio/audioengine_openal.cpp | 574 ------
linden/indra/llaudio/audioengine_openal.h | 114 -
linden/indra/llaudio/listener.cpp | 153 --
linden/indra/llaudio/listener.h | 80 -
linden/indra/llaudio/listener_ds3d.h | 76 -
linden/indra/llaudio/listener_fmod.cpp | 143 --
linden/indra/llaudio/listener_fmod.h | 67 -
linden/indra/llaudio/listener_openal.cpp | 125 --
linden/indra/llaudio/listener_openal.h | 68 -
linden/indra/llaudio/llaudiodecodemgr.cpp | 62 +-
linden/indra/llaudio/llaudioengine.cpp | 1801 ++++++++++++++++
linden/indra/llaudio/llaudioengine.h | 457 ++++
linden/indra/llaudio/llaudioengine_fmod.cpp | 766 +++++++
linden/indra/llaudio/llaudioengine_fmod.h | 129 ++
linden/indra/llaudio/llaudioengine_openal.cpp | 546 +++++
linden/indra/llaudio/llaudioengine_openal.h | 114 +
linden/indra/llaudio/lllistener.cpp | 142 ++
linden/indra/llaudio/lllistener.h | 78 +
linden/indra/llaudio/lllistener_ds3d.h | 74 +
linden/indra/llaudio/lllistener_fmod.cpp | 131 ++
linden/indra/llaudio/lllistener_fmod.h | 64 +
linden/indra/llaudio/lllistener_openal.cpp | 116 ++
linden/indra/llaudio/lllistener_openal.h | 64 +
linden/indra/llaudio/llstreamingaudio.h | 56 +
linden/indra/llaudio/llstreamingaudio_fmod.cpp | 362 ++++
linden/indra/llaudio/llstreamingaudio_fmod.h | 68 +
linden/indra/llaudio/llvorbisdecode.cpp | 326 +++
linden/indra/llaudio/llvorbisdecode.h | 42 +
linden/indra/llaudio/llvorbisencode.cpp | 505 +++++
linden/indra/llaudio/llvorbisencode.h | 64 +
linden/indra/llaudio/llwindgen.h | 136 ++
linden/indra/llaudio/vorbisdecode.cpp | 326 ---
linden/indra/llaudio/vorbisdecode.h | 42 -
linden/indra/llaudio/vorbisencode.h | 53 -
linden/indra/llaudio/windgen.h | 136 --
linden/indra/llcommon/CMakeLists.txt | 2 +
linden/indra/llcommon/llerrorcontrol.h | 1 +
linden/indra/llcommon/llprocesslauncher.cpp | 346 ++++
linden/indra/llcommon/llprocesslauncher.h | 86 +
linden/indra/llinventory/llparcel.cpp | 125 ++
linden/indra/llinventory/llparcel.h | 25 +
linden/indra/llmath/CMakeLists.txt | 1 +
linden/indra/llmath/llmath.h | 10 +-
linden/indra/llmath/llvolume.cpp | 8 +-
linden/indra/llmath/llvolume.h | 10 +-
linden/indra/llmath/v3math.h | 4 +-
linden/indra/llmedia/CMakeLists.txt | 79 -
linden/indra/llmedia/llgstplaythread.cpp | 54 -
linden/indra/llmedia/llgstplaythread.h | 62 -
linden/indra/llmedia/llmediabase.h | 265 ---
linden/indra/llmedia/llmediaemitter.h | 104 -
linden/indra/llmedia/llmediaimplcommon.cpp | 552 -----
linden/indra/llmedia/llmediaimplcommon.h | 164 --
linden/indra/llmedia/llmediaimplexample1.cpp | 231 ---
linden/indra/llmedia/llmediaimplexample1.h | 73 -
linden/indra/llmedia/llmediaimplexample2.cpp | 198 --
linden/indra/llmedia/llmediaimplexample2.h | 76 -
linden/indra/llmedia/llmediaimplfactory.cpp | 105 -
linden/indra/llmedia/llmediaimplfactory.h | 100 -
linden/indra/llmedia/llmediaimplgstreamer.h | 164 --
.../indra/llmedia/llmediaimplgstreamervidplug.cpp | 448 ----
linden/indra/llmedia/llmediaimplgstreamervidplug.h | 106 -
linden/indra/llmedia/llmediaimplllmozlib.cpp | 624 ------
linden/indra/llmedia/llmediaimplllmozlib.h | 127 --
linden/indra/llmedia/llmediaimplquicktime.cpp | 657 ------
linden/indra/llmedia/llmediaimplquicktime.h | 112 -
linden/indra/llmedia/llmediaimplregister.h | 60 -
linden/indra/llmedia/llmediamanager.cpp | 295 ---
linden/indra/llmedia/llmediamanager.h | 127 --
linden/indra/llmedia/llmediaobserver.h | 116 --
linden/indra/llmessage/tests/commtest.h | 83 +
linden/indra/llmessage/tests/llcurl_stub.cpp | 100 +
.../llmessage/tests/llhttpclientadapter_test.cpp | 170 ++
.../tests/lltemplatemessagedispatcher_test.cpp | 165 ++
.../llmessage/tests/lltesthttpclientadapter.cpp | 67 +
.../llmessage/tests/lltesthttpclientadapter.h | 63 +
.../indra/llmessage/tests/lltestmessagesender.cpp | 44 +
linden/indra/llmessage/tests/lltestmessagesender.h | 57 +
.../tests/lltrustedmessageservice_test.cpp | 146 ++
linden/indra/llmessage/tests/networkio.h | 116 ++
.../indra/llmessage/tests/test_llsdmessage_peer.py | 153 ++
linden/indra/llplugin/CMakeLists.txt | 55 +
linden/indra/llplugin/llpluginclassmedia.cpp | 1162 +++++++++++
linden/indra/llplugin/llpluginclassmedia.h | 352 ++++
linden/indra/llplugin/llpluginclassmediaowner.h | 82 +
linden/indra/llplugin/llplugininstance.cpp | 172 ++
linden/indra/llplugin/llplugininstance.h | 104 +
linden/indra/llplugin/llpluginmessage.cpp | 442 ++++
linden/indra/llplugin/llpluginmessage.h | 142 ++
linden/indra/llplugin/llpluginmessageclasses.h | 57 +
linden/indra/llplugin/llpluginmessagepipe.cpp | 316 +++
linden/indra/llplugin/llpluginmessagepipe.h | 92 +
linden/indra/llplugin/llpluginprocesschild.cpp | 490 +++++
linden/indra/llplugin/llpluginprocesschild.h | 112 +
linden/indra/llplugin/llpluginprocessparent.cpp | 714 +++++++
linden/indra/llplugin/llpluginprocessparent.h | 169 ++
linden/indra/llplugin/llpluginsharedmemory.cpp | 506 +++++
linden/indra/llplugin/llpluginsharedmemory.h | 130 ++
linden/indra/llplugin/slplugin/CMakeLists.txt | 55 +
linden/indra/llplugin/slplugin/slplugin.cpp | 288 +++
linden/indra/llplugin/slplugin/slplugin_info.plist | 12 +
linden/indra/llui/CMakeLists.txt | 15 +-
linden/indra/llui/llbutton.cpp | 5 +
linden/indra/llui/llbutton.h | 3 +-
linden/indra/llui/llfloater.cpp | 8 +-
linden/indra/llui/llfocusmgr.cpp | 84 +-
linden/indra/llui/llfocusmgr.h | 49 +-
linden/indra/llui/lliconctrl.cpp | 6 +
linden/indra/llui/lliconctrl.h | 2 +
linden/indra/llui/llmultisliderctrl.cpp | 3 -
linden/indra/llui/llpanel.cpp | 19 +-
linden/indra/llui/llpanel.h | 3 +
linden/indra/llui/llsliderctrl.cpp | 2 -
linden/indra/llui/llspinctrl.cpp | 1 -
linden/indra/llui/lltextparser.cpp | 48 +-
linden/indra/llui/lltextparser.h | 7 +-
linden/indra/llui/llui.cpp | 1 -
linden/indra/llui/lluictrl.cpp | 55 +-
linden/indra/llui/lluictrl.h | 26 +-
linden/indra/llui/llview.cpp | 7 +-
linden/indra/llui/llview.h | 14 +-
linden/indra/llvfs/CMakeLists.txt | 2 +-
linden/indra/llvfs/lldir.cpp | 6 +
linden/indra/llvfs/lldir.h | 6 +
linden/indra/llvfs/lldir_linux.cpp | 43 +-
linden/indra/llvfs/lldir_linux.h | 3 +
linden/indra/llvfs/lldir_mac.cpp | 15 +
linden/indra/llvfs/lldir_mac.h | 3 +
linden/indra/llvfs/lldir_solaris.cpp | 2 +
linden/indra/llvfs/lldir_win32.cpp | 15 +
linden/indra/llvfs/lldir_win32.h | 3 +
linden/indra/llwindow/CMakeLists.txt | 14 +-
linden/indra/media_plugins/CMakeLists.txt | 11 +
linden/indra/media_plugins/base/CMakeLists.txt | 41 +
.../indra/media_plugins/base/media_plugin_base.cpp | 155 ++
.../indra/media_plugins/base/media_plugin_base.exp | 1 +
.../indra/media_plugins/base/media_plugin_base.h | 112 +
linden/indra/media_plugins/example/CMakeLists.txt | 74 +
.../media_plugins/example/media_plugin_example.cpp | 488 +++++
.../media_plugins/gstreamer010/CMakeLists.txt | 71 +
.../gstreamer010/llmediaimplgstreamer.h | 57 +
.../gstreamer010/llmediaimplgstreamer_syms.cpp | 171 ++
.../gstreamer010/llmediaimplgstreamer_syms.h | 78 +
.../gstreamer010/llmediaimplgstreamer_syms_raw.inc | 51 +
.../llmediaimplgstreamer_syms_rawv.inc | 5 +
.../llmediaimplgstreamertriviallogging.h | 53 +
.../gstreamer010/llmediaimplgstreamervidplug.cpp | 532 +++++
.../gstreamer010/llmediaimplgstreamervidplug.h | 109 +
.../gstreamer010/media_plugin_gstreamer010.cpp | 1202 +++++++++++
.../gstreamer010/media_plugin_gstreamer010.cpp~ | 1219 +++++++++++
.../indra/media_plugins/quicktime/CMakeLists.txt | 83 +
.../quicktime/media_plugin_quicktime.cpp | 985 +++++++++
linden/indra/media_plugins/webkit/CMakeLists.txt | 82 +
.../media_plugins/webkit/media_plugin_webkit.cpp | 932 +++++++++
linden/indra/newview/CMakeLists.txt | 100 +-
linden/indra/newview/app_settings/settings.xml | 35 +-
linden/indra/newview/chatbar_as_cmdline.cpp | 4 +-
linden/indra/newview/floatervoicelicense.cpp | 4 +-
linden/indra/newview/floatervoicelicense.h | 8 +-
linden/indra/newview/llagent.cpp | 6 +
linden/indra/newview/llappviewer.cpp | 20 +-
linden/indra/newview/llappviewerlinux.cpp | 2 +-
linden/indra/newview/llappviewermacosx.cpp | 4 +-
linden/indra/newview/llassetuploadresponders.cpp | 5 +-
linden/indra/newview/llaudiosourcevo.h | 2 +-
linden/indra/newview/llchatbar.cpp | 2 +-
linden/indra/newview/llcommandhandler.cpp | 6 +-
linden/indra/newview/llcommandhandler.h | 10 +-
linden/indra/newview/llfirstuse.cpp | 4 +-
linden/indra/newview/llfloaterabout.cpp | 27 +-
linden/indra/newview/llfloateravatarinfo.cpp | 2 +-
linden/indra/newview/llfloaterchat.cpp | 54 +-
linden/indra/newview/llfloaterchat.h | 2 +
linden/indra/newview/llfloaterclassified.cpp | 2 +-
linden/indra/newview/llfloaterevent.cpp | 2 +-
linden/indra/newview/llfloatergroupinfo.cpp | 2 +-
linden/indra/newview/llfloaterhandler.cpp | 4 +-
linden/indra/newview/llfloaterhandler.h | 2 +-
linden/indra/newview/llfloaterhtmlhelp.h | 90 -
linden/indra/newview/llfloaterhtmlsimple.cpp | 6 +-
linden/indra/newview/llfloaterhud.cpp | 4 +-
linden/indra/newview/llfloaterhud.h | 4 +-
linden/indra/newview/llfloaterland.cpp | 12 +
linden/indra/newview/llfloaterland.h | 3 +
linden/indra/newview/llfloatermediabrowser.cpp | 398 ++++
linden/indra/newview/llfloatermediabrowser.h | 102 +
linden/indra/newview/llfloaterobjectiminfo.cpp | 6 +-
linden/indra/newview/llfloaterparcel.cpp | 2 +-
linden/indra/newview/llfloaterpreference.cpp | 8 +-
linden/indra/newview/llfloatertos.cpp | 33 +-
linden/indra/newview/llfloatertos.h | 7 +-
linden/indra/newview/llfloaterurlentry.cpp | 2 +-
linden/indra/newview/llhoverview.cpp | 3 +-
linden/indra/newview/llhoverview.h | 3 +
linden/indra/newview/llhudview.cpp | 13 +-
linden/indra/newview/llhudview.h | 2 +-
linden/indra/newview/llimpanel.cpp | 2 +-
linden/indra/newview/llloginhandler.cpp | 2 +-
linden/indra/newview/llloginhandler.h | 2 +-
linden/indra/newview/llmediactrl.cpp | 1201 +++++++++++
linden/indra/newview/llmediactrl.h | 201 ++
linden/indra/newview/llmediaremotectrl.cpp | 57 +-
linden/indra/newview/llmimetypes.cpp | 24 +
linden/indra/newview/llmimetypes.h | 6 +
linden/indra/newview/lloverlaybar.cpp | 17 +-
linden/indra/newview/llpanelaudioprefs.cpp | 4 +-
linden/indra/newview/llpanelavatar.cpp | 60 +-
linden/indra/newview/llpanelavatar.h | 16 +-
linden/indra/newview/llpanelclassified.cpp | 2 +-
linden/indra/newview/llpaneldebug.cpp | 2 +-
linden/indra/newview/llpaneldirfind.cpp | 42 +-
linden/indra/newview/llpaneldirfind.h | 15 +-
linden/indra/newview/llpaneldirgroups.cpp | 1 +
linden/indra/newview/llpanelface.cpp | 33 +-
linden/indra/newview/llpanellandaudio.cpp | 195 ++
linden/indra/newview/llpanellandaudio.h | 63 +
linden/indra/newview/llpanellandmedia.cpp | 292 ++-
linden/indra/newview/llpanellandmedia.h | 25 +-
linden/indra/newview/llpanellogin.cpp | 55 +-
linden/indra/newview/llpanellogin.h | 8 +-
linden/indra/newview/llpanelmediahud.cpp | 667 ++++++
linden/indra/newview/llpanelmediahud.h | 110 +
linden/indra/newview/llpanelpermissions.cpp | 2 +-
linden/indra/newview/llpanelweb.cpp | 65 +-
linden/indra/newview/llprefsvoice.cpp | 4 +-
linden/indra/newview/llpreviewscript.cpp | 14 +-
linden/indra/newview/llpreviewsound.cpp | 2 +-
linden/indra/newview/llselectmgr.cpp | 11 +-
linden/indra/newview/llstartup.cpp | 37 +-
linden/indra/newview/llstatusbar.cpp | 2 +-
linden/indra/newview/lltoolcomp.cpp | 4 -
linden/indra/newview/lltoolcomp.h | 1 +
linden/indra/newview/lltoolgun.cpp | 7 +-
linden/indra/newview/lltoolgun.h | 2 +
linden/indra/newview/lltoolmgr.cpp | 14 +-
linden/indra/newview/lltoolmorph.cpp | 2 +-
linden/indra/newview/lltoolpie.cpp | 208 +-
linden/indra/newview/lltoolpie.h | 1 +
linden/indra/newview/lltoolplacer.cpp | 2 +-
linden/indra/newview/llurldispatcher.cpp | 22 +-
linden/indra/newview/llurldispatcher.h | 6 +-
linden/indra/newview/llvieweraudio.cpp | 3 +-
linden/indra/newview/llviewercontrol.cpp | 19 +-
linden/indra/newview/llviewergesture.cpp | 2 +-
linden/indra/newview/llviewerimagelist.cpp | 2 +-
linden/indra/newview/llviewerkeyboard.cpp | 2 +-
linden/indra/newview/llviewermedia.cpp | 1390 ++++++++-----
linden/indra/newview/llviewermedia.h | 200 +-
.../indra/newview/llviewermedia_streamingaudio.cpp | 169 ++
.../indra/newview/llviewermedia_streamingaudio.h | 69 +
linden/indra/newview/llviewermediafocus.cpp | 359 ++++
linden/indra/newview/llviewermediafocus.h | 91 +
linden/indra/newview/llviewermediaobserver.h | 71 +
linden/indra/newview/llviewermenu.cpp | 34 +-
linden/indra/newview/llviewermenufile.cpp | 2 +-
linden/indra/newview/llviewermessage.cpp | 8 +-
linden/indra/newview/llviewerobject.cpp | 2 +-
linden/indra/newview/llviewerparcelmedia.cpp | 350 +++-
linden/indra/newview/llviewerparcelmedia.h | 31 +-
.../indra/newview/llviewerparcelmediaautoplay.cpp | 2 +-
linden/indra/newview/llviewerparcelmediaautoplay.h | 1 -
linden/indra/newview/llviewerparcelmgr.cpp | 80 +-
linden/indra/newview/llviewerparcelmgr.h | 5 +
linden/indra/newview/llviewerregion.cpp | 6 +-
linden/indra/newview/llviewertexteditor.cpp | 2 +-
linden/indra/newview/llviewerwindow.cpp | 58 +-
linden/indra/newview/llvoavatar.cpp | 17 +-
linden/indra/newview/llvovolume.cpp | 2 +-
linden/indra/newview/llweb.cpp | 2 +-
.../newview/mozilla-powerpc-darwin-readme.txt | 71 -
linden/indra/newview/pipeline.cpp | 2 +-
.../newview/skins/default/textures/textures.xml | 20 +-
.../skins/default/xui/en-us/floater_about_land.xml | 744 +++++--
.../default/xui/en-us/floater_media_browser.xml | 21 +-
.../newview/skins/default/xui/en-us/mime_types.xml | 456 ----
.../skins/default/xui/en-us/mime_types_linux.xml | 445 ++++
.../skins/default/xui/en-us/mime_types_mac.xml | 445 ++++
.../skins/default/xui/en-us/mime_types_windows.xml | 445 ++++
.../newview/skins/default/xui/en-us/panel_bars.xml | 3 -
.../newview/skins/default/xui/en-us/panel_hud.xml | 4 +
.../skins/default/xui/en-us/panel_media_hud.xml | 68 +
linden/indra/newview/viewer_manifest.py | 126 +-
linden/indra/newview/viewer_manifest.py~ | 1176 +++++++++++
linden/indra/test_apps/llplugintest/CMakeLists.txt | 378 ++++
linden/indra/test_apps/llplugintest/bookmarks.txt | 28 +
.../test_apps/llplugintest/demo_media_plugin.cpp | 472 +++++
.../test_apps/llplugintest/demo_media_plugin_2.cpp | 578 ++++++
.../indra/test_apps/llplugintest/demo_plugin.cpp | 220 ++
.../test_apps/llplugintest/llmediaplugintest.cpp | 2179 ++++++++++++++++++++
.../test_apps/llplugintest/llmediaplugintest.h | 201 ++
.../test_apps/llplugintest/media_mappings.txt | 3 +
.../test_apps/llplugintest/media_plugin_test.cpp | 511 +++++
.../test_apps/llplugintest/media_simple_test.cpp | 460 +++++
.../indra/test_apps/llplugintest/plugin_host.cpp | 92 +
.../llplugintest/plugin_process_launcher.cpp | 197 ++
318 files changed, 35650 insertions(+), 12782 deletions(-)
create mode 100644 linden/indra/cmake/FindNDOF.cmake
create mode 100644 linden/indra/cmake/GStreamer010Plugin.cmake
create mode 100644 linden/indra/cmake/Glui.cmake
create mode 100644 linden/indra/cmake/Glut.cmake
delete mode 100644 linden/indra/cmake/LLMedia.cmake
create mode 100644 linden/indra/cmake/LLPlugin.cmake
create mode 100644 linden/indra/cmake/MediaPluginBase.cmake
create mode 100644 linden/indra/cmake/OPENAL.cmake.imp
create mode 100644 linden/indra/cmake/PluginAPI.cmake
create mode 100644 linden/indra/cmake/QuickTimePlugin.cmake
create mode 100644 linden/indra/cmake/WebKitLibPlugin.cmake
create mode 100644 linden/indra/cmake/linden%2findra%2fcmake%2fCopyWinLibs.cmake.rej.txt
delete mode 100644 linden/indra/llaudio/audioengine.cpp
delete mode 100644 linden/indra/llaudio/audioengine.h
delete mode 100644 linden/indra/llaudio/audioengine_fmod.cpp
delete mode 100644 linden/indra/llaudio/audioengine_fmod.h
delete mode 100644 linden/indra/llaudio/audioengine_openal.cpp
delete mode 100644 linden/indra/llaudio/audioengine_openal.h
delete mode 100644 linden/indra/llaudio/listener_openal.cpp
delete mode 100644 linden/indra/llaudio/listener_openal.h
create mode 100644 linden/indra/llaudio/llaudioengine.cpp
create mode 100644 linden/indra/llaudio/llaudioengine.h
create mode 100644 linden/indra/llaudio/llaudioengine_fmod.cpp
create mode 100644 linden/indra/llaudio/llaudioengine_fmod.h
create mode 100644 linden/indra/llaudio/llaudioengine_openal.cpp
create mode 100644 linden/indra/llaudio/llaudioengine_openal.h
create mode 100644 linden/indra/llaudio/lllistener.cpp
create mode 100644 linden/indra/llaudio/lllistener.h
create mode 100644 linden/indra/llaudio/lllistener_ds3d.h
create mode 100644 linden/indra/llaudio/lllistener_fmod.cpp
create mode 100644 linden/indra/llaudio/lllistener_fmod.h
create mode 100644 linden/indra/llaudio/lllistener_openal.cpp
create mode 100644 linden/indra/llaudio/lllistener_openal.h
create mode 100644 linden/indra/llaudio/llstreamingaudio.h
create mode 100644 linden/indra/llaudio/llstreamingaudio_fmod.cpp
create mode 100644 linden/indra/llaudio/llstreamingaudio_fmod.h
create mode 100644 linden/indra/llaudio/llvorbisdecode.cpp
create mode 100644 linden/indra/llaudio/llvorbisdecode.h
create mode 100644 linden/indra/llaudio/llvorbisencode.cpp
create mode 100644 linden/indra/llaudio/llvorbisencode.h
create mode 100644 linden/indra/llaudio/llwindgen.h
delete mode 100644 linden/indra/llaudio/vorbisdecode.cpp
delete mode 100644 linden/indra/llaudio/vorbisdecode.h
delete mode 100644 linden/indra/llaudio/vorbisencode.h
delete mode 100644 linden/indra/llaudio/windgen.h
create mode 100644 linden/indra/llcommon/llprocesslauncher.cpp
create mode 100644 linden/indra/llcommon/llprocesslauncher.h
delete mode 100644 linden/indra/llmedia/CMakeLists.txt
delete mode 100644 linden/indra/llmedia/llgstplaythread.cpp
delete mode 100644 linden/indra/llmedia/llgstplaythread.h
delete mode 100644 linden/indra/llmedia/llmediabase.h
delete mode 100644 linden/indra/llmedia/llmediaemitter.h
delete mode 100644 linden/indra/llmedia/llmediaimplcommon.cpp
delete mode 100644 linden/indra/llmedia/llmediaimplcommon.h
delete mode 100644 linden/indra/llmedia/llmediaimplexample1.cpp
delete mode 100644 linden/indra/llmedia/llmediaimplexample1.h
delete mode 100644 linden/indra/llmedia/llmediaimplexample2.cpp
delete mode 100644 linden/indra/llmedia/llmediaimplexample2.h
delete mode 100644 linden/indra/llmedia/llmediaimplfactory.cpp
delete mode 100644 linden/indra/llmedia/llmediaimplfactory.h
delete mode 100644 linden/indra/llmedia/llmediaimplgstreamer.h
delete mode 100644 linden/indra/llmedia/llmediaimplgstreamervidplug.cpp
delete mode 100644 linden/indra/llmedia/llmediaimplgstreamervidplug.h
delete mode 100644 linden/indra/llmedia/llmediaimplllmozlib.cpp
delete mode 100644 linden/indra/llmedia/llmediaimplllmozlib.h
delete mode 100644 linden/indra/llmedia/llmediaimplquicktime.cpp
delete mode 100644 linden/indra/llmedia/llmediaimplquicktime.h
delete mode 100644 linden/indra/llmedia/llmediaimplregister.h
delete mode 100644 linden/indra/llmedia/llmediamanager.cpp
delete mode 100644 linden/indra/llmedia/llmediamanager.h
delete mode 100644 linden/indra/llmedia/llmediaobserver.h
create mode 100644 linden/indra/llmessage/tests/commtest.h
create mode 100644 linden/indra/llmessage/tests/llcurl_stub.cpp
create mode 100644 linden/indra/llmessage/tests/llhttpclientadapter_test.cpp
create mode 100644 linden/indra/llmessage/tests/lltemplatemessagedispatcher_test.cpp
create mode 100644 linden/indra/llmessage/tests/lltesthttpclientadapter.cpp
create mode 100644 linden/indra/llmessage/tests/lltesthttpclientadapter.h
create mode 100644 linden/indra/llmessage/tests/lltestmessagesender.cpp
create mode 100644 linden/indra/llmessage/tests/lltestmessagesender.h
create mode 100644 linden/indra/llmessage/tests/lltrustedmessageservice_test.cpp
create mode 100644 linden/indra/llmessage/tests/networkio.h
create mode 100644 linden/indra/llmessage/tests/test_llsdmessage_peer.py
create mode 100644 linden/indra/llplugin/CMakeLists.txt
create mode 100644 linden/indra/llplugin/llpluginclassmedia.cpp
create mode 100644 linden/indra/llplugin/llpluginclassmedia.h
create mode 100644 linden/indra/llplugin/llpluginclassmediaowner.h
create mode 100644 linden/indra/llplugin/llplugininstance.cpp
create mode 100644 linden/indra/llplugin/llplugininstance.h
create mode 100644 linden/indra/llplugin/llpluginmessage.cpp
create mode 100644 linden/indra/llplugin/llpluginmessage.h
create mode 100644 linden/indra/llplugin/llpluginmessageclasses.h
create mode 100644 linden/indra/llplugin/llpluginmessagepipe.cpp
create mode 100644 linden/indra/llplugin/llpluginmessagepipe.h
create mode 100644 linden/indra/llplugin/llpluginprocesschild.cpp
create mode 100644 linden/indra/llplugin/llpluginprocesschild.h
create mode 100644 linden/indra/llplugin/llpluginprocessparent.cpp
create mode 100644 linden/indra/llplugin/llpluginprocessparent.h
create mode 100644 linden/indra/llplugin/llpluginsharedmemory.cpp
create mode 100644 linden/indra/llplugin/llpluginsharedmemory.h
create mode 100644 linden/indra/llplugin/slplugin/CMakeLists.txt
create mode 100644 linden/indra/llplugin/slplugin/slplugin.cpp
create mode 100644 linden/indra/llplugin/slplugin/slplugin_info.plist
create mode 100644 linden/indra/media_plugins/CMakeLists.txt
create mode 100644 linden/indra/media_plugins/base/CMakeLists.txt
create mode 100644 linden/indra/media_plugins/base/media_plugin_base.cpp
create mode 100644 linden/indra/media_plugins/base/media_plugin_base.exp
create mode 100644 linden/indra/media_plugins/base/media_plugin_base.h
create mode 100644 linden/indra/media_plugins/example/CMakeLists.txt
create mode 100644 linden/indra/media_plugins/example/media_plugin_example.cpp
create mode 100644 linden/indra/media_plugins/gstreamer010/CMakeLists.txt
create mode 100644 linden/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h
create mode 100644 linden/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp
create mode 100644 linden/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.h
create mode 100644 linden/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms_raw.inc
create mode 100644 linden/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms_rawv.inc
create mode 100644 linden/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h
create mode 100644 linden/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp
create mode 100644 linden/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h
create mode 100644 linden/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp
create mode 100755 linden/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp~
create mode 100644 linden/indra/media_plugins/quicktime/CMakeLists.txt
create mode 100644 linden/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
create mode 100644 linden/indra/media_plugins/webkit/CMakeLists.txt
create mode 100644 linden/indra/media_plugins/webkit/media_plugin_webkit.cpp
delete mode 100644 linden/indra/newview/llfloaterhtmlhelp.h
create mode 100644 linden/indra/newview/llfloatermediabrowser.cpp
create mode 100644 linden/indra/newview/llfloatermediabrowser.h
create mode 100644 linden/indra/newview/llmediactrl.cpp
create mode 100644 linden/indra/newview/llmediactrl.h
create mode 100644 linden/indra/newview/llpanellandaudio.cpp
create mode 100644 linden/indra/newview/llpanellandaudio.h
create mode 100644 linden/indra/newview/llpanelmediahud.cpp
create mode 100644 linden/indra/newview/llpanelmediahud.h
create mode 100644 linden/indra/newview/llviewermedia_streamingaudio.cpp
create mode 100644 linden/indra/newview/llviewermedia_streamingaudio.h
create mode 100644 linden/indra/newview/llviewermediafocus.cpp
create mode 100644 linden/indra/newview/llviewermediafocus.h
create mode 100644 linden/indra/newview/llviewermediaobserver.h
create mode 100644 linden/indra/newview/skins/default/xui/en-us/mime_types_linux.xml
create mode 100644 linden/indra/newview/skins/default/xui/en-us/mime_types_mac.xml
create mode 100644 linden/indra/newview/skins/default/xui/en-us/mime_types_windows.xml
create mode 100644 linden/indra/newview/skins/default/xui/en-us/panel_hud.xml
create mode 100644 linden/indra/newview/skins/default/xui/en-us/panel_media_hud.xml
create mode 100755 linden/indra/newview/viewer_manifest.py~
create mode 100644 linden/indra/test_apps/llplugintest/CMakeLists.txt
create mode 100644 linden/indra/test_apps/llplugintest/bookmarks.txt
create mode 100644 linden/indra/test_apps/llplugintest/demo_media_plugin.cpp
create mode 100644 linden/indra/test_apps/llplugintest/demo_media_plugin_2.cpp
create mode 100644 linden/indra/test_apps/llplugintest/demo_plugin.cpp
create mode 100644 linden/indra/test_apps/llplugintest/llmediaplugintest.cpp
create mode 100644 linden/indra/test_apps/llplugintest/llmediaplugintest.h
create mode 100644 linden/indra/test_apps/llplugintest/media_mappings.txt
create mode 100644 linden/indra/test_apps/llplugintest/media_plugin_test.cpp
create mode 100644 linden/indra/test_apps/llplugintest/media_simple_test.cpp
create mode 100644 linden/indra/test_apps/llplugintest/plugin_host.cpp
create mode 100644 linden/indra/test_apps/llplugintest/plugin_process_launcher.cpp
(limited to 'linden/indra')
diff --git a/linden/indra/CMakeLists.txt b/linden/indra/CMakeLists.txt
index 8dca9d8..64e0079 100644
--- a/linden/indra/CMakeLists.txt
+++ b/linden/indra/CMakeLists.txt
@@ -42,7 +42,6 @@ add_subdirectory(${LIBS_OPEN_PREFIX}llimage)
add_subdirectory(${LIBS_OPEN_PREFIX}llimagej2coj)
add_subdirectory(${LIBS_OPEN_PREFIX}llinventory)
add_subdirectory(${LIBS_OPEN_PREFIX}llmath)
-add_subdirectory(${LIBS_OPEN_PREFIX}llmedia)
add_subdirectory(${LIBS_OPEN_PREFIX}llmessage)
add_subdirectory(${LIBS_OPEN_PREFIX}llprimitive)
add_subdirectory(${LIBS_OPEN_PREFIX}llrender)
@@ -59,8 +58,17 @@ endif (WINDOWS AND EXISTS ${LIBS_CLOSED_DIR}copy_win_scripts)
add_custom_target(viewer)
if (VIEWER)
add_subdirectory(${LIBS_OPEN_PREFIX}llcrashlogger)
+ add_subdirectory(${LIBS_OPEN_PREFIX}llplugin)
add_subdirectory(${LIBS_OPEN_PREFIX}llui)
+ # viewer media plugins
+ add_subdirectory(${LIBS_OPEN_PREFIX}media_plugins)
+
+ # llplugin testbed code (is this the right way to include it?)
+ if (NOT LINUX)
+ add_subdirectory(${VIEWER_PREFIX}test_apps/llplugintest)
+ endif (NOT LINUX)
+
if (LINUX)
add_subdirectory(${VIEWER_PREFIX}linux_crash_logger)
add_dependencies(viewer linux-crash-logger-strip-target)
diff --git a/linden/indra/cmake/00-Common.cmake b/linden/indra/cmake/00-Common.cmake
index d1f379c..d335cb0 100644
--- a/linden/indra/cmake/00-Common.cmake
+++ b/linden/indra/cmake/00-Common.cmake
@@ -9,9 +9,9 @@ include(Variables)
set(CMAKE_CXX_FLAGS_DEBUG "-D_DEBUG -DLL_DEBUG=1")
set(CMAKE_CXX_FLAGS_RELEASE
- "-DLL_RELEASE=1 -DLL_RELEASE_FOR_DOWNLOAD=1 -D_SECURE_SCL=0 -DNDEBUG")
+ "-DLL_RELEASE=1 -DLL_RELEASE_FOR_DOWNLOAD=1 -D_SECURE_SCL=0 -DLL_SEND_CRASH_REPORTS=1 -DNDEBUG")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO
- "-DLL_RELEASE=1 -D_SECURE_SCL=0 -DNDEBUG -DLL_RELEASE_WITH_DEBUG_INFO=1")
+ "-DLL_RELEASE=1 -D_SECURE_SCL=0 -DLL_SEND_CRASH_REPORTS=0 -DNDEBUG -DLL_RELEASE_WITH_DEBUG_INFO=1")
# Don't bother with a MinSizeRel build.
diff --git a/linden/indra/cmake/FindNDOF.cmake b/linden/indra/cmake/FindNDOF.cmake
new file mode 100644
index 0000000..f980e34
--- /dev/null
+++ b/linden/indra/cmake/FindNDOF.cmake
@@ -0,0 +1,39 @@
+# -*- cmake -*-
+
+# - Find NDOF
+# Find the NDOF includes and library
+# This module defines
+# NDOF_INCLUDE_DIR, where to find ndofdev_external.h, etc.
+# NDOF_LIBRARY, the library needed to use NDOF.
+# NDOF_FOUND, If false, do not try to use NDOF.
+
+find_path(NDOF_INCLUDE_DIR ndofdev_external.h
+ PATH_SUFFIXES ndofdev
+ )
+
+set(NDOF_NAMES ${NDOF_NAMES} ndofdev libndofdev)
+find_library(NDOF_LIBRARY
+ NAMES ${NDOF_NAMES}
+ )
+
+if (NDOF_LIBRARY AND NDOF_INCLUDE_DIR)
+ set(NDOF_FOUND "YES")
+else (NDOF_LIBRARY AND NDOF_INCLUDE_DIR)
+ set(NDOF_FOUND "NO")
+endif (NDOF_LIBRARY AND NDOF_INCLUDE_DIR)
+
+
+if (NDOF_FOUND)
+ if (NOT NDOF_FIND_QUIETLY)
+ message(STATUS "Found NDOF: Library in '${NDOF_LIBRARY}' and header in '${NDOF_INCLUDE_DIR}' ")
+ endif (NOT NDOF_FIND_QUIETLY)
+else (NDOF_FOUND)
+ if (NDOF_FIND_REQUIRED)
+ message(FATAL_ERROR "Could not find NDOF library!")
+ endif (NDOF_FIND_REQUIRED)
+endif (NDOF_FOUND)
+
+mark_as_advanced(
+ NDOF_LIBRARY
+ NDOF_INCLUDE_DIR
+ )
diff --git a/linden/indra/cmake/GStreamer010Plugin.cmake b/linden/indra/cmake/GStreamer010Plugin.cmake
new file mode 100644
index 0000000..0d33483
--- /dev/null
+++ b/linden/indra/cmake/GStreamer010Plugin.cmake
@@ -0,0 +1,39 @@
+# -*- cmake -*-
+include(Prebuilt)
+
+if (STANDALONE)
+ include(FindPkgConfig)
+
+ pkg_check_modules(GSTREAMER010 REQUIRED gstreamer-0.10)
+ pkg_check_modules(GSTREAMER010_PLUGINS_BASE REQUIRED gstreamer-plugins-base-0.10)
+elseif (LINUX)
+ use_prebuilt_binary(gstreamer)
+ # possible libxml should have its own .cmake file instead
+ use_prebuilt_binary(libxml)
+ set(GSTREAMER010_FOUND ON FORCE BOOL)
+ set(GSTREAMER010_PLUGINS_BASE_FOUND ON FORCE BOOL)
+ set(GSTREAMER010_INCLUDE_DIRS
+ ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/gstreamer-0.10
+ ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/glib-2.0
+ ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/libxml2
+ )
+ # We don't need to explicitly link against gstreamer itself, because
+ # LLMediaImplGStreamer probes for the system's copy at runtime.
+ set(GSTREAMER010_LIBRARIES
+ gobject-2.0
+ gmodule-2.0
+ dl
+ gthread-2.0
+ rt
+ glib-2.0
+ )
+endif (STANDALONE)
+
+if (GSTREAMER010_FOUND AND GSTREAMER010_PLUGINS_BASE_FOUND)
+ set(GSTREAMER010 ON CACHE BOOL "Build with GStreamer-0.10 streaming media support.")
+endif (GSTREAMER010_FOUND AND GSTREAMER010_PLUGINS_BASE_FOUND)
+
+if (GSTREAMER010)
+ add_definitions(-DLL_GSTREAMER010_ENABLED=1)
+endif (GSTREAMER010)
+
diff --git a/linden/indra/cmake/Glui.cmake b/linden/indra/cmake/Glui.cmake
new file mode 100644
index 0000000..f62a568
--- /dev/null
+++ b/linden/indra/cmake/Glui.cmake
@@ -0,0 +1,28 @@
+# -*- cmake -*-
+include(Linking)
+include(Prebuilt)
+
+if (STANDALONE)
+ set(GLUI OFF CACHE BOOL
+ "GLUI support for the llplugin/llmedia test apps.")
+else (STANDALONE)
+ use_prebuilt_binary(glui)
+ set(GLUI ON CACHE BOOL
+ "GLUI support for the llplugin/llmedia test apps.")
+endif (STANDALONE)
+
+if (LINUX)
+ set(GLUI ON CACHE BOOL
+ "llplugin media apps HACK for Linux.")
+endif (LINUX)
+
+if (DARWIN OR LINUX)
+ set(GLUI_LIBRARY
+ glui)
+endif (DARWIN OR LINUX)
+
+if (WINDOWS)
+ set(GLUI_LIBRARY
+ debug glui32.lib
+ optimized glui32.lib)
+endif (WINDOWS)
diff --git a/linden/indra/cmake/Glut.cmake b/linden/indra/cmake/Glut.cmake
new file mode 100644
index 0000000..314da30
--- /dev/null
+++ b/linden/indra/cmake/Glut.cmake
@@ -0,0 +1,19 @@
+# -*- cmake -*-
+include(Linking)
+include(Prebuilt)
+
+if (WINDOWS)
+ use_prebuilt_binary(freeglut)
+ set(GLUT_LIBRARY
+ debug freeglut_static.lib
+ optimized freeglut_static.lib)
+endif (WINDOWS)
+
+if (LINUX)
+ FIND_LIBRARY(GLUT_LIBRARY glut)
+endif (LINUX)
+
+if (DARWIN)
+ include(CMakeFindFrameworks)
+ find_library(GLUT_LIBRARY GLUT)
+endif (DARWIN)
diff --git a/linden/indra/cmake/LLAudio.cmake b/linden/indra/cmake/LLAudio.cmake
index 625e212..89b790c 100644
--- a/linden/indra/cmake/LLAudio.cmake
+++ b/linden/indra/cmake/LLAudio.cmake
@@ -1,11 +1,9 @@
# -*- cmake -*-
include(Audio)
-include(OPENAL)
set(LLAUDIO_INCLUDE_DIRS
${LIBS_OPEN_DIR}/llaudio
- ${OPENAL_INCLUDE_DIRS}
)
set(LLAUDIO_LIBRARIES llaudio ${OPENAL_LIBRARIES})
diff --git a/linden/indra/cmake/LLMedia.cmake b/linden/indra/cmake/LLMedia.cmake
deleted file mode 100644
index 8a36a69..0000000
--- a/linden/indra/cmake/LLMedia.cmake
+++ /dev/null
@@ -1,13 +0,0 @@
-# -*- cmake -*-
-
-include(GStreamer)
-
-set(LLMEDIA_INCLUDE_DIRS
- ${LIBS_OPEN_DIR}/llmedia
- )
-
-set(LLMEDIA_LIBRARIES
- llmedia
- ${GSTREAMER_LIBRARIES}
- ${GSTREAMER_PLUGINS_BASE_LIBRARIES}
- )
diff --git a/linden/indra/cmake/LLPlugin.cmake b/linden/indra/cmake/LLPlugin.cmake
new file mode 100644
index 0000000..9722f16
--- /dev/null
+++ b/linden/indra/cmake/LLPlugin.cmake
@@ -0,0 +1,8 @@
+# -*- cmake -*-
+
+
+set(LLPLUGIN_INCLUDE_DIRS
+ ${LIBS_OPEN_DIR}/llplugin
+ )
+
+set(LLPLUGIN_LIBRARIES llplugin)
diff --git a/linden/indra/cmake/MediaPluginBase.cmake b/linden/indra/cmake/MediaPluginBase.cmake
new file mode 100644
index 0000000..2be035b
--- /dev/null
+++ b/linden/indra/cmake/MediaPluginBase.cmake
@@ -0,0 +1,8 @@
+# -*- cmake -*-
+
+
+set(MEDIA_PLUGIN_BASE_INCLUDE_DIRS
+ ${LIBS_OPEN_DIR}/media_plugins/base/
+ )
+
+set(MEDIA_PLUGIN_BASE_LIBRARIES media_plugin_base)
diff --git a/linden/indra/cmake/Mozlib.cmake b/linden/indra/cmake/Mozlib.cmake
index e9555df..e69de29 100644
--- a/linden/indra/cmake/Mozlib.cmake
+++ b/linden/indra/cmake/Mozlib.cmake
@@ -1,47 +0,0 @@
-# -*- cmake -*-
-include(Linking)
-include(Prebuilt)
-
-if (STANDALONE)
- set(MOZLIB OFF CACHE BOOL
- "Enable Mozilla support in the viewer (requires llmozlib library).")
-else (STANDALONE)
- use_prebuilt_binary(llmozlib)
- set(MOZLIB ON CACHE BOOL
- "Enable Mozilla support in the viewer (requires llmozlib library).")
-endif (STANDALONE)
-
-if (MOZLIB)
- add_definitions(-DLL_LLMOZLIB_ENABLED=1)
-
- if (LINUX)
- link_directories(${CMAKE_SOURCE_DIR}/newview/app_settings/mozilla-runtime-linux-${ARCH})
- set(MOZLIB_LIBRARIES
- llmozlib2
- mozjs
- nspr4
- plc4
- plds4
- xpcom
- xul
- profdirserviceprovider_s
- )
- elseif (WINDOWS)
- if (MSVC71)
- set(MOZLIB_LIBRARIES
- debug llmozlib2d
- optimized llmozlib2)
- elseif (MSVC80 OR MSVC90)
- set(MOZLIB_LIBRARIES
- debug llmozlib2d-vc80
- optimized llmozlib2-vc80)
- endif (MSVC71)
- else (LINUX)
- set(MOZLIB_LIBRARIES
- optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libllmozlib2.dylib
- debug ${ARCH_PREBUILT_DIRS_DEBUG}/libllmozlib2.dylib
- )
- endif (LINUX)
-else (MOZLIB)
- add_definitions(-DLL_LLMOZLIB_ENABLED=0)
-endif (MOZLIB)
diff --git a/linden/indra/cmake/NDOF.cmake b/linden/indra/cmake/NDOF.cmake
index dad74e9..bdf5db1 100644
--- a/linden/indra/cmake/NDOF.cmake
+++ b/linden/indra/cmake/NDOF.cmake
@@ -1,14 +1,28 @@
# -*- cmake -*-
include(Prebuilt)
-use_prebuilt_binary(ndofdev)
+if (STANDALONE)
+ include(FindNDOF)
+ if(NOT NDOF_FOUND)
+ message(STATUS "Building without N-DoF joystick support")
+ endif(NOT NDOF_FOUND)
+else (STANDALONE)
+ use_prebuilt_binary(ndofdev)
-if (WINDOWS OR DARWIN OR LINUX)
- add_definitions(-DLIB_NDOF=1)
-endif (WINDOWS OR DARWIN OR LINUX)
+ if (WINDOWS)
+ set(NDOF_LIBRARY libndofdev)
+ elseif (DARWIN OR LINUX)
+ set(NDOF_LIBRARY ndofdev)
+ endif (WINDOWS)
+
+ set(NDOF_INCLUDE_DIR ${ARCH_PREBUILT_DIRS}/include/ndofdev)
+ set(NDOF_FOUND 1)
+endif (STANDALONE)
-if (WINDOWS)
- set(NDOF_LIBRARY libndofdev)
-elseif (DARWIN OR LINUX)
- set(NDOF_LIBRARY ndofdev)
-endif (WINDOWS)
+if (NDOF_FOUND)
+ add_definitions(-DLIB_NDOF=1)
+ include_directories(${NDOF_INCLUDE_DIR})
+else (NDOF_FOUND)
+ set(NDOF_INCLUDE_DIR "")
+ set(NDOF_LIBRARY "")
+endif (NDOF_FOUND)
diff --git a/linden/indra/cmake/OPENAL.cmake b/linden/indra/cmake/OPENAL.cmake
index 4f0e0cc..f7ebfe6 100644
--- a/linden/indra/cmake/OPENAL.cmake
+++ b/linden/indra/cmake/OPENAL.cmake
@@ -1,10 +1,12 @@
# -*- cmake -*-
-
-include(Variables)
include(Linking)
+include(Prebuilt)
-set(OPENAL ON CACHE BOOL "Enable OpenAL")
-
+if (LINUX)
+ set(OPENAL ON CACHE BOOL "Enable OpenAL")
+else (LINUX)
+ set(OPENAL OFF CACHE BOOL "Enable OpenAL")
+endif (LINUX)
if (OPENAL)
@@ -109,5 +111,8 @@ if (OPENAL)
set(OPENAL_FOUND TRUE CACHE BOOL
"Found OpenAL and ALUT libraries successfully"
)
+endif (OPENAL)
+if (OPENAL)
+ message(STATUS "Building with OpenAL audio support")
endif (OPENAL)
diff --git a/linden/indra/cmake/OPENAL.cmake.imp b/linden/indra/cmake/OPENAL.cmake.imp
new file mode 100644
index 0000000..60abef3
--- /dev/null
+++ b/linden/indra/cmake/OPENAL.cmake.imp
@@ -0,0 +1,115 @@
+# -*- cmake -*-
+
+include(Variables)
+include(Linking)
+
+set(OPENAL ON CACHE BOOL "Enable OpenAL")
+
+
+if (OPENAL)
+
+ # message(STATUS "Building with OpenAL audio support")
+
+ # OPENAL_LIB
+ use_prebuilt_binary(openal)
+
+ if (WINDOWS)
+ set(OPENAL_LIB
+ optimized ${ARCH_PREBUILT_DIRS_RELEASE}/openal32.lib
+ debug ${ARCH_PREBUILT_DIRS_DEBUG}/openal32.lib
+ )
+
+ elseif (DARWIN)
+ # Look for for system's OpenAL.framework
+ find_library(OPENAL_LIB
+ NAMES openal.1
+ PATHS ${ARCH_PREBUILT_DIRS_RELEASE}
+ NO_DEFAULT_PATH
+ )
+ else (WINDOWS)
+ set(OPENAL_LIB openal)
+ endif (WINDOWS)
+
+ if (NOT OPENAL_LIB)
+ message(FATAL_ERROR "OpenAL not found!")
+ else (NOT OPENAL_LIB)
+ # message(STATUS "OpenAL found: ${OPENAL_LIB}")
+ endif (NOT OPENAL_LIB)
+
+
+
+ # OPENAL_INCLUDE_DIR
+
+ if (DARWIN)
+ set(OPENAL_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/AL)
+ else (DARWIN)
+ find_path(OPENAL_INCLUDE_DIR
+ NAMES al.h
+ PATHS ${LIBS_PREBUILT_DIR}/include/AL
+ )
+ endif (DARWIN)
+
+ if (NOT OPENAL_INCLUDE_DIR)
+ message(FATAL_ERROR "al.h not found!")
+ else (NOT OPENAL_INCLUDE_DIR)
+ # message(STATUS "al.h found in: ${OPENAL_INCLUDE_DIR}")
+ endif (NOT OPENAL_INCLUDE_DIR)
+
+
+
+ # ALUT_LIB
+
+ if (WINDOWS)
+ set(ALUT_LIB
+ optimized ${ARCH_PREBUILT_DIRS_RELEASE}/alut.lib
+ debug ${ARCH_PREBUILT_DIRS_DEBUG}/alut.lib
+ )
+ elseif (DARWIN)
+ find_library( ALUT_LIB
+ NAMES alut.0
+ PATHS ${ARCH_PREBUILT_DIRS_RELEASE}
+ NO_DEFAULT_PATH
+ )
+ else (WINDOWS)
+ set(ALUT_LIB alut)
+ endif (WINDOWS)
+
+ if (NOT ALUT_LIB)
+ message(FATAL_ERROR "ALUT not found!")
+ else (NOT ALUT_LIB)
+ # message(STATUS "ALUT found: ${ALUT_LIB}")
+ endif (NOT ALUT_LIB)
+
+
+
+ # ALUT_INCLUDE_DIR
+
+ find_path(ALUT_INCLUDE_DIR
+ NAMES alut.h
+ PATHS ${OPENAL_INCLUDE_DIR}
+ )
+
+ if (NOT ALUT_INCLUDE_DIR)
+ message(FATAL_ERROR "alut.h not found!")
+ else (NOT ALUT_INCLUDE_DIR)
+ # message(STATUS "alut.h found in: ${ALUT_INCLUDE_DIR}")
+ endif (NOT ALUT_INCLUDE_DIR)
+
+
+
+ set(OPENAL_LIBRARIES
+ ${OPENAL_LIB}
+ ${ALUT_LIB}
+ )
+
+ set(OPENAL_INCLUDE_DIRS
+ ${OPENAL_INCLUDE_DIR}
+ ${ALUT_INCLUDE_DIR}
+ )
+
+
+ set(OPENAL_FOUND TRUE CACHE BOOL
+ "Found OpenAL and ALUT libraries successfully"
+ )
+
+endif (OPENAL)
diff --git a/linden/indra/cmake/PluginAPI.cmake b/linden/indra/cmake/PluginAPI.cmake
new file mode 100644
index 0000000..d1649e8
--- /dev/null
+++ b/linden/indra/cmake/PluginAPI.cmake
@@ -0,0 +1,16 @@
+# -*- cmake -*-
+
+if (WINDOWS)
+ set(PLUGIN_API_WINDOWS_LIBRARIES
+ wsock32
+ ws2_32
+ psapi
+ netapi32
+ advapi32
+ user32
+ )
+else (WINDOWS)
+ set(PLUGIN_API_WINDOWS_LIBRARIES "")
+endif (WINDOWS)
+
+
diff --git a/linden/indra/cmake/QuickTimePlugin.cmake b/linden/indra/cmake/QuickTimePlugin.cmake
new file mode 100644
index 0000000..8afd8f3
--- /dev/null
+++ b/linden/indra/cmake/QuickTimePlugin.cmake
@@ -0,0 +1,46 @@
+# -*- cmake -*-
+
+if(INSTALL_PROPRIETARY)
+ include(Prebuilt)
+ use_prebuilt_binary(quicktime)
+endif(INSTALL_PROPRIETARY)
+
+if (DARWIN)
+ include(CMakeFindFrameworks)
+ find_library(QUICKTIME_LIBRARY QuickTime)
+elseif (WINDOWS)
+ set(QUICKTIME_SDK_DIR "$ENV{PROGRAMFILES}/QuickTime SDK"
+ CACHE PATH "Location of the QuickTime SDK.")
+
+ find_library(DEBUG_QUICKTIME_LIBRARY qtmlclient
+ PATHS
+ ${ARCH_PREBUILT_DIRS_DEBUG}
+ "${QUICKTIME_SDK_DIR}\\libraries"
+ )
+
+ find_library(RELEASE_QUICKTIME_LIBRARY qtmlclient
+ PATHS
+ ${ARCH_PREBUILT_DIRS_RELEASE}
+ "${QUICKTIME_SDK_DIR}\\libraries"
+ )
+
+ if (DEBUG_QUICKTIME_LIBRARY AND RELEASE_QUICKTIME_LIBRARY)
+ set(QUICKTIME_LIBRARY
+ optimized ${RELEASE_QUICKTIME_LIBRARY}
+ debug ${DEBUG_QUICKTIME_LIBRARY}
+ )
+
+ endif (DEBUG_QUICKTIME_LIBRARY AND RELEASE_QUICKTIME_LIBRARY)
+
+ include_directories(
+ ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/quicktime
+ "${QUICKTIME_SDK_DIR}\\CIncludes"
+ )
+endif (DARWIN)
+
+mark_as_advanced(QUICKTIME_LIBRARY)
+
+if (QUICKTIME_LIBRARY)
+ set(QUICKTIME ON CACHE BOOL "Build with QuickTime streaming media support.")
+endif (QUICKTIME_LIBRARY)
+
diff --git a/linden/indra/cmake/WebKitLibPlugin.cmake b/linden/indra/cmake/WebKitLibPlugin.cmake
new file mode 100644
index 0000000..23958fe
--- /dev/null
+++ b/linden/indra/cmake/WebKitLibPlugin.cmake
@@ -0,0 +1,55 @@
+# -*- cmake -*-
+include(Linking)
+include(Prebuilt)
+
+if (STANDALONE)
+ set(WEBKITLIBPLUGIN OFF CACHE BOOL
+ "WEBKITLIBPLUGIN support for the llplugin/llmedia test apps.")
+else (STANDALONE)
+ use_prebuilt_binary(llqtwebkit)
+ set(WEBKITLIBPLUGIN ON CACHE BOOL
+ "WEBKITLIBPLUGIN support for the llplugin/llmedia test apps.")
+endif (STANDALONE)
+
+if (WINDOWS)
+ set(WEBKIT_PLUGIN_LIBRARIES
+ debug llqtwebkitd
+ debug QtWebKitd4
+ debug QtOpenGLd4
+ debug QtNetworkd4
+ debug QtGuid4
+ debug QtCored4
+ debug qtmaind
+ optimized llqtwebkit
+ optimized QtWebKit4
+ optimized QtOpenGL4
+ optimized QtNetwork4
+ optimized QtGui4
+ optimized QtCore4
+ optimized qtmain
+ )
+elseif (DARWIN)
+ set(WEBKIT_PLUGIN_LIBRARIES
+ optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib
+ debug ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib
+ )
+elseif (LINUX)
+ if (STANDALONE)
+ set(WEBKIT_PLUGIN_LIBRARIES llqtwebkit)
+ else (STANDALONE)
+ set(WEBKIT_PLUGIN_LIBRARIES
+ llqtwebkit
+ qgif
+ qjpeg
+ QtWebKit
+ QtOpenGL
+ QtNetwork
+ QtGui
+ QtCore
+ fontconfig
+ X11
+ Xrender
+ GL
+ )
+ endif (STANDALONE)
+endif (WINDOWS)
diff --git a/linden/indra/cmake/linden%2findra%2fcmake%2fCopyWinLibs.cmake.rej.txt b/linden/indra/cmake/linden%2findra%2fcmake%2fCopyWinLibs.cmake.rej.txt
new file mode 100644
index 0000000..295c9fe
--- /dev/null
+++ b/linden/indra/cmake/linden%2findra%2fcmake%2fCopyWinLibs.cmake.rej.txt
@@ -0,0 +1,257 @@
+***************
+*** 15,35 ****
+ wrap_oal.dll
+ )
+
+ set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug")
+ set(debug_files
+- freebl3.dll
+- js3250.dll
+- nspr4.dll
+- nss3.dll
+- nssckbi.dll
+- plc4.dll
+- plds4.dll
+- smime3.dll
+- softokn3.dll
+- ssl3.dll
+- xpcom.dll
+- xul.dll
+ openjpegd.dll
+- windbgdlg.exe
+ )
+
+--- 15,30 ----
+ wrap_oal.dll
+ )
++ copy_if_different(
++ ${vivox_src_dir}
++ "${CMAKE_CURRENT_BINARY_DIR}/Debug"
++ out_targets
++ ${vivox_files}
++ )
++ set(all_targets ${all_targets} ${out_targets})
++
+
+ set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug")
+ set(debug_files
+ openjpegd.dll
+ )
+
+***************
+*** 42,50 ****
+ set(all_targets ${all_targets} ${out_targets})
+
+- copy_if_different(
+- ${vivox_src_dir}
+- "${CMAKE_CURRENT_BINARY_DIR}/Debug"
+- out_targets
+- ${vivox_files}
+ )
+ set(all_targets ${all_targets} ${out_targets})
+--- 37,206 ----
+ set(all_targets ${all_targets} ${out_targets})
+
++ # Debug config runtime files required for the plugin test mule
++ set(plugintest_debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug")
++ set(plugintest_debug_files
++ libeay32.dll
++ libglib-2.0-0.dll
++ libgmodule-2.0-0.dll
++ libgobject-2.0-0.dll
++ libgthread-2.0-0.dll
++ qtcored4.dll
++ qtguid4.dll
++ qtnetworkd4.dll
++ qtopengld4.dll
++ qtwebkitd4.dll
++ ssleay32.dll
++ )
++ copy_if_different(
++ ${plugintest_debug_src_dir}
++ "${CMAKE_CURRENT_BINARY_DIR}/../test_apps/llplugintest/Debug"
++ out_targets
++ ${plugintest_debug_files}
++ )
++ set(all_targets ${all_targets} ${out_targets})
++
++ # Debug config runtime files required for the plugin test mule (Qt image format plugins)
++ set(plugintest_debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug/imageformats")
++ set(plugintest_debug_files
++ qgifd4.dll
++ qicod4.dll
++ qjpegd4.dll
++ qmngd4.dll
++ qsvgd4.dll
++ qtiffd4.dll
++ )
++ copy_if_different(
++ ${plugintest_debug_src_dir}
++ "${CMAKE_CURRENT_BINARY_DIR}/../test_apps/llplugintest/Debug/imageformats"
++ out_targets
++ ${plugintest_debug_files}
++ )
++ set(all_targets ${all_targets} ${out_targets})
++
++ copy_if_different(
++ ${plugintest_debug_src_dir}
++ "${CMAKE_CURRENT_BINARY_DIR}/llplugin/imageformats"
++ out_targets
++ ${plugintest_debug_files}
++ )
++ set(all_targets ${all_targets} ${out_targets})
++
++ # Release & ReleaseDebInfo config runtime files required for the plugin test mule
++ set(plugintest_release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release")
++ set(plugintest_release_files
++ libeay32.dll
++ libglib-2.0-0.dll
++ libgmodule-2.0-0.dll
++ libgobject-2.0-0.dll
++ libgthread-2.0-0.dll
++ # llkdu.dll (not required for plugin test)
++ qtcore4.dll
++ qtgui4.dll
++ qtnetwork4.dll
++ qtopengl4.dll
++ qtwebkit4.dll
++ ssleay32.dll
++ )
++ copy_if_different(
++ ${plugintest_release_src_dir}
++ "${CMAKE_CURRENT_BINARY_DIR}/../test_apps/llplugintest/Release"
++ out_targets
++ ${plugintest_release_files}
++ )
++ set(all_targets ${all_targets} ${out_targets})
++
++ copy_if_different(
++ ${plugintest_release_src_dir}
++ "${CMAKE_CURRENT_BINARY_DIR}/../test_apps/llplugintest/RelWithDebInfo"
++ out_targets
++ ${plugintest_release_files}
++ )
++ set(all_targets ${all_targets} ${out_targets})
++
++ # Release & ReleaseDebInfo config runtime files required for the plugin test mule (Qt image format plugins)
++ set(plugintest_release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release/imageformats")
++ set(plugintest_release_files
++ qgif4.dll
++ qico4.dll
++ qjpeg4.dll
++ qmng4.dll
++ qsvg4.dll
++ qtiff4.dll
++ )
++ copy_if_different(
++ ${plugintest_release_src_dir}
++ "${CMAKE_CURRENT_BINARY_DIR}/../test_apps/llplugintest/Release/imageformats"
++ out_targets
++ ${plugintest_release_files}
++ )
++ set(all_targets ${all_targets} ${out_targets})
++
++ copy_if_different(
++ ${plugintest_release_src_dir}
++ "${CMAKE_CURRENT_BINARY_DIR}/../test_apps/llplugintest/RelWithDebInfo/imageformats"
++ out_targets
++ ${plugintest_release_files}
++ )
++ set(all_targets ${all_targets} ${out_targets})
++
++ copy_if_different(
++ ${plugintest_release_src_dir}
++ "${CMAKE_CURRENT_BINARY_DIR}/Release/llplugin/imageformats"
++ out_targets
++ ${plugintest_release_files}
++ )
++ set(all_targets ${all_targets} ${out_targets})
++
++ copy_if_different(
++ ${plugintest_release_src_dir}
++ "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/llplugin/imageformats"
++ out_targets
++ ${plugintest_release_files}
++ )
++ set(all_targets ${all_targets} ${out_targets})
++
++ # Debug config runtime files required for the plugins
++ set(plugins_debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug")
++ set(plugins_debug_files
++ libeay32.dll
++ qtcored4.dll
++ qtguid4.dll
++ qtnetworkd4.dll
++ qtopengld4.dll
++ qtwebkitd4.dll
++ ssleay32.dll
++ )
++ copy_if_different(
++ ${plugins_debug_src_dir}
++ "${CMAKE_CURRENT_BINARY_DIR}/Debug/llplugin"
++ out_targets
++ ${plugins_debug_files}
++ )
++ set(all_targets ${all_targets} ${out_targets})
++
++ # Release & ReleaseDebInfo config runtime files required for the plugins
++ set(plugins_release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release")
++ set(plugins_release_files
++ libeay32.dll
++ qtcore4.dll
++ qtgui4.dll
++ qtnetwork4.dll
++ qtopengl4.dll
++ qtwebkit4.dll
++ ssleay32.dll
++ )
++ copy_if_different(
++ ${plugins_release_src_dir}
++ "${CMAKE_CURRENT_BINARY_DIR}/Release/llplugin"
++ out_targets
++ ${plugins_release_files}
++ )
++ set(all_targets ${all_targets} ${out_targets})
++
++ copy_if_different(
++ ${plugins_release_src_dir}
++ "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/llplugin"
++ out_targets
++ ${plugins_release_files}
+ )
+ set(all_targets ${all_targets} ${out_targets})
+***************
+*** 52,67 ****
+ set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release")
+ set(release_files
+- freebl3.dll
+- js3250.dll
+- nspr4.dll
+- nss3.dll
+- nssckbi.dll
+- plc4.dll
+- plds4.dll
+- smime3.dll
+- softokn3.dll
+- ssl3.dll
+- xpcom.dll
+- xul.dll
+ openjpeg.dll
+ )
+--- 208,211 ----
+ set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release")
+ set(release_files
+ openjpeg.dll
+ )
+***************
+*** 252,256 ****
+ ${debug_appconfig_file}
+ )
+- add_dependencies(copy_win_libs prepare)
+
+ if(EXISTS ${internal_llkdu_path})
+--- 396,399 ----
+ ${debug_appconfig_file}
+ )
+
+ if(EXISTS ${internal_llkdu_path})
diff --git a/linden/indra/llaudio/CMakeLists.txt b/linden/indra/llaudio/CMakeLists.txt
index 0a668f9..1a0527c 100644
--- a/linden/indra/llaudio/CMakeLists.txt
+++ b/linden/indra/llaudio/CMakeLists.txt
@@ -4,6 +4,7 @@ project(llaudio)
# Current starting point for CMake. Seems rather arbitrary - MC
include(00-Common)
+include(LLAudio)
include(Audio)
include(OPENAL)
include(FMOD)
@@ -12,9 +13,9 @@ include(LLCommon)
include(LLMath)
include(LLMessage)
include(LLVFS)
-include(LLMedia)
include_directories(
+ ${LLAUDIO_INCLUDE_DIRS}
${FMOD_INCLUDE_DIR}
${LLCOMMON_INCLUDE_DIRS}
${LLMATH_INCLUDE_DIRS}
@@ -26,43 +27,43 @@ include_directories(
${VORBIS_INCLUDE_DIRS}
${OPENAL_LIB_INCLUDE_DIRS}
${FREEAULT_LIB_INCLUDE_DIRS}
- ${LLMEDIA_INCLUDE_DIRS}
- ${GSTREAMER_INCLUDE_DIRS}
)
set(llaudio_SOURCE_FILES
- audioengine.cpp
- listener.cpp
+ llaudioengine.cpp
+ lllistener.cpp
llaudiodecodemgr.cpp
- vorbisdecode.cpp
- vorbisencode.cpp
+ llvorbisdecode.cpp
+ llvorbisencode.cpp
)
set(llaudio_HEADER_FILES
CMakeLists.txt
- audioengine.h
- listener.h
+ llaudioengine.h
+ lllistener.h
llaudiodecodemgr.h
- vorbisdecode.h
- vorbisencode.h
- windgen.h
+ llvorbisdecode.h
+ llvorbisencode.h
+ llwindgen.h
)
if (FMOD)
list(APPEND llaudio_SOURCE_FILES
- audioengine_fmod.cpp
- listener_fmod.cpp
+ llaudioengine_fmod.cpp
+ lllistener_fmod.cpp
+ llstreamingaudio_fmod.cpp
)
list(APPEND llaudio_HEADER_FILES
- audioengine_fmod.h
- listener_fmod.h
+ llaudioengine_fmod.h
+ lllistener_fmod.h
+ llstreamingaudio_fmod.h
)
if (LINUX)
if (${CXX_VERSION} MATCHES "4.[23]")
- set_source_files_properties(audioengine_fmod.cpp
+ set_source_files_properties(llaudioengine_fmod.cpp
COMPILE_FLAGS -Wno-error=write-strings)
endif (${CXX_VERSION} MATCHES "4.[23]")
endif (LINUX)
@@ -70,13 +71,13 @@ endif (FMOD)
if (OPENAL)
list(APPEND llaudio_SOURCE_FILES
- audioengine_openal.cpp
- listener_openal.cpp
+ llaudioengine_openal.cpp
+ lllistener_openal.cpp
)
list(APPEND llaudio_HEADER_FILES
- audioengine_openal.h
- listener_openal.h
+ llaudioengine_openal.h
+ lllistener_openal.h
)
endif (OPENAL)
diff --git a/linden/indra/llaudio/audioengine.cpp b/linden/indra/llaudio/audioengine.cpp
deleted file mode 100644
index 1900c38..0000000
--- a/linden/indra/llaudio/audioengine.cpp
+++ /dev/null
@@ -1,1904 +0,0 @@
- /**
- * @file audioengine.cpp
- * @brief implementation of LLAudioEngine class abstracting the Open
- * AL audio support
- *
- * $LicenseInfo:firstyear=2000&license=viewergpl$
- *
- * Copyright (c) 2000-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include
-
-#include "linden_common.h"
-
-#include "audioengine.h"
-
-#include "llerror.h"
-#include "llmath.h"
-
-#include "sound_ids.h" // temporary hack for min/max distances
-
-#include "llvfs.h"
-#include "lldir.h"
-#include "llaudiodecodemgr.h"
-#include "llassetstorage.h"
-
-#include "llmediamanager.h"
-#include "llmediabase.h"
-#include "llmediaimplcommon.h"
-
-// necessary for grabbing sounds from sim (implemented in viewer)
-extern void request_sound(const LLUUID &sound_guid);
-
-LLAudioEngine* gAudiop = NULL;
-
-
-//
-// LLAudioEngine implementation
-//
-
-
-LLAudioEngine::LLAudioEngine()
-{
- setDefaults();
-}
-
-
-LLAudioEngine::~LLAudioEngine()
-{
-}
-
-
-void LLAudioEngine::setDefaults()
-{
- mMaxWindGain = 1.f;
-
- mListenerp = NULL;
-
- mMuted = false;
- mUserData = NULL;
-
- mLastStatus = 0;
-
- mNumChannels = 0;
- mEnableWind = false;
-
- S32 i;
- for (i = 0; i < MAX_CHANNELS; i++)
- {
- mChannels[i] = NULL;
- }
- for (i = 0; i < MAX_BUFFERS; i++)
- {
- mBuffers[i] = NULL;
- }
-
- mMasterGain = 1.f;
- mInternetStreamGain = 0.125f;
- mNextWindUpdate = 0.f;
-
- mInternetStreamMedia = NULL;
- mInternetStreamURL.clear();
-
- mStatus = LLMediaBase::STATUS_UNKNOWN;
-
- for (U32 i = 0; i < LLAudioEngine::AUDIO_TYPE_COUNT; i++)
- mSecondaryGain[i] = 1.0f;
-}
-
-
-bool LLAudioEngine::init(const S32 num_channels, void* userdata)
-{
- setDefaults();
-
- mNumChannels = num_channels;
- mUserData = userdata;
-
- allocateListener();
-
- // Initialize the decode manager
- gAudioDecodeMgrp = new LLAudioDecodeMgr;
-
- llinfos << "LLAudioEngine::init() AudioEngine successfully initialized" << llendl;
-
- return true;
-}
-
-
-void LLAudioEngine::shutdown()
-{
- // Clean up decode manager
- delete gAudioDecodeMgrp;
- gAudioDecodeMgrp = NULL;
-
- // Clean up wind source
- cleanupWind();
-
- // Clean up audio sources
- source_map::iterator iter_src;
- for (iter_src = mAllSources.begin(); iter_src != mAllSources.end(); iter_src++)
- {
- delete iter_src->second;
- }
-
-
- // Clean up audio data
- data_map::iterator iter_data;
- for (iter_data = mAllData.begin(); iter_data != mAllData.end(); iter_data++)
- {
- delete iter_data->second;
- }
-
-
- // Clean up channels
- S32 i;
- for (i = 0; i < MAX_CHANNELS; i++)
- {
- delete mChannels[i];
- mChannels[i] = NULL;
- }
-
- // Clean up buffers
- for (i = 0; i < MAX_BUFFERS; i++)
- {
- delete mBuffers[i];
- mBuffers[i] = NULL;
- }
-
- delete mInternetStreamMedia;
- mInternetStreamMedia = NULL;
- mInternetStreamURL.clear();
-}
-
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-LLMediaBase::EStatus LLAudioEngine::getStatus()
-{
- return mStatus;
-}
-
-
-// virtual
-void LLAudioEngine::startInternetStream(const std::string& url)
-{
- llinfos << "entered startInternetStream()" << llendl;
-
- if (!mInternetStreamMedia)
- {
- LLMediaManager* mgr = LLMediaManager::getInstance();
- if (mgr)
- {
- mInternetStreamMedia = mgr->createSourceFromMimeType(LLURI(url).scheme(), "audio/mpeg"); // assumes that whatever media implementation supports mp3 also supports vorbis.
- llinfos << "mInternetStreamMedia is now " << mInternetStreamMedia << llendl;
- }
- }
-
- if(!mInternetStreamMedia)
- {
- return;
- }
- // Check for a dead stream from gstreamer, just in case
- else if(getStatus() == LLMediaBase::STATUS_DEAD)
- {
- llinfos << "don't play dead stream urls"<< llendl;
- mInternetStreamURL.clear();
- mInternetStreamMedia->addCommand(LLMediaBase::COMMAND_STOP);
- mInternetStreamMedia->updateMedia();
- stopInternetStream();
- }
- else if (url.empty())
- {
- llinfos << "url is emptly. Setting stream to NULL"<< llendl;
- mInternetStreamURL.clear();
- mInternetStreamMedia->addCommand(LLMediaBase::COMMAND_STOP);
- mInternetStreamMedia->updateMedia();
- }
- // Stream appears to be good, attempting to play
- else
- {
- // stop any other stream first
- stopInternetStream();
-
- llinfos << "Starting internet stream: " << url << llendl;
- mInternetStreamURL = url;
- mInternetStreamMedia->navigateTo(url);
- //llinfos << "Playing....." << llendl;
- mInternetStreamMedia->addCommand(LLMediaBase::COMMAND_START);
- mInternetStreamMedia->updateMedia();
- mStatus = LLMediaBase::STATUS_STARTED;
- }
-}
-
-// virtual
-void LLAudioEngine::stopInternetStream()
-{
- llinfos << "entered stopInternetStream()" << llendl;
- mInternetStreamURL.clear();
-
- if(mInternetStreamMedia)
- {
- if(!mInternetStreamMedia->addCommand(LLMediaBase::COMMAND_STOP))
- {
- llinfos << "attempting to stop stream failed!" << llendl;
- }
- mInternetStreamMedia->updateMedia();
- }
-
- mInternetStreamURL.clear();
-}
-
-// virtual
-void LLAudioEngine::pauseInternetStream(int pause)
-{
- llinfos << "entered pauseInternetStream()" << llendl;
-
- if(!mInternetStreamMedia)
- return;
-
- if(pause)
- {
- if(! mInternetStreamMedia->addCommand(LLMediaBase::COMMAND_PAUSE))
- {
- llinfos << "attempting to pause stream failed!" << llendl;
- }
- } else {
- if(! mInternetStreamMedia->addCommand(LLMediaBase::COMMAND_START))
- {
- llinfos << "attempting to unpause stream failed!" << llendl;
- }
- }
- mInternetStreamMedia->updateMedia();
-}
-
-// virtual
-void LLAudioEngine::updateInternetStream()
-{
- if (mInternetStreamMedia)
- mInternetStreamMedia->updateMedia();
-}
-
-// virtual
-int LLAudioEngine::isInternetStreamPlaying()
-{
- if (!mInternetStreamMedia)
- return 0;
-
- if (mInternetStreamMedia->getStatus() == LLMediaBase::STATUS_STARTED)
- {
- return 1; // Active and playing
- }
-
- if (mInternetStreamMedia->getStatus() == LLMediaBase::STATUS_PAUSED)
- {
- return 2; // paused
- }
-
- return 0; // Stopped
-}
-
-// virtual
-void LLAudioEngine::getInternetStreamInfo(char* artist, char* title)
-{
- artist[0] = 0;
- title[0] = 0;
-}
-
-// virtual
-void LLAudioEngine::setInternetStreamGain(F32 vol)
-{
- mInternetStreamGain = vol;
-
- if(!mInternetStreamMedia)
- return;
-
- vol = llclamp(vol, 0.f, 1.f);
- mInternetStreamMedia->setVolume(vol);
- mInternetStreamMedia->updateMedia();
-}
-
-// virtual
-const std::string& LLAudioEngine::getInternetStreamURL()
-{
- return mInternetStreamURL;
-}
-
-
-void LLAudioEngine::updateChannels()
-{
- S32 i;
- for (i = 0; i < MAX_CHANNELS; i++)
- {
- if (mChannels[i])
- {
- // set secondary gain if type is available
- LLAudioSource* source = mChannels[i]->getSource();
- if (source)
- {
- mChannels[i]->setSecondaryGain(mSecondaryGain[source->getType()]);
- }
-
- mChannels[i]->updateBuffer();
- mChannels[i]->update3DPosition();
- mChannels[i]->updateLoop();
- }
- }
-}
-
-static const F32 default_max_decode_time = .002f; // 2 ms
-void LLAudioEngine::idle(F32 max_decode_time)
-{
- if (max_decode_time <= 0.f)
- {
- max_decode_time = default_max_decode_time;
- }
-
- // "Update" all of our audio sources, clean up dead ones.
- // Primarily does position updating, cleanup of unused audio sources.
- // Also does regeneration of the current priority of each audio source.
-
- if (getMuted())
- {
- setInternalGain(0.f);
- }
- else
- {
- setInternalGain(getMasterGain());
- }
-
- S32 i;
- for (i = 0; i < MAX_BUFFERS; i++)
- {
- if (mBuffers[i])
- {
- mBuffers[i]->mInUse = false;
- }
- }
-
- F32 max_priority = -1.f;
- LLAudioSource *max_sourcep = NULL; // Maximum priority source without a channel
- source_map::iterator iter;
- for (iter = mAllSources.begin(); iter != mAllSources.end();)
- {
- LLAudioSource *sourcep = iter->second;
-
- // Update this source
- sourcep->update();
- sourcep->updatePriority();
-
- if (sourcep->isDone())
- {
- // The source is done playing, clean it up.
- delete sourcep;
- mAllSources.erase(iter++);
- continue;
- }
-
- if (!sourcep->getChannel() && sourcep->getCurrentBuffer())
- {
- // We could potentially play this sound if its priority is high enough.
- if (sourcep->getPriority() > max_priority)
- {
- max_priority = sourcep->getPriority();
- max_sourcep = sourcep;
- }
- }
-
- // Move on to the next source
- iter++;
- }
-
- // Now, do priority-based organization of audio sources.
- // All channels used, check priorities.
- // Find channel with lowest priority
- if (max_sourcep)
- {
- LLAudioChannel *channelp = getFreeChannel(max_priority);
- if (channelp)
- {
- //LL_INFOS("AudioEngine") << "Replacing source in channel due to priority!" << llendl;
- max_sourcep->setChannel(channelp);
- channelp->setSource(max_sourcep);
- if (max_sourcep->isSyncSlave())
- {
- // A sync slave, it doesn't start playing until it's synced up with the master.
- // Flag this channel as waiting for sync, and return true.
- channelp->setWaiting(true);
- }
- else
- {
- channelp->setWaiting(false);
- if (channelp->mCurrentBufferp)
- {
- channelp->play();
- }
- }
- }
- }
-
-
- // Do this BEFORE we update the channels
- // Update the channels to sync up with any changes that the source made,
- // such as changing what sound was playing.
- updateChannels();
-
- // Update queued sounds (switch to next queued data if the current has finished playing)
- for (iter = mAllSources.begin(); iter != mAllSources.end(); ++iter)
- {
- // This is lame, instead of this I could actually iterate through all the sources
- // attached to each channel, since only those with active channels
- // can have anything interesting happen with their queue? (Maybe not true)
- LLAudioSource *sourcep = iter->second;
- if (!sourcep->mQueuedDatap)
- {
- // Nothing queued, so we don't care.
- continue;
- }
-
- LLAudioChannel *channelp = sourcep->getChannel();
- if (!channelp)
- {
- // This sound isn't playing, so we just process move the queue
- sourcep->mCurrentDatap = sourcep->mQueuedDatap;
- sourcep->mQueuedDatap = NULL;
-
- // Reset the timer so the source doesn't die.
- sourcep->mAgeTimer.reset();
- // Make sure we have the buffer set up if we just decoded the data
- if (sourcep->mCurrentDatap)
- {
- updateBufferForData(sourcep->mCurrentDatap);
- }
-
- // Actually play the associated data.
- sourcep->setupChannel();
- channelp = sourcep->getChannel();
- if (channelp)
- {
- channelp->updateBuffer();
- sourcep->getChannel()->play();
- }
- continue;
- }
- else
- {
- // Check to see if the current sound is done playing, or looped.
- if (!channelp->isPlaying())
- {
- sourcep->mCurrentDatap = sourcep->mQueuedDatap;
- sourcep->mQueuedDatap = NULL;
-
- // Reset the timer so the source doesn't die.
- sourcep->mAgeTimer.reset();
-
- // Make sure we have the buffer set up if we just decoded the data
- if (sourcep->mCurrentDatap)
- {
- updateBufferForData(sourcep->mCurrentDatap);
- }
-
- // Actually play the associated data.
- sourcep->setupChannel();
- channelp->updateBuffer();
- sourcep->getChannel()->play();
- }
- else if (sourcep->isLoop())
- {
- // It's a loop, we need to check and see if we're done with it.
- if (channelp->mLoopedThisFrame)
- {
- sourcep->mCurrentDatap = sourcep->mQueuedDatap;
- sourcep->mQueuedDatap = NULL;
-
- // Actually, should do a time sync so if we're a loop master/slave
- // we don't drift away.
- sourcep->setupChannel();
- sourcep->getChannel()->play();
- }
- }
- }
- }
-
- // Lame, update the channels AGAIN.
- // Update the channels to sync up with any changes that the source made,
- // such as changing what sound was playing.
- updateChannels();
-
- // Hack! For now, just use a global sync master;
- LLAudioSource *sync_masterp = NULL;
- LLAudioChannel *master_channelp = NULL;
- F32 max_sm_priority = -1.f;
- for (iter = mAllSources.begin(); iter != mAllSources.end(); ++iter)
- {
- LLAudioSource *sourcep = iter->second;
- if (sourcep->isSyncMaster())
- {
- if (sourcep->getPriority() > max_sm_priority)
- {
- sync_masterp = sourcep;
- master_channelp = sync_masterp->getChannel();
- max_sm_priority = sourcep->getPriority();
- }
- }
- }
-
- if (master_channelp && master_channelp->mLoopedThisFrame)
- {
- // Synchronize loop slaves with their masters
- // Update queued sounds (switch to next queued data if the current has finished playing)
- for (iter = mAllSources.begin(); iter != mAllSources.end(); ++iter)
- {
- LLAudioSource *sourcep = iter->second;
-
- if (!sourcep->isSyncSlave())
- {
- // Not a loop slave, we don't need to do anything
- continue;
- }
-
- LLAudioChannel *channelp = sourcep->getChannel();
- if (!channelp)
- {
- // Not playing, don't need to bother.
- continue;
- }
-
- if (!channelp->isPlaying())
- {
- // Now we need to check if our loop master has just looped, and
- // start playback if that's the case.
- if (sync_masterp->getChannel())
- {
- channelp->playSynced(master_channelp);
- channelp->setWaiting(false);
- }
- }
- }
- }
-
- // Sync up everything that the audio engine needs done.
- commitDeferredChanges();
-
- // Flush unused buffers that are stale enough
- for (i = 0; i < MAX_BUFFERS; i++)
- {
- if (mBuffers[i])
- {
- if (!mBuffers[i]->mInUse && mBuffers[i]->mLastUseTimer.getElapsedTimeF32() > 30.f)
- {
- //LL_INFOS("AudioEngine") << "Flushing unused buffer!" << llendl;
- mBuffers[i]->mAudioDatap->mBufferp = NULL;
- delete mBuffers[i];
- mBuffers[i] = NULL;
- }
- }
- }
-
-
- // Clear all of the looped flags for the channels
- for (i = 0; i < MAX_CHANNELS; i++)
- {
- if (mChannels[i])
- {
- mChannels[i]->mLoopedThisFrame = false;
- }
- }
-
- // Decode audio files
- gAudioDecodeMgrp->processQueue(max_decode_time);
-
- // Call this every frame, just in case we somehow
- // missed picking it up in all the places that can add
- // or request new data.
- startNextTransfer();
-
- updateInternetStream();
-}
-
-
-
-bool LLAudioEngine::updateBufferForData(LLAudioData *adp, const LLUUID &audio_uuid)
-{
- if (!adp)
- {
- return false;
- }
-
- // Update the audio buffer first - load a sound if we have it.
- // Note that this could potentially cause us to waste time updating buffers
- // for sounds that actually aren't playing, although this should be mitigated
- // by the fact that we limit the number of buffers, and we flush buffers based
- // on priority.
- if (!adp->getBuffer())
- {
- if (adp->hasDecodedData())
- {
- return adp->load();
- }
- else if (adp->hasLocalData())
- {
- if (audio_uuid.notNull())
- {
- gAudioDecodeMgrp->addDecodeRequest(audio_uuid);
- }
- }
- else
- {
- return false;
- }
- }
- return true;
-}
-
-
-void LLAudioEngine::enableWind(bool enable)
-{
- if (enable && (!mEnableWind))
- {
- initWind();
- mEnableWind = enable;
- }
- else if (mEnableWind && (!enable))
- {
- mEnableWind = enable;
- cleanupWind();
- }
-}
-
-
-LLAudioBuffer *LLAudioEngine::getFreeBuffer()
-{
- static clock_t last_info = 0;
- static bool spamming = FALSE;
-
- S32 i;
- for (i = 0; i < MAX_BUFFERS; i++)
- {
- if (!mBuffers[i])
- {
- mBuffers[i] = createBuffer();
- return mBuffers[i];
- }
- }
-
-
- // Grab the oldest unused buffer
- F32 max_age = -1.f;
- S32 buffer_id = -1;
- for (i = 0; i < MAX_BUFFERS; i++)
- {
- if (mBuffers[i])
- {
- if (!mBuffers[i]->mInUse)
- {
- if (mBuffers[i]->mLastUseTimer.getElapsedTimeF32() > max_age)
- {
- max_age = mBuffers[i]->mLastUseTimer.getElapsedTimeF32();
- buffer_id = i;
- }
- }
- }
- }
-
- if (buffer_id >= 0)
- {
- if (clock() - last_info > CLOCKS_PER_SEC)
- {
- // Do not spam us with such messages...
- llinfos << "Taking over unused buffer " << buffer_id << llendl;
- last_info = clock();
- }
- else if (!spamming)
- {
- // ... but warn us *once* when the buffer freeing frequency is abnormal.
- llwarns << "Excessive buffer freeing frequency, info messages throttled." << llendl;
- spamming = true;
- }
- mBuffers[buffer_id]->mAudioDatap->mBufferp = NULL;
- delete mBuffers[buffer_id];
- mBuffers[buffer_id] = createBuffer();
- return mBuffers[buffer_id];
- }
- return NULL;
-}
-
-
-LLAudioChannel * LLAudioEngine::getFreeChannel(const F32 priority)
-{
- S32 i;
- for (i = 0; i < mNumChannels; i++)
- {
- if (!mChannels[i])
- {
- // No channel allocated here, use it.
- mChannels[i] = createChannel();
- return mChannels[i];
- }
- else
- {
- // Channel is allocated but not playing right now, use it.
- if (!mChannels[i]->isPlaying() && !mChannels[i]->isWaiting())
- {
- mChannels[i]->cleanup();
- if (mChannels[i]->getSource())
- {
- mChannels[i]->getSource()->setChannel(NULL);
- }
- return mChannels[i];
- }
- }
- }
-
- // All channels used, check priorities.
- // Find channel with lowest priority and see if we want to replace it.
- F32 min_priority = 10000.f;
- LLAudioChannel *min_channelp = NULL;
-
- for (i = 0; i < mNumChannels; i++)
- {
- LLAudioChannel *channelp = mChannels[i];
- LLAudioSource *sourcep = channelp->getSource();
- if (sourcep && sourcep->getPriority() < min_priority)
- {
- min_channelp = channelp;
- min_priority = sourcep->getPriority();
- }
- }
-
- if (min_priority > priority || !min_channelp)
- {
- // All playing channels have higher priority, return.
- return NULL;
- }
-
- // Flush the minimum priority channel, and return it.
- min_channelp->cleanup();
- min_channelp->getSource()->setChannel(NULL);
- return min_channelp;
-}
-
-
-void LLAudioEngine::cleanupBuffer(LLAudioBuffer *bufferp)
-{
- S32 i;
- for (i = 0; i < MAX_BUFFERS; i++)
- {
- if (mBuffers[i] == bufferp)
- {
- delete mBuffers[i];
- mBuffers[i] = NULL;
- }
- }
-}
-
-
-bool LLAudioEngine::preloadSound(const LLUUID &uuid)
-{
- gAudiop->getAudioData(uuid); // We don't care about the return value, this is just to make sure
- // that we have an entry, which will mean that the audio engine knows about this
-
- if (gAudioDecodeMgrp->addDecodeRequest(uuid))
- {
- // This means that we do have a local copy, and we're working on decoding it.
- return true;
- }
-
- // At some point we need to have the audio/asset system check the static VFS
- // before it goes off and fetches stuff from the server.
- //llwarns << "Used internal preload for non-local sound" << llendl;
- return false;
-}
-
-
-bool LLAudioEngine::isWindEnabled()
-{
- return mEnableWind;
-}
-
-
-void LLAudioEngine::setMuted(bool muted)
-{
- mMuted = muted;
- enableWind(!mMuted);
-}
-
-
-void LLAudioEngine::setMasterGain(const F32 gain)
-{
- mMasterGain = gain;
- setInternalGain(gain);
-}
-
-F32 LLAudioEngine::getMasterGain()
-{
- return mMasterGain;
-}
-
-void LLAudioEngine::setSecondaryGain(S32 type, F32 gain)
-{
- llassert(type < LLAudioEngine::AUDIO_TYPE_COUNT);
-
- mSecondaryGain[type] = gain;
-}
-
-F32 LLAudioEngine::getSecondaryGain(S32 type)
-{
- return mSecondaryGain[type];
-}
-
-F32 LLAudioEngine::getInternetStreamGain()
-{
- return mInternetStreamGain;
-}
-
-void LLAudioEngine::setMaxWindGain(F32 gain)
-{
- mMaxWindGain = gain;
-}
-
-
-F64 LLAudioEngine::mapWindVecToGain(LLVector3 wind_vec)
-{
- F64 gain = 0.0;
-
- gain = wind_vec.magVec();
-
- if (gain)
- {
- if (gain > 20)
- {
- gain = 20;
- }
- gain = gain/20.0;
- }
-
- return (gain);
-}
-
-
-F64 LLAudioEngine::mapWindVecToPitch(LLVector3 wind_vec)
-{
- LLVector3 listen_right;
- F64 theta;
-
- // Wind frame is in listener-relative coordinates
- LLVector3 norm_wind = wind_vec;
- norm_wind.normVec();
- listen_right.setVec(1.0,0.0,0.0);
-
- // measure angle between wind vec and listener right axis (on 0,PI)
- theta = acos(norm_wind * listen_right);
-
- // put it on 0, 1
- theta /= F_PI;
-
- // put it on [0, 0.5, 0]
- if (theta > 0.5) theta = 1.0-theta;
- if (theta < 0) theta = 0;
-
- return (theta);
-}
-
-
-F64 LLAudioEngine::mapWindVecToPan(LLVector3 wind_vec)
-{
- LLVector3 listen_right;
- F64 theta;
-
- // Wind frame is in listener-relative coordinates
- listen_right.setVec(1.0,0.0,0.0);
-
- LLVector3 norm_wind = wind_vec;
- norm_wind.normVec();
-
- // measure angle between wind vec and listener right axis (on 0,PI)
- theta = acos(norm_wind * listen_right);
-
- // put it on 0, 1
- theta /= F_PI;
-
- return (theta);
-}
-
-
-void LLAudioEngine::triggerSound(const LLUUID &audio_uuid, const LLUUID& owner_id, const F32 gain,
- const S32 type, const LLVector3d &pos_global)
-{
- // Create a new source (since this can't be associated with an existing source.
- //LL_INFOS("AudioEngine") << "Localized: " << audio_uuid << llendl;
-
- //If we cannot hear it, dont even try to load the sound.
- if (mMuted || gain == 0.0)
- {
- return;
- }
-
- LLUUID source_id;
- source_id.generate();
-
- LLAudioSource *asp = new LLAudioSource(source_id, owner_id, gain, type);
- gAudiop->addAudioSource(asp);
- if (pos_global.isExactlyZero())
- {
- asp->setAmbient(true);
- }
- else
- {
- asp->setPositionGlobal(pos_global);
- }
- asp->updatePriority();
- asp->play(audio_uuid);
-}
-
-
-void LLAudioEngine::setListenerPos(LLVector3 aVec)
-{
- mListenerp->setPosition(aVec);
-}
-
-
-LLVector3 LLAudioEngine::getListenerPos()
-{
- if (mListenerp)
- {
- return(mListenerp->getPosition());
- }
- else
- {
- return(LLVector3::zero);
- }
-}
-
-
-void LLAudioEngine::setListenerVelocity(LLVector3 aVec)
-{
- mListenerp->setVelocity(aVec);
-}
-
-
-void LLAudioEngine::translateListener(LLVector3 aVec)
-{
- mListenerp->translate(aVec);
-}
-
-
-void LLAudioEngine::orientListener(LLVector3 up, LLVector3 at)
-{
- mListenerp->orient(up, at);
-}
-
-
-void LLAudioEngine::setListener(LLVector3 pos, LLVector3 vel, LLVector3 up, LLVector3 at)
-{
- mListenerp->set(pos,vel,up,at);
-}
-
-
-void LLAudioEngine::setDopplerFactor(F32 factor)
-{
- if (mListenerp)
- {
- mListenerp->setDopplerFactor(factor);
- }
-}
-
-
-F32 LLAudioEngine::getDopplerFactor()
-{
- if (mListenerp)
- {
- return mListenerp->getDopplerFactor();
- }
- else
- {
- return 0.f;
- }
-}
-
-
-void LLAudioEngine::setDistanceFactor(F32 factor)
-{
- if (mListenerp)
- {
- mListenerp->setDistanceFactor(factor);
- }
-}
-
-
-F32 LLAudioEngine::getDistanceFactor()
-{
- if (mListenerp)
- {
- return mListenerp->getDistanceFactor();
- }
- else
- {
- return 0.f;
- }
-}
-
-
-void LLAudioEngine::setRolloffFactor(F32 factor)
-{
- if (mListenerp)
- {
- mListenerp->setRolloffFactor(factor);
- }
-}
-
-
-F32 LLAudioEngine::getRolloffFactor()
-{
- if (mListenerp)
- {
- return mListenerp->getRolloffFactor();
- }
- else
- {
- return 0.f;
- }
-}
-
-
-void LLAudioEngine::commitDeferredChanges()
-{
- mListenerp->commitDeferredChanges();
-}
-
-
-LLAudioSource *LLAudioEngine::findAudioSource(const LLUUID &source_id)
-{
- source_map::iterator iter;
- iter = mAllSources.find(source_id);
-
- if (iter == mAllSources.end())
- {
- return NULL;
- }
- else
- {
- return iter->second;
- }
-}
-
-
-LLAudioData *LLAudioEngine::getAudioData(const LLUUID &audio_uuid)
-{
- data_map::iterator iter;
- iter = mAllData.find(audio_uuid);
- if (iter == mAllData.end())
- {
- // Create the new audio data
- LLAudioData *adp = new LLAudioData(audio_uuid);
- mAllData[audio_uuid] = adp;
- return adp;
- }
- else
- {
- return iter->second;
- }
-}
-
-void LLAudioEngine::addAudioSource(LLAudioSource *asp)
-{
- mAllSources[asp->getID()] = asp;
-}
-
-
-void LLAudioEngine::cleanupAudioSource(LLAudioSource *asp)
-{
- source_map::iterator iter;
- iter = mAllSources.find(asp->getID());
- if (iter == mAllSources.end())
- {
- llwarns << "Cleaning up unknown audio source!" << llendl;
- return;
- }
- delete asp;
- mAllSources.erase(iter);
-}
-
-
-bool LLAudioEngine::hasDecodedFile(const LLUUID &uuid)
-{
- std::string uuid_str;
- uuid.toString(uuid_str);
-
- std::string wav_path;
- wav_path = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_str);
- wav_path += ".dsf";
-
- if (gDirUtilp->fileExists(wav_path))
- {
- return true;
- }
- else
- {
- return false;
- }
-}
-
-
-bool LLAudioEngine::hasLocalFile(const LLUUID &uuid)
-{
- // See if it's in the VFS.
- return gVFS->getExists(uuid, LLAssetType::AT_SOUND);
-}
-
-
-void LLAudioEngine::startNextTransfer()
-{
- //LL_INFOS("AudioEngine") << "LLAudioEngine::startNextTransfer()" << llendl;
- if (mCurrentTransfer.notNull() || getMuted())
- {
- //LL_INFOS("AudioEngine") << "Transfer in progress, aborting" << llendl;
- return;
- }
-
- // Get the ID for the next asset that we want to transfer.
- // Pick one in the following order:
- LLUUID asset_id;
- S32 i;
- LLAudioSource *asp = NULL;
- LLAudioData *adp = NULL;
- data_map::iterator data_iter;
-
- // Check all channels for currently playing sounds.
- F32 max_pri = -1.f;
- for (i = 0; i < MAX_CHANNELS; i++)
- {
- if (!mChannels[i])
- {
- continue;
- }
-
- asp = mChannels[i]->getSource();
- if (!asp)
- {
- continue;
- }
- if (asp->getPriority() <= max_pri)
- {
- continue;
- }
-
- if (asp->getPriority() <= max_pri)
- {
- continue;
- }
-
- adp = asp->getCurrentData();
- if (!adp)
- {
- continue;
- }
-
- if (!adp->hasLocalData() && adp->hasValidData())
- {
- asset_id = adp->getID();
- max_pri = asp->getPriority();
- }
- }
-
- // Check all channels for currently queued sounds.
- if (asset_id.isNull())
- {
- max_pri = -1.f;
- for (i = 0; i < MAX_CHANNELS; i++)
- {
- if (!mChannels[i])
- {
- continue;
- }
-
- LLAudioSource *asp;
- asp = mChannels[i]->getSource();
- if (!asp)
- {
- continue;
- }
-
- if (asp->getPriority() <= max_pri)
- {
- continue;
- }
-
- adp = asp->getQueuedData();
- if (!adp)
- {
- continue;
- }
-
- if (!adp->hasLocalData() && adp->hasValidData())
- {
- asset_id = adp->getID();
- max_pri = asp->getPriority();
- }
- }
- }
-
- // Check all live channels for other sounds (preloads).
- if (asset_id.isNull())
- {
- max_pri = -1.f;
- for (i = 0; i < MAX_CHANNELS; i++)
- {
- if (!mChannels[i])
- {
- continue;
- }
-
- LLAudioSource *asp;
- asp = mChannels[i]->getSource();
- if (!asp)
- {
- continue;
- }
-
- if (asp->getPriority() <= max_pri)
- {
- continue;
- }
-
-
- for (data_iter = asp->mPreloadMap.begin(); data_iter != asp->mPreloadMap.end(); data_iter++)
- {
- LLAudioData *adp = data_iter->second;
- if (!adp)
- {
- continue;
- }
-
- if (!adp->hasLocalData() && adp->hasValidData())
- {
- asset_id = adp->getID();
- max_pri = asp->getPriority();
- }
- }
- }
- }
-
- // Check all sources
- if (asset_id.isNull())
- {
- max_pri = -1.f;
- source_map::iterator source_iter;
- for (source_iter = mAllSources.begin(); source_iter != mAllSources.end(); source_iter++)
- {
- asp = source_iter->second;
- if (!asp)
- {
- continue;
- }
-
- if (asp->getPriority() <= max_pri)
- {
- continue;
- }
-
- adp = asp->getCurrentData();
- if (adp && !adp->hasLocalData() && adp->hasValidData())
- {
- asset_id = adp->getID();
- max_pri = asp->getPriority();
- continue;
- }
-
- adp = asp->getQueuedData();
- if (adp && !adp->hasLocalData() && adp->hasValidData())
- {
- asset_id = adp->getID();
- max_pri = asp->getPriority();
- continue;
- }
-
- for (data_iter = asp->mPreloadMap.begin(); data_iter != asp->mPreloadMap.end(); data_iter++)
- {
- LLAudioData *adp = data_iter->second;
- if (!adp)
- {
- continue;
- }
-
- if (!adp->hasLocalData() && adp->hasValidData())
- {
- asset_id = adp->getID();
- max_pri = asp->getPriority();
- break;
- }
- }
- }
- }
-
- if (asset_id.notNull())
- {
- LL_INFOS("AudioEngine") << "Getting asset data for: " << asset_id << llendl;
- gAudiop->mCurrentTransfer = asset_id;
- gAudiop->mCurrentTransferTimer.reset();
- gAssetStorage->getAssetData(asset_id, LLAssetType::AT_SOUND,
- assetCallback, NULL);
- }
- else
- {
- //LL_INFOS("AudioEngine") << "No pending transfers?" << llendl;
- }
-}
-
-
-// static
-void LLAudioEngine::assetCallback(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type, void *user_data, S32 result_code, LLExtStat ext_status)
-{
- if (result_code)
- {
- LL_INFOS("AudioEngine") << "Boom, error in audio file transfer: " << LLAssetStorage::getErrorString( result_code ) << " (" << result_code << ")" << llendl;
- // Need to mark data as bad to avoid constant rerequests.
- LLAudioData *adp = gAudiop->getAudioData(uuid);
- if (adp)
- {
- adp->setHasValidData(false);
- adp->setHasLocalData(false);
- adp->setHasDecodedData(false);
- }
- }
- else
- {
- LLAudioData *adp = gAudiop->getAudioData(uuid);
- if (!adp)
- {
- // Should never happen
- llwarns << "Got asset callback without audio data for " << uuid << llendl;
- }
- else
- {
- adp->setHasValidData(true);
- adp->setHasLocalData(true);
- gAudioDecodeMgrp->addDecodeRequest(uuid);
- }
- }
- gAudiop->mCurrentTransfer = LLUUID::null;
- gAudiop->startNextTransfer();
-}
-
-
-//
-// LLAudioSource implementation
-//
-
-
-LLAudioSource::LLAudioSource(const LLUUID& id, const LLUUID& owner_id, const F32 gain, const S32 type)
-: mID(id),
- mOwnerID(owner_id),
- mPriority(0.f),
- mGain(gain),
- mType(type),
- mAmbient(false),
- mLoop(false),
- mSyncMaster(false),
- mSyncSlave(false),
- mQueueSounds(false),
- mPlayedOnce(false),
- mChannelp(NULL),
- mCurrentDatap(NULL),
- mQueuedDatap(NULL)
-{
-}
-
-
-LLAudioSource::~LLAudioSource()
-{
- if (mChannelp)
- {
- // Stop playback of this sound
- mChannelp->setSource(NULL);
- mChannelp = NULL;
- }
-}
-
-
-void LLAudioSource::setChannel(LLAudioChannel *channelp)
-{
- if (channelp == mChannelp)
- {
- return;
- }
-
- mChannelp = channelp;
-}
-
-
-void LLAudioSource::update()
-{
- if (!getCurrentBuffer())
- {
- if (getCurrentData())
- {
- // Hack - try and load the sound. Will do this as a callback
- // on decode later.
- if (getCurrentData()->load())
- {
- play(getCurrentData()->getID());
- }
- }
- }
-}
-
-void LLAudioSource::updatePriority()
-{
- if (isAmbient())
- {
- mPriority = 1.f;
- }
- else
- {
- // Priority is based on distance
- LLVector3 dist_vec;
- dist_vec.setVec(getPositionGlobal());
- dist_vec -= gAudiop->getListenerPos();
- F32 dist_squared = llmax(1.f, dist_vec.magVecSquared());
-
- mPriority = mGain / dist_squared;
- }
-}
-
-bool LLAudioSource::setupChannel()
-{
- LLAudioData *adp = getCurrentData();
-
- if (!adp->getBuffer())
- {
- // We're not ready to play back the sound yet, so don't try and allocate a channel for it.
- //llwarns << "Aborting, no buffer" << llendl;
- return false;
- }
-
-
- if (!mChannelp)
- {
- // Update the priority, in case we need to push out another channel.
- updatePriority();
-
- setChannel(gAudiop->getFreeChannel(getPriority()));
- }
-
- if (!mChannelp)
- {
- // Ugh, we don't have any free channels.
- // Now we have to reprioritize.
- // For now, just don't play the sound.
- //llwarns << "Aborting, no free channels" << llendl;
- return false;
- }
-
- mChannelp->setSource(this);
- return true;
-}
-
-
-bool LLAudioSource::play(const LLUUID &audio_uuid)
-{
- if (audio_uuid.isNull())
- {
- if (getChannel())
- {
- getChannel()->setSource(NULL);
- setChannel(NULL);
- addAudioData(NULL, true);
- }
- }
- // Reset our age timeout if someone attempts to play the source.
- mAgeTimer.reset();
-
- LLAudioData *adp = gAudiop->getAudioData(audio_uuid);
-
- bool has_buffer = gAudiop->updateBufferForData(adp, audio_uuid);
-
-
- addAudioData(adp);
-
- if (!has_buffer)
- {
- // Don't bother trying to set up a channel or anything, we don't have an audio buffer.
- return false;
- }
-
- if (!setupChannel())
- {
- return false;
- }
-
- if (isSyncSlave())
- {
- // A sync slave, it doesn't start playing until it's synced up with the master.
- // Flag this channel as waiting for sync, and return true.
- getChannel()->setWaiting(true);
- return true;
- }
-
- getChannel()->play();
- return true;
-}
-
-
-bool LLAudioSource::isDone()
-{
- const F32 MAX_AGE = 60.f;
- const F32 MAX_UNPLAYED_AGE = 15.f;
-
- if (isLoop())
- {
- // Looped sources never die on their own.
- return false;
- }
-
-
- if (hasPendingPreloads())
- {
- return false;
- }
-
- if (mQueuedDatap)
- {
- // Don't kill this sound if we've got something queued up to play.
- return false;
- }
-
- F32 elapsed = mAgeTimer.getElapsedTimeF32();
-
- // This is a single-play source
- if (!mChannelp)
- {
- if ((elapsed > MAX_UNPLAYED_AGE) || mPlayedOnce)
- {
- // We don't have a channel assigned, and it's been
- // over 5 seconds since we tried to play it. Don't bother.
- //llinfos << "No channel assigned, source is done" << llendl;
- return true;
- }
- else
- {
- return false;
- }
- }
-
- if (mChannelp->isPlaying())
- {
- if (elapsed > MAX_AGE)
- {
- // Arbitarily cut off non-looped sounds when they're old.
- return true;
- }
- else
- {
- // Sound is still playing and we haven't timed out, don't kill it.
- return false;
- }
- }
-
- if ((elapsed > MAX_UNPLAYED_AGE) || mPlayedOnce)
- {
- // The sound isn't playing back after 5 seconds or we're already done playing it, kill it.
- return true;
- }
-
- return false;
-}
-
-
-void LLAudioSource::addAudioData(LLAudioData *adp, const bool set_current)
-{
- // Only handle a single piece of audio data associated with a source right now,
- // until I implement prefetch.
- if (set_current)
- {
- if (!mCurrentDatap)
- {
- mCurrentDatap = adp;
- if (mChannelp)
- {
- mChannelp->updateBuffer();
- mChannelp->play();
- }
-
- // Make sure the audio engine knows that we want to request this sound.
- gAudiop->startNextTransfer();
- return;
- }
- else if (mQueueSounds)
- {
- // If we have current data, and we're queuing, put
- // the object onto the queue.
- if (mQueuedDatap)
- {
- // We only queue one sound at a time, and it's a FIFO.
- // Don't put it onto the queue.
- return;
- }
-
- if (adp == mCurrentDatap && isLoop())
- {
- // No point in queueing the same sound if
- // we're looping.
- return;
- }
- mQueuedDatap = adp;
-
- // Make sure the audio engine knows that we want to request this sound.
- gAudiop->startNextTransfer();
- }
- else
- {
- if (mCurrentDatap != adp)
- {
- // Right now, if we're currently playing this sound in a channel, we
- // update the buffer that the channel's associated with
- // and play it. This may not be the correct behavior.
- mCurrentDatap = adp;
- if (mChannelp)
- {
- mChannelp->updateBuffer();
- mChannelp->play();
- }
- // Make sure the audio engine knows that we want to request this sound.
- gAudiop->startNextTransfer();
- }
- }
- }
- else
- {
- // Add it to the preload list.
- mPreloadMap[adp->getID()] = adp;
- gAudiop->startNextTransfer();
- }
-}
-
-
-bool LLAudioSource::hasPendingPreloads() const
-{
- // Check to see if we've got any preloads on deck for this source
- data_map::const_iterator iter;
- for (iter = mPreloadMap.begin(); iter != mPreloadMap.end(); iter++)
- {
- LLAudioData *adp = iter->second;
- // note: a bad UUID will forever be !hasDecodedData()
- // but also !hasValidData(), hence the check for hasValidData()
- if (!adp->hasDecodedData() && adp->hasValidData())
- {
- // This source is still waiting for a preload
- return true;
- }
- }
-
- return false;
-}
-
-
-LLAudioData *LLAudioSource::getCurrentData()
-{
- return mCurrentDatap;
-}
-
-LLAudioData *LLAudioSource::getQueuedData()
-{
- return mQueuedDatap;
-}
-
-LLAudioBuffer *LLAudioSource::getCurrentBuffer()
-{
- if (!mCurrentDatap)
- {
- return NULL;
- }
-
- return mCurrentDatap->getBuffer();
-}
-
-
-
-
-//
-// LLAudioChannel implementation
-//
-
-
-LLAudioChannel::LLAudioChannel() :
- mCurrentSourcep(NULL),
- mCurrentBufferp(NULL),
- mLoopedThisFrame(false),
- mWaiting(false),
- mSecondaryGain(1.0f)
-{
-}
-
-
-LLAudioChannel::~LLAudioChannel()
-{
- // Need to disconnect any sources which are using this channel.
- //LL_INFOS("AudioEngine") << "Cleaning up audio channel" << llendl;
- if (mCurrentSourcep)
- {
- mCurrentSourcep->setChannel(NULL);
- }
- mCurrentBufferp = NULL;
-}
-
-
-void LLAudioChannel::setSource(LLAudioSource *sourcep)
-{
- //LL_INFOS("AudioEngine") << this << ": setSource(" << sourcep << ")" << llendl;
-
- if (!sourcep)
- {
- // Clearing the source for this channel, don't need to do anything.
- //LL_INFOS("AudioEngine") << "Clearing source for channel" << llendl;
- cleanup();
- mCurrentSourcep = NULL;
- mWaiting = false;
- return;
- }
-
- if (sourcep == mCurrentSourcep)
- {
- // Don't reallocate the channel, this will make FMOD goofy.
- //LL_INFOS("AudioEngine") << "Calling setSource with same source!" << llendl;
- }
-
- mCurrentSourcep = sourcep;
-
-
- updateBuffer();
- update3DPosition();
-}
-
-
-bool LLAudioChannel::updateBuffer()
-{
- if (!mCurrentSourcep)
- {
- // This channel isn't associated with any source, nothing
- // to be updated
- return false;
- }
-
- // Initialize the channel's gain setting for this sound.
- if(gAudiop)
- {
- setSecondaryGain(gAudiop->getSecondaryGain(mCurrentSourcep->getType()));
- }
-
- LLAudioBuffer *bufferp = mCurrentSourcep->getCurrentBuffer();
- if (bufferp == mCurrentBufferp)
- {
- if (bufferp)
- {
- // The source hasn't changed what buffer it's playing
- bufferp->mLastUseTimer.reset();
- bufferp->mInUse = true;
- }
- return false;
- }
-
- //
- // The source changed what buffer it's playing. We need to clean up
- // the existing channel
- //
- cleanup();
-
- mCurrentBufferp = bufferp;
- if (bufferp)
- {
- bufferp->mLastUseTimer.reset();
- bufferp->mInUse = true;
- }
-
- if (!mCurrentBufferp)
- {
- // There's no new buffer to be played, so we just abort.
- return false;
- }
-
- return true;
-}
-
-
-
-
-//
-// LLAudioData implementation
-//
-
-
-LLAudioData::LLAudioData(const LLUUID &uuid) :
- mID(uuid),
- mBufferp(NULL),
- mHasLocalData(false),
- mHasDecodedData(false),
- mHasValidData(true)
-{
- if (uuid.isNull())
- {
- // This is a null sound.
- return;
- }
-
- if (gAudiop && gAudiop->hasDecodedFile(uuid))
- {
- // Already have a decoded version, don't need to decode it.
- mHasLocalData = true;
- mHasDecodedData = true;
- }
- else if (gAssetStorage && gAssetStorage->hasLocalAsset(uuid, LLAssetType::AT_SOUND))
- {
- mHasLocalData = true;
- }
-}
-
-
-bool LLAudioData::load()
-{
- static clock_t last_info = 0;
-
- // For now, just assume we're going to use one buffer per audiodata.
- if (mBufferp)
- {
- // We already have this sound in a buffer, don't do anything.
- llinfos << "Already have a buffer for this sound, don't bother loading!" << llendl;
- return true;
- }
-
- mBufferp = gAudiop->getFreeBuffer();
- if (!mBufferp)
- {
- // No free buffers, abort.
- if (clock() - last_info > CLOCKS_PER_SEC) // Do not spam us with such messages
- {
- llinfos << "Not able to allocate a new audio buffer, aborting." << llendl;
- last_info = clock();
- }
- return false;
- }
-
- std::string uuid_str;
- std::string wav_path;
- mID.toString(uuid_str);
- wav_path= gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_str) + ".dsf";
-
- if (!mBufferp->loadWAV(wav_path))
- {
- // Hrm. Right now, let's unset the buffer, since it's empty.
- gAudiop->cleanupBuffer(mBufferp);
- mBufferp = NULL;
-
- // Maybe it was removed by another instance. Send it to the preload queue.
- gAudiop->preloadSound(mID);
-
- return false;
- }
- mBufferp->mAudioDatap = this;
- return true;
-}
-
-
diff --git a/linden/indra/llaudio/audioengine.h b/linden/indra/llaudio/audioengine.h
deleted file mode 100644
index e46091c..0000000
--- a/linden/indra/llaudio/audioengine.h
+++ /dev/null
@@ -1,466 +0,0 @@
-/**
- * @file audioengine.h
- * @brief Definition of LLAudioEngine base class abstracting the audio support
- *
- * $LicenseInfo:firstyear=2000&license=viewergpl$
- *
- * Copyright (c) 2000-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-
-#ifndef LL_AUDIOENGINE_H
-#define LL_AUDIOENGINE_H
-
-#include
-#include
-
-#include "listener.h"
-#include "v3math.h"
-#include "v3dmath.h"
-#include "listener.h"
-#include "lltimer.h"
-#include "lluuid.h"
-#include "llframetimer.h"
-#include "llassettype.h"
-
-#include "llmediabase.h"
-
-class LLMediaBase;
-
-const F32 LL_WIND_UPDATE_INTERVAL = 0.1f;
-const F32 LL_ROLLOFF_MULTIPLIER_UNDER_WATER = 5.f; // How much sounds are weaker under water
-const F32 LL_WIND_UNDERWATER_CENTER_FREQ = 20.f;
-
-const F32 ATTACHED_OBJECT_TIMEOUT = 5.0f;
-const F32 DEFAULT_MIN_DISTANCE = 2.0f;
-
-#define MAX_CHANNELS 30
-// Number of maximum rezzed objects with sounds + sounds without an object + UI sounds.
-#define MAX_BUFFERS 100
-
-// This define is intended to allow us to switch from os based wav
-// file loading to vfs based wav file loading. The problem is that I
-// am unconvinced that the LLWaveFile works for loading sounds from
-// memory. So, until that is fixed up, changed, whatever, this remains
-// undefined.
-//#define USE_WAV_VFILE
-
-class LLVFS;
-
-class LLAudioSource;
-class LLAudioData;
-class LLAudioChannel;
-class LLAudioChannelOpenAL;
-class LLAudioBuffer;
-
-
-
-//
-// LLAudioEngine definition
-//
-
-class LLAudioEngine
-{
- friend class LLAudioChannelOpenAL; // bleh. channel needs some listener methods.
-
-public:
- enum LLAudioType
- {
- AUDIO_TYPE_NONE = 0,
- AUDIO_TYPE_SFX = 1,
- AUDIO_TYPE_UI = 2,
- AUDIO_TYPE_AMBIENT = 3,
- AUDIO_TYPE_GESTURE = 4,
- AUDIO_TYPE_COUNT = 5 // last
- };
-
- LLAudioEngine();
- virtual ~LLAudioEngine();
-
- // initialization/startup/shutdown
- virtual bool init(const S32 num_channels, void *userdata);
- virtual std::string getDriverName(bool verbose) = 0;
- virtual void shutdown();
-
- // Used by the mechanics of the engine
- //virtual void processQueue(const LLUUID &sound_guid);
- virtual void setListener(LLVector3 pos,LLVector3 vel,LLVector3 up,LLVector3 at);
- virtual void updateWind(LLVector3 direction, F32 camera_height_above_water) = 0;
- virtual void idle(F32 max_decode_time = 0.f);
- virtual void updateChannels();
-
- //
- // "End user" functionality
- //
- virtual bool isWindEnabled();
- virtual void enableWind(bool state_b);
-
- // Use these for temporarily muting the audio system.
- // Does not change buffers, initialization, etc. but
- // stops playing new sounds.
- virtual void setMuted(bool muted);
- virtual bool getMuted() const { return mMuted; }
-
- F32 getMasterGain();
- void setMasterGain(F32 gain);
-
- F32 getSecondaryGain(S32 type);
- void setSecondaryGain(S32 type, F32 gain);
-
- F32 getInternetStreamGain();
-
- virtual void setDopplerFactor(F32 factor);
- virtual F32 getDopplerFactor();
- virtual void setDistanceFactor(F32 factor);
- virtual F32 getDistanceFactor();
- virtual void setRolloffFactor(F32 factor);
- virtual F32 getRolloffFactor();
- virtual void setMaxWindGain(F32 gain);
-
-
- // Methods actually related to setting up and removing sounds
- // Owner ID is the owner of the object making the request
- void triggerSound(const LLUUID &sound_id, const LLUUID& owner_id, const F32 gain,
- const S32 type = LLAudioEngine::AUDIO_TYPE_NONE,
- const LLVector3d &pos_global = LLVector3d::zero);
- bool preloadSound(const LLUUID &id);
-
- void addAudioSource(LLAudioSource *asp);
- void cleanupAudioSource(LLAudioSource *asp);
-
- LLAudioSource *findAudioSource(const LLUUID &source_id);
- LLAudioData *getAudioData(const LLUUID &audio_uuid);
-
-
- // Internet stream methods
- virtual void startInternetStream(const std::string& url);
- virtual void stopInternetStream();
- virtual void pauseInternetStream(int pause);
- virtual void updateInternetStream();
- virtual int isInternetStreamPlaying();
- virtual void getInternetStreamInfo(char* artist, char* title);
- // use a value from 0.0 to 1.0, inclusive
- virtual void setInternetStreamGain(F32 vol);
- virtual const std::string& getInternetStreamURL();
- virtual LLMediaBase::EStatus getStatus();
-
- // For debugging usage
- virtual LLVector3 getListenerPos();
-
- LLAudioBuffer *getFreeBuffer(); // Get a free buffer, or flush an existing one if you have to.
- LLAudioChannel *getFreeChannel(const F32 priority); // Get a free channel or flush an existing one if your priority is higher
- void cleanupBuffer(LLAudioBuffer *bufferp);
-
- bool hasDecodedFile(const LLUUID &uuid);
- bool hasLocalFile(const LLUUID &uuid);
-
- bool updateBufferForData(LLAudioData *adp, const LLUUID &audio_uuid = LLUUID::null);
-
-
- // Asset callback when we're retrieved a sound from the asset server.
- void startNextTransfer();
- static void assetCallback(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type, void *user_data, S32 result_code, LLExtStat ext_status);
-
- friend class LLPipeline; // For debugging
-
- LLMediaBase * getStreamMedia() { return mInternetStreamMedia; }
-public:
- F32 mMaxWindGain; // Hack. Public to set before fade in?
-
-protected:
- virtual LLAudioBuffer *createBuffer() = 0;
- virtual LLAudioChannel *createChannel() = 0;
-
- virtual void initWind() = 0;
- virtual void cleanupWind() = 0;
- virtual void setInternalGain(F32 gain) = 0;
-
- void commitDeferredChanges();
-
- virtual void allocateListener() = 0;
-
-
- // listener methods
- virtual void setListenerPos(LLVector3 vec);
- virtual void setListenerVelocity(LLVector3 vec);
- virtual void orientListener(LLVector3 up, LLVector3 at);
- virtual void translateListener(LLVector3 vec);
-
-
- F64 mapWindVecToGain(LLVector3 wind_vec);
- F64 mapWindVecToPitch(LLVector3 wind_vec);
- F64 mapWindVecToPan(LLVector3 wind_vec);
-
-protected:
- LLListener *mListenerp;
-
- bool mMuted;
- void* mUserData;
-
- S32 mLastStatus;
-
- S32 mNumChannels;
- bool mEnableWind;
-
- LLUUID mCurrentTransfer; // Audio file currently being transferred by the system
- LLFrameTimer mCurrentTransferTimer;
-
- // A list of all audio sources that are known to the viewer at this time.
- // This is most likely a superset of the ones that we actually have audio
- // data for, or are playing back.
- typedef std::map source_map;
- typedef std::map data_map;
-
- source_map mAllSources;
- data_map mAllData;
-
- LLAudioChannel *mChannels[MAX_CHANNELS];
-
- // Buffers needs to change into a different data structure, as the number of buffers
- // that we have active should be limited by RAM usage, not count.
- LLAudioBuffer *mBuffers[MAX_BUFFERS];
-
- F32 mMasterGain;
- F32 mSecondaryGain[AUDIO_TYPE_COUNT];
-
- // Hack! Internet streams are treated differently from other sources!
- F32 mInternetStreamGain;
- std::string mInternetStreamURL;
-
- F32 mNextWindUpdate;
-
- LLFrameTimer mWindUpdateTimer;
-
- LLMediaBase::EStatus mStatus;
-
-private:
- void setDefaults();
- LLMediaBase *mInternetStreamMedia;
-};
-
-
-
-
-//
-// Standard audio source. Can be derived from for special sources, such as those attached to objects.
-//
-
-
-class LLAudioSource
-{
-public:
- // owner_id is the id of the agent responsible for making this sound
- // play, for example, the owner of the object currently playing it
- LLAudioSource(const LLUUID &id, const LLUUID& owner_id, const F32 gain, const S32 type = LLAudioEngine::AUDIO_TYPE_NONE);
- virtual ~LLAudioSource();
-
- virtual void update(); // Update this audio source
- void updatePriority();
-
- void preload(const LLUUID &audio_id); // Only used for preloading UI sounds, now.
-
- void addAudioData(LLAudioData *adp, bool set_current = TRUE);
-
- void setAmbient(const bool ambient) { mAmbient = ambient; }
- bool isAmbient() const { return mAmbient; }
-
- void setLoop(const bool loop) { mLoop = loop; }
- bool isLoop() const { return mLoop; }
-
- void setSyncMaster(const bool master) { mSyncMaster = master; }
- bool isSyncMaster() const { return mSyncMaster; }
-
- void setSyncSlave(const bool slave) { mSyncSlave = slave; }
- bool isSyncSlave() const { return mSyncSlave; }
-
- void setQueueSounds(const bool queue) { mQueueSounds = queue; }
- bool isQueueSounds() const { return mQueueSounds; }
-
- void setPlayedOnce(const bool played_once) { mPlayedOnce = played_once; }
-
- void setType(S32 type) { mType = type; }
- S32 getType() { return mType; }
-
- void setPositionGlobal(const LLVector3d &position_global) { mPositionGlobal = position_global; }
- LLVector3d getPositionGlobal() const { return mPositionGlobal; }
- LLVector3 getVelocity() const { return mVelocity; }
- F32 getPriority() const { return mPriority; }
-
- // Gain should always be clamped between 0 and 1.
- F32 getGain() const { return mGain; }
- virtual void setGain(const F32 gain) { mGain = llclamp(gain, 0.f, 1.f); }
-
- const LLUUID &getID() const { return mID; }
- bool isDone();
-
- LLAudioData *getCurrentData();
- LLAudioData *getQueuedData();
- LLAudioBuffer *getCurrentBuffer();
-
- bool setupChannel();
- bool play(const LLUUID &audio_id); // Start the audio source playing
-
- bool hasPendingPreloads() const; // Has preloads that haven't been done yet
-
- friend class LLAudioEngine;
- friend class LLAudioChannel;
-protected:
- void setChannel(LLAudioChannel *channelp);
- LLAudioChannel *getChannel() const { return mChannelp; }
-
-protected:
- LLUUID mID; // The ID of the source is that of the object if it's attached to an object.
- LLUUID mOwnerID; // owner of the object playing the sound
- F32 mPriority;
- F32 mGain;
- bool mAmbient;
- bool mLoop;
- bool mSyncMaster;
- bool mSyncSlave;
- bool mQueueSounds;
- bool mPlayedOnce;
- S32 mType;
- LLVector3d mPositionGlobal;
- LLVector3 mVelocity;
-
- //LLAudioSource *mSyncMasterp; // If we're a slave, the source that we're synced to.
- LLAudioChannel *mChannelp; // If we're currently playing back, this is the channel that we're assigned to.
- LLAudioData *mCurrentDatap;
- LLAudioData *mQueuedDatap;
-
- typedef std::map data_map;
- data_map mPreloadMap;
-
- LLFrameTimer mAgeTimer;
-};
-
-
-
-
-//
-// Generic metadata about a particular piece of audio data.
-// The actual data is handled by the derived LLAudioBuffer classes which are
-// derived for each audio engine.
-//
-
-
-class LLAudioData
-{
-public:
- LLAudioData(const LLUUID &uuid);
- bool load();
-
- LLUUID getID() const { return mID; }
- LLAudioBuffer *getBuffer() const { return mBufferp; }
-
- bool hasLocalData() const { return mHasLocalData; }
- bool hasDecodedData() const { return mHasDecodedData; }
- bool hasValidData() const { return mHasValidData; }
-
- void setHasLocalData(const bool hld) { mHasLocalData = hld; }
- void setHasDecodedData(const bool hdd) { mHasDecodedData = hdd; }
- void setHasValidData(const bool hvd) { mHasValidData = hvd; }
-
- friend class LLAudioEngine; // Severe laziness, bad.
-
-protected:
- LLUUID mID;
- LLAudioBuffer *mBufferp; // If this data is being used by the audio system, a pointer to the buffer will be set here.
- bool mHasLocalData;
- bool mHasDecodedData;
- bool mHasValidData;
-};
-
-
-//
-// Base class for an audio channel, i.e. a channel which is capable of playing back a sound.
-// Management of channels is done generically, methods for actually manipulating the channel
-// are derived for each audio engine.
-//
-
-
-class LLAudioChannel
-{
-public:
- LLAudioChannel();
- virtual ~LLAudioChannel();
-
- virtual void setSource(LLAudioSource *sourcep);
- LLAudioSource *getSource() const { return mCurrentSourcep; }
-
- void setSecondaryGain(F32 gain) { mSecondaryGain = gain; }
- F32 getSecondaryGain() { return mSecondaryGain; }
-
- friend class LLAudioEngine;
- friend class LLAudioSource;
-protected:
- virtual void play() = 0;
- virtual void playSynced(LLAudioChannel *channelp) = 0;
- virtual void cleanup() = 0;
- virtual bool isPlaying() = 0;
- void setWaiting(const bool waiting) { mWaiting = waiting; }
- bool isWaiting() const { return mWaiting; }
-
- virtual bool updateBuffer(); // Check to see if the buffer associated with the source changed, and update if necessary.
- virtual void update3DPosition() = 0;
- virtual void updateLoop() = 0; // Update your loop/completion status, for use by queueing/syncing.
-protected:
- LLAudioSource *mCurrentSourcep;
- LLAudioBuffer *mCurrentBufferp;
- bool mLoopedThisFrame;
- bool mWaiting; // Waiting for sync.
- F32 mSecondaryGain;
-};
-
-
-
-
-// Basically an interface class to the engine-specific implementation
-// of audio data that's ready for playback.
-// Will likely get more complex as we decide to do stuff like real streaming audio.
-
-
-class LLAudioBuffer
-{
-public:
- virtual ~LLAudioBuffer() {};
- virtual bool loadWAV(const std::string& filename) = 0;
- virtual U32 getLength() = 0;
-
- friend class LLAudioEngine;
- friend class LLAudioChannel;
- friend class LLAudioData;
-protected:
- bool mInUse;
- LLAudioData *mAudioDatap;
- LLFrameTimer mLastUseTimer;
-};
-
-
-
-extern LLAudioEngine* gAudiop;
-
-#endif
diff --git a/linden/indra/llaudio/audioengine_fmod.cpp b/linden/indra/llaudio/audioengine_fmod.cpp
deleted file mode 100644
index 938c2aa..0000000
--- a/linden/indra/llaudio/audioengine_fmod.cpp
+++ /dev/null
@@ -1,1093 +0,0 @@
-/**
- * @file audioengine_fmod.cpp
- * @brief Implementation of LLAudioEngine class abstracting the audio support as a FMOD 3D implementation
- *
- * $LicenseInfo:firstyear=2002&license=viewergpl$
- *
- * Copyright (c) 2002-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "linden_common.h"
-
-#include "audioengine_fmod.h"
-#include "listener_fmod.h"
-
-#include "llerror.h"
-#include "llmath.h"
-#include "llrand.h"
-
-#include "fmod.h"
-#include "fmod_errors.h"
-#include "lldir.h"
-#include "llapr.h"
-
-#include "sound_ids.h"
-
-extern "C" {
- void * F_CALLBACKAPI windCallback(void *originalbuffer, void *newbuffer, int length, void* userdata);
-}
-
-FSOUND_DSPUNIT *gWindDSP = NULL;
-
-
-// Safe strcpy
-#if 0 //(unused) //LL_WINDOWS || LL_LINUX
-static size_t strlcpy( char* dest, const char* src, size_t dst_size )
-{
- size_t source_len = 0;
- size_t min_len = 0;
- if( dst_size > 0 )
- {
- if( src )
- {
- source_len = strlen(src); /*Flawfinder: ignore*/
- min_len = llmin( dst_size - 1, source_len );
- memcpy(dest, src, min_len); /*Flawfinder: ignore*/
- }
- dest[min_len] = '\0';
- }
- return source_len;
-}
-#else
-// apple ships with the non-standard strlcpy in /usr/include/string.h:
-// size_t strlcpy(char *, const char *, size_t);
-#endif
-
-
-LLAudioEngine_FMOD::LLAudioEngine_FMOD()
-{
- mInited = false;
- mCurrentInternetStreamp = NULL;
- mInternetStreamChannel = -1;
- mWindGen = NULL;
-}
-
-
-LLAudioEngine_FMOD::~LLAudioEngine_FMOD()
-{
-}
-
-
-bool LLAudioEngine_FMOD::init(const S32 num_channels, void* userdata)
-{
- mFadeIn = -10000;
-
- LLAudioEngine::init(num_channels, userdata);
-
- // Reserve one extra channel for the http stream.
- if (!FSOUND_SetMinHardwareChannels(num_channels + 1))
- {
- LL_WARNS("AppInit") << "FMOD::init[0](), error: " << FMOD_ErrorString(FSOUND_GetError()) << LL_ENDL;
- }
-
- LL_DEBUGS("AppInit") << "LLAudioEngine_FMOD::init() initializing FMOD" << LL_ENDL;
-
- F32 version = FSOUND_GetVersion();
- if (version < FMOD_VERSION)
- {
- LL_WARNS("AppInit") << "Error : You are using the wrong FMOD version (" << version
- << ")! You should be using FMOD " << FMOD_VERSION << LL_ENDL;
- //return false;
- }
-
- U32 fmod_flags = 0x0;
-
-#if LL_WINDOWS
- // Windows needs to know which window is frontmost.
- // This must be called before FSOUND_Init() per the FMOD docs.
- // This could be used to let FMOD handle muting when we lose focus,
- // but we don't actually want to do that because we want to distinguish
- // between minimized and not-focused states.
- if (!FSOUND_SetHWND(userdata))
- {
- LL_WARNS("AppInit") << "Error setting FMOD window: "
- << FMOD_ErrorString(FSOUND_GetError()) << LL_ENDL;
- return false;
- }
- // Play audio when we don't have focus.
- // (For example, IM client on top of us.)
- // This means we also try to play audio when minimized,
- // so we manually handle muting in that case. JC
- fmod_flags |= FSOUND_INIT_GLOBALFOCUS;
-#endif
-
-#if LL_LINUX
- // initialize the FMOD engine
-
- // This is a hack to use only FMOD's basic FPU mixer
- // when the LL_VALGRIND environmental variable is set,
- // otherwise valgrind will fall over on FMOD's MMX detection
- if (getenv("LL_VALGRIND")) /*Flawfinder: ignore*/
- {
- LL_INFOS("AppInit") << "Pacifying valgrind in FMOD init." << LL_ENDL;
- FSOUND_SetMixer(FSOUND_MIXER_QUALITY_FPU);
- }
-
- // If we don't set an output method, Linux FMOD always
- // decides on OSS and fails otherwise. So we'll manually
- // try ESD, then OSS, then ALSA.
- // Why this order? See SL-13250, but in short, OSS emulated
- // on top of ALSA is ironically more reliable than raw ALSA.
- // Ack, and ESD has more reliable failure modes - but has worse
- // latency - than all of them, so wins for now.
- bool audio_ok = false;
-
- if (!audio_ok)
- if (NULL == getenv("LL_BAD_FMOD_ESD")) /*Flawfinder: ignore*/
- {
- LL_DEBUGS("AppInit") << "Trying ESD audio output..." << LL_ENDL;
- if(FSOUND_SetOutput(FSOUND_OUTPUT_ESD) &&
- FSOUND_Init(44100, num_channels, fmod_flags))
- {
- LL_DEBUGS("AppInit") << "ESD audio output initialized OKAY"
- << LL_ENDL;
- audio_ok = true;
- } else {
- LL_WARNS("AppInit") << "ESD audio output FAILED to initialize: "
- << FMOD_ErrorString(FSOUND_GetError()) << LL_ENDL;
- }
- } else {
- LL_DEBUGS("AppInit") << "ESD audio output SKIPPED" << LL_ENDL;
- }
-
- if (!audio_ok)
- if (NULL == getenv("LL_BAD_FMOD_OSS")) /*Flawfinder: ignore*/
- {
- LL_DEBUGS("AppInit") << "Trying OSS audio output..." << LL_ENDL;
- if(FSOUND_SetOutput(FSOUND_OUTPUT_OSS) &&
- FSOUND_Init(44100, num_channels, fmod_flags))
- {
- LL_DEBUGS("AppInit") << "OSS audio output initialized OKAY" << LL_ENDL;
- audio_ok = true;
- } else {
- LL_WARNS("AppInit") << "OSS audio output FAILED to initialize: "
- << FMOD_ErrorString(FSOUND_GetError()) << LL_ENDL;
- }
- } else {
- LL_DEBUGS("AppInit") << "OSS audio output SKIPPED" << LL_ENDL;
- }
-
- if (!audio_ok)
- if (NULL == getenv("LL_BAD_FMOD_ALSA")) /*Flawfinder: ignore*/
- {
- LL_DEBUGS("AppInit") << "Trying ALSA audio output..." << LL_ENDL;
- if(FSOUND_SetOutput(FSOUND_OUTPUT_ALSA) &&
- FSOUND_Init(44100, num_channels, fmod_flags))
- {
- LL_DEBUGS("AppInit") << "ALSA audio output initialized OKAY" << LL_ENDL;
- audio_ok = true;
- } else {
- LL_WARNS("AppInit") << "ALSA audio output FAILED to initialize: "
- << FMOD_ErrorString(FSOUND_GetError()) << LL_ENDL;
- }
- } else {
- LL_DEBUGS("AppInit") << "OSS audio output SKIPPED" << LL_ENDL;
- }
-
- if (!audio_ok)
- {
- LL_WARNS("AppInit") << "Overall audio init failure." << LL_ENDL;
- return false;
- }
-
- // On Linux, FMOD causes a SIGPIPE for some netstream error
- // conditions (an FMOD bug); ignore SIGPIPE so it doesn't crash us.
- // NOW FIXED in FMOD 3.x since 2006-10-01.
- //signal(SIGPIPE, SIG_IGN);
-
- // We're interested in logging which output method we
- // ended up with, for QA purposes.
- switch (FSOUND_GetOutput())
- {
- case FSOUND_OUTPUT_NOSOUND: LL_DEBUGS("AppInit") << "Audio output: NoSound" << LL_ENDL; break;
- case FSOUND_OUTPUT_OSS: LL_DEBUGS("AppInit") << "Audio output: OSS" << LL_ENDL; break;
- case FSOUND_OUTPUT_ESD: LL_DEBUGS("AppInit") << "Audio output: ESD" << LL_ENDL; break;
- case FSOUND_OUTPUT_ALSA: LL_DEBUGS("AppInit") << "Audio output: ALSA" << LL_ENDL; break;
- default: LL_INFOS("AppInit") << "Audio output: Unknown!" << LL_ENDL; break;
- };
-
-#else // LL_LINUX
-
- // initialize the FMOD engine
- if (!FSOUND_Init(44100, num_channels, fmod_flags))
- {
- LL_WARNS("AppInit") << "Error initializing FMOD: "
- << FMOD_ErrorString(FSOUND_GetError()) << LL_ENDL;
- return false;
- }
-
-#endif
-
- initInternetStream();
-
- LL_DEBUGS("AppInit") << "LLAudioEngine_FMOD::init() FMOD initialized correctly" << LL_ENDL;
-
- mInited = true;
-
- return true;
-}
-
-
-std::string LLAudioEngine_FMOD::getDriverName(bool verbose)
-{
- if (verbose)
- {
- F32 version = FSOUND_GetVersion();
- return llformat("FMOD version %f", version);
- }
- else
- {
- return "FMOD";
- }
-}
-
-
-void LLAudioEngine_FMOD::allocateListener(void)
-{
- mListenerp = (LLListener *) new LLListener_FMOD();
- if (!mListenerp)
- {
- llwarns << "Listener creation failed" << llendl;
- }
-}
-
-
-void LLAudioEngine_FMOD::shutdown()
-{
- if (gWindDSP)
- {
- FSOUND_DSP_SetActive(gWindDSP,false);
- FSOUND_DSP_Free(gWindDSP);
- }
-
- stopInternetStream();
-
- LLAudioEngine::shutdown();
-
- llinfos << "LLAudioEngine_FMOD::shutdown() closing FMOD" << llendl;
- FSOUND_Close();
- llinfos << "LLAudioEngine_FMOD::shutdown() done closing FMOD" << llendl;
-
- delete mListenerp;
- mListenerp = NULL;
-}
-
-
-LLAudioBuffer *LLAudioEngine_FMOD::createBuffer()
-{
- return new LLAudioBufferFMOD();
-}
-
-
-LLAudioChannel *LLAudioEngine_FMOD::createChannel()
-{
- return new LLAudioChannelFMOD();
-}
-
-
-void LLAudioEngine_FMOD::initWind()
-{
- mWindGen = new LLWindGen;
-
- if (!gWindDSP)
- {
- gWindDSP = FSOUND_DSP_Create(&windCallback, FSOUND_DSP_DEFAULTPRIORITY_CLEARUNIT + 20, mWindGen);
- }
- if (gWindDSP)
- {
- FSOUND_DSP_SetActive(gWindDSP, true);
- }
- mNextWindUpdate = 0.0;
-}
-
-
-void LLAudioEngine_FMOD::cleanupWind()
-{
- if (gWindDSP)
- {
- FSOUND_DSP_SetActive(gWindDSP, false);
- FSOUND_DSP_Free(gWindDSP);
- gWindDSP = NULL;
- }
-
- delete mWindGen;
- mWindGen = NULL;
-}
-
-
-//-----------------------------------------------------------------------
-void LLAudioEngine_FMOD::updateWind(LLVector3 wind_vec, F32 camera_height_above_water)
-{
- LLVector3 wind_pos;
- F64 pitch;
- F64 center_freq;
-
- if (!mEnableWind)
- {
- return;
- }
-
- if (mWindUpdateTimer.checkExpirationAndReset(LL_WIND_UPDATE_INTERVAL))
- {
-
- // wind comes in as Linden coordinate (+X = forward, +Y = left, +Z = up)
- // need to convert this to the conventional orientation DS3D and OpenAL use
- // where +X = right, +Y = up, +Z = backwards
-
- wind_vec.setVec(-wind_vec.mV[1], wind_vec.mV[2], -wind_vec.mV[0]);
-
- // cerr << "Wind update" << endl;
-
- pitch = 1.0 + mapWindVecToPitch(wind_vec);
- center_freq = 80.0 * pow(pitch,2.5*(mapWindVecToGain(wind_vec)+1.0));
-
- mWindGen->mTargetFreq = (F32)center_freq;
- mWindGen->mTargetGain = (F32)mapWindVecToGain(wind_vec) * mMaxWindGain;
- mWindGen->mTargetPanGainR = (F32)mapWindVecToPan(wind_vec);
- }
-}
-
-/*
-//-----------------------------------------------------------------------
-void LLAudioEngine_FMOD::setSourceMinDistance(U16 source_num, F64 distance)
-{
- if (!mInited)
- {
- return;
- }
- if (mBuffer[source_num])
- {
- mMinDistance[source_num] = (F32) distance;
- if (!FSOUND_Sample_SetMinMaxDistance(mBuffer[source_num],mMinDistance[source_num], mMaxDistance[source_num]))
- {
- llwarns << "FMOD::setSourceMinDistance(" << source_num << "), error: " << FMOD_ErrorString(FSOUND_GetError()) << llendl;
- }
- }
-}
-
-//-----------------------------------------------------------------------
-void LLAudioEngine_FMOD::setSourceMaxDistance(U16 source_num, F64 distance)
-{
- if (!mInited)
- {
- return;
- }
- if (mBuffer[source_num])
- {
- mMaxDistance[source_num] = (F32) distance;
- if (!FSOUND_Sample_SetMinMaxDistance(mBuffer[source_num],mMinDistance[source_num], mMaxDistance[source_num]))
- {
- llwarns << "FMOD::setSourceMaxDistance(" << source_num << "), error: " << FMOD_ErrorString(FSOUND_GetError()) << llendl;
- }
- }
-}
-
-//-----------------------------------------------------------------------
-void LLAudioEngine_FMOD::get3DParams(S32 source_num, S32 *volume, S32 *freq, S32 *inside, S32 *outside, LLVector3 *orient, S32 *out_volume, F32 *min_dist, F32 *max_dist)
-{
- *volume = 0;
- *freq = 0;
- *inside = 0;
- *outside = 0;
- *orient = LLVector3::zero;
- *out_volume = 0;
- *min_dist = 0.f;
- *max_dist = 0.f;
-}
-
-*/
-
-
-//-----------------------------------------------------------------------
-void LLAudioEngine_FMOD::setInternalGain(F32 gain)
-{
- if (!mInited)
- {
- return;
- }
-
- gain = llclamp( gain, 0.0f, 1.0f );
- FSOUND_SetSFXMasterVolume( llround( 255.0f * gain ) );
-
- if ( mInternetStreamChannel != -1 )
- {
- F32 clamp_internet_stream_gain = llclamp( mInternetStreamGain, 0.0f, 1.0f );
- FSOUND_SetVolumeAbsolute( mInternetStreamChannel, llround( 255.0f * clamp_internet_stream_gain ) );
- }
-}
-
-//
-// LLAudioChannelFMOD implementation
-//
-
-LLAudioChannelFMOD::LLAudioChannelFMOD() : LLAudioChannel(), mChannelID(0), mLastSamplePos(0)
-{
-}
-
-
-LLAudioChannelFMOD::~LLAudioChannelFMOD()
-{
- cleanup();
-}
-
-
-bool LLAudioChannelFMOD::updateBuffer()
-{
- if (LLAudioChannel::updateBuffer())
- {
- // Base class update returned true, which means that we need to actually
- // set up the channel for a different buffer.
-
- LLAudioBufferFMOD *bufferp = (LLAudioBufferFMOD *)mCurrentSourcep->getCurrentBuffer();
-
- // Grab the FMOD sample associated with the buffer
- FSOUND_SAMPLE *samplep = bufferp->getSample();
- if (!samplep)
- {
- // This is bad, there should ALWAYS be a sample associated with a legit
- // buffer.
- llerrs << "No FMOD sample!" << llendl;
- return false;
- }
-
-
- // Actually play the sound. Start it off paused so we can do all the necessary
- // setup.
- mChannelID = FSOUND_PlaySoundEx(FSOUND_FREE, samplep, FSOUND_DSP_GetSFXUnit(), true);
-
- //llinfos << "Setting up channel " << std::hex << mChannelID << std::dec << llendl;
- }
-
- // If we have a source for the channel, we need to update its gain.
- if (mCurrentSourcep)
- {
- // SJB: warnings can spam and hurt framerate, disabling
- if (!FSOUND_SetVolume(mChannelID, llround(getSecondaryGain() * mCurrentSourcep->getGain() * 255.0f)))
- {
-// llwarns << "LLAudioChannelFMOD::updateBuffer error: " << FMOD_ErrorString(FSOUND_GetError()) << llendl;
- }
-
- if (!FSOUND_SetLoopMode(mChannelID, mCurrentSourcep->isLoop() ? FSOUND_LOOP_NORMAL : FSOUND_LOOP_OFF))
- {
-// llwarns << "Channel " << mChannelID << "Source ID: " << mCurrentSourcep->getID()
-// << " at " << mCurrentSourcep->getPositionGlobal() << llendl;
-// llwarns << "LLAudioChannelFMOD::updateBuffer error: " << FMOD_ErrorString(FSOUND_GetError()) << llendl;
- }
- }
-
- return true;
-}
-
-
-void LLAudioChannelFMOD::update3DPosition()
-{
- if (!mChannelID)
- {
- // We're not actually a live channel (i.e., we're not playing back anything)
- return;
- }
-
- LLAudioBufferFMOD *bufferp = (LLAudioBufferFMOD *)mCurrentBufferp;
- if (!bufferp)
- {
- // We don't have a buffer associated with us (should really have been picked up
- // by the above if.
- return;
- }
-
- if (mCurrentSourcep->isAmbient())
- {
- // Ambient sound, don't need to do any positional updates.
- bufferp->set3DMode(false);
- }
- else
- {
- // Localized sound. Update the position and velocity of the sound.
- bufferp->set3DMode(true);
-
- LLVector3 float_pos;
- float_pos.setVec(mCurrentSourcep->getPositionGlobal());
- if (!FSOUND_3D_SetAttributes(mChannelID, float_pos.mV, mCurrentSourcep->getVelocity().mV))
- {
- LL_DEBUGS("FMOD") << "LLAudioChannelFMOD::update3DPosition error: " << FMOD_ErrorString(FSOUND_GetError()) << LL_ENDL;
- }
- }
-}
-
-
-void LLAudioChannelFMOD::updateLoop()
-{
- if (!mChannelID)
- {
- // May want to clear up the loop/sample counters.
- return;
- }
-
- //
- // Hack: We keep track of whether we looped or not by seeing when the
- // sample position looks like it's going backwards. Not reliable; may
- // yield false negatives.
- //
- U32 cur_pos = FSOUND_GetCurrentPosition(mChannelID);
- if (cur_pos < (U32)mLastSamplePos)
- {
- mLoopedThisFrame = true;
- }
- mLastSamplePos = cur_pos;
-}
-
-
-void LLAudioChannelFMOD::cleanup()
-{
- if (!mChannelID)
- {
- //llinfos << "Aborting cleanup with no channelID." << llendl;
- return;
- }
-
- //llinfos << "Cleaning up channel: " << mChannelID << llendl;
- if (!FSOUND_StopSound(mChannelID))
- {
- LL_DEBUGS("FMOD") << "LLAudioChannelFMOD::cleanup error: " << FMOD_ErrorString(FSOUND_GetError()) << llendl;
- }
-
- mCurrentBufferp = NULL;
- mChannelID = 0;
-}
-
-
-void LLAudioChannelFMOD::play()
-{
- if (!mChannelID)
- {
- llwarns << "Playing without a channelID, aborting" << llendl;
- return;
- }
-
- if (!FSOUND_SetPaused(mChannelID, false))
- {
- llwarns << "LLAudioChannelFMOD::play error: " << FMOD_ErrorString(FSOUND_GetError()) << llendl;
- }
- getSource()->setPlayedOnce(true);
-}
-
-
-void LLAudioChannelFMOD::playSynced(LLAudioChannel *channelp)
-{
- LLAudioChannelFMOD *fmod_channelp = (LLAudioChannelFMOD*)channelp;
- if (!(fmod_channelp->mChannelID && mChannelID))
- {
- // Don't have channels allocated to both the master and the slave
- return;
- }
-
- U32 position = FSOUND_GetCurrentPosition(fmod_channelp->mChannelID) % mCurrentBufferp->getLength();
- // Try to match the position of our sync master
- if (!FSOUND_SetCurrentPosition(mChannelID, position))
- {
- llwarns << "LLAudioChannelFMOD::playSynced unable to set current position" << llendl;
- }
-
- // Start us playing
- play();
-}
-
-
-bool LLAudioChannelFMOD::isPlaying()
-{
- if (!mChannelID)
- {
- return false;
- }
-
- return FSOUND_IsPlaying(mChannelID) && (!FSOUND_GetPaused(mChannelID));
-}
-
-
-
-//
-// LLAudioBufferFMOD implementation
-//
-
-
-LLAudioBufferFMOD::LLAudioBufferFMOD()
-{
- mSamplep = NULL;
-}
-
-
-LLAudioBufferFMOD::~LLAudioBufferFMOD()
-{
- if (mSamplep)
- {
- // Clean up the associated FMOD sample if it exists.
- FSOUND_Sample_Free(mSamplep);
- mSamplep = NULL;
- }
-}
-
-
-bool LLAudioBufferFMOD::loadWAV(const std::string& filename)
-{
- // Try to open a wav file from disk. This will eventually go away, as we don't
- // really want to block doing this.
- if (filename.empty())
- {
- // invalid filename, abort.
- return false;
- }
-
- if (!LLAPRFile::isExist(filename, NULL, LL_APR_RPB))
- {
- // File not found, abort.
- return false;
- }
-
- if (mSamplep)
- {
- // If there's already something loaded in this buffer, clean it up.
- FSOUND_Sample_Free(mSamplep);
- mSamplep = NULL;
- }
-
- // Load up the wav file into an fmod sample
-#if LL_WINDOWS
- // MikeS. - Loading the sound file manually and then handing it over to FMOD,
- // since FMOD uses posix IO internally,
- // which doesn't work with unicode file paths.
- LLFILE* sound_file = LLFile::fopen(filename,"rb"); /* Flawfinder: ignore */
- if (sound_file)
- {
- fseek(sound_file,0,SEEK_END);
- U32 file_length = ftell(sound_file); //Find the length of the file by seeking to the end and getting the offset
- size_t read_count;
- fseek(sound_file,0,SEEK_SET); //Seek back to the beginning
- char* buffer = new char[file_length];
- llassert(buffer);
- read_count = fread((void*)buffer,file_length,1,sound_file);//Load it..
- if(ferror(sound_file)==0 && (read_count == 1)){//No read error, and we got 1 chunk of our size...
- unsigned int mode_flags = FSOUND_LOOP_NORMAL | FSOUND_LOADMEMORY;
- //FSOUND_16BITS | FSOUND_MONO | FSOUND_LOADMEMORY | FSOUND_LOOP_NORMAL;
- mSamplep = FSOUND_Sample_Load(FSOUND_UNMANAGED, buffer, mode_flags , 0, file_length);
- }
- delete[] buffer;
- fclose(sound_file);
- }
-#else
- mSamplep = FSOUND_Sample_Load(FSOUND_UNMANAGED, filename.c_str(), FSOUND_LOOP_NORMAL, 0, 0);
-#endif
-
- if (!mSamplep)
- {
- // We failed to load the file for some reason.
- llwarns << "Could not load data '" << filename << "': "
- << FMOD_ErrorString(FSOUND_GetError()) << llendl;
-
- //
- // If we EVER want to load wav files provided by end users, we need
- // to rethink this!
- //
- // file is probably corrupt - remove it.
- LLFile::remove(filename);
- return false;
- }
-
- // Everything went well, return true
- return true;
-}
-
-
-U32 LLAudioBufferFMOD::getLength()
-{
- if (!mSamplep)
- {
- return 0;
- }
-
- return FSOUND_Sample_GetLength(mSamplep);
-}
-
-
-void LLAudioBufferFMOD::set3DMode(bool use3d)
-{
- U16 current_mode = FSOUND_Sample_GetMode(mSamplep);
-
- if (use3d)
- {
- if (!FSOUND_Sample_SetMode(mSamplep, (current_mode & (~FSOUND_2D))))
- {
- llwarns << "LLAudioBufferFMOD::set3DMode error: " << FMOD_ErrorString(FSOUND_GetError()) << llendl;
- }
- }
- else
- {
- if (!FSOUND_Sample_SetMode(mSamplep, current_mode | FSOUND_2D))
- {
- llwarns << "LLAudioBufferFMOD::set3DMode error: " << FMOD_ErrorString(FSOUND_GetError()) << llendl;
- }
- }
-}
-
-
-
-//---------------------------------------------------------------------------
-// Internet Streaming
-//---------------------------------------------------------------------------
-void LLAudioEngine_FMOD::initInternetStream()
-{
- // Number of milliseconds of audio to buffer for the audio card.
- // Must be larger than the usual Second Life frame stutter time.
- FSOUND_Stream_SetBufferSize(200);
-
- // Here's where we set the size of the network buffer and some buffering
- // parameters. In this case we want a network buffer of 16k, we want it
- // to prebuffer 40% of that when we first connect, and we want it
- // to rebuffer 80% of that whenever we encounter a buffer underrun.
-
- // Leave the net buffer properties at the default.
- //FSOUND_Stream_Net_SetBufferProperties(20000, 40, 80);
- mInternetStreamURL.clear();
-}
-
-
-void LLAudioEngine_FMOD::startInternetStream(const std::string& url)
-{
- if (!mInited)
- {
- llwarns << "startInternetStream before audio initialized" << llendl;
- return;
- }
-
- // "stop" stream but don't clear url, etc. in calse url == mInternetStreamURL
- stopInternetStream();
- if (!url.empty())
- {
- llinfos << "Starting internet stream: " << url << llendl;
- mCurrentInternetStreamp = new LLAudioStreamFMOD(url);
- mInternetStreamURL = url;
- }
- else
- {
- llinfos << "Set internet stream to null" << llendl;
- mInternetStreamURL.clear();
- }
-}
-
-
-signed char F_CALLBACKAPI LLAudioEngine_FMOD::callbackMetaData(char *name, char *value, void *userdata)
-{
- /*
- LLAudioEngine_FMOD* self = (LLAudioEngine_FMOD*)userdata;
-
- if (!strcmp("ARTIST", name))
- {
- strlcpy(self->mInternetStreamArtist, value, 256);
- self->mInternetStreamNewMetaData = true;
- return true;
- }
-
- if (!strcmp("TITLE", name))
- {
- strlcpy(self->mInternetStreamTitle, value, 256);
- self->mInternetStreamNewMetaData = true;
- return true;
- }
- */
-
- return true;
-}
-
-
-void LLAudioEngine_FMOD::updateInternetStream()
-{
- // Kill dead internet streams, if possible
- std::list::iterator iter;
- for (iter = mDeadStreams.begin(); iter != mDeadStreams.end();)
- {
- LLAudioStreamFMOD *streamp = *iter;
- if (streamp->stopStream())
- {
- llinfos << "Closed dead stream" << llendl;
- delete streamp;
- mDeadStreams.erase(iter++);
- }
- else
- {
- iter++;
- }
- }
-
- // Don't do anything if there are no streams playing
- if (!mCurrentInternetStreamp)
- {
- return;
- }
-
- int open_state = mCurrentInternetStreamp->getOpenState();
-
- if (!open_state)
- {
- // Stream is live
-
-
- // start the stream if it's ready
- if (mInternetStreamChannel < 0)
- {
- mInternetStreamChannel = mCurrentInternetStreamp->startStream();
-
- if (mInternetStreamChannel != -1)
- {
- // Reset volume to previously set volume
- setInternetStreamGain(mInternetStreamGain);
- FSOUND_SetPaused(mInternetStreamChannel, false);
- //FSOUND_Stream_Net_SetMetadataCallback(mInternetStream, callbackMetaData, this);
- }
- }
- }
-
- switch(open_state)
- {
- default:
- case 0:
- // success
- break;
- case -1:
- // stream handle is invalid
- llwarns << "InternetStream - invalid handle" << llendl;
- stopInternetStream();
- return;
- case -2:
- // opening
- //strlcpy(mInternetStreamArtist, "Opening", 256);
- break;
- case -3:
- // failed to open, file not found, perhaps
- llwarns << "InternetSteam - failed to open" << llendl;
- stopInternetStream();
- return;
- case -4:
- // connecting
- //strlcpy(mInternetStreamArtist, "Connecting", 256);
- break;
- case -5:
- // buffering
- //strlcpy(mInternetStreamArtist, "Buffering", 256);
- break;
- }
-
-}
-
-void LLAudioEngine_FMOD::stopInternetStream()
-{
- if (mInternetStreamChannel != -1)
- {
- FSOUND_SetPaused(mInternetStreamChannel, true);
- FSOUND_SetPriority(mInternetStreamChannel, 0);
- mInternetStreamChannel = -1;
- }
-
- if (mCurrentInternetStreamp)
- {
- llinfos << "Stopping internet stream: " << mCurrentInternetStreamp->getURL() << llendl;
- if (mCurrentInternetStreamp->stopStream())
- {
- delete mCurrentInternetStreamp;
- }
- else
- {
- llwarns << "Pushing stream to dead list: " << mCurrentInternetStreamp->getURL() << llendl;
- mDeadStreams.push_back(mCurrentInternetStreamp);
- }
- mCurrentInternetStreamp = NULL;
- //mInternetStreamURL.clear();
- }
-}
-
-void LLAudioEngine_FMOD::pauseInternetStream(int pause)
-{
- if (pause < 0)
- {
- pause = mCurrentInternetStreamp ? 1 : 0;
- }
-
- if (pause)
- {
- if (mCurrentInternetStreamp)
- {
- stopInternetStream();
- }
- }
- else
- {
- startInternetStream(mInternetStreamURL);
- }
-}
-
-
-// A stream is "playing" if it has been requested to start. That
-// doesn't necessarily mean audio is coming out of the speakers.
-int LLAudioEngine_FMOD::isInternetStreamPlaying()
-{
- if (mCurrentInternetStreamp)
- {
- return 1; // Active and playing
- }
- else if (!mInternetStreamURL.empty())
- {
- return 2; // "Paused"
- }
- else
- {
- return 0;
- }
-}
-
-
-void LLAudioEngine_FMOD::setInternetStreamGain(F32 vol)
-{
- mInternetStreamGain = vol;
-
- if (mInternetStreamChannel != -1)
- {
- vol = llclamp(vol, 0.f, 1.f);
- int vol_int = llround(vol * 255.f);
- FSOUND_SetVolumeAbsolute(mInternetStreamChannel, vol_int);
- }
-}
-
-
-LLAudioStreamFMOD::LLAudioStreamFMOD(const std::string& url) :
- mInternetStream(NULL),
- mReady(false)
-{
- mInternetStreamURL = url;
- mInternetStream = FSOUND_Stream_Open(url.c_str(), FSOUND_NORMAL | FSOUND_NONBLOCKING, 0, 0);
- if (!mInternetStream)
- {
- llwarns << "Couldn't open fmod stream, error "
- << FMOD_ErrorString(FSOUND_GetError())
- << llendl;
- mReady = false;
- return;
- }
-
- mReady = true;
-}
-
-int LLAudioStreamFMOD::startStream()
-{
- // We need a live and opened stream before we try and play it.
- if (!mInternetStream || getOpenState())
- {
- llwarns << "No internet stream to start playing!" << llendl;
- return -1;
- }
-
- // Make sure the stream is set to 2D mode.
- FSOUND_Stream_SetMode(mInternetStream, FSOUND_2D);
-
- return FSOUND_Stream_PlayEx(FSOUND_FREE, mInternetStream, NULL, true);
-}
-
-bool LLAudioStreamFMOD::stopStream()
-{
- if (mInternetStream)
- {
- int read_percent = 0;
- int status = 0;
- int bitrate = 0;
- unsigned int flags = 0x0;
- FSOUND_Stream_Net_GetStatus(mInternetStream, &status, &read_percent, &bitrate, &flags);
-
- bool close = true;
- switch (status)
- {
- case FSOUND_STREAM_NET_CONNECTING:
- close = false;
- break;
- case FSOUND_STREAM_NET_NOTCONNECTED:
- case FSOUND_STREAM_NET_BUFFERING:
- case FSOUND_STREAM_NET_READY:
- case FSOUND_STREAM_NET_ERROR:
- default:
- close = true;
- }
-
- if (close)
- {
- FSOUND_Stream_Close(mInternetStream);
- mInternetStream = NULL;
- return true;
- }
- else
- {
- return false;
- }
- }
- else
- {
- return true;
- }
-}
-
-int LLAudioStreamFMOD::getOpenState()
-{
- int open_state = FSOUND_Stream_GetOpenState(mInternetStream);
- return open_state;
-}
-
-void * F_CALLBACKAPI windCallback(void *originalbuffer, void *newbuffer, int length, void* userdata)
-{
- // originalbuffer = fmod's original mixbuffer.
- // newbuffer = the buffer passed from the previous DSP unit.
- // length = length in samples at this mix time.
- // param = user parameter passed through in FSOUND_DSP_Create.
- //
- // modify the buffer in some fashion
-
- LLWindGen *windgen =
- (LLWindGen *)userdata;
- U8 stride;
-
-#if LL_DARWIN
- stride = sizeof(LLAudioEngine_FMOD::MIXBUFFERFORMAT);
-#else
- int mixertype = FSOUND_GetMixer();
- if (mixertype == FSOUND_MIXER_BLENDMODE ||
- mixertype == FSOUND_MIXER_QUALITY_FPU)
- {
- stride = 4;
- }
- else
- {
- stride = 2;
- }
-#endif
-
- newbuffer = windgen->windGenerate((LLAudioEngine_FMOD::MIXBUFFERFORMAT *)newbuffer, length, stride);
-
- return newbuffer;
-}
diff --git a/linden/indra/llaudio/audioengine_fmod.h b/linden/indra/llaudio/audioengine_fmod.h
deleted file mode 100644
index d0d2e1b..0000000
--- a/linden/indra/llaudio/audioengine_fmod.h
+++ /dev/null
@@ -1,161 +0,0 @@
-/**
- * @file audioengine_fmod.h
- * @brief Definition of LLAudioEngine class abstracting the audio
- * support as a FMOD 3D implementation
- *
- * $LicenseInfo:firstyear=2002&license=viewergpl$
- *
- * Copyright (c) 2002-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_AUDIOENGINE_FMOD_H
-#define LL_AUDIOENGINE_FMOD_H
-
-#include "audioengine.h"
-#include "listener_fmod.h"
-#include "windgen.h"
-
-#include "fmod.h"
-
-class LLAudioStreamFMOD;
-
-class LLAudioEngine_FMOD : public LLAudioEngine
-{
-public:
- LLAudioEngine_FMOD();
- virtual ~LLAudioEngine_FMOD();
-
- // initialization/startup/shutdown
- virtual bool init(const S32 num_channels, void *user_data);
- virtual std::string getDriverName(bool verbose);
- virtual void allocateListener();
-
- virtual void shutdown();
-
- // Internet stream methods
- virtual void initInternetStream();
- virtual void startInternetStream(const std::string& url);
- virtual void updateInternetStream();
- virtual void stopInternetStream();
- virtual void pauseInternetStream(int pause);
- virtual int isInternetStreamPlaying();
- virtual void setInternetStreamGain(F32 vol);
-
- /*virtual*/ void initWind();
- /*virtual*/ void cleanupWind();
-
- /*virtual*/void updateWind(LLVector3 direction, F32 camera_height_above_water);
-
-#if LL_DARWIN
- typedef S32 MIXBUFFERFORMAT;
-#else
- typedef S16 MIXBUFFERFORMAT;
-#endif
-
-protected:
- /*virtual*/ LLAudioBuffer *createBuffer(); // Get a free buffer, or flush an existing one if you have to.
- /*virtual*/ LLAudioChannel *createChannel(); // Create a new audio channel.
-
- /*virtual*/ void setInternalGain(F32 gain);
-protected:
- static signed char F_CALLBACKAPI callbackMetaData(char* name, char* value, void* userdata);
-
- LLAudioStreamFMOD *mCurrentInternetStreamp;
- int mInternetStreamChannel;
-
- std::list mDeadStreams;
-
- //F32 mMinDistance[MAX_BUFFERS];
- //F32 mMaxDistance[MAX_BUFFERS];
-
- S32 mFadeIn;
- bool mInited;
-
- // On Windows, userdata is the HWND of the application window.
- void* mUserData;
-
- LLWindGen *mWindGen;
-};
-
-
-class LLAudioChannelFMOD : public LLAudioChannel
-{
-public:
- LLAudioChannelFMOD();
- virtual ~LLAudioChannelFMOD();
-
-protected:
- /*virtual*/ void play();
- /*virtual*/ void playSynced(LLAudioChannel *channelp);
- /*virtual*/ void cleanup();
- /*virtual*/ bool isPlaying();
-
- /*virtual*/ bool updateBuffer();
- /*virtual*/ void update3DPosition();
- /*virtual*/ void updateLoop();
-
-protected:
- int mChannelID;
- S32 mLastSamplePos;
-};
-
-
-class LLAudioBufferFMOD : public LLAudioBuffer
-{
-public:
- LLAudioBufferFMOD();
- virtual ~LLAudioBufferFMOD();
-
- /*virtual*/ bool loadWAV(const std::string& filename);
- /*virtual*/ U32 getLength();
- friend class LLAudioChannelFMOD;
-
- void set3DMode(bool use3d);
-protected:
- FSOUND_SAMPLE *getSample() { return mSamplep; }
-protected:
- FSOUND_SAMPLE *mSamplep;
-};
-
-class LLAudioStreamFMOD
-{
-public:
- LLAudioStreamFMOD(const std::string& url);
- int startStream();
- bool stopStream(); // Returns true if the stream was successfully stopped.
- bool ready();
-
- const std::string& getURL() { return mInternetStreamURL; }
-
- int getOpenState();
-protected:
- FSOUND_STREAM* mInternetStream;
- bool mReady;
-
- std::string mInternetStreamURL;
-};
-
-#endif // LL_AUDIOENGINE_FMOD_H
diff --git a/linden/indra/llaudio/audioengine_openal.cpp b/linden/indra/llaudio/audioengine_openal.cpp
deleted file mode 100644
index 84305f0..0000000
--- a/linden/indra/llaudio/audioengine_openal.cpp
+++ /dev/null
@@ -1,574 +0,0 @@
-/**
- * @file audioengine_openal.cpp
- * @brief implementation of audio engine using OpenAL
- * support as a OpenAL 3D implementation
- *
- * $LicenseInfo:firstyear=2002&license=viewergpl$
- *
- * Copyright (c) 2002-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "linden_common.h"
-#include "lldir.h"
-
-#include "audioengine_openal.h"
-#include "listener_openal.h"
-
-
-LLAudioEngine_OpenAL::LLAudioEngine_OpenAL()
- :
- mWindGen(NULL),
- mWindBuf(NULL),
- mWindBufFreq(0),
- mWindBufSamples(0),
- mWindBufBytes(0),
- mWindSource(AL_NONE),
- mNumEmptyWindALBuffers(MAX_NUM_WIND_BUFFERS)
-{
-}
-
-// virtual
-LLAudioEngine_OpenAL::~LLAudioEngine_OpenAL()
-{
-}
-
-static ALboolean alutInitHelp(const char **errorstring)
-{
- ALboolean result = AL_FALSE;
- ALenum err = AL_NO_ERROR;
-#if LL_WINDOWS
- __try {
- result = alutInit(NULL, NULL);
- err = alutGetError();
- alGetError(); // hit loading of wrap_oal.dll
- if(!result) *errorstring = alutGetErrorString(err);
- } __except( EXCEPTION_EXECUTE_HANDLER ) {
- *errorstring = "[Exception]";
- result = AL_FALSE;
- }
- return result;
-#else
- result = alutInit(NULL, NULL);
- if(!result) {
- err = alutGetError();
- *errorstring = alutGetErrorString(err);
- }
- return result;
-#endif
-}
-
-// virtual
-bool LLAudioEngine_OpenAL::init(const S32 num_channels, void* userdata)
-{
- const char *errorstring = "(null)";
- mWindGen = NULL;
- LLAudioEngine::init(num_channels, userdata);
-
- if(!alutInitHelp(&errorstring))
- {
- llwarns << "LLAudioEngine_OpenAL::init() ALUT initialization failed: " << errorstring << llendl;
- return false;
- }
-
- llinfos << "LLAudioEngine_OpenAL::init() OpenAL successfully initialized" << llendl;
-
- llinfos << "OpenAL version: "
- << ll_safe_string(alGetString(AL_VERSION)) << llendl;
- llinfos << "OpenAL vendor: "
- << ll_safe_string(alGetString(AL_VENDOR)) << llendl;
- llinfos << "OpenAL renderer: "
- << ll_safe_string(alGetString(AL_RENDERER)) << llendl;
-
- ALint major = alutGetMajorVersion ();
- ALint minor = alutGetMinorVersion ();
- llinfos << "ALUT version: " << major << "." << minor << llendl;
-
- ALCdevice *device = alcGetContextsDevice(alcGetCurrentContext());
-
- alcGetIntegerv(device, ALC_MAJOR_VERSION, 1, &major);
- alcGetIntegerv(device, ALC_MINOR_VERSION, 1, &minor);
- llinfos << "ALC version: " << major << "." << minor << llendl;
-
- llinfos << "ALC default device: "
- << ll_safe_string(alcGetString(device,
- ALC_DEFAULT_DEVICE_SPECIFIER))
- << llendl;
-
- return true;
-}
-
-// virtual
-std::string LLAudioEngine_OpenAL::getDriverName(bool verbose)
-{
- ALCdevice *device = alcGetContextsDevice(alcGetCurrentContext());
- std::ostringstream version;
-
- version <<
- "OpenAL";
-
- if (verbose)
- {
- version <<
- ", version " <<
- ll_safe_string(alGetString(AL_VERSION)) <<
- " / " <<
- ll_safe_string(alGetString(AL_VENDOR)) <<
- " / " <<
- ll_safe_string(alGetString(AL_RENDERER));
-
- if (device)
- version <<
- ": " <<
- ll_safe_string(alcGetString(device,
- ALC_DEFAULT_DEVICE_SPECIFIER));
- }
-
- return version.str();
-}
-
-// virtual
-void LLAudioEngine_OpenAL::allocateListener()
-{
- mListenerp = (LLListener *) new LLListener_OpenAL();
- if(!mListenerp)
- {
- llwarns << "LLAudioEngine_OpenAL::allocateListener() Listener creation failed" << llendl;
- }
-}
-
-// virtual
-void LLAudioEngine_OpenAL::shutdown()
-{
- llinfos << "About to LLAudioEngine::shutdown()" << llendl;
- LLAudioEngine::shutdown();
-
- llinfos << "About to alutExit()" << llendl;
- if(!alutExit())
- {
- llwarns << "Nuts." << llendl;
- llwarns << "LLAudioEngine_OpenAL::shutdown() ALUT shutdown failed: " << alutGetErrorString (alutGetError ()) << llendl;
- }
-
- llinfos << "LLAudioEngine_OpenAL::shutdown() OpenAL successfully shut down" << llendl;
-
- delete mListenerp;
- mListenerp = NULL;
-}
-
-LLAudioBuffer *LLAudioEngine_OpenAL::createBuffer()
-{
- return new LLAudioBufferOpenAL();
-}
-
-LLAudioChannel *LLAudioEngine_OpenAL::createChannel()
-{
- return new LLAudioChannelOpenAL();
-}
-
-void LLAudioEngine_OpenAL::setInternalGain(F32 gain)
-{
- //llinfos << "LLAudioEngine_OpenAL::setInternalGain() Gain: " << gain << llendl;
- alListenerf(AL_GAIN, gain);
-}
-
-LLAudioChannelOpenAL::LLAudioChannelOpenAL()
- :
- mALSource(AL_NONE),
- mLastSamplePos(0)
-{
- alGenSources(1, &mALSource);
-}
-
-LLAudioChannelOpenAL::~LLAudioChannelOpenAL()
-{
- cleanup();
- alDeleteSources(1, &mALSource);
-}
-
-void LLAudioChannelOpenAL::cleanup()
-{
- alSourceStop(mALSource);
- mCurrentBufferp = NULL;
-}
-
-void LLAudioChannelOpenAL::play()
-{
- if (mALSource == AL_NONE)
- {
- llwarns << "Playing without a mALSource, aborting" << llendl;
- return;
- }
-
- if(!isPlaying())
- {
- alSourcePlay(mALSource);
- getSource()->setPlayedOnce(true);
- }
-}
-
-void LLAudioChannelOpenAL::playSynced(LLAudioChannel *channelp)
-{
- if (channelp)
- {
- LLAudioChannelOpenAL *masterchannelp =
- (LLAudioChannelOpenAL*)channelp;
- if (mALSource != AL_NONE &&
- masterchannelp->mALSource != AL_NONE)
- {
- // we have channels allocated to master and slave
- ALfloat master_offset;
- alGetSourcef(masterchannelp->mALSource, AL_SEC_OFFSET,
- &master_offset);
-
- llinfos << "Syncing with master at " << master_offset
- << "sec" << llendl;
- // *TODO: detect when this fails, maybe use AL_SAMPLE_
- alSourcef(mALSource, AL_SEC_OFFSET, master_offset);
- }
- }
- play();
-}
-
-bool LLAudioChannelOpenAL::isPlaying()
-{
- if (mALSource != AL_NONE)
- {
- ALint state;
- alGetSourcei(mALSource, AL_SOURCE_STATE, &state);
- if(state == AL_PLAYING)
- {
- return true;
- }
- }
-
- return false;
-}
-
-bool LLAudioChannelOpenAL::updateBuffer()
-{
- if (LLAudioChannel::updateBuffer())
- {
- // Base class update returned true, which means that we need to actually
- // set up the source for a different buffer.
- LLAudioBufferOpenAL *bufferp = (LLAudioBufferOpenAL *)mCurrentSourcep->getCurrentBuffer();
- ALuint buffer = bufferp->getBuffer();
- alSourcei(mALSource, AL_BUFFER, buffer);
- mLastSamplePos = 0;
- }
-
- if (mCurrentSourcep)
- {
- alSourcef(mALSource, AL_GAIN,
- mCurrentSourcep->getGain() * getSecondaryGain());
- alSourcei(mALSource, AL_LOOPING,
- mCurrentSourcep->isLoop() ? AL_TRUE : AL_FALSE);
- alSourcef(mALSource, AL_ROLLOFF_FACTOR,
- gAudiop->mListenerp->getRolloffFactor());
- alSourcef(mALSource, AL_REFERENCE_DISTANCE,
- gAudiop->mListenerp->getDistanceFactor());
- }
-
- return true;
-}
-
-
-void LLAudioChannelOpenAL::updateLoop()
-{
- if (mALSource == AL_NONE)
- {
- return;
- }
-
- // Hack: We keep track of whether we looped or not by seeing when the
- // sample position looks like it's going backwards. Not reliable; may
- // yield false negatives.
- //
- ALint cur_pos;
- alGetSourcei(mALSource, AL_SAMPLE_OFFSET, &cur_pos);
- if (cur_pos < mLastSamplePos)
- {
- mLoopedThisFrame = true;
- }
- mLastSamplePos = cur_pos;
-}
-
-
-void LLAudioChannelOpenAL::update3DPosition()
-{
- if(!mCurrentSourcep)
- {
- return;
- }
- if (mCurrentSourcep->isAmbient())
- {
- alSource3f(mALSource, AL_POSITION, 0.0, 0.0, 0.0);
- alSource3f(mALSource, AL_VELOCITY, 0.0, 0.0, 0.0);
- alSourcei (mALSource, AL_SOURCE_RELATIVE, AL_TRUE);
- } else {
- LLVector3 float_pos;
- float_pos.setVec(mCurrentSourcep->getPositionGlobal());
- alSourcefv(mALSource, AL_POSITION, float_pos.mV);
- alSourcefv(mALSource, AL_VELOCITY, mCurrentSourcep->getVelocity().mV);
- alSourcei (mALSource, AL_SOURCE_RELATIVE, AL_FALSE);
- }
-
- alSourcef(mALSource, AL_GAIN, mCurrentSourcep->getGain() * getSecondaryGain());
-}
-
-LLAudioBufferOpenAL::LLAudioBufferOpenAL()
-{
- mALBuffer = AL_NONE;
-}
-
-LLAudioBufferOpenAL::~LLAudioBufferOpenAL()
-{
- cleanup();
-}
-
-void LLAudioBufferOpenAL::cleanup()
-{
- if(mALBuffer != AL_NONE)
- {
- alDeleteBuffers(1, &mALBuffer);
- mALBuffer = AL_NONE;
- }
-}
-
-bool LLAudioBufferOpenAL::loadWAV(const std::string& filename)
-{
- cleanup();
- mALBuffer = alutCreateBufferFromFile(filename.c_str());
- if(mALBuffer == AL_NONE)
- {
- ALenum error = alutGetError();
- if (gDirUtilp->fileExists(filename))
- {
- llwarns <<
- "LLAudioBufferOpenAL::loadWAV() Error loading "
- << filename
- << " " << alutGetErrorString(error) << llendl;
- }
- else
- {
- // It's common for the file to not actually exist.
- lldebugs <<
- "LLAudioBufferOpenAL::loadWAV() Error loading "
- << filename
- << " " << alutGetErrorString(error) << llendl;
- }
- return false;
- }
-
- return true;
-}
-
-U32 LLAudioBufferOpenAL::getLength()
-{
- if(mALBuffer == AL_NONE)
- {
- return 0;
- }
- ALint length;
- alGetBufferi(mALBuffer, AL_SIZE, &length);
- return length / 2; // convert size in bytes to size in (16-bit) samples
-}
-
-// ------------
-
-void LLAudioEngine_OpenAL::initWind()
-{
- ALenum error;
- llinfos << "LLAudioEngine_OpenAL::initWind() start" << llendl;
-
- mNumEmptyWindALBuffers = MAX_NUM_WIND_BUFFERS;
-
- alGetError(); /* clear error */
-
- alGenSources(1,&mWindSource);
-
- if((error=alGetError()) != AL_NO_ERROR)
- {
- llwarns << "LLAudioEngine_OpenAL::initWind() Error creating wind sources: "<;
-
- mWindBufFreq = mWindGen->getInputSamplingRate();
- mWindBufSamples = llceil(mWindBufFreq * 0.05f); // 1/20th sec - WIND_BUFFER_SIZE_SEC
- mWindBufBytes = mWindBufSamples * 2 /*stereo*/ * sizeof(WIND_SAMPLE_T);
-
- mWindBuf = new WIND_SAMPLE_T [mWindBufSamples * 2 /*stereo*/];
-
- if(mWindBuf==NULL)
- {
- llerrs << "LLAudioEngine_OpenAL::initWind() Error creating wind memory buffer" << llendl;
- mEnableWind=false;
- }
-
- llinfos << "LLAudioEngine_OpenAL::initWind() done" << llendl;
-}
-
-void LLAudioEngine_OpenAL::cleanupWind()
-{
- llinfos << "LLAudioEngine_OpenAL::cleanupWind()" << llendl;
-
- if (mWindSource != AL_NONE)
- {
- // detach and delete all outstanding buffers on the wind source
- alSourceStop(mWindSource);
- ALint processed;
- alGetSourcei(mWindSource, AL_BUFFERS_PROCESSED, &processed);
- while (processed--)
- {
- ALuint buffer = AL_NONE;
- alSourceUnqueueBuffers(mWindSource, 1, &buffer);
- alDeleteBuffers(1, &buffer);
- }
-
- // delete the wind source itself
- alDeleteSources(1, &mWindSource);
-
- mWindSource = AL_NONE;
- }
-
- delete[] mWindBuf;
- mWindBuf = NULL;
-
- delete mWindGen;
- mWindGen = NULL;
-}
-
-void LLAudioEngine_OpenAL::updateWind(LLVector3 wind_vec, F32 camera_altitude)
-{
- LLVector3 wind_pos;
- F64 pitch;
- F64 center_freq;
- ALenum error;
-
- if (!mEnableWind)
- return;
-
- if(!mWindBuf)
- return;
-
- if (mWindUpdateTimer.checkExpirationAndReset(LL_WIND_UPDATE_INTERVAL))
- {
-
- // wind comes in as Linden coordinate (+X = forward, +Y = left, +Z = up)
- // need to convert this to the conventional orientation DS3D and OpenAL use
- // where +X = right, +Y = up, +Z = backwards
-
- wind_vec.setVec(-wind_vec.mV[1], wind_vec.mV[2], -wind_vec.mV[0]);
-
- pitch = 1.0 + mapWindVecToPitch(wind_vec);
- center_freq = 80.0 * pow(pitch,2.5*(mapWindVecToGain(wind_vec)+1.0));
-
- mWindGen->mTargetFreq = (F32)center_freq;
- mWindGen->mTargetGain = (F32)mapWindVecToGain(wind_vec) * mMaxWindGain;
- mWindGen->mTargetPanGainR = (F32)mapWindVecToPan(wind_vec);
-
- alSourcei(mWindSource, AL_LOOPING, AL_FALSE);
- alSource3f(mWindSource, AL_POSITION, 0.0, 0.0, 0.0);
- alSource3f(mWindSource, AL_VELOCITY, 0.0, 0.0, 0.0);
- alSourcef(mWindSource, AL_ROLLOFF_FACTOR, 0.0);
- alSourcei(mWindSource, AL_SOURCE_RELATIVE, AL_TRUE);
- }
-
- // ok lets make a wind buffer now
-
- ALint processed, queued, unprocessed;
- alGetSourcei(mWindSource, AL_BUFFERS_PROCESSED, &processed);
- alGetSourcei(mWindSource, AL_BUFFERS_QUEUED, &queued);
- unprocessed = queued - processed;
-
- // ensure that there are always at least 3x as many filled buffers
- // queued as we managed to empty since last time.
- mNumEmptyWindALBuffers = llmin(mNumEmptyWindALBuffers + processed * 3 - unprocessed, MAX_NUM_WIND_BUFFERS-unprocessed);
- mNumEmptyWindALBuffers = llmax(mNumEmptyWindALBuffers, 0);
-
- //llinfos << "mNumEmptyWindALBuffers: " << mNumEmptyWindALBuffers <<" (" << unprocessed << ":" << processed << ")" << llendl;
-
- while(processed--) // unqueue old buffers
- {
- ALuint buffer;
- ALenum error;
- alGetError(); /* clear error */
- alSourceUnqueueBuffers(mWindSource, 1, &buffer);
- error = alGetError();
- if(error != AL_NO_ERROR)
- {
- llwarns << "LLAudioEngine_OpenAL::updateWind() error swapping (unqueuing) buffers" << llendl;
- }
- else
- {
- alDeleteBuffers(1, &buffer);
- }
- }
-
- unprocessed += mNumEmptyWindALBuffers;
- while (mNumEmptyWindALBuffers > 0) // fill+queue new buffers
- {
- ALuint buffer;
- alGetError(); /* clear error */
- alGenBuffers(1,&buffer);
- if((error=alGetError()) != AL_NO_ERROR)
- {
- llwarns << "LLAudioEngine_OpenAL::initWind() Error creating wind buffer: " << error << llendl;
- break;
- }
-
- alBufferData(buffer,
- AL_FORMAT_STEREO16,
- mWindGen->windGenerate(mWindBuf,
- mWindBufSamples, 2),
- mWindBufBytes,
- mWindBufFreq);
- error = alGetError();
- if(error != AL_NO_ERROR)
- {
- llwarns << "LLAudioEngine_OpenAL::updateWind() error swapping (bufferdata) buffers" << llendl;
- }
-
- alSourceQueueBuffers(mWindSource, 1, &buffer);
- error = alGetError();
- if(error != AL_NO_ERROR)
- {
- llwarns << "LLAudioEngine_OpenAL::updateWind() error swapping (queuing) buffers" << llendl;
- }
-
- --mNumEmptyWindALBuffers;
- }
-
- ALint playing;
- alGetSourcei(mWindSource, AL_SOURCE_STATE, &playing);
- if(playing != AL_PLAYING)
- {
- alSourcePlay(mWindSource);
-
- lldebugs << "Wind had stopped - probably ran out of buffers - restarting: " << (unprocessed+mNumEmptyWindALBuffers) << " now queued." << llendl;
- }
-}
-
diff --git a/linden/indra/llaudio/audioengine_openal.h b/linden/indra/llaudio/audioengine_openal.h
deleted file mode 100644
index 8c8bfd9..0000000
--- a/linden/indra/llaudio/audioengine_openal.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/**
- * @file audioengine_openal.cpp
- * @brief implementation of audio engine using OpenAL
- * support as a OpenAL 3D implementation
- *
- *
- * $LicenseInfo:firstyear=2002&license=viewergpl$
- *
- * Copyright (c) 2002-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-
-#ifndef LL_AUDIOENGINE_OPENAL_H
-#define LL_AUDIOENGINE_OPENAL_H
-
-#include "audioengine.h"
-#include "listener_openal.h"
-#include "windgen.h"
-
-
-class LLAudioEngine_OpenAL : public LLAudioEngine
-{
- public:
- LLAudioEngine_OpenAL();
- virtual ~LLAudioEngine_OpenAL();
-
- virtual bool init(const S32 num_channels, void *user_data);
- virtual std::string getDriverName(bool verbose);
- virtual void allocateListener();
-
- virtual void shutdown();
-
- void setInternalGain(F32 gain);
-
- LLAudioBuffer* createBuffer();
- LLAudioChannel* createChannel();
-
- /*virtual*/ void initWind();
- /*virtual*/ void cleanupWind();
- /*virtual*/ void updateWind(LLVector3 direction, F32 camera_altitude);
-
- private:
- void * windDSP(void *newbuffer, int length);
- typedef S16 WIND_SAMPLE_T;
- LLWindGen *mWindGen;
- S16 *mWindBuf;
- U32 mWindBufFreq;
- U32 mWindBufSamples;
- U32 mWindBufBytes;
- ALuint mWindSource;
- int mNumEmptyWindALBuffers;
-
- static const int MAX_NUM_WIND_BUFFERS = 80;
-};
-
-class LLAudioChannelOpenAL : public LLAudioChannel
-{
- public:
- LLAudioChannelOpenAL();
- virtual ~LLAudioChannelOpenAL();
- protected:
- /*virtual*/ void play();
- /*virtual*/ void playSynced(LLAudioChannel *channelp);
- /*virtual*/ void cleanup();
- /*virtual*/ bool isPlaying();
-
- /*virtual*/ bool updateBuffer();
- /*virtual*/ void update3DPosition();
- /*virtual*/ void updateLoop();
-
- ALuint mALSource;
- ALint mLastSamplePos;
-};
-
-class LLAudioBufferOpenAL : public LLAudioBuffer{
- public:
- LLAudioBufferOpenAL();
- virtual ~LLAudioBufferOpenAL();
-
- bool loadWAV(const std::string& filename);
- U32 getLength();
-
- friend class LLAudioChannelOpenAL;
- protected:
- void cleanup();
- ALuint getBuffer() {return mALBuffer;}
-
- ALuint mALBuffer;
-};
-
-#endif
diff --git a/linden/indra/llaudio/listener.cpp b/linden/indra/llaudio/listener.cpp
index e2dc30e..e69de29 100644
--- a/linden/indra/llaudio/listener.cpp
+++ b/linden/indra/llaudio/listener.cpp
@@ -1,153 +0,0 @@
-/**
- * @file listener.cpp
- * @brief Implementation of LISTENER class abstracting the audio support
- *
- * $LicenseInfo:firstyear=2000&license=viewergpl$
- *
- * Copyright (c) 2000-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "linden_common.h"
-
-#include "listener.h"
-
-#define DEFAULT_AT 0.0f,0.0f,-1.0f
-#define DEFAULT_UP 0.0f,1.0f,0.0f
-
-//-----------------------------------------------------------------------
-// constructor
-//-----------------------------------------------------------------------
-LLListener::LLListener()
-{
- init();
-}
-
-//-----------------------------------------------------------------------
-LLListener::~LLListener()
-{
-}
-
-//-----------------------------------------------------------------------
-void LLListener::init(void)
-{
- mPosition.zeroVec();
- mListenAt.setVec(DEFAULT_AT);
- mListenUp.setVec(DEFAULT_UP);
- mVelocity.zeroVec();
-}
-
-//-----------------------------------------------------------------------
-void LLListener::translate(LLVector3 offset)
-{
- mPosition += offset;
-}
-
-//-----------------------------------------------------------------------
-void LLListener::setPosition(LLVector3 pos)
-{
- mPosition = pos;
-}
-
-//-----------------------------------------------------------------------
-LLVector3 LLListener::getPosition(void)
-{
- return(mPosition);
-}
-
-//-----------------------------------------------------------------------
-LLVector3 LLListener::getAt(void)
-{
- return(mListenAt);
-}
-
-//-----------------------------------------------------------------------
-LLVector3 LLListener::getUp(void)
-{
- return(mListenUp);
-}
-
-//-----------------------------------------------------------------------
-void LLListener::setVelocity(LLVector3 vel)
-{
- mVelocity = vel;
-}
-
-//-----------------------------------------------------------------------
-void LLListener::orient(LLVector3 up, LLVector3 at)
-{
- mListenUp = up;
- mListenAt = at;
-}
-
-//-----------------------------------------------------------------------
-void LLListener::set(LLVector3 pos, LLVector3 vel, LLVector3 up, LLVector3 at)
-{
- mPosition = pos;
- mVelocity = vel;
-
- setPosition(pos);
- setVelocity(vel);
- orient(up,at);
-}
-
-//-----------------------------------------------------------------------
-void LLListener::setDopplerFactor(F32 factor)
-{
-}
-
-//-----------------------------------------------------------------------
-F32 LLListener::getDopplerFactor()
-{
- return (1.f);
-}
-
-//-----------------------------------------------------------------------
-void LLListener::setDistanceFactor(F32 factor)
-{
-}
-
-//-----------------------------------------------------------------------
-F32 LLListener::getDistanceFactor()
-{
- return (1.f);
-}
-
-//-----------------------------------------------------------------------
-void LLListener::setRolloffFactor(F32 factor)
-{
-}
-
-//-----------------------------------------------------------------------
-F32 LLListener::getRolloffFactor()
-{
- return (1.f);
-}
-
-//-----------------------------------------------------------------------
-void LLListener::commitDeferredChanges()
-{
-}
-
diff --git a/linden/indra/llaudio/listener.h b/linden/indra/llaudio/listener.h
index 4137304..e69de29 100644
--- a/linden/indra/llaudio/listener.h
+++ b/linden/indra/llaudio/listener.h
@@ -1,80 +0,0 @@
-/**
- * @file listener.h
- * @brief Description of LISTENER base class abstracting the audio support.
- *
- * $LicenseInfo:firstyear=2000&license=viewergpl$
- *
- * Copyright (c) 2000-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_LISTENER_H
-#define LL_LISTENER_H
-
-#include "v3math.h"
-
-class LLListener
-{
- private:
- protected:
- LLVector3 mPosition;
- LLVector3 mVelocity;
- LLVector3 mListenAt;
- LLVector3 mListenUp;
-
- public:
-
- private:
- protected:
- public:
- LLListener();
- virtual ~LLListener();
- virtual void init();
-
- virtual void set(LLVector3 pos, LLVector3 vel, LLVector3 up, LLVector3 at);
-
- virtual void setPosition(LLVector3 pos);
- virtual void setVelocity(LLVector3 vel);
-
- virtual void orient(LLVector3 up, LLVector3 at);
- virtual void translate(LLVector3 offset);
-
- virtual void setDopplerFactor(F32 factor);
- virtual void setDistanceFactor(F32 factor);
- virtual void setRolloffFactor(F32 factor);
-
- virtual LLVector3 getPosition();
- virtual LLVector3 getAt();
- virtual LLVector3 getUp();
-
- virtual F32 getDopplerFactor();
- virtual F32 getDistanceFactor();
- virtual F32 getRolloffFactor();
-
- virtual void commitDeferredChanges();
-};
-
-#endif
-
diff --git a/linden/indra/llaudio/listener_ds3d.h b/linden/indra/llaudio/listener_ds3d.h
index 3121e12..e69de29 100644
--- a/linden/indra/llaudio/listener_ds3d.h
+++ b/linden/indra/llaudio/listener_ds3d.h
@@ -1,76 +0,0 @@
-/**
- * @file listener_ds3d.h
- * @brief Description of LISTENER class abstracting the audio support
- * as a DirectSound 3D implementation (windows only)
- *
- * $LicenseInfo:firstyear=2000&license=viewergpl$
- *
- * Copyright (c) 2000-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_LISTENER_DS3D_H
-#define LL_LISTENER_DS3D_H
-
-#include "listener.h"
-
-#include
-#include
-#include
-
-class LLListener_DS3D : public LLListener
-{
- private:
- protected:
- IDirectSound3DListener8 *m3DListener;
- public:
-
- private:
- protected:
- public:
- LLListener_DS3D();
- virtual ~LLListener_DS3D();
- virtual void init();
-
- virtual void setDS3DLPtr (IDirectSound3DListener8 *listener_p);
-
- virtual void translate(LLVector3 offset);
- virtual void setPosition(LLVector3 pos);
- virtual void setVelocity(LLVector3 vel);
- virtual void orient(LLVector3 up, LLVector3 at);
-
- virtual void setDopplerFactor(F32 factor);
- virtual F32 getDopplerFactor();
- virtual void setDistanceFactor(F32 factor);
- virtual F32 getDistanceFactor();
- virtual void setRolloffFactor(F32 factor);
- virtual F32 getRolloffFactor();
-
- virtual void commitDeferredChanges();
-};
-
-#endif
-
-
diff --git a/linden/indra/llaudio/listener_fmod.cpp b/linden/indra/llaudio/listener_fmod.cpp
index 4bbb3d9..e69de29 100644
--- a/linden/indra/llaudio/listener_fmod.cpp
+++ b/linden/indra/llaudio/listener_fmod.cpp
@@ -1,143 +0,0 @@
-/**
- * @file listener_fmod.cpp
- * @brief implementation of LISTENER class abstracting the audio
- * support as a FMOD 3D implementation (windows only)
- *
- * $LicenseInfo:firstyear=2002&license=viewergpl$
- *
- * Copyright (c) 2002-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "linden_common.h"
-#include "audioengine.h"
-#include "listener_fmod.h"
-#include "fmod.h"
-
-//-----------------------------------------------------------------------
-// constructor
-//-----------------------------------------------------------------------
-LLListener_FMOD::LLListener_FMOD()
-{
- init();
-}
-
-//-----------------------------------------------------------------------
-LLListener_FMOD::~LLListener_FMOD()
-{
-}
-
-//-----------------------------------------------------------------------
-void LLListener_FMOD::init(void)
-{
- // do inherited
- LLListener::init();
- mDopplerFactor = 1.0f;
- mDistanceFactor = 1.0f;
- mRolloffFactor = 1.0f;
-}
-
-//-----------------------------------------------------------------------
-void LLListener_FMOD::translate(LLVector3 offset)
-{
- LLListener::translate(offset);
-
- FSOUND_3D_Listener_SetAttributes(mPosition.mV, NULL, mListenAt.mV[0],mListenAt.mV[1],mListenAt.mV[2], mListenUp.mV[0],mListenUp.mV[1],mListenUp.mV[2]);
-}
-
-//-----------------------------------------------------------------------
-void LLListener_FMOD::setPosition(LLVector3 pos)
-{
- LLListener::setPosition(pos);
-
- FSOUND_3D_Listener_SetAttributes(pos.mV, NULL, mListenAt.mV[0],mListenAt.mV[1],mListenAt.mV[2], mListenUp.mV[0],mListenUp.mV[1],mListenUp.mV[2]);
-}
-
-//-----------------------------------------------------------------------
-void LLListener_FMOD::setVelocity(LLVector3 vel)
-{
- LLListener::setVelocity(vel);
-
- FSOUND_3D_Listener_SetAttributes(NULL, vel.mV, mListenAt.mV[0],mListenAt.mV[1],mListenAt.mV[2], mListenUp.mV[0],mListenUp.mV[1],mListenUp.mV[2]);
-}
-
-//-----------------------------------------------------------------------
-void LLListener_FMOD::orient(LLVector3 up, LLVector3 at)
-{
- LLListener::orient(up, at);
-
- // Welcome to the transition between right and left
- // (coordinate systems, that is)
- // Leaving the at vector alone results in a L/R reversal
- // since DX is left-handed and we (LL, OpenGL, OpenAL) are right-handed
- at = -at;
-
- FSOUND_3D_Listener_SetAttributes(NULL, NULL, at.mV[0],at.mV[1],at.mV[2], up.mV[0],up.mV[1],up.mV[2]);
-}
-
-//-----------------------------------------------------------------------
-void LLListener_FMOD::commitDeferredChanges()
-{
- FSOUND_Update();
-}
-
-
-void LLListener_FMOD::setRolloffFactor(F32 factor)
-{
- mRolloffFactor = factor;
- FSOUND_3D_SetRolloffFactor(factor);
-}
-
-
-F32 LLListener_FMOD::getRolloffFactor()
-{
- return mRolloffFactor;
-}
-
-
-void LLListener_FMOD::setDopplerFactor(F32 factor)
-{
- mDopplerFactor = factor;
- FSOUND_3D_SetDopplerFactor(factor);
-}
-
-
-F32 LLListener_FMOD::getDopplerFactor()
-{
- return mDopplerFactor;
-}
-
-
-void LLListener_FMOD::setDistanceFactor(F32 factor)
-{
- mDistanceFactor = factor;
- FSOUND_3D_SetDistanceFactor(factor);
-}
-
-
-F32 LLListener_FMOD::getDistanceFactor()
-{
- return mDistanceFactor;
-}
diff --git a/linden/indra/llaudio/listener_fmod.h b/linden/indra/llaudio/listener_fmod.h
index 5f372ab..e69de29 100644
--- a/linden/indra/llaudio/listener_fmod.h
+++ b/linden/indra/llaudio/listener_fmod.h
@@ -1,67 +0,0 @@
-/**
- * @file listener_fmod.h
- * @brief Description of LISTENER class abstracting the audio support
- * as an FMOD 3D implementation (windows and Linux)
- *
- * $LicenseInfo:firstyear=2002&license=viewergpl$
- *
- * Copyright (c) 2002-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_LISTENER_FMOD_H
-#define LL_LISTENER_FMOD_H
-
-#include "listener.h"
-
-class LLListener_FMOD : public LLListener
-{
- public:
- LLListener_FMOD();
- virtual ~LLListener_FMOD();
- virtual void init();
-
- virtual void translate(LLVector3 offset);
- virtual void setPosition(LLVector3 pos);
- virtual void setVelocity(LLVector3 vel);
- virtual void orient(LLVector3 up, LLVector3 at);
- virtual void commitDeferredChanges();
-
- virtual void setDopplerFactor(F32 factor);
- virtual F32 getDopplerFactor();
- virtual void setDistanceFactor(F32 factor);
- virtual F32 getDistanceFactor();
- virtual void setRolloffFactor(F32 factor);
- virtual F32 getRolloffFactor();
-
- protected:
- F32 mDopplerFactor;
- F32 mDistanceFactor;
- F32 mRolloffFactor;
-};
-
-#endif
-
-
diff --git a/linden/indra/llaudio/listener_openal.cpp b/linden/indra/llaudio/listener_openal.cpp
deleted file mode 100644
index d0ef9b2..0000000
--- a/linden/indra/llaudio/listener_openal.cpp
+++ /dev/null
@@ -1,125 +0,0 @@
-/**
- * @file audioengine_openal.cpp
- * @brief implementation of audio engine using OpenAL
- * support as a OpenAL 3D implementation
- *
- * $LicenseInfo:firstyear=2002&license=viewergpl$
- *
- * Copyright (c) 2002-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "linden_common.h"
-#include "audioengine.h"
-
-#include "listener_openal.h"
-
-LLListener_OpenAL::LLListener_OpenAL()
-{
- init();
-}
-
-LLListener_OpenAL::~LLListener_OpenAL()
-{
-}
-
-void LLListener_OpenAL::translate(LLVector3 offset)
-{
- //llinfos << "LLListener_OpenAL::translate() : " << offset << llendl;
- LLListener::translate(offset);
-}
-
-void LLListener_OpenAL::setPosition(LLVector3 pos)
-{
- //llinfos << "LLListener_OpenAL::setPosition() : " << pos << llendl;
- LLListener::setPosition(pos);
-}
-
-void LLListener_OpenAL::setVelocity(LLVector3 vel)
-{
- LLListener::setVelocity(vel);
-}
-
-void LLListener_OpenAL::orient(LLVector3 up, LLVector3 at)
-{
- //llinfos << "LLListener_OpenAL::orient() up: " << up << " at: " << at << llendl;
- LLListener::orient(up, at);
-}
-
-void LLListener_OpenAL::commitDeferredChanges()
-{
- ALfloat orientation[6];
- orientation[0] = mListenAt.mV[0];
- orientation[1] = mListenAt.mV[1];
- orientation[2] = mListenAt.mV[2];
- orientation[3] = mListenUp.mV[0];
- orientation[4] = mListenUp.mV[1];
- orientation[5] = mListenUp.mV[2];
-
- ALfloat velocity[3];
- velocity[0] = mVelocity.mV[0];
- velocity[1] = mVelocity.mV[1];
- velocity[2] = mVelocity.mV[2];
-
- alListenerfv(AL_ORIENTATION, orientation);
- alListenerfv(AL_POSITION, mPosition.mV);
- alListenerfv(AL_VELOCITY, velocity);
-}
-
-void LLListener_OpenAL::setDopplerFactor(F32 factor)
-{
- //llinfos << "LLListener_OpenAL::setDopplerFactor() : " << factor << llendl;
- alDopplerFactor(factor);
-}
-
-F32 LLListener_OpenAL::getDopplerFactor()
-{
- ALfloat factor;
- factor = alGetFloat(AL_DOPPLER_FACTOR);
- //llinfos << "LLListener_OpenAL::getDopplerFactor() : " << factor << llendl;
- return factor;
-}
-
-
-void LLListener_OpenAL::setRolloffFactor(F32 factor)
-{
- mRolloffFactor = factor;
-}
-
-F32 LLListener_OpenAL::getRolloffFactor()
-{
- return mRolloffFactor;
-}
-
-
-void LLListener_OpenAL::setDistanceFactor(F32 factor)
-{
- mDistanceFactor = factor;
-}
-
-F32 LLListener_OpenAL::getDistanceFactor()
-{
- return mDistanceFactor;
-}
diff --git a/linden/indra/llaudio/listener_openal.h b/linden/indra/llaudio/listener_openal.h
deleted file mode 100644
index 2b79ada..0000000
--- a/linden/indra/llaudio/listener_openal.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * @file listener_openal.h
- * @brief Description of LISTENER class abstracting the audio support
- * as an OpenAL implementation
- *
- * $LicenseInfo:firstyear=2000&license=viewergpl$
- *
- * Copyright (c) 2000-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_LISTENER_OPENAL_H
-#define LL_LISTENER_OPENAL_H
-
-#include "listener.h"
-
-
-//#include "AL/al.h"
-#include "AL/alut.h"
-
-class LLListener_OpenAL : public LLListener
-{
- public:
- LLListener_OpenAL();
- virtual ~LLListener_OpenAL();
-
- virtual void translate(LLVector3 offset);
- virtual void setPosition(LLVector3 pos);
- virtual void setVelocity(LLVector3 vel);
- virtual void orient(LLVector3 up, LLVector3 at);
- virtual void commitDeferredChanges();
-
- virtual void setDopplerFactor(F32 factor);
- virtual F32 getDopplerFactor();
- virtual void setDistanceFactor(F32 factor);
- virtual F32 getDistanceFactor();
- virtual void setRolloffFactor(F32 factor);
- virtual F32 getRolloffFactor();
-
- protected:
- F32 mDistanceFactor;
- F32 mRolloffFactor;
-};
-
-#endif
-
diff --git a/linden/indra/llaudio/llaudiodecodemgr.cpp b/linden/indra/llaudio/llaudiodecodemgr.cpp
index afb3c33..a14d4ec 100644
--- a/linden/indra/llaudio/llaudiodecodemgr.cpp
+++ b/linden/indra/llaudio/llaudiodecodemgr.cpp
@@ -33,18 +33,18 @@
#include "llaudiodecodemgr.h"
-#include "vorbisdecode.h"
-#include "audioengine.h"
+#include "llvorbisdecode.h"
+#include "llaudioengine.h"
#include "lllfsthread.h"
#include "llvfile.h"
#include "llstring.h"
#include "lldir.h"
#include "llendianswizzle.h"
-#include "audioengine.h"
#include "llassetstorage.h"
#include "vorbis/codec.h"
#include "vorbis/vorbisfile.h"
+#include "llvorbisencode.h"
extern LLAudioEngine *gAudiop;
@@ -218,11 +218,42 @@ BOOL LLVorbisDecodeState::initDecode()
return(FALSE);
}
- size_t size_guess = (size_t)ov_pcm_total(&mVF, -1);
+ S32 sample_count = ov_pcm_total(&mVF, -1);
+ size_t size_guess = (size_t)sample_count;
vorbis_info* vi = ov_info(&mVF, -1);
size_guess *= vi->channels;
size_guess *= 2;
size_guess += 2048;
+
+ bool abort_decode = false;
+
+ if( vi->channels < 1 || vi->channels > LLVORBIS_CLIP_MAX_CHANNELS )
+ {
+ abort_decode = true;
+ llwarns << "Bad channel count: " << vi->channels << llendl;
+ }
+
+ if( (size_t)sample_count > LLVORBIS_CLIP_REJECT_SAMPLES )
+ {
+ abort_decode = true;
+ llwarns << "Illegal sample count: " << sample_count << llendl;
+ }
+
+ if( size_guess > LLVORBIS_CLIP_REJECT_SIZE )
+ {
+ abort_decode = true;
+ llwarns << "Illegal sample size: " << size_guess << llendl;
+ }
+
+ if( abort_decode )
+ {
+ llwarns << "Canceling initDecode. Bad asset: " << mUUID << llendl;
+ llwarns << "Bad asset encoded by: " << ov_comment(&mVF,-1)->vendor << llendl;
+ delete mInFilep;
+ mInFilep = NULL;
+ return FALSE;
+ }
+
mWAVBuffer.reserve(size_guess);
mWAVBuffer.resize(WAV_HEADER_SIZE);
@@ -375,16 +406,16 @@ BOOL LLVorbisDecodeState::finishDecode()
// write "data" chunk length, in little-endian format
S32 data_length = mWAVBuffer.size() - WAV_HEADER_SIZE;
- mWAVBuffer[40] = (data_length - 8) & 0x000000FF;
- mWAVBuffer[41] = ((data_length - 8)>> 8) & 0x000000FF;
- mWAVBuffer[42] = ((data_length - 8)>> 16) & 0x000000FF;
- mWAVBuffer[43] = ((data_length - 8)>> 24) & 0x000000FF;
-
+ mWAVBuffer[40] = (data_length) & 0x000000FF;
+ mWAVBuffer[41] = (data_length >> 8) & 0x000000FF;
+ mWAVBuffer[42] = (data_length >> 16) & 0x000000FF;
+ mWAVBuffer[43] = (data_length >> 24) & 0x000000FF;
// write overall "RIFF" length, in little-endian format
- mWAVBuffer[4] = (data_length + 28) & 0x000000FF;
- mWAVBuffer[5] = ((data_length + 28) >> 8) & 0x000000FF;
- mWAVBuffer[6] = ((data_length + 28) >> 16) & 0x000000FF;
- mWAVBuffer[7] = ((data_length + 28) >> 24) & 0x000000FF;
+ data_length += 36;
+ mWAVBuffer[4] = (data_length) & 0x000000FF;
+ mWAVBuffer[5] = (data_length >> 8) & 0x000000FF;
+ mWAVBuffer[6] = (data_length >> 16) & 0x000000FF;
+ mWAVBuffer[7] = (data_length >> 24) & 0x000000FF;
//
// FUDGECAKES!!! Vorbis encode/decode messes up loop point transitions (pop)
@@ -396,8 +427,7 @@ BOOL LLVorbisDecodeState::finishDecode()
S32 fade_length;
char pcmout[4096]; /*Flawfinder: ignore*/
- fade_length = llmin((S32)128,(S32)(data_length)/8);
-
+ fade_length = llmin((S32)128,(S32)(data_length-36)/8);
if((S32)mWAVBuffer.size() >= (WAV_HEADER_SIZE + 2* fade_length))
{
memcpy(pcmout, &mWAVBuffer[WAV_HEADER_SIZE], (2 * fade_length)); /*Flawfinder: ignore*/
@@ -437,7 +467,7 @@ BOOL LLVorbisDecodeState::finishDecode()
}
}
- if (0 == data_length)
+ if (36 == data_length)
{
llwarns << "BAD Vorbis decode in finishDecode!" << llendl;
mValid = FALSE;
diff --git a/linden/indra/llaudio/llaudioengine.cpp b/linden/indra/llaudio/llaudioengine.cpp
new file mode 100644
index 0000000..bed791a
--- /dev/null
+++ b/linden/indra/llaudio/llaudioengine.cpp
@@ -0,0 +1,1801 @@
+ /**
+ * @file audioengine.cpp
+ * @brief implementation of LLAudioEngine class abstracting the Open
+ * AL audio support
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include
+
+#include "linden_common.h"
+
+#include "llaudioengine.h"
+#include "llstreamingaudio.h"
+
+#include "llerror.h"
+#include "llmath.h"
+
+#include "sound_ids.h" // temporary hack for min/max distances
+
+#include "llvfs.h"
+#include "lldir.h"
+#include "llaudiodecodemgr.h"
+#include "llassetstorage.h"
+
+
+// necessary for grabbing sounds from sim (implemented in viewer)
+extern void request_sound(const LLUUID &sound_guid);
+
+LLAudioEngine* gAudiop = NULL;
+
+
+//
+// LLAudioEngine implementation
+//
+
+
+LLAudioEngine::LLAudioEngine()
+{
+ setDefaults();
+}
+
+
+LLAudioEngine::~LLAudioEngine()
+{
+}
+
+LLStreamingAudioInterface* LLAudioEngine::getStreamingAudioImpl()
+{
+ return mStreamingAudioImpl;
+}
+
+void LLAudioEngine::setStreamingAudioImpl(LLStreamingAudioInterface *impl)
+{
+ mStreamingAudioImpl = impl;
+}
+
+void LLAudioEngine::setDefaults()
+{
+ mMaxWindGain = 1.f;
+
+ mListenerp = NULL;
+
+ mMuted = false;
+ mUserData = NULL;
+
+ mLastStatus = 0;
+
+ mNumChannels = 0;
+ mEnableWind = false;
+
+ S32 i;
+ for (i = 0; i < MAX_CHANNELS; i++)
+ {
+ mChannels[i] = NULL;
+ }
+ for (i = 0; i < MAX_BUFFERS; i++)
+ {
+ mBuffers[i] = NULL;
+ }
+
+ mMasterGain = 1.f;
+ mInternalGain = 0.f;
+ mNextWindUpdate = 0.f;
+
+ mStreamingAudioImpl = NULL;
+
+ for (U32 i = 0; i < LLAudioEngine::AUDIO_TYPE_COUNT; i++)
+ mSecondaryGain[i] = 1.0f;
+}
+
+
+bool LLAudioEngine::init(const S32 num_channels, void* userdata)
+{
+ setDefaults();
+
+ mNumChannels = num_channels;
+ mUserData = userdata;
+
+ allocateListener();
+
+ // Initialize the decode manager
+ gAudioDecodeMgrp = new LLAudioDecodeMgr;
+
+ llinfos << "LLAudioEngine::init() AudioEngine successfully initialized" << llendl;
+
+ return true;
+}
+
+
+void LLAudioEngine::shutdown()
+{
+ // Clean up decode manager
+ delete gAudioDecodeMgrp;
+ gAudioDecodeMgrp = NULL;
+
+ // Clean up wind source
+ cleanupWind();
+
+ // Clean up audio sources
+ source_map::iterator iter_src;
+ for (iter_src = mAllSources.begin(); iter_src != mAllSources.end(); iter_src++)
+ {
+ delete iter_src->second;
+ }
+
+
+ // Clean up audio data
+ data_map::iterator iter_data;
+ for (iter_data = mAllData.begin(); iter_data != mAllData.end(); iter_data++)
+ {
+ delete iter_data->second;
+ }
+
+
+ // Clean up channels
+ S32 i;
+ for (i = 0; i < MAX_CHANNELS; i++)
+ {
+ delete mChannels[i];
+ mChannels[i] = NULL;
+ }
+
+ // Clean up buffers
+ for (i = 0; i < MAX_BUFFERS; i++)
+ {
+ delete mBuffers[i];
+ mBuffers[i] = NULL;
+ }
+}
+
+
+// virtual
+void LLAudioEngine::startInternetStream(const std::string& url)
+{
+ if (mStreamingAudioImpl)
+ mStreamingAudioImpl->start(url);
+}
+
+
+// virtual
+void LLAudioEngine::stopInternetStream()
+{
+ if (mStreamingAudioImpl)
+ mStreamingAudioImpl->stop();
+}
+
+// virtual
+void LLAudioEngine::pauseInternetStream(int pause)
+{
+ if (mStreamingAudioImpl)
+ mStreamingAudioImpl->pause(pause);
+}
+
+// virtual
+void LLAudioEngine::updateInternetStream()
+{
+ if (mStreamingAudioImpl)
+ mStreamingAudioImpl->update();
+}
+
+// virtual
+int LLAudioEngine::isInternetStreamPlaying()
+{
+ if (mStreamingAudioImpl)
+ return mStreamingAudioImpl->isPlaying();
+
+ return 0; // Stopped
+}
+
+
+// virtual
+void LLAudioEngine::setInternetStreamGain(F32 vol)
+{
+ if (mStreamingAudioImpl)
+ mStreamingAudioImpl->setGain(vol);
+}
+
+// virtual
+std::string LLAudioEngine::getInternetStreamURL()
+{
+ if (mStreamingAudioImpl)
+ return mStreamingAudioImpl->getURL();
+ else return std::string();
+}
+
+
+void LLAudioEngine::updateChannels()
+{
+ S32 i;
+ for (i = 0; i < MAX_CHANNELS; i++)
+ {
+ if (mChannels[i])
+ {
+ mChannels[i]->updateBuffer();
+ mChannels[i]->update3DPosition();
+ mChannels[i]->updateLoop();
+ }
+ }
+}
+
+static const F32 default_max_decode_time = .002f; // 2 ms
+void LLAudioEngine::idle(F32 max_decode_time)
+{
+ if (max_decode_time <= 0.f)
+ {
+ max_decode_time = default_max_decode_time;
+ }
+
+ // "Update" all of our audio sources, clean up dead ones.
+ // Primarily does position updating, cleanup of unused audio sources.
+ // Also does regeneration of the current priority of each audio source.
+
+ S32 i;
+ for (i = 0; i < MAX_BUFFERS; i++)
+ {
+ if (mBuffers[i])
+ {
+ mBuffers[i]->mInUse = false;
+ }
+ }
+
+ F32 max_priority = -1.f;
+ LLAudioSource *max_sourcep = NULL; // Maximum priority source without a channel
+ source_map::iterator iter;
+ for (iter = mAllSources.begin(); iter != mAllSources.end();)
+ {
+ LLAudioSource *sourcep = iter->second;
+
+ // Update this source
+ sourcep->update();
+ sourcep->updatePriority();
+
+ if (sourcep->isDone())
+ {
+ // The source is done playing, clean it up.
+ delete sourcep;
+ mAllSources.erase(iter++);
+ continue;
+ }
+
+ if (sourcep->isMuted())
+ {
+ ++iter;
+ continue;
+ }
+
+ if (!sourcep->getChannel() && sourcep->getCurrentBuffer())
+ {
+ // We could potentially play this sound if its priority is high enough.
+ if (sourcep->getPriority() > max_priority)
+ {
+ max_priority = sourcep->getPriority();
+ max_sourcep = sourcep;
+ }
+ }
+
+ // Move on to the next source
+ iter++;
+ }
+
+ // Now, do priority-based organization of audio sources.
+ // All channels used, check priorities.
+ // Find channel with lowest priority
+ if (max_sourcep)
+ {
+ LLAudioChannel *channelp = getFreeChannel(max_priority);
+ if (channelp)
+ {
+ //llinfos << "Replacing source in channel due to priority!" << llendl;
+ max_sourcep->setChannel(channelp);
+ channelp->setSource(max_sourcep);
+ if (max_sourcep->isSyncSlave())
+ {
+ // A sync slave, it doesn't start playing until it's synced up with the master.
+ // Flag this channel as waiting for sync, and return true.
+ channelp->setWaiting(true);
+ }
+ else
+ {
+ channelp->setWaiting(false);
+ if (channelp->mCurrentBufferp)
+ {
+ channelp->play();
+ }
+ }
+ }
+ }
+
+
+ // Do this BEFORE we update the channels
+ // Update the channels to sync up with any changes that the source made,
+ // such as changing what sound was playing.
+ updateChannels();
+
+ // Update queued sounds (switch to next queued data if the current has finished playing)
+ for (iter = mAllSources.begin(); iter != mAllSources.end(); ++iter)
+ {
+ // This is lame, instead of this I could actually iterate through all the sources
+ // attached to each channel, since only those with active channels
+ // can have anything interesting happen with their queue? (Maybe not true)
+ LLAudioSource *sourcep = iter->second;
+ if (!sourcep->mQueuedDatap || sourcep->isMuted())
+ {
+ // Muted, or nothing queued, so we don't care.
+ continue;
+ }
+
+ LLAudioChannel *channelp = sourcep->getChannel();
+ if (!channelp)
+ {
+ // This sound isn't playing, so we just process move the queue
+ sourcep->mCurrentDatap = sourcep->mQueuedDatap;
+ sourcep->mQueuedDatap = NULL;
+
+ // Reset the timer so the source doesn't die.
+ sourcep->mAgeTimer.reset();
+ // Make sure we have the buffer set up if we just decoded the data
+ if (sourcep->mCurrentDatap)
+ {
+ updateBufferForData(sourcep->mCurrentDatap);
+ }
+
+ // Actually play the associated data.
+ sourcep->setupChannel();
+ channelp = sourcep->getChannel();
+ if (channelp)
+ {
+ channelp->updateBuffer();
+ sourcep->getChannel()->play();
+ }
+ continue;
+ }
+ else
+ {
+ // Check to see if the current sound is done playing, or looped.
+ if (!channelp->isPlaying())
+ {
+ sourcep->mCurrentDatap = sourcep->mQueuedDatap;
+ sourcep->mQueuedDatap = NULL;
+
+ // Reset the timer so the source doesn't die.
+ sourcep->mAgeTimer.reset();
+
+ // Make sure we have the buffer set up if we just decoded the data
+ if (sourcep->mCurrentDatap)
+ {
+ updateBufferForData(sourcep->mCurrentDatap);
+ }
+
+ // Actually play the associated data.
+ sourcep->setupChannel();
+ channelp->updateBuffer();
+ sourcep->getChannel()->play();
+ }
+ else if (sourcep->isLoop())
+ {
+ // It's a loop, we need to check and see if we're done with it.
+ if (channelp->mLoopedThisFrame)
+ {
+ sourcep->mCurrentDatap = sourcep->mQueuedDatap;
+ sourcep->mQueuedDatap = NULL;
+
+ // Actually, should do a time sync so if we're a loop master/slave
+ // we don't drift away.
+ sourcep->setupChannel();
+ sourcep->getChannel()->play();
+ }
+ }
+ }
+ }
+
+ // Lame, update the channels AGAIN.
+ // Update the channels to sync up with any changes that the source made,
+ // such as changing what sound was playing.
+ updateChannels();
+
+ // Hack! For now, just use a global sync master;
+ LLAudioSource *sync_masterp = NULL;
+ LLAudioChannel *master_channelp = NULL;
+ F32 max_sm_priority = -1.f;
+ for (iter = mAllSources.begin(); iter != mAllSources.end(); ++iter)
+ {
+ LLAudioSource *sourcep = iter->second;
+ if (sourcep->isMuted())
+ {
+ continue;
+ }
+ if (sourcep->isSyncMaster())
+ {
+ if (sourcep->getPriority() > max_sm_priority)
+ {
+ sync_masterp = sourcep;
+ master_channelp = sync_masterp->getChannel();
+ max_sm_priority = sourcep->getPriority();
+ }
+ }
+ }
+
+ if (master_channelp && master_channelp->mLoopedThisFrame)
+ {
+ // Synchronize loop slaves with their masters
+ // Update queued sounds (switch to next queued data if the current has finished playing)
+ for (iter = mAllSources.begin(); iter != mAllSources.end(); ++iter)
+ {
+ LLAudioSource *sourcep = iter->second;
+
+ if (!sourcep->isSyncSlave())
+ {
+ // Not a loop slave, we don't need to do anything
+ continue;
+ }
+
+ LLAudioChannel *channelp = sourcep->getChannel();
+ if (!channelp)
+ {
+ // Not playing, don't need to bother.
+ continue;
+ }
+
+ if (!channelp->isPlaying())
+ {
+ // Now we need to check if our loop master has just looped, and
+ // start playback if that's the case.
+ if (sync_masterp->getChannel())
+ {
+ channelp->playSynced(master_channelp);
+ channelp->setWaiting(false);
+ }
+ }
+ }
+ }
+
+ // Sync up everything that the audio engine needs done.
+ commitDeferredChanges();
+
+ // Flush unused buffers that are stale enough
+ for (i = 0; i < MAX_BUFFERS; i++)
+ {
+ if (mBuffers[i])
+ {
+ if (!mBuffers[i]->mInUse && mBuffers[i]->mLastUseTimer.getElapsedTimeF32() > 30.f)
+ {
+ //llinfos << "Flushing unused buffer!" << llendl;
+ mBuffers[i]->mAudioDatap->mBufferp = NULL;
+ delete mBuffers[i];
+ mBuffers[i] = NULL;
+ }
+ }
+ }
+
+
+ // Clear all of the looped flags for the channels
+ for (i = 0; i < MAX_CHANNELS; i++)
+ {
+ if (mChannels[i])
+ {
+ mChannels[i]->mLoopedThisFrame = false;
+ }
+ }
+
+ // Decode audio files
+ gAudioDecodeMgrp->processQueue(max_decode_time);
+
+ // Call this every frame, just in case we somehow
+ // missed picking it up in all the places that can add
+ // or request new data.
+ startNextTransfer();
+
+ updateInternetStream();
+}
+
+
+
+bool LLAudioEngine::updateBufferForData(LLAudioData *adp, const LLUUID &audio_uuid)
+{
+ if (!adp)
+ {
+ return false;
+ }
+
+ // Update the audio buffer first - load a sound if we have it.
+ // Note that this could potentially cause us to waste time updating buffers
+ // for sounds that actually aren't playing, although this should be mitigated
+ // by the fact that we limit the number of buffers, and we flush buffers based
+ // on priority.
+ if (!adp->getBuffer())
+ {
+ if (adp->hasDecodedData())
+ {
+ return adp->load();
+ }
+ else if (adp->hasLocalData())
+ {
+ if (audio_uuid.notNull())
+ {
+ gAudioDecodeMgrp->addDecodeRequest(audio_uuid);
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+ return true;
+}
+
+
+void LLAudioEngine::enableWind(bool enable)
+{
+ if (enable && (!mEnableWind))
+ {
+ initWind();
+ mEnableWind = enable;
+ }
+ else if (mEnableWind && (!enable))
+ {
+ mEnableWind = enable;
+ cleanupWind();
+ }
+}
+
+
+LLAudioBuffer * LLAudioEngine::getFreeBuffer()
+{
+ static clock_t last_info = 0;
+ static bool spamming = FALSE;
+
+ S32 i;
+ for (i = 0; i < MAX_BUFFERS; i++)
+ {
+ if (!mBuffers[i])
+ {
+ mBuffers[i] = createBuffer();
+ return mBuffers[i];
+ }
+ }
+
+
+ // Grab the oldest unused buffer
+ F32 max_age = -1.f;
+ S32 buffer_id = -1;
+ for (i = 0; i < MAX_BUFFERS; i++)
+ {
+ if (mBuffers[i])
+ {
+ if (!mBuffers[i]->mInUse)
+ {
+ if (mBuffers[i]->mLastUseTimer.getElapsedTimeF32() > max_age)
+ {
+ max_age = mBuffers[i]->mLastUseTimer.getElapsedTimeF32();
+ buffer_id = i;
+ }
+ }
+ }
+ }
+
+ if (buffer_id >= 0)
+ {
+ if (clock() - last_info > CLOCKS_PER_SEC)
+ {
+ // Do not spam us with such messages...
+ llinfos << "Taking over unused buffer " << buffer_id << llendl;
+ last_info = clock();
+ }
+ else if (!spamming)
+ {
+ // ... but warn us *once* when the buffer freeing frequency is abnormal.
+ llwarns << "Excessive buffer freeing frequency, info messages throttled." << llendl;
+ spamming = true;
+ }
+ mBuffers[buffer_id]->mAudioDatap->mBufferp = NULL;
+ delete mBuffers[buffer_id];
+ mBuffers[buffer_id] = createBuffer();
+ return mBuffers[buffer_id];
+ }
+ return NULL;
+}
+
+
+LLAudioChannel * LLAudioEngine::getFreeChannel(const F32 priority)
+{
+ S32 i;
+ for (i = 0; i < mNumChannels; i++)
+ {
+ if (!mChannels[i])
+ {
+ // No channel allocated here, use it.
+ mChannels[i] = createChannel();
+ return mChannels[i];
+ }
+ else
+ {
+ // Channel is allocated but not playing right now, use it.
+ if (!mChannels[i]->isPlaying() && !mChannels[i]->isWaiting())
+ {
+ mChannels[i]->cleanup();
+ if (mChannels[i]->getSource())
+ {
+ mChannels[i]->getSource()->setChannel(NULL);
+ }
+ return mChannels[i];
+ }
+ }
+ }
+
+ // All channels used, check priorities.
+ // Find channel with lowest priority and see if we want to replace it.
+ F32 min_priority = 10000.f;
+ LLAudioChannel *min_channelp = NULL;
+
+ for (i = 0; i < mNumChannels; i++)
+ {
+ LLAudioChannel *channelp = mChannels[i];
+ LLAudioSource *sourcep = channelp->getSource();
+ if (sourcep && sourcep->getPriority() < min_priority)
+ {
+ min_channelp = channelp;
+ min_priority = sourcep->getPriority();
+ }
+ }
+
+ if (min_priority > priority || !min_channelp)
+ {
+ // All playing channels have higher priority, return.
+ return NULL;
+ }
+
+ // Flush the minimum priority channel, and return it.
+ min_channelp->cleanup();
+ min_channelp->getSource()->setChannel(NULL);
+ return min_channelp;
+}
+
+
+void LLAudioEngine::cleanupBuffer(LLAudioBuffer *bufferp)
+{
+ S32 i;
+ for (i = 0; i < MAX_BUFFERS; i++)
+ {
+ if (mBuffers[i] == bufferp)
+ {
+ delete mBuffers[i];
+ mBuffers[i] = NULL;
+ }
+ }
+}
+
+
+bool LLAudioEngine::preloadSound(const LLUUID &uuid)
+{
+ gAudiop->getAudioData(uuid); // We don't care about the return value, this is just to make sure
+ // that we have an entry, which will mean that the audio engine knows about this
+
+ if (gAudioDecodeMgrp->addDecodeRequest(uuid))
+ {
+ // This means that we do have a local copy, and we're working on decoding it.
+ return true;
+ }
+
+ // At some point we need to have the audio/asset system check the static VFS
+ // before it goes off and fetches stuff from the server.
+ //llwarns << "Used internal preload for non-local sound" << llendl;
+ return false;
+}
+
+
+bool LLAudioEngine::isWindEnabled()
+{
+ return mEnableWind;
+}
+
+
+void LLAudioEngine::setMuted(bool muted)
+{
+ if (muted != mMuted)
+ {
+ mMuted = muted;
+ setMasterGain(mMasterGain);
+ }
+ enableWind(!mMuted);
+}
+
+void LLAudioEngine::setMasterGain(const F32 gain)
+{
+ mMasterGain = gain;
+ F32 internal_gain = getMuted() ? 0.f : gain;
+ if (internal_gain != mInternalGain)
+ {
+ mInternalGain = internal_gain;
+ setInternalGain(mInternalGain);
+ }
+}
+
+F32 LLAudioEngine::getMasterGain()
+{
+ return mMasterGain;
+}
+
+void LLAudioEngine::setSecondaryGain(S32 type, F32 gain)
+{
+ llassert(type < LLAudioEngine::AUDIO_TYPE_COUNT);
+
+ mSecondaryGain[type] = gain;
+}
+
+F32 LLAudioEngine::getSecondaryGain(S32 type)
+{
+ return mSecondaryGain[type];
+}
+
+F32 LLAudioEngine::getInternetStreamGain()
+{
+ if (mStreamingAudioImpl)
+ return mStreamingAudioImpl->getGain();
+ else
+ return 1.0f;
+}
+
+void LLAudioEngine::setMaxWindGain(F32 gain)
+{
+ mMaxWindGain = gain;
+}
+
+
+F64 LLAudioEngine::mapWindVecToGain(LLVector3 wind_vec)
+{
+ F64 gain = 0.0;
+
+ gain = wind_vec.magVec();
+
+ if (gain)
+ {
+ if (gain > 20)
+ {
+ gain = 20;
+ }
+ gain = gain/20.0;
+ }
+
+ return (gain);
+}
+
+
+F64 LLAudioEngine::mapWindVecToPitch(LLVector3 wind_vec)
+{
+ LLVector3 listen_right;
+ F64 theta;
+
+ // Wind frame is in listener-relative coordinates
+ LLVector3 norm_wind = wind_vec;
+ norm_wind.normVec();
+ listen_right.setVec(1.0,0.0,0.0);
+
+ // measure angle between wind vec and listener right axis (on 0,PI)
+ theta = acos(norm_wind * listen_right);
+
+ // put it on 0, 1
+ theta /= F_PI;
+
+ // put it on [0, 0.5, 0]
+ if (theta > 0.5) theta = 1.0-theta;
+ if (theta < 0) theta = 0;
+
+ return (theta);
+}
+
+
+F64 LLAudioEngine::mapWindVecToPan(LLVector3 wind_vec)
+{
+ LLVector3 listen_right;
+ F64 theta;
+
+ // Wind frame is in listener-relative coordinates
+ listen_right.setVec(1.0,0.0,0.0);
+
+ LLVector3 norm_wind = wind_vec;
+ norm_wind.normVec();
+
+ // measure angle between wind vec and listener right axis (on 0,PI)
+ theta = acos(norm_wind * listen_right);
+
+ // put it on 0, 1
+ theta /= F_PI;
+
+ return (theta);
+}
+
+
+void LLAudioEngine::triggerSound(const LLUUID &audio_uuid, const LLUUID& owner_id, const F32 gain,
+ const S32 type, const LLVector3d &pos_global)
+{
+ // Create a new source (since this can't be associated with an existing source.
+ //llinfos << "Localized: " << audio_uuid << llendl;
+
+ if (mMuted)
+ {
+ return;
+ }
+
+ LLUUID source_id;
+ source_id.generate();
+
+ LLAudioSource *asp = new LLAudioSource(source_id, owner_id, gain, type);
+ gAudiop->addAudioSource(asp);
+ if (pos_global.isExactlyZero())
+ {
+ asp->setAmbient(true);
+ }
+ else
+ {
+ asp->setPositionGlobal(pos_global);
+ }
+ asp->updatePriority();
+ asp->play(audio_uuid);
+}
+
+
+void LLAudioEngine::setListenerPos(LLVector3 aVec)
+{
+ mListenerp->setPosition(aVec);
+}
+
+
+LLVector3 LLAudioEngine::getListenerPos()
+{
+ if (mListenerp)
+ {
+ return(mListenerp->getPosition());
+ }
+ else
+ {
+ return(LLVector3::zero);
+ }
+}
+
+
+void LLAudioEngine::setListenerVelocity(LLVector3 aVec)
+{
+ mListenerp->setVelocity(aVec);
+}
+
+
+void LLAudioEngine::translateListener(LLVector3 aVec)
+{
+ mListenerp->translate(aVec);
+}
+
+
+void LLAudioEngine::orientListener(LLVector3 up, LLVector3 at)
+{
+ mListenerp->orient(up, at);
+}
+
+
+void LLAudioEngine::setListener(LLVector3 pos, LLVector3 vel, LLVector3 up, LLVector3 at)
+{
+ mListenerp->set(pos,vel,up,at);
+}
+
+
+void LLAudioEngine::setDopplerFactor(F32 factor)
+{
+ if (mListenerp)
+ {
+ mListenerp->setDopplerFactor(factor);
+ }
+}
+
+
+F32 LLAudioEngine::getDopplerFactor()
+{
+ if (mListenerp)
+ {
+ return mListenerp->getDopplerFactor();
+ }
+ else
+ {
+ return 0.f;
+ }
+}
+
+
+void LLAudioEngine::setRolloffFactor(F32 factor)
+{
+ if (mListenerp)
+ {
+ mListenerp->setRolloffFactor(factor);
+ }
+}
+
+
+F32 LLAudioEngine::getRolloffFactor()
+{
+ if (mListenerp)
+ {
+ return mListenerp->getRolloffFactor();
+ }
+ else
+ {
+ return 0.f;
+ }
+}
+
+
+void LLAudioEngine::commitDeferredChanges()
+{
+ mListenerp->commitDeferredChanges();
+}
+
+
+LLAudioSource * LLAudioEngine::findAudioSource(const LLUUID &source_id)
+{
+ source_map::iterator iter;
+ iter = mAllSources.find(source_id);
+
+ if (iter == mAllSources.end())
+ {
+ return NULL;
+ }
+ else
+ {
+ return iter->second;
+ }
+}
+
+
+LLAudioData * LLAudioEngine::getAudioData(const LLUUID &audio_uuid)
+{
+ data_map::iterator iter;
+ iter = mAllData.find(audio_uuid);
+ if (iter == mAllData.end())
+ {
+ // Create the new audio data
+ LLAudioData *adp = new LLAudioData(audio_uuid);
+ mAllData[audio_uuid] = adp;
+ return adp;
+ }
+ else
+ {
+ return iter->second;
+ }
+}
+
+void LLAudioEngine::addAudioSource(LLAudioSource *asp)
+{
+ mAllSources[asp->getID()] = asp;
+}
+
+
+void LLAudioEngine::cleanupAudioSource(LLAudioSource *asp)
+{
+ source_map::iterator iter;
+ iter = mAllSources.find(asp->getID());
+ if (iter == mAllSources.end())
+ {
+ llwarns << "Cleaning up unknown audio source!" << llendl;
+ return;
+ }
+ delete asp;
+ mAllSources.erase(iter);
+}
+
+
+bool LLAudioEngine::hasDecodedFile(const LLUUID &uuid)
+{
+ std::string uuid_str;
+ uuid.toString(uuid_str);
+
+ std::string wav_path;
+ wav_path = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_str);
+ wav_path += ".dsf";
+
+ if (gDirUtilp->fileExists(wav_path))
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+
+bool LLAudioEngine::hasLocalFile(const LLUUID &uuid)
+{
+ // See if it's in the VFS.
+ return gVFS->getExists(uuid, LLAssetType::AT_SOUND);
+}
+
+
+void LLAudioEngine::startNextTransfer()
+{
+ //llinfos << "LLAudioEngine::startNextTransfer()" << llendl;
+ if (mCurrentTransfer.notNull() || getMuted())
+ {
+ //llinfos << "Transfer in progress, aborting" << llendl;
+ return;
+ }
+
+ // Get the ID for the next asset that we want to transfer.
+ // Pick one in the following order:
+ LLUUID asset_id;
+ S32 i;
+ LLAudioSource *asp = NULL;
+ LLAudioData *adp = NULL;
+ data_map::iterator data_iter;
+
+ // Check all channels for currently playing sounds.
+ F32 max_pri = -1.f;
+ for (i = 0; i < MAX_CHANNELS; i++)
+ {
+ if (!mChannels[i])
+ {
+ continue;
+ }
+
+ asp = mChannels[i]->getSource();
+ if (!asp)
+ {
+ continue;
+ }
+ if (asp->getPriority() <= max_pri)
+ {
+ continue;
+ }
+
+ if (asp->getPriority() <= max_pri)
+ {
+ continue;
+ }
+
+ adp = asp->getCurrentData();
+ if (!adp)
+ {
+ continue;
+ }
+
+ if (!adp->hasLocalData() && adp->hasValidData())
+ {
+ asset_id = adp->getID();
+ max_pri = asp->getPriority();
+ }
+ }
+
+ // Check all channels for currently queued sounds.
+ if (asset_id.isNull())
+ {
+ max_pri = -1.f;
+ for (i = 0; i < MAX_CHANNELS; i++)
+ {
+ if (!mChannels[i])
+ {
+ continue;
+ }
+
+ LLAudioSource *asp;
+ asp = mChannels[i]->getSource();
+ if (!asp)
+ {
+ continue;
+ }
+
+ if (asp->getPriority() <= max_pri)
+ {
+ continue;
+ }
+
+ adp = asp->getQueuedData();
+ if (!adp)
+ {
+ continue;
+ }
+
+ if (!adp->hasLocalData() && adp->hasValidData())
+ {
+ asset_id = adp->getID();
+ max_pri = asp->getPriority();
+ }
+ }
+ }
+
+ // Check all live channels for other sounds (preloads).
+ if (asset_id.isNull())
+ {
+ max_pri = -1.f;
+ for (i = 0; i < MAX_CHANNELS; i++)
+ {
+ if (!mChannels[i])
+ {
+ continue;
+ }
+
+ LLAudioSource *asp;
+ asp = mChannels[i]->getSource();
+ if (!asp)
+ {
+ continue;
+ }
+
+ if (asp->getPriority() <= max_pri)
+ {
+ continue;
+ }
+
+
+ for (data_iter = asp->mPreloadMap.begin(); data_iter != asp->mPreloadMap.end(); data_iter++)
+ {
+ LLAudioData *adp = data_iter->second;
+ if (!adp)
+ {
+ continue;
+ }
+
+ if (!adp->hasLocalData() && adp->hasValidData())
+ {
+ asset_id = adp->getID();
+ max_pri = asp->getPriority();
+ }
+ }
+ }
+ }
+
+ // Check all sources
+ if (asset_id.isNull())
+ {
+ max_pri = -1.f;
+ source_map::iterator source_iter;
+ for (source_iter = mAllSources.begin(); source_iter != mAllSources.end(); source_iter++)
+ {
+ asp = source_iter->second;
+ if (!asp)
+ {
+ continue;
+ }
+
+ if (asp->getPriority() <= max_pri)
+ {
+ continue;
+ }
+
+ adp = asp->getCurrentData();
+ if (adp && !adp->hasLocalData() && adp->hasValidData())
+ {
+ asset_id = adp->getID();
+ max_pri = asp->getPriority();
+ continue;
+ }
+
+ adp = asp->getQueuedData();
+ if (adp && !adp->hasLocalData() && adp->hasValidData())
+ {
+ asset_id = adp->getID();
+ max_pri = asp->getPriority();
+ continue;
+ }
+
+ for (data_iter = asp->mPreloadMap.begin(); data_iter != asp->mPreloadMap.end(); data_iter++)
+ {
+ LLAudioData *adp = data_iter->second;
+ if (!adp)
+ {
+ continue;
+ }
+
+ if (!adp->hasLocalData() && adp->hasValidData())
+ {
+ asset_id = adp->getID();
+ max_pri = asp->getPriority();
+ break;
+ }
+ }
+ }
+ }
+
+ if (asset_id.notNull())
+ {
+ llinfos << "Getting asset data for: " << asset_id << llendl;
+ gAudiop->mCurrentTransfer = asset_id;
+ gAudiop->mCurrentTransferTimer.reset();
+ gAssetStorage->getAssetData(asset_id, LLAssetType::AT_SOUND,
+ assetCallback, NULL);
+ }
+ else
+ {
+ //llinfos << "No pending transfers?" << llendl;
+ }
+}
+
+
+// static
+void LLAudioEngine::assetCallback(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type, void *user_data, S32 result_code, LLExtStat ext_status)
+{
+ if (result_code)
+ {
+ llinfos << "Boom, error in audio file transfer: " << LLAssetStorage::getErrorString( result_code ) << " (" << result_code << ")" << llendl;
+ // Need to mark data as bad to avoid constant rerequests.
+ LLAudioData *adp = gAudiop->getAudioData(uuid);
+ if (adp)
+ {
+ adp->setHasValidData(false);
+ adp->setHasLocalData(false);
+ adp->setHasDecodedData(false);
+ }
+ }
+ else
+ {
+ LLAudioData *adp = gAudiop->getAudioData(uuid);
+ if (!adp)
+ {
+ // Should never happen
+ llwarns << "Got asset callback without audio data for " << uuid << llendl;
+ }
+ else
+ {
+ adp->setHasValidData(true);
+ adp->setHasLocalData(true);
+ gAudioDecodeMgrp->addDecodeRequest(uuid);
+ }
+ }
+ gAudiop->mCurrentTransfer = LLUUID::null;
+ gAudiop->startNextTransfer();
+}
+
+
+//
+// LLAudioSource implementation
+//
+
+
+LLAudioSource::LLAudioSource(const LLUUID& id, const LLUUID& owner_id, const F32 gain, const S32 type)
+: mID(id),
+ mOwnerID(owner_id),
+ mPriority(0.f),
+ mGain(gain),
+ mSourceMuted(false),
+ mAmbient(false),
+ mLoop(false),
+ mSyncMaster(false),
+ mSyncSlave(false),
+ mQueueSounds(false),
+ mPlayedOnce(false),
+ mType(type),
+ mChannelp(NULL),
+ mCurrentDatap(NULL),
+ mQueuedDatap(NULL)
+{
+}
+
+
+LLAudioSource::~LLAudioSource()
+{
+ if (mChannelp)
+ {
+ // Stop playback of this sound
+ mChannelp->setSource(NULL);
+ mChannelp = NULL;
+ }
+}
+
+
+void LLAudioSource::setChannel(LLAudioChannel *channelp)
+{
+ if (channelp == mChannelp)
+ {
+ return;
+ }
+
+ mChannelp = channelp;
+}
+
+
+void LLAudioSource::update()
+{
+ if (!getCurrentBuffer())
+ {
+ if (getCurrentData())
+ {
+ // Hack - try and load the sound. Will do this as a callback
+ // on decode later.
+ if (getCurrentData()->load())
+ {
+ play(getCurrentData()->getID());
+ }
+ }
+ }
+}
+
+void LLAudioSource::updatePriority()
+{
+ if (isAmbient())
+ {
+ mPriority = 1.f;
+ }
+ else if (isMuted())
+ {
+ mPriority = 0.f;
+ }
+ else
+ {
+ // Priority is based on distance
+ LLVector3 dist_vec;
+ dist_vec.setVec(getPositionGlobal());
+ dist_vec -= gAudiop->getListenerPos();
+ F32 dist_squared = llmax(1.f, dist_vec.magVecSquared());
+
+ mPriority = mGain / dist_squared;
+ }
+}
+
+bool LLAudioSource::setupChannel()
+{
+ LLAudioData *adp = getCurrentData();
+
+ if (!adp->getBuffer())
+ {
+ // We're not ready to play back the sound yet, so don't try and allocate a channel for it.
+ //llwarns << "Aborting, no buffer" << llendl;
+ return false;
+ }
+
+
+ if (!mChannelp)
+ {
+ // Update the priority, in case we need to push out another channel.
+ updatePriority();
+
+ setChannel(gAudiop->getFreeChannel(getPriority()));
+ }
+
+ if (!mChannelp)
+ {
+ // Ugh, we don't have any free channels.
+ // Now we have to reprioritize.
+ // For now, just don't play the sound.
+ //llwarns << "Aborting, no free channels" << llendl;
+ return false;
+ }
+
+ mChannelp->setSource(this);
+ return true;
+}
+
+
+bool LLAudioSource::play(const LLUUID &audio_uuid)
+{
+ // Special abuse of play(); don't play a sound, but kill it.
+ if (audio_uuid.isNull())
+ {
+ if (getChannel())
+ {
+ getChannel()->setSource(NULL);
+ setChannel(NULL);
+ if (!isMuted())
+ {
+ mCurrentDatap = NULL;
+ }
+ }
+ return false;
+ }
+
+ // Reset our age timeout if someone attempts to play the source.
+ mAgeTimer.reset();
+
+ LLAudioData *adp = gAudiop->getAudioData(audio_uuid);
+ addAudioData(adp);
+
+ if (isMuted())
+ {
+ return false;
+ }
+
+ bool has_buffer = gAudiop->updateBufferForData(adp, audio_uuid);
+ if (!has_buffer)
+ {
+ // Don't bother trying to set up a channel or anything, we don't have an audio buffer.
+ return false;
+ }
+
+ if (!setupChannel())
+ {
+ return false;
+ }
+
+ if (isSyncSlave())
+ {
+ // A sync slave, it doesn't start playing until it's synced up with the master.
+ // Flag this channel as waiting for sync, and return true.
+ getChannel()->setWaiting(true);
+ return true;
+ }
+
+ getChannel()->play();
+ return true;
+}
+
+
+bool LLAudioSource::isDone() const
+{
+ const F32 MAX_AGE = 60.f;
+ const F32 MAX_UNPLAYED_AGE = 15.f;
+ const F32 MAX_MUTED_AGE = 11.f;
+
+ if (isLoop())
+ {
+ // Looped sources never die on their own.
+ return false;
+ }
+
+ if (hasPendingPreloads())
+ {
+ return false;
+ }
+
+ if (mQueuedDatap)
+ {
+ // Don't kill this sound if we've got something queued up to play.
+ return false;
+ }
+
+ F32 elapsed = mAgeTimer.getElapsedTimeF32();
+
+ // This is a single-play source
+ if (!mChannelp)
+ {
+ if ((elapsed > (mSourceMuted ? MAX_MUTED_AGE : MAX_UNPLAYED_AGE)) || mPlayedOnce)
+ {
+ // We don't have a channel assigned, and it's been
+ // over 15 seconds since we tried to play it. Don't bother.
+ //llinfos << "No channel assigned, source is done" << llendl;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ if (mChannelp->isPlaying())
+ {
+ if (elapsed > MAX_AGE)
+ {
+ // Arbitarily cut off non-looped sounds when they're old.
+ return true;
+ }
+ else
+ {
+ // Sound is still playing and we haven't timed out, don't kill it.
+ return false;
+ }
+ }
+
+ if ((elapsed > MAX_UNPLAYED_AGE) || mPlayedOnce)
+ {
+ // The sound isn't playing back after 15 seconds or we're already done playing it, kill it.
+ return true;
+ }
+
+ return false;
+}
+
+
+void LLAudioSource::addAudioData(LLAudioData *adp, const bool set_current)
+{
+ // Only handle a single piece of audio data associated with a source right now,
+ // until I implement prefetch.
+ if (set_current)
+ {
+ if (!mCurrentDatap)
+ {
+ mCurrentDatap = adp;
+ if (mChannelp)
+ {
+ mChannelp->updateBuffer();
+ mChannelp->play();
+ }
+
+ // Make sure the audio engine knows that we want to request this sound.
+ gAudiop->startNextTransfer();
+ return;
+ }
+ else if (mQueueSounds)
+ {
+ // If we have current data, and we're queuing, put
+ // the object onto the queue.
+ if (mQueuedDatap)
+ {
+ // We only queue one sound at a time, and it's a FIFO.
+ // Don't put it onto the queue.
+ return;
+ }
+
+ if (adp == mCurrentDatap && isLoop())
+ {
+ // No point in queueing the same sound if
+ // we're looping.
+ return;
+ }
+ mQueuedDatap = adp;
+
+ // Make sure the audio engine knows that we want to request this sound.
+ gAudiop->startNextTransfer();
+ }
+ else
+ {
+ if (mCurrentDatap != adp)
+ {
+ // Right now, if we're currently playing this sound in a channel, we
+ // update the buffer that the channel's associated with
+ // and play it. This may not be the correct behavior.
+ mCurrentDatap = adp;
+ if (mChannelp)
+ {
+ mChannelp->updateBuffer();
+ mChannelp->play();
+ }
+ // Make sure the audio engine knows that we want to request this sound.
+ gAudiop->startNextTransfer();
+ }
+ }
+ }
+ else
+ {
+ // Add it to the preload list.
+ mPreloadMap[adp->getID()] = adp;
+ gAudiop->startNextTransfer();
+ }
+}
+
+
+bool LLAudioSource::hasPendingPreloads() const
+{
+ // Check to see if we've got any preloads on deck for this source
+ data_map::const_iterator iter;
+ for (iter = mPreloadMap.begin(); iter != mPreloadMap.end(); iter++)
+ {
+ LLAudioData *adp = iter->second;
+ // note: a bad UUID will forever be !hasDecodedData()
+ // but also !hasValidData(), hence the check for hasValidData()
+ if (!adp->hasDecodedData() && adp->hasValidData())
+ {
+ // This source is still waiting for a preload
+ return true;
+ }
+ }
+
+ return false;
+}
+
+
+LLAudioData * LLAudioSource::getCurrentData()
+{
+ return mCurrentDatap;
+}
+
+LLAudioData * LLAudioSource::getQueuedData()
+{
+ return mQueuedDatap;
+}
+
+LLAudioBuffer * LLAudioSource::getCurrentBuffer()
+{
+ if (!mCurrentDatap)
+ {
+ return NULL;
+ }
+
+ return mCurrentDatap->getBuffer();
+}
+
+
+
+
+//
+// LLAudioChannel implementation
+//
+
+
+LLAudioChannel::LLAudioChannel() :
+ mCurrentSourcep(NULL),
+ mCurrentBufferp(NULL),
+ mLoopedThisFrame(false),
+ mWaiting(false),
+ mSecondaryGain(1.0f)
+{
+}
+
+
+LLAudioChannel::~LLAudioChannel()
+{
+ // Need to disconnect any sources which are using this channel.
+ //llinfos << "Cleaning up audio channel" << llendl;
+ if (mCurrentSourcep)
+ {
+ mCurrentSourcep->setChannel(NULL);
+ }
+ mCurrentBufferp = NULL;
+}
+
+
+void LLAudioChannel::setSource(LLAudioSource *sourcep)
+{
+ //llinfos << this << ": setSource(" << sourcep << ")" << llendl;
+
+ if (!sourcep)
+ {
+ // Clearing the source for this channel, don't need to do anything.
+ //llinfos << "Clearing source for channel" << llendl;
+ cleanup();
+ mCurrentSourcep = NULL;
+ mWaiting = false;
+ return;
+ }
+
+ if (sourcep == mCurrentSourcep)
+ {
+ // Don't reallocate the channel, this will make FMOD goofy.
+ //llinfos << "Calling setSource with same source!" << llendl;
+ }
+
+ mCurrentSourcep = sourcep;
+
+
+ updateBuffer();
+ update3DPosition();
+}
+
+
+bool LLAudioChannel::updateBuffer()
+{
+ if (!mCurrentSourcep)
+ {
+ // This channel isn't associated with any source, nothing
+ // to be updated
+ return false;
+ }
+
+ // Initialize the channel's gain setting for this sound.
+ if(gAudiop)
+ {
+ setSecondaryGain(gAudiop->getSecondaryGain(mCurrentSourcep->getType()));
+ }
+
+ LLAudioBuffer *bufferp = mCurrentSourcep->getCurrentBuffer();
+ if (bufferp == mCurrentBufferp)
+ {
+ if (bufferp)
+ {
+ // The source hasn't changed what buffer it's playing
+ bufferp->mLastUseTimer.reset();
+ bufferp->mInUse = true;
+ }
+ return false;
+ }
+
+ //
+ // The source changed what buffer it's playing. We need to clean up
+ // the existing channel
+ //
+ cleanup();
+
+ mCurrentBufferp = bufferp;
+ if (bufferp)
+ {
+ bufferp->mLastUseTimer.reset();
+ bufferp->mInUse = true;
+ }
+
+ if (!mCurrentBufferp)
+ {
+ // There's no new buffer to be played, so we just abort.
+ return false;
+ }
+
+ return true;
+}
+
+
+
+
+//
+// LLAudioData implementation
+//
+
+
+LLAudioData::LLAudioData(const LLUUID &uuid) :
+ mID(uuid),
+ mBufferp(NULL),
+ mHasLocalData(false),
+ mHasDecodedData(false),
+ mHasValidData(true)
+{
+ if (uuid.isNull())
+ {
+ // This is a null sound.
+ return;
+ }
+
+ if (gAudiop && gAudiop->hasDecodedFile(uuid))
+ {
+ // Already have a decoded version, don't need to decode it.
+ mHasLocalData = true;
+ mHasDecodedData = true;
+ }
+ else if (gAssetStorage && gAssetStorage->hasLocalAsset(uuid, LLAssetType::AT_SOUND))
+ {
+ mHasLocalData = true;
+ }
+}
+
+
+bool LLAudioData::load()
+{
+ static clock_t last_info = 0;
+
+ // For now, just assume we're going to use one buffer per audiodata.
+ if (mBufferp)
+ {
+ // We already have this sound in a buffer, don't do anything.
+ llinfos << "Already have a buffer for this sound, don't bother loading!" << llendl;
+ return true;
+ }
+
+ mBufferp = gAudiop->getFreeBuffer();
+ if (!mBufferp)
+ {
+ // No free buffers, abort.
+ if (clock() - last_info > CLOCKS_PER_SEC) // Do not spam us with such messages
+ {
+ llinfos << "Not able to allocate a new audio buffer, aborting." << llendl;
+ last_info = clock();
+ }
+ return false;
+ }
+
+ std::string uuid_str;
+ std::string wav_path;
+ mID.toString(uuid_str);
+ wav_path= gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_str) + ".dsf";
+
+ if (!mBufferp->loadWAV(wav_path))
+ {
+ // Hrm. Right now, let's unset the buffer, since it's empty.
+ gAudiop->cleanupBuffer(mBufferp);
+ mBufferp = NULL;
+
+ // Maybe it was removed by another instance. Send it to the preload queue.
+ gAudiop->preloadSound(mID);
+
+ return false;
+ }
+ mBufferp->mAudioDatap = this;
+ return true;
+}
+
+
diff --git a/linden/indra/llaudio/llaudioengine.h b/linden/indra/llaudio/llaudioengine.h
new file mode 100644
index 0000000..a1b240e
--- /dev/null
+++ b/linden/indra/llaudio/llaudioengine.h
@@ -0,0 +1,457 @@
+/**
+ * @file audioengine.h
+ * @brief Definition of LLAudioEngine base class abstracting the audio support
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+
+#ifndef LL_AUDIOENGINE_H
+#define LL_AUDIOENGINE_H
+
+#include
+#include
+
+#include "v3math.h"
+#include "v3dmath.h"
+#include "lltimer.h"
+#include "lluuid.h"
+#include "llframetimer.h"
+#include "llassettype.h"
+
+#include "lllistener.h"
+
+const F32 LL_WIND_UPDATE_INTERVAL = 0.1f;
+const F32 LL_ROLLOFF_MULTIPLIER_UNDER_WATER = 5.f; // How much sounds are weaker under water
+const F32 LL_WIND_UNDERWATER_CENTER_FREQ = 20.f;
+
+const F32 ATTACHED_OBJECT_TIMEOUT = 5.0f;
+const F32 DEFAULT_MIN_DISTANCE = 2.0f;
+
+#define MAX_CHANNELS 30
+// Number of maximum rezzed objects with sounds + sounds without an object + UI sounds.
+#define MAX_BUFFERS 100
+
+// This define is intended to allow us to switch from os based wav
+// file loading to vfs based wav file loading. The problem is that I
+// am unconvinced that the LLWaveFile works for loading sounds from
+// memory. So, until that is fixed up, changed, whatever, this remains
+// undefined.
+//#define USE_WAV_VFILE
+
+class LLVFS;
+
+class LLAudioSource;
+class LLAudioData;
+class LLAudioChannel;
+class LLAudioChannelOpenAL;
+class LLAudioBuffer;
+class LLStreamingAudioInterface;
+
+
+//
+// LLAudioEngine definition
+//
+
+class LLAudioEngine
+{
+ friend class LLAudioChannelOpenAL; // bleh. channel needs some listener methods.
+
+public:
+ enum LLAudioType
+ {
+ AUDIO_TYPE_NONE = 0,
+ AUDIO_TYPE_SFX = 1,
+ AUDIO_TYPE_UI = 2,
+ AUDIO_TYPE_AMBIENT = 3,
+ AUDIO_TYPE_GESTURE = 4,
+ AUDIO_TYPE_COUNT = 5 // last
+ };
+
+ LLAudioEngine();
+ virtual ~LLAudioEngine();
+
+ // initialization/startup/shutdown
+ virtual bool init(const S32 num_channels, void *userdata);
+ virtual std::string getDriverName(bool verbose) = 0;
+ virtual void shutdown();
+
+ // Used by the mechanics of the engine
+ //virtual void processQueue(const LLUUID &sound_guid);
+ virtual void setListener(LLVector3 pos,LLVector3 vel,LLVector3 up,LLVector3 at);
+ virtual void updateWind(LLVector3 direction, F32 camera_height_above_water) = 0;
+ virtual void idle(F32 max_decode_time = 0.f);
+ virtual void updateChannels();
+
+ //
+ // "End user" functionality
+ //
+ virtual bool isWindEnabled();
+ virtual void enableWind(bool state_b);
+
+ // Use these for temporarily muting the audio system.
+ // Does not change buffers, initialization, etc. but
+ // stops playing new sounds.
+ void setMuted(bool muted);
+ bool getMuted() const { return mMuted; }
+#ifdef USE_PLUGIN_MEDIA
+ LLPluginClassMedia* initializeMedia(const std::string& media_type);
+#endif
+ F32 getMasterGain();
+ void setMasterGain(F32 gain);
+
+ F32 getSecondaryGain(S32 type);
+ void setSecondaryGain(S32 type, F32 gain);
+
+ F32 getInternetStreamGain();
+
+ virtual void setDopplerFactor(F32 factor);
+ virtual F32 getDopplerFactor();
+ virtual void setRolloffFactor(F32 factor);
+ virtual F32 getRolloffFactor();
+ virtual void setMaxWindGain(F32 gain);
+
+
+ // Methods actually related to setting up and removing sounds
+ // Owner ID is the owner of the object making the request
+ void triggerSound(const LLUUID &sound_id, const LLUUID& owner_id, const F32 gain,
+ const S32 type = LLAudioEngine::AUDIO_TYPE_NONE,
+ const LLVector3d &pos_global = LLVector3d::zero);
+ bool preloadSound(const LLUUID &id);
+
+ void addAudioSource(LLAudioSource *asp);
+ void cleanupAudioSource(LLAudioSource *asp);
+
+ LLAudioSource *findAudioSource(const LLUUID &source_id);
+ LLAudioData *getAudioData(const LLUUID &audio_uuid);
+
+ // Internet stream implementation manipulation
+ LLStreamingAudioInterface *getStreamingAudioImpl();
+ void setStreamingAudioImpl(LLStreamingAudioInterface *impl);
+ // Internet stream methods - these will call down into the *mStreamingAudioImpl if it exists
+ void startInternetStream(const std::string& url);
+ void stopInternetStream();
+ void pauseInternetStream(int pause);
+ void updateInternetStream(); // expected to be called often
+ int isInternetStreamPlaying();
+ // use a value from 0.0 to 1.0, inclusive
+ void setInternetStreamGain(F32 vol);
+ std::string getInternetStreamURL();
+
+ // For debugging usage
+ virtual LLVector3 getListenerPos();
+
+ LLAudioBuffer *getFreeBuffer(); // Get a free buffer, or flush an existing one if you have to.
+ LLAudioChannel *getFreeChannel(const F32 priority); // Get a free channel or flush an existing one if your priority is higher
+ void cleanupBuffer(LLAudioBuffer *bufferp);
+
+ bool hasDecodedFile(const LLUUID &uuid);
+ bool hasLocalFile(const LLUUID &uuid);
+
+ bool updateBufferForData(LLAudioData *adp, const LLUUID &audio_uuid = LLUUID::null);
+
+
+ // Asset callback when we're retrieved a sound from the asset server.
+ void startNextTransfer();
+ static void assetCallback(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type, void *user_data, S32 result_code, LLExtStat ext_status);
+
+ friend class LLPipeline; // For debugging
+public:
+ F32 mMaxWindGain; // Hack. Public to set before fade in?
+
+protected:
+ virtual LLAudioBuffer *createBuffer() = 0;
+ virtual LLAudioChannel *createChannel() = 0;
+
+ virtual void initWind() = 0;
+ virtual void cleanupWind() = 0;
+ virtual void setInternalGain(F32 gain) = 0;
+
+ void commitDeferredChanges();
+
+ virtual void allocateListener() = 0;
+
+
+ // listener methods
+ virtual void setListenerPos(LLVector3 vec);
+ virtual void setListenerVelocity(LLVector3 vec);
+ virtual void orientListener(LLVector3 up, LLVector3 at);
+ virtual void translateListener(LLVector3 vec);
+
+
+ F64 mapWindVecToGain(LLVector3 wind_vec);
+ F64 mapWindVecToPitch(LLVector3 wind_vec);
+ F64 mapWindVecToPan(LLVector3 wind_vec);
+
+protected:
+ LLListener *mListenerp;
+
+ bool mMuted;
+ void* mUserData;
+
+ S32 mLastStatus;
+
+ S32 mNumChannels;
+ bool mEnableWind;
+
+ LLUUID mCurrentTransfer; // Audio file currently being transferred by the system
+ LLFrameTimer mCurrentTransferTimer;
+
+ // A list of all audio sources that are known to the viewer at this time.
+ // This is most likely a superset of the ones that we actually have audio
+ // data for, or are playing back.
+ typedef std::map source_map;
+ typedef std::map data_map;
+
+ source_map mAllSources;
+ data_map mAllData;
+
+ LLAudioChannel *mChannels[MAX_CHANNELS];
+
+ // Buffers needs to change into a different data structure, as the number of buffers
+ // that we have active should be limited by RAM usage, not count.
+ LLAudioBuffer *mBuffers[MAX_BUFFERS];
+
+ F32 mMasterGain;
+ F32 mInternalGain; // Actual gain set; either mMasterGain or 0 when mMuted is true.
+ F32 mSecondaryGain[AUDIO_TYPE_COUNT];
+
+ F32 mNextWindUpdate;
+
+ LLFrameTimer mWindUpdateTimer;
+
+private:
+ void setDefaults();
+ LLStreamingAudioInterface *mStreamingAudioImpl;
+};
+
+
+
+
+//
+// Standard audio source. Can be derived from for special sources, such as those attached to objects.
+//
+
+
+class LLAudioSource
+{
+public:
+ // owner_id is the id of the agent responsible for making this sound
+ // play, for example, the owner of the object currently playing it
+ LLAudioSource(const LLUUID &id, const LLUUID& owner_id, const F32 gain, const S32 type = LLAudioEngine::AUDIO_TYPE_NONE);
+ virtual ~LLAudioSource();
+
+ virtual void update(); // Update this audio source
+ void updatePriority();
+
+ void preload(const LLUUID &audio_id); // Only used for preloading UI sounds, now.
+
+ void addAudioData(LLAudioData *adp, bool set_current = TRUE);
+
+ void setAmbient(const bool ambient) { mAmbient = ambient; }
+ bool isAmbient() const { return mAmbient; }
+
+ void setLoop(const bool loop) { mLoop = loop; }
+ bool isLoop() const { return mLoop; }
+
+ void setSyncMaster(const bool master) { mSyncMaster = master; }
+ bool isSyncMaster() const { return mSyncMaster; }
+
+ void setSyncSlave(const bool slave) { mSyncSlave = slave; }
+ bool isSyncSlave() const { return mSyncSlave; }
+
+ void setQueueSounds(const bool queue) { mQueueSounds = queue; }
+ bool isQueueSounds() const { return mQueueSounds; }
+
+ void setPlayedOnce(const bool played_once) { mPlayedOnce = played_once; }
+
+ void setType(S32 type) { mType = type; }
+ S32 getType() { return mType; }
+
+ void setPositionGlobal(const LLVector3d &position_global) { mPositionGlobal = position_global; }
+ LLVector3d getPositionGlobal() const { return mPositionGlobal; }
+ LLVector3 getVelocity() const { return mVelocity; }
+ F32 getPriority() const { return mPriority; }
+
+ // Gain should always be clamped between 0 and 1.
+ F32 getGain() const { return mGain; }
+ virtual void setGain(const F32 gain) { mGain = llclamp(gain, 0.f, 1.f); }
+
+ const LLUUID &getID() const { return mID; }
+ bool isDone() const;
+ bool isMuted() const { return mSourceMuted; }
+
+ LLAudioData *getCurrentData();
+ LLAudioData *getQueuedData();
+ LLAudioBuffer *getCurrentBuffer();
+
+ bool setupChannel();
+ bool play(const LLUUID &audio_id); // Start the audio source playing
+
+ bool hasPendingPreloads() const; // Has preloads that haven't been done yet
+
+ friend class LLAudioEngine;
+ friend class LLAudioChannel;
+protected:
+ void setChannel(LLAudioChannel *channelp);
+ LLAudioChannel *getChannel() const { return mChannelp; }
+
+protected:
+ LLUUID mID; // The ID of the source is that of the object if it's attached to an object.
+ LLUUID mOwnerID; // owner of the object playing the sound
+ F32 mPriority;
+ F32 mGain;
+ bool mSourceMuted;
+ bool mAmbient;
+ bool mLoop;
+ bool mSyncMaster;
+ bool mSyncSlave;
+ bool mQueueSounds;
+ bool mPlayedOnce;
+ S32 mType;
+ LLVector3d mPositionGlobal;
+ LLVector3 mVelocity;
+
+ //LLAudioSource *mSyncMasterp; // If we're a slave, the source that we're synced to.
+ LLAudioChannel *mChannelp; // If we're currently playing back, this is the channel that we're assigned to.
+ LLAudioData *mCurrentDatap;
+ LLAudioData *mQueuedDatap;
+
+ typedef std::map data_map;
+ data_map mPreloadMap;
+
+ LLFrameTimer mAgeTimer;
+};
+
+
+
+
+//
+// Generic metadata about a particular piece of audio data.
+// The actual data is handled by the derived LLAudioBuffer classes which are
+// derived for each audio engine.
+//
+
+
+class LLAudioData
+{
+public:
+ LLAudioData(const LLUUID &uuid);
+ bool load();
+
+ LLUUID getID() const { return mID; }
+ LLAudioBuffer *getBuffer() const { return mBufferp; }
+
+ bool hasLocalData() const { return mHasLocalData; }
+ bool hasDecodedData() const { return mHasDecodedData; }
+ bool hasValidData() const { return mHasValidData; }
+
+ void setHasLocalData(const bool hld) { mHasLocalData = hld; }
+ void setHasDecodedData(const bool hdd) { mHasDecodedData = hdd; }
+ void setHasValidData(const bool hvd) { mHasValidData = hvd; }
+
+ friend class LLAudioEngine; // Severe laziness, bad.
+
+protected:
+ LLUUID mID;
+ LLAudioBuffer *mBufferp; // If this data is being used by the audio system, a pointer to the buffer will be set here.
+ bool mHasLocalData;
+ bool mHasDecodedData;
+ bool mHasValidData;
+};
+
+
+//
+// Base class for an audio channel, i.e. a channel which is capable of playing back a sound.
+// Management of channels is done generically, methods for actually manipulating the channel
+// are derived for each audio engine.
+//
+
+
+class LLAudioChannel
+{
+public:
+ LLAudioChannel();
+ virtual ~LLAudioChannel();
+
+ virtual void setSource(LLAudioSource *sourcep);
+ LLAudioSource *getSource() const { return mCurrentSourcep; }
+
+ void setSecondaryGain(F32 gain) { mSecondaryGain = gain; }
+ F32 getSecondaryGain() { return mSecondaryGain; }
+
+ friend class LLAudioEngine;
+ friend class LLAudioSource;
+protected:
+ virtual void play() = 0;
+ virtual void playSynced(LLAudioChannel *channelp) = 0;
+ virtual void cleanup() = 0;
+ virtual bool isPlaying() = 0;
+ void setWaiting(const bool waiting) { mWaiting = waiting; }
+ bool isWaiting() const { return mWaiting; }
+
+ virtual bool updateBuffer(); // Check to see if the buffer associated with the source changed, and update if necessary.
+ virtual void update3DPosition() = 0;
+ virtual void updateLoop() = 0; // Update your loop/completion status, for use by queueing/syncing.
+protected:
+ LLAudioSource *mCurrentSourcep;
+ LLAudioBuffer *mCurrentBufferp;
+ bool mLoopedThisFrame;
+ bool mWaiting; // Waiting for sync.
+ F32 mSecondaryGain;
+};
+
+
+
+
+// Basically an interface class to the engine-specific implementation
+// of audio data that's ready for playback.
+// Will likely get more complex as we decide to do stuff like real streaming audio.
+
+
+class LLAudioBuffer
+{
+public:
+ virtual ~LLAudioBuffer() {};
+ virtual bool loadWAV(const std::string& filename) = 0;
+ virtual U32 getLength() = 0;
+
+ friend class LLAudioEngine;
+ friend class LLAudioChannel;
+ friend class LLAudioData;
+protected:
+ bool mInUse;
+ LLAudioData *mAudioDatap;
+ LLFrameTimer mLastUseTimer;
+};
+
+
+
+extern LLAudioEngine* gAudiop;
+
+#endif
diff --git a/linden/indra/llaudio/llaudioengine_fmod.cpp b/linden/indra/llaudio/llaudioengine_fmod.cpp
new file mode 100644
index 0000000..85ae863
--- /dev/null
+++ b/linden/indra/llaudio/llaudioengine_fmod.cpp
@@ -0,0 +1,766 @@
+/**
+ * @file audioengine_fmod.cpp
+ * @brief Implementation of LLAudioEngine class abstracting the audio support as a FMOD 3D implementation
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "llstreamingaudio.h"
+#include "llstreamingaudio_fmod.h"
+
+#include "llaudioengine_fmod.h"
+#include "lllistener_fmod.h"
+
+#include "llerror.h"
+#include "llmath.h"
+#include "llrand.h"
+
+#include "fmod.h"
+#include "fmod_errors.h"
+#include "lldir.h"
+#include "llapr.h"
+
+#include "sound_ids.h"
+
+
+extern "C" {
+ void * F_CALLBACKAPI windCallback(void *originalbuffer, void *newbuffer, int length, void* userdata);
+}
+
+FSOUND_DSPUNIT *gWindDSP = NULL;
+
+
+LLAudioEngine_FMOD::LLAudioEngine_FMOD()
+{
+ mInited = false;
+ mWindGen = NULL;
+}
+
+
+LLAudioEngine_FMOD::~LLAudioEngine_FMOD()
+{
+}
+
+
+bool LLAudioEngine_FMOD::init(const S32 num_channels, void* userdata)
+{
+ LLAudioEngine::init(num_channels, userdata);
+
+ // Reserve one extra channel for the http stream.
+ if (!FSOUND_SetMinHardwareChannels(num_channels + 1))
+ {
+ LL_WARNS("AppInit") << "FMOD::init[0](), error: " << FMOD_ErrorString(FSOUND_GetError()) << LL_ENDL;
+ }
+
+ LL_DEBUGS("AppInit") << "LLAudioEngine_FMOD::init() initializing FMOD" << LL_ENDL;
+
+ F32 version = FSOUND_GetVersion();
+ if (version < FMOD_VERSION)
+ {
+ LL_WARNS("AppInit") << "Error : You are using the wrong FMOD version (" << version
+ << ")! You should be using FMOD " << FMOD_VERSION << LL_ENDL;
+ //return false;
+ }
+
+ U32 fmod_flags = 0x0;
+
+#if LL_WINDOWS
+ // Windows needs to know which window is frontmost.
+ // This must be called before FSOUND_Init() per the FMOD docs.
+ // This could be used to let FMOD handle muting when we lose focus,
+ // but we don't actually want to do that because we want to distinguish
+ // between minimized and not-focused states.
+ if (!FSOUND_SetHWND(userdata))
+ {
+ LL_WARNS("AppInit") << "Error setting FMOD window: "
+ << FMOD_ErrorString(FSOUND_GetError()) << LL_ENDL;
+ return false;
+ }
+ // Play audio when we don't have focus.
+ // (For example, IM client on top of us.)
+ // This means we also try to play audio when minimized,
+ // so we manually handle muting in that case. JC
+ fmod_flags |= FSOUND_INIT_GLOBALFOCUS;
+#endif
+
+#if LL_LINUX
+ // initialize the FMOD engine
+
+ // This is a hack to use only FMOD's basic FPU mixer
+ // when the LL_VALGRIND environmental variable is set,
+ // otherwise valgrind will fall over on FMOD's MMX detection
+ if (getenv("LL_VALGRIND")) /*Flawfinder: ignore*/
+ {
+ LL_INFOS("AppInit") << "Pacifying valgrind in FMOD init." << LL_ENDL;
+ FSOUND_SetMixer(FSOUND_MIXER_QUALITY_FPU);
+ }
+
+ // If we don't set an output method, Linux FMOD always
+ // decides on OSS and fails otherwise. So we'll manually
+ // try ESD, then OSS, then ALSA.
+ // Why this order? See SL-13250, but in short, OSS emulated
+ // on top of ALSA is ironically more reliable than raw ALSA.
+ // Ack, and ESD has more reliable failure modes - but has worse
+ // latency - than all of them, so wins for now.
+ bool audio_ok = false;
+
+ if (!audio_ok)
+ if (NULL == getenv("LL_BAD_FMOD_ESD")) /*Flawfinder: ignore*/
+ {
+ LL_DEBUGS("AppInit") << "Trying ESD audio output..." << LL_ENDL;
+ if(FSOUND_SetOutput(FSOUND_OUTPUT_ESD) &&
+ FSOUND_Init(44100, num_channels, fmod_flags))
+ {
+ LL_DEBUGS("AppInit") << "ESD audio output initialized OKAY"
+ << LL_ENDL;
+ audio_ok = true;
+ } else {
+ LL_WARNS("AppInit") << "ESD audio output FAILED to initialize: "
+ << FMOD_ErrorString(FSOUND_GetError()) << LL_ENDL;
+ }
+ } else {
+ LL_DEBUGS("AppInit") << "ESD audio output SKIPPED" << LL_ENDL;
+ }
+
+ if (!audio_ok)
+ if (NULL == getenv("LL_BAD_FMOD_OSS")) /*Flawfinder: ignore*/
+ {
+ LL_DEBUGS("AppInit") << "Trying OSS audio output..." << LL_ENDL;
+ if(FSOUND_SetOutput(FSOUND_OUTPUT_OSS) &&
+ FSOUND_Init(44100, num_channels, fmod_flags))
+ {
+ LL_DEBUGS("AppInit") << "OSS audio output initialized OKAY" << LL_ENDL;
+ audio_ok = true;
+ } else {
+ LL_WARNS("AppInit") << "OSS audio output FAILED to initialize: "
+ << FMOD_ErrorString(FSOUND_GetError()) << LL_ENDL;
+ }
+ } else {
+ LL_DEBUGS("AppInit") << "OSS audio output SKIPPED" << LL_ENDL;
+ }
+
+ if (!audio_ok)
+ if (NULL == getenv("LL_BAD_FMOD_ALSA")) /*Flawfinder: ignore*/
+ {
+ LL_DEBUGS("AppInit") << "Trying ALSA audio output..." << LL_ENDL;
+ if(FSOUND_SetOutput(FSOUND_OUTPUT_ALSA) &&
+ FSOUND_Init(44100, num_channels, fmod_flags))
+ {
+ LL_DEBUGS("AppInit") << "ALSA audio output initialized OKAY" << LL_ENDL;
+ audio_ok = true;
+ } else {
+ LL_WARNS("AppInit") << "ALSA audio output FAILED to initialize: "
+ << FMOD_ErrorString(FSOUND_GetError()) << LL_ENDL;
+ }
+ } else {
+ LL_DEBUGS("AppInit") << "OSS audio output SKIPPED" << LL_ENDL;
+ }
+
+ if (!audio_ok)
+ {
+ LL_WARNS("AppInit") << "Overall audio init failure." << LL_ENDL;
+ return false;
+ }
+
+ // On Linux, FMOD causes a SIGPIPE for some netstream error
+ // conditions (an FMOD bug); ignore SIGPIPE so it doesn't crash us.
+ // NOW FIXED in FMOD 3.x since 2006-10-01.
+ //signal(SIGPIPE, SIG_IGN);
+
+ // We're interested in logging which output method we
+ // ended up with, for QA purposes.
+ switch (FSOUND_GetOutput())
+ {
+ case FSOUND_OUTPUT_NOSOUND: LL_DEBUGS("AppInit") << "Audio output: NoSound" << LL_ENDL; break;
+ case FSOUND_OUTPUT_OSS: LL_DEBUGS("AppInit") << "Audio output: OSS" << LL_ENDL; break;
+ case FSOUND_OUTPUT_ESD: LL_DEBUGS("AppInit") << "Audio output: ESD" << LL_ENDL; break;
+ case FSOUND_OUTPUT_ALSA: LL_DEBUGS("AppInit") << "Audio output: ALSA" << LL_ENDL; break;
+ default: LL_INFOS("AppInit") << "Audio output: Unknown!" << LL_ENDL; break;
+ };
+
+#else // LL_LINUX
+
+ // initialize the FMOD engine
+ if (!FSOUND_Init(44100, num_channels, fmod_flags))
+ {
+ LL_WARNS("AppInit") << "Error initializing FMOD: "
+ << FMOD_ErrorString(FSOUND_GetError()) << LL_ENDL;
+ return false;
+ }
+
+#endif
+
+ // set up our favourite FMOD-native streaming audio implementation if none has already been added
+ if (!getStreamingAudioImpl()) // no existing implementation added
+ setStreamingAudioImpl(new LLStreamingAudio_FMOD());
+
+ LL_DEBUGS("AppInit") << "LLAudioEngine_FMOD::init() FMOD initialized correctly" << LL_ENDL;
+
+ mInited = true;
+
+ return true;
+}
+
+
+std::string LLAudioEngine_FMOD::getDriverName(bool verbose)
+{
+ if (verbose)
+ {
+ F32 version = FSOUND_GetVersion();
+ return llformat("FMOD version %f", version);
+ }
+ else
+ {
+ return "FMOD";
+ }
+}
+
+
+void LLAudioEngine_FMOD::allocateListener(void)
+{
+ mListenerp = (LLListener *) new LLListener_FMOD();
+ if (!mListenerp)
+ {
+ llwarns << "Listener creation failed" << llendl;
+ }
+}
+
+
+void LLAudioEngine_FMOD::shutdown()
+{
+ if (gWindDSP)
+ {
+ FSOUND_DSP_SetActive(gWindDSP,false);
+ FSOUND_DSP_Free(gWindDSP);
+ }
+
+ stopInternetStream();
+
+ LLAudioEngine::shutdown();
+
+ llinfos << "LLAudioEngine_FMOD::shutdown() closing FMOD" << llendl;
+ FSOUND_Close();
+ llinfos << "LLAudioEngine_FMOD::shutdown() done closing FMOD" << llendl;
+
+ delete mListenerp;
+ mListenerp = NULL;
+}
+
+
+LLAudioBuffer * LLAudioEngine_FMOD::createBuffer()
+{
+ return new LLAudioBufferFMOD();
+}
+
+
+LLAudioChannel * LLAudioEngine_FMOD::createChannel()
+{
+ return new LLAudioChannelFMOD();
+}
+
+
+void LLAudioEngine_FMOD::initWind()
+{
+ mWindGen = new LLWindGen;
+
+ if (!gWindDSP)
+ {
+ gWindDSP = FSOUND_DSP_Create(&windCallback, FSOUND_DSP_DEFAULTPRIORITY_CLEARUNIT + 20, mWindGen);
+ }
+ if (gWindDSP)
+ {
+ FSOUND_DSP_SetActive(gWindDSP, true);
+ }
+ mNextWindUpdate = 0.0;
+}
+
+
+void LLAudioEngine_FMOD::cleanupWind()
+{
+ if (gWindDSP)
+ {
+ FSOUND_DSP_SetActive(gWindDSP, false);
+ FSOUND_DSP_Free(gWindDSP);
+ gWindDSP = NULL;
+ }
+
+ delete mWindGen;
+ mWindGen = NULL;
+}
+
+
+//-----------------------------------------------------------------------
+void LLAudioEngine_FMOD::updateWind(LLVector3 wind_vec, F32 camera_height_above_water)
+{
+ LLVector3 wind_pos;
+ F64 pitch;
+ F64 center_freq;
+
+ if (!mEnableWind)
+ {
+ return;
+ }
+
+ if (mWindUpdateTimer.checkExpirationAndReset(LL_WIND_UPDATE_INTERVAL))
+ {
+
+ // wind comes in as Linden coordinate (+X = forward, +Y = left, +Z = up)
+ // need to convert this to the conventional orientation DS3D and OpenAL use
+ // where +X = right, +Y = up, +Z = backwards
+
+ wind_vec.setVec(-wind_vec.mV[1], wind_vec.mV[2], -wind_vec.mV[0]);
+
+ // cerr << "Wind update" << endl;
+
+ pitch = 1.0 + mapWindVecToPitch(wind_vec);
+ center_freq = 80.0 * pow(pitch,2.5*(mapWindVecToGain(wind_vec)+1.0));
+
+ mWindGen->mTargetFreq = (F32)center_freq;
+ mWindGen->mTargetGain = (F32)mapWindVecToGain(wind_vec) * mMaxWindGain;
+ mWindGen->mTargetPanGainR = (F32)mapWindVecToPan(wind_vec);
+ }
+}
+
+/*
+//-----------------------------------------------------------------------
+void LLAudioEngine_FMOD::setSourceMinDistance(U16 source_num, F64 distance)
+{
+ if (!mInited)
+ {
+ return;
+ }
+ if (mBuffer[source_num])
+ {
+ mMinDistance[source_num] = (F32) distance;
+ if (!FSOUND_Sample_SetMinMaxDistance(mBuffer[source_num],mMinDistance[source_num], mMaxDistance[source_num]))
+ {
+ llwarns << "FMOD::setSourceMinDistance(" << source_num << "), error: " << FMOD_ErrorString(FSOUND_GetError()) << llendl;
+ }
+ }
+}
+
+//-----------------------------------------------------------------------
+void LLAudioEngine_FMOD::setSourceMaxDistance(U16 source_num, F64 distance)
+{
+ if (!mInited)
+ {
+ return;
+ }
+ if (mBuffer[source_num])
+ {
+ mMaxDistance[source_num] = (F32) distance;
+ if (!FSOUND_Sample_SetMinMaxDistance(mBuffer[source_num],mMinDistance[source_num], mMaxDistance[source_num]))
+ {
+ llwarns << "FMOD::setSourceMaxDistance(" << source_num << "), error: " << FMOD_ErrorString(FSOUND_GetError()) << llendl;
+ }
+ }
+}
+
+//-----------------------------------------------------------------------
+void LLAudioEngine_FMOD::get3DParams(S32 source_num, S32 *volume, S32 *freq, S32 *inside, S32 *outside, LLVector3 *orient, S32 *out_volume, F32 *min_dist, F32 *max_dist)
+{
+ *volume = 0;
+ *freq = 0;
+ *inside = 0;
+ *outside = 0;
+ *orient = LLVector3::zero;
+ *out_volume = 0;
+ *min_dist = 0.f;
+ *max_dist = 0.f;
+}
+
+*/
+
+
+//-----------------------------------------------------------------------
+void LLAudioEngine_FMOD::setInternalGain(F32 gain)
+{
+ if (!mInited)
+ {
+ return;
+ }
+
+ gain = llclamp( gain, 0.0f, 1.0f );
+ FSOUND_SetSFXMasterVolume( llround( 255.0f * gain ) );
+
+ LLStreamingAudioInterface *saimpl = getStreamingAudioImpl();
+ if ( saimpl )
+ {
+ // fmod likes its streaming audio channel gain re-asserted after
+ // master volume change.
+ saimpl->setGain(saimpl->getGain());
+ }
+}
+
+//
+// LLAudioChannelFMOD implementation
+//
+
+LLAudioChannelFMOD::LLAudioChannelFMOD() : LLAudioChannel(), mChannelID(0), mLastSamplePos(0)
+{
+}
+
+
+LLAudioChannelFMOD::~LLAudioChannelFMOD()
+{
+ cleanup();
+}
+
+
+bool LLAudioChannelFMOD::updateBuffer()
+{
+ if (LLAudioChannel::updateBuffer())
+ {
+ // Base class update returned true, which means that we need to actually
+ // set up the channel for a different buffer.
+
+ LLAudioBufferFMOD *bufferp = (LLAudioBufferFMOD *)mCurrentSourcep->getCurrentBuffer();
+
+ // Grab the FMOD sample associated with the buffer
+ FSOUND_SAMPLE *samplep = bufferp->getSample();
+ if (!samplep)
+ {
+ // This is bad, there should ALWAYS be a sample associated with a legit
+ // buffer.
+ llerrs << "No FMOD sample!" << llendl;
+ return false;
+ }
+
+
+ // Actually play the sound. Start it off paused so we can do all the necessary
+ // setup.
+ mChannelID = FSOUND_PlaySoundEx(FSOUND_FREE, samplep, FSOUND_DSP_GetSFXUnit(), true);
+
+ //llinfos << "Setting up channel " << std::hex << mChannelID << std::dec << llendl;
+ }
+
+ // If we have a source for the channel, we need to update its gain.
+ if (mCurrentSourcep)
+ {
+ // SJB: warnings can spam and hurt framerate, disabling
+ if (!FSOUND_SetVolume(mChannelID, llround(getSecondaryGain() * mCurrentSourcep->getGain() * 255.0f)))
+ {
+// llwarns << "LLAudioChannelFMOD::updateBuffer error: " << FMOD_ErrorString(FSOUND_GetError()) << llendl;
+ }
+
+ if (!FSOUND_SetLoopMode(mChannelID, mCurrentSourcep->isLoop() ? FSOUND_LOOP_NORMAL : FSOUND_LOOP_OFF))
+ {
+// llwarns << "Channel " << mChannelID << "Source ID: " << mCurrentSourcep->getID()
+// << " at " << mCurrentSourcep->getPositionGlobal() << llendl;
+// llwarns << "LLAudioChannelFMOD::updateBuffer error: " << FMOD_ErrorString(FSOUND_GetError()) << llendl;
+ }
+ }
+
+ return true;
+}
+
+
+void LLAudioChannelFMOD::update3DPosition()
+{
+ if (!mChannelID)
+ {
+ // We're not actually a live channel (i.e., we're not playing back anything)
+ return;
+ }
+
+ LLAudioBufferFMOD *bufferp = (LLAudioBufferFMOD *)mCurrentBufferp;
+ if (!bufferp)
+ {
+ // We don't have a buffer associated with us (should really have been picked up
+ // by the above if.
+ return;
+ }
+
+ if (mCurrentSourcep->isAmbient())
+ {
+ // Ambient sound, don't need to do any positional updates.
+ bufferp->set3DMode(false);
+ }
+ else
+ {
+ // Localized sound. Update the position and velocity of the sound.
+ bufferp->set3DMode(true);
+
+ LLVector3 float_pos;
+ float_pos.setVec(mCurrentSourcep->getPositionGlobal());
+ if (!FSOUND_3D_SetAttributes(mChannelID, float_pos.mV, mCurrentSourcep->getVelocity().mV))
+ {
+ LL_DEBUGS("FMOD") << "LLAudioChannelFMOD::update3DPosition error: " << FMOD_ErrorString(FSOUND_GetError()) << LL_ENDL;
+ }
+ }
+}
+
+
+void LLAudioChannelFMOD::updateLoop()
+{
+ if (!mChannelID)
+ {
+ // May want to clear up the loop/sample counters.
+ return;
+ }
+
+ //
+ // Hack: We keep track of whether we looped or not by seeing when the
+ // sample position looks like it's going backwards. Not reliable; may
+ // yield false negatives.
+ //
+ U32 cur_pos = FSOUND_GetCurrentPosition(mChannelID);
+ if (cur_pos < (U32)mLastSamplePos)
+ {
+ mLoopedThisFrame = true;
+ }
+ mLastSamplePos = cur_pos;
+}
+
+
+void LLAudioChannelFMOD::cleanup()
+{
+ if (!mChannelID)
+ {
+ //llinfos << "Aborting cleanup with no channelID." << llendl;
+ return;
+ }
+
+ //llinfos << "Cleaning up channel: " << mChannelID << llendl;
+ if (!FSOUND_StopSound(mChannelID))
+ {
+ LL_DEBUGS("FMOD") << "LLAudioChannelFMOD::cleanup error: " << FMOD_ErrorString(FSOUND_GetError()) << llendl;
+ }
+
+ mCurrentBufferp = NULL;
+ mChannelID = 0;
+}
+
+
+void LLAudioChannelFMOD::play()
+{
+ if (!mChannelID)
+ {
+ llwarns << "Playing without a channelID, aborting" << llendl;
+ return;
+ }
+
+ if (!FSOUND_SetPaused(mChannelID, false))
+ {
+ llwarns << "LLAudioChannelFMOD::play error: " << FMOD_ErrorString(FSOUND_GetError()) << llendl;
+ }
+ getSource()->setPlayedOnce(true);
+}
+
+
+void LLAudioChannelFMOD::playSynced(LLAudioChannel *channelp)
+{
+ LLAudioChannelFMOD *fmod_channelp = (LLAudioChannelFMOD*)channelp;
+ if (!(fmod_channelp->mChannelID && mChannelID))
+ {
+ // Don't have channels allocated to both the master and the slave
+ return;
+ }
+
+ U32 position = FSOUND_GetCurrentPosition(fmod_channelp->mChannelID) % mCurrentBufferp->getLength();
+ // Try to match the position of our sync master
+ if (!FSOUND_SetCurrentPosition(mChannelID, position))
+ {
+ llwarns << "LLAudioChannelFMOD::playSynced unable to set current position" << llendl;
+ }
+
+ // Start us playing
+ play();
+}
+
+
+bool LLAudioChannelFMOD::isPlaying()
+{
+ if (!mChannelID)
+ {
+ return false;
+ }
+
+ return FSOUND_IsPlaying(mChannelID) && (!FSOUND_GetPaused(mChannelID));
+}
+
+
+
+//
+// LLAudioBufferFMOD implementation
+//
+
+
+LLAudioBufferFMOD::LLAudioBufferFMOD()
+{
+ mSamplep = NULL;
+}
+
+
+LLAudioBufferFMOD::~LLAudioBufferFMOD()
+{
+ if (mSamplep)
+ {
+ // Clean up the associated FMOD sample if it exists.
+ FSOUND_Sample_Free(mSamplep);
+ mSamplep = NULL;
+ }
+}
+
+
+bool LLAudioBufferFMOD::loadWAV(const std::string& filename)
+{
+ // Try to open a wav file from disk. This will eventually go away, as we don't
+ // really want to block doing this.
+ if (filename.empty())
+ {
+ // invalid filename, abort.
+ return false;
+ }
+
+ if (!LLAPRFile::isExist(filename, LL_APR_RPB))
+ {
+ // File not found, abort.
+ return false;
+ }
+
+ if (mSamplep)
+ {
+ // If there's already something loaded in this buffer, clean it up.
+ FSOUND_Sample_Free(mSamplep);
+ mSamplep = NULL;
+ }
+
+ // Load up the wav file into an fmod sample
+#if LL_WINDOWS
+ // MikeS. - Loading the sound file manually and then handing it over to FMOD,
+ // since FMOD uses posix IO internally,
+ // which doesn't work with unicode file paths.
+ LLFILE* sound_file = LLFile::fopen(filename,"rb"); /* Flawfinder: ignore */
+ if (sound_file)
+ {
+ fseek(sound_file,0,SEEK_END);
+ U32 file_length = ftell(sound_file); //Find the length of the file by seeking to the end and getting the offset
+ size_t read_count;
+ fseek(sound_file,0,SEEK_SET); //Seek back to the beginning
+ char* buffer = new char[file_length];
+ llassert(buffer);
+ read_count = fread((void*)buffer,file_length,1,sound_file);//Load it..
+ if(ferror(sound_file)==0 && (read_count == 1)){//No read error, and we got 1 chunk of our size...
+ unsigned int mode_flags = FSOUND_LOOP_NORMAL | FSOUND_LOADMEMORY;
+ //FSOUND_16BITS | FSOUND_MONO | FSOUND_LOADMEMORY | FSOUND_LOOP_NORMAL;
+ mSamplep = FSOUND_Sample_Load(FSOUND_UNMANAGED, buffer, mode_flags , 0, file_length);
+ }
+ delete[] buffer;
+ fclose(sound_file);
+ }
+#else
+ mSamplep = FSOUND_Sample_Load(FSOUND_UNMANAGED, filename.c_str(), FSOUND_LOOP_NORMAL, 0, 0);
+#endif
+
+ if (!mSamplep)
+ {
+ // We failed to load the file for some reason.
+ llwarns << "Could not load data '" << filename << "': "
+ << FMOD_ErrorString(FSOUND_GetError()) << llendl;
+
+ //
+ // If we EVER want to load wav files provided by end users, we need
+ // to rethink this!
+ //
+ // file is probably corrupt - remove it.
+ LLFile::remove(filename);
+ return false;
+ }
+
+ // Everything went well, return true
+ return true;
+}
+
+
+U32 LLAudioBufferFMOD::getLength()
+{
+ if (!mSamplep)
+ {
+ return 0;
+ }
+
+ return FSOUND_Sample_GetLength(mSamplep);
+}
+
+
+void LLAudioBufferFMOD::set3DMode(bool use3d)
+{
+ U16 current_mode = FSOUND_Sample_GetMode(mSamplep);
+
+ if (use3d)
+ {
+ if (!FSOUND_Sample_SetMode(mSamplep, (current_mode & (~FSOUND_2D))))
+ {
+ llwarns << "LLAudioBufferFMOD::set3DMode error: " << FMOD_ErrorString(FSOUND_GetError()) << llendl;
+ }
+ }
+ else
+ {
+ if (!FSOUND_Sample_SetMode(mSamplep, current_mode | FSOUND_2D))
+ {
+ llwarns << "LLAudioBufferFMOD::set3DMode error: " << FMOD_ErrorString(FSOUND_GetError()) << llendl;
+ }
+ }
+}
+
+
+void * F_CALLBACKAPI windCallback(void *originalbuffer, void *newbuffer, int length, void* userdata)
+{
+ // originalbuffer = fmod's original mixbuffer.
+ // newbuffer = the buffer passed from the previous DSP unit.
+ // length = length in samples at this mix time.
+ // param = user parameter passed through in FSOUND_DSP_Create.
+ //
+ // modify the buffer in some fashion
+
+ LLWindGen *windgen =
+ (LLWindGen *)userdata;
+ U8 stride;
+
+#if LL_DARWIN
+ stride = sizeof(LLAudioEngine_FMOD::MIXBUFFERFORMAT);
+#else
+ int mixertype = FSOUND_GetMixer();
+ if (mixertype == FSOUND_MIXER_BLENDMODE ||
+ mixertype == FSOUND_MIXER_QUALITY_FPU)
+ {
+ stride = 4;
+ }
+ else
+ {
+ stride = 2;
+ }
+#endif
+
+ newbuffer = windgen->windGenerate((LLAudioEngine_FMOD::MIXBUFFERFORMAT *)newbuffer, length, stride);
+
+ return newbuffer;
+}
diff --git a/linden/indra/llaudio/llaudioengine_fmod.h b/linden/indra/llaudio/llaudioengine_fmod.h
new file mode 100644
index 0000000..3968657
--- /dev/null
+++ b/linden/indra/llaudio/llaudioengine_fmod.h
@@ -0,0 +1,129 @@
+/**
+ * @file audioengine_fmod.h
+ * @brief Definition of LLAudioEngine class abstracting the audio
+ * support as a FMOD 3D implementation
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_AUDIOENGINE_FMOD_H
+#define LL_AUDIOENGINE_FMOD_H
+
+#include "llaudioengine.h"
+#include "lllistener_fmod.h"
+#include "llwindgen.h"
+
+#include "fmod.h"
+
+class LLAudioStreamManagerFMOD;
+
+class LLAudioEngine_FMOD : public LLAudioEngine
+{
+public:
+ LLAudioEngine_FMOD();
+ virtual ~LLAudioEngine_FMOD();
+
+ // initialization/startup/shutdown
+ virtual bool init(const S32 num_channels, void *user_data);
+ virtual std::string getDriverName(bool verbose);
+ virtual void allocateListener();
+
+ virtual void shutdown();
+
+ /*virtual*/ void initWind();
+ /*virtual*/ void cleanupWind();
+
+ /*virtual*/void updateWind(LLVector3 direction, F32 camera_height_above_water);
+
+#if LL_DARWIN
+ typedef S32 MIXBUFFERFORMAT;
+#else
+ typedef S16 MIXBUFFERFORMAT;
+#endif
+
+protected:
+ /*virtual*/ LLAudioBuffer *createBuffer(); // Get a free buffer, or flush an existing one if you have to.
+ /*virtual*/ LLAudioChannel *createChannel(); // Create a new audio channel.
+
+ /*virtual*/ void setInternalGain(F32 gain);
+protected:
+ static signed char F_CALLBACKAPI callbackMetaData(char* name, char* value, void* userdata);
+
+ //F32 mMinDistance[MAX_BUFFERS];
+ //F32 mMaxDistance[MAX_BUFFERS];
+
+ bool mInited;
+
+ // On Windows, userdata is the HWND of the application window.
+ void* mUserData;
+
+ LLWindGen *mWindGen;
+};
+
+
+class LLAudioChannelFMOD : public LLAudioChannel
+{
+public:
+ LLAudioChannelFMOD();
+ virtual ~LLAudioChannelFMOD();
+
+protected:
+ /*virtual*/ void play();
+ /*virtual*/ void playSynced(LLAudioChannel *channelp);
+ /*virtual*/ void cleanup();
+ /*virtual*/ bool isPlaying();
+
+ /*virtual*/ bool updateBuffer();
+ /*virtual*/ void update3DPosition();
+ /*virtual*/ void updateLoop();
+
+protected:
+ int mChannelID;
+ S32 mLastSamplePos;
+};
+
+
+class LLAudioBufferFMOD : public LLAudioBuffer
+{
+public:
+ LLAudioBufferFMOD();
+ virtual ~LLAudioBufferFMOD();
+
+ /*virtual*/ bool loadWAV(const std::string& filename);
+ /*virtual*/ U32 getLength();
+ friend class LLAudioChannelFMOD;
+
+ void set3DMode(bool use3d);
+protected:
+ FSOUND_SAMPLE *getSample() { return mSamplep; }
+protected:
+ FSOUND_SAMPLE *mSamplep;
+};
+
+
+#endif // LL_AUDIOENGINE_FMOD_H
diff --git a/linden/indra/llaudio/llaudioengine_openal.cpp b/linden/indra/llaudio/llaudioengine_openal.cpp
new file mode 100644
index 0000000..99ab18e
--- /dev/null
+++ b/linden/indra/llaudio/llaudioengine_openal.cpp
@@ -0,0 +1,546 @@
+/**
+ * @file audioengine_openal.cpp
+ * @brief implementation of audio engine using OpenAL
+ * support as a OpenAL 3D implementation
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+#include "lldir.h"
+
+#include "llaudioengine_openal.h"
+#include "lllistener_openal.h"
+
+
+LLAudioEngine_OpenAL::LLAudioEngine_OpenAL()
+ :
+ mWindGen(NULL),
+ mWindBuf(NULL),
+ mWindBufFreq(0),
+ mWindBufSamples(0),
+ mWindBufBytes(0),
+ mWindSource(AL_NONE),
+ mNumEmptyWindALBuffers(MAX_NUM_WIND_BUFFERS)
+{
+}
+
+// virtual
+LLAudioEngine_OpenAL::~LLAudioEngine_OpenAL()
+{
+}
+
+// virtual
+bool LLAudioEngine_OpenAL::init(const S32 num_channels, void* userdata)
+{
+ mWindGen = NULL;
+ LLAudioEngine::init(num_channels, userdata);
+
+ if(!alutInit(NULL, NULL))
+ {
+ llwarns << "LLAudioEngine_OpenAL::init() ALUT initialization failed: " << alutGetErrorString (alutGetError ()) << llendl;
+ return false;
+ }
+
+ llinfos << "LLAudioEngine_OpenAL::init() OpenAL successfully initialized" << llendl;
+
+ llinfos << "OpenAL version: "
+ << ll_safe_string(alGetString(AL_VERSION)) << llendl;
+ llinfos << "OpenAL vendor: "
+ << ll_safe_string(alGetString(AL_VENDOR)) << llendl;
+ llinfos << "OpenAL renderer: "
+ << ll_safe_string(alGetString(AL_RENDERER)) << llendl;
+
+ ALint major = alutGetMajorVersion ();
+ ALint minor = alutGetMinorVersion ();
+ llinfos << "ALUT version: " << major << "." << minor << llendl;
+
+ ALCdevice *device = alcGetContextsDevice(alcGetCurrentContext());
+
+ alcGetIntegerv(device, ALC_MAJOR_VERSION, 1, &major);
+ alcGetIntegerv(device, ALC_MINOR_VERSION, 1, &minor);
+ llinfos << "ALC version: " << major << "." << minor << llendl;
+
+ llinfos << "ALC default device: "
+ << ll_safe_string(alcGetString(device,
+ ALC_DEFAULT_DEVICE_SPECIFIER))
+ << llendl;
+
+ return true;
+}
+
+// virtual
+std::string LLAudioEngine_OpenAL::getDriverName(bool verbose)
+{
+ ALCdevice *device = alcGetContextsDevice(alcGetCurrentContext());
+ std::ostringstream version;
+
+ version <<
+ "OpenAL";
+
+ if (verbose)
+ {
+ version <<
+ ", version " <<
+ ll_safe_string(alGetString(AL_VERSION)) <<
+ " / " <<
+ ll_safe_string(alGetString(AL_VENDOR)) <<
+ " / " <<
+ ll_safe_string(alGetString(AL_RENDERER));
+
+ if (device)
+ version <<
+ ": " <<
+ ll_safe_string(alcGetString(device,
+ ALC_DEFAULT_DEVICE_SPECIFIER));
+ }
+
+ return version.str();
+}
+
+// virtual
+void LLAudioEngine_OpenAL::allocateListener()
+{
+ mListenerp = (LLListener *) new LLListener_OpenAL();
+ if(!mListenerp)
+ {
+ llwarns << "LLAudioEngine_OpenAL::allocateListener() Listener creation failed" << llendl;
+ }
+}
+
+// virtual
+void LLAudioEngine_OpenAL::shutdown()
+{
+ llinfos << "About to LLAudioEngine::shutdown()" << llendl;
+ LLAudioEngine::shutdown();
+
+ llinfos << "About to alutExit()" << llendl;
+ if(!alutExit())
+ {
+ llwarns << "Nuts." << llendl;
+ llwarns << "LLAudioEngine_OpenAL::shutdown() ALUT shutdown failed: " << alutGetErrorString (alutGetError ()) << llendl;
+ }
+
+ llinfos << "LLAudioEngine_OpenAL::shutdown() OpenAL successfully shut down" << llendl;
+
+ delete mListenerp;
+ mListenerp = NULL;
+}
+
+LLAudioBuffer *LLAudioEngine_OpenAL::createBuffer()
+{
+ return new LLAudioBufferOpenAL();
+}
+
+LLAudioChannel *LLAudioEngine_OpenAL::createChannel()
+{
+ return new LLAudioChannelOpenAL();
+}
+
+void LLAudioEngine_OpenAL::setInternalGain(F32 gain)
+{
+ //llinfos << "LLAudioEngine_OpenAL::setInternalGain() Gain: " << gain << llendl;
+ alListenerf(AL_GAIN, gain);
+}
+
+LLAudioChannelOpenAL::LLAudioChannelOpenAL()
+ :
+ mALSource(AL_NONE),
+ mLastSamplePos(0)
+{
+ alGenSources(1, &mALSource);
+}
+
+LLAudioChannelOpenAL::~LLAudioChannelOpenAL()
+{
+ cleanup();
+ alDeleteSources(1, &mALSource);
+}
+
+void LLAudioChannelOpenAL::cleanup()
+{
+ alSourceStop(mALSource);
+ mCurrentBufferp = NULL;
+}
+
+void LLAudioChannelOpenAL::play()
+{
+ if (mALSource == AL_NONE)
+ {
+ llwarns << "Playing without a mALSource, aborting" << llendl;
+ return;
+ }
+
+ if(!isPlaying())
+ {
+ alSourcePlay(mALSource);
+ getSource()->setPlayedOnce(true);
+ }
+}
+
+void LLAudioChannelOpenAL::playSynced(LLAudioChannel *channelp)
+{
+ if (channelp)
+ {
+ LLAudioChannelOpenAL *masterchannelp =
+ (LLAudioChannelOpenAL*)channelp;
+ if (mALSource != AL_NONE &&
+ masterchannelp->mALSource != AL_NONE)
+ {
+ // we have channels allocated to master and slave
+ ALfloat master_offset;
+ alGetSourcef(masterchannelp->mALSource, AL_SEC_OFFSET,
+ &master_offset);
+
+ llinfos << "Syncing with master at " << master_offset
+ << "sec" << llendl;
+ // *TODO: detect when this fails, maybe use AL_SAMPLE_
+ alSourcef(mALSource, AL_SEC_OFFSET, master_offset);
+ }
+ }
+ play();
+}
+
+bool LLAudioChannelOpenAL::isPlaying()
+{
+ if (mALSource != AL_NONE)
+ {
+ ALint state;
+ alGetSourcei(mALSource, AL_SOURCE_STATE, &state);
+ if(state == AL_PLAYING)
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool LLAudioChannelOpenAL::updateBuffer()
+{
+ if (LLAudioChannel::updateBuffer())
+ {
+ // Base class update returned true, which means that we need to actually
+ // set up the source for a different buffer.
+ LLAudioBufferOpenAL *bufferp = (LLAudioBufferOpenAL *)mCurrentSourcep->getCurrentBuffer();
+ ALuint buffer = bufferp->getBuffer();
+ alSourcei(mALSource, AL_BUFFER, buffer);
+ mLastSamplePos = 0;
+ }
+
+ if (mCurrentSourcep)
+ {
+ alSourcef(mALSource, AL_GAIN,
+ mCurrentSourcep->getGain() * getSecondaryGain());
+ alSourcei(mALSource, AL_LOOPING,
+ mCurrentSourcep->isLoop() ? AL_TRUE : AL_FALSE);
+ alSourcef(mALSource, AL_ROLLOFF_FACTOR,
+ gAudiop->mListenerp->getRolloffFactor());
+ }
+
+ return true;
+}
+
+
+void LLAudioChannelOpenAL::updateLoop()
+{
+ if (mALSource == AL_NONE)
+ {
+ return;
+ }
+
+ // Hack: We keep track of whether we looped or not by seeing when the
+ // sample position looks like it's going backwards. Not reliable; may
+ // yield false negatives.
+ //
+ ALint cur_pos;
+ alGetSourcei(mALSource, AL_SAMPLE_OFFSET, &cur_pos);
+ if (cur_pos < mLastSamplePos)
+ {
+ mLoopedThisFrame = true;
+ }
+ mLastSamplePos = cur_pos;
+}
+
+
+void LLAudioChannelOpenAL::update3DPosition()
+{
+ if(!mCurrentSourcep)
+ {
+ return;
+ }
+ if (mCurrentSourcep->isAmbient())
+ {
+ alSource3f(mALSource, AL_POSITION, 0.0, 0.0, 0.0);
+ alSource3f(mALSource, AL_VELOCITY, 0.0, 0.0, 0.0);
+ alSourcei (mALSource, AL_SOURCE_RELATIVE, AL_TRUE);
+ } else {
+ LLVector3 float_pos;
+ float_pos.setVec(mCurrentSourcep->getPositionGlobal());
+ alSourcefv(mALSource, AL_POSITION, float_pos.mV);
+ alSourcefv(mALSource, AL_VELOCITY, mCurrentSourcep->getVelocity().mV);
+ alSourcei (mALSource, AL_SOURCE_RELATIVE, AL_FALSE);
+ }
+
+ alSourcef(mALSource, AL_GAIN, mCurrentSourcep->getGain() * getSecondaryGain());
+}
+
+LLAudioBufferOpenAL::LLAudioBufferOpenAL()
+{
+ mALBuffer = AL_NONE;
+}
+
+LLAudioBufferOpenAL::~LLAudioBufferOpenAL()
+{
+ cleanup();
+}
+
+void LLAudioBufferOpenAL::cleanup()
+{
+ if(mALBuffer != AL_NONE)
+ {
+ alDeleteBuffers(1, &mALBuffer);
+ mALBuffer = AL_NONE;
+ }
+}
+
+bool LLAudioBufferOpenAL::loadWAV(const std::string& filename)
+{
+ cleanup();
+ mALBuffer = alutCreateBufferFromFile(filename.c_str());
+ if(mALBuffer == AL_NONE)
+ {
+ ALenum error = alutGetError();
+ if (gDirUtilp->fileExists(filename))
+ {
+ llwarns <<
+ "LLAudioBufferOpenAL::loadWAV() Error loading "
+ << filename
+ << " " << alutGetErrorString(error) << llendl;
+ }
+ else
+ {
+ // It's common for the file to not actually exist.
+ lldebugs <<
+ "LLAudioBufferOpenAL::loadWAV() Error loading "
+ << filename
+ << " " << alutGetErrorString(error) << llendl;
+ }
+ return false;
+ }
+
+ return true;
+}
+
+U32 LLAudioBufferOpenAL::getLength()
+{
+ if(mALBuffer == AL_NONE)
+ {
+ return 0;
+ }
+ ALint length;
+ alGetBufferi(mALBuffer, AL_SIZE, &length);
+ return length / 2; // convert size in bytes to size in (16-bit) samples
+}
+
+// ------------
+
+void LLAudioEngine_OpenAL::initWind()
+{
+ ALenum error;
+ llinfos << "LLAudioEngine_OpenAL::initWind() start" << llendl;
+
+ mNumEmptyWindALBuffers = MAX_NUM_WIND_BUFFERS;
+
+ alGetError(); /* clear error */
+
+ alGenSources(1,&mWindSource);
+
+ if((error=alGetError()) != AL_NO_ERROR)
+ {
+ llwarns << "LLAudioEngine_OpenAL::initWind() Error creating wind sources: "<;
+
+ mWindBufFreq = mWindGen->getInputSamplingRate();
+ mWindBufSamples = llceil(mWindBufFreq * WIND_BUFFER_SIZE_SEC);
+ mWindBufBytes = mWindBufSamples * 2 /*stereo*/ * sizeof(WIND_SAMPLE_T);
+
+ mWindBuf = new WIND_SAMPLE_T [mWindBufSamples * 2 /*stereo*/];
+
+ if(mWindBuf==NULL)
+ {
+ llerrs << "LLAudioEngine_OpenAL::initWind() Error creating wind memory buffer" << llendl;
+ mEnableWind=false;
+ }
+
+ llinfos << "LLAudioEngine_OpenAL::initWind() done" << llendl;
+}
+
+void LLAudioEngine_OpenAL::cleanupWind()
+{
+ llinfos << "LLAudioEngine_OpenAL::cleanupWind()" << llendl;
+
+ if (mWindSource != AL_NONE)
+ {
+ // detach and delete all outstanding buffers on the wind source
+ alSourceStop(mWindSource);
+ ALint processed;
+ alGetSourcei(mWindSource, AL_BUFFERS_PROCESSED, &processed);
+ while (processed--)
+ {
+ ALuint buffer = AL_NONE;
+ alSourceUnqueueBuffers(mWindSource, 1, &buffer);
+ alDeleteBuffers(1, &buffer);
+ }
+
+ // delete the wind source itself
+ alDeleteSources(1, &mWindSource);
+
+ mWindSource = AL_NONE;
+ }
+
+ delete[] mWindBuf;
+ mWindBuf = NULL;
+
+ delete mWindGen;
+ mWindGen = NULL;
+}
+
+void LLAudioEngine_OpenAL::updateWind(LLVector3 wind_vec, F32 camera_altitude)
+{
+ LLVector3 wind_pos;
+ F64 pitch;
+ F64 center_freq;
+ ALenum error;
+
+ if (!mEnableWind)
+ return;
+
+ if(!mWindBuf)
+ return;
+
+ if (mWindUpdateTimer.checkExpirationAndReset(LL_WIND_UPDATE_INTERVAL))
+ {
+
+ // wind comes in as Linden coordinate (+X = forward, +Y = left, +Z = up)
+ // need to convert this to the conventional orientation DS3D and OpenAL use
+ // where +X = right, +Y = up, +Z = backwards
+
+ wind_vec.setVec(-wind_vec.mV[1], wind_vec.mV[2], -wind_vec.mV[0]);
+
+ pitch = 1.0 + mapWindVecToPitch(wind_vec);
+ center_freq = 80.0 * pow(pitch,2.5*(mapWindVecToGain(wind_vec)+1.0));
+
+ mWindGen->mTargetFreq = (F32)center_freq;
+ mWindGen->mTargetGain = (F32)mapWindVecToGain(wind_vec) * mMaxWindGain;
+ mWindGen->mTargetPanGainR = (F32)mapWindVecToPan(wind_vec);
+
+ alSourcei(mWindSource, AL_LOOPING, AL_FALSE);
+ alSource3f(mWindSource, AL_POSITION, 0.0, 0.0, 0.0);
+ alSource3f(mWindSource, AL_VELOCITY, 0.0, 0.0, 0.0);
+ alSourcef(mWindSource, AL_ROLLOFF_FACTOR, 0.0);
+ alSourcei(mWindSource, AL_SOURCE_RELATIVE, AL_TRUE);
+ }
+
+ // ok lets make a wind buffer now
+
+ ALint processed, queued, unprocessed;
+ alGetSourcei(mWindSource, AL_BUFFERS_PROCESSED, &processed);
+ alGetSourcei(mWindSource, AL_BUFFERS_QUEUED, &queued);
+ unprocessed = queued - processed;
+
+ // ensure that there are always at least 3x as many filled buffers
+ // queued as we managed to empty since last time.
+ mNumEmptyWindALBuffers = llmin(mNumEmptyWindALBuffers + processed * 3 - unprocessed, MAX_NUM_WIND_BUFFERS-unprocessed);
+ mNumEmptyWindALBuffers = llmax(mNumEmptyWindALBuffers, 0);
+
+ //llinfos << "mNumEmptyWindALBuffers: " << mNumEmptyWindALBuffers <<" (" << unprocessed << ":" << processed << ")" << llendl;
+
+ while(processed--) // unqueue old buffers
+ {
+ ALuint buffer;
+ ALenum error;
+ alGetError(); /* clear error */
+ alSourceUnqueueBuffers(mWindSource, 1, &buffer);
+ error = alGetError();
+ if(error != AL_NO_ERROR)
+ {
+ llwarns << "LLAudioEngine_OpenAL::updateWind() error swapping (unqueuing) buffers" << llendl;
+ }
+ else
+ {
+ alDeleteBuffers(1, &buffer);
+ }
+ }
+
+ unprocessed += mNumEmptyWindALBuffers;
+ while (mNumEmptyWindALBuffers > 0) // fill+queue new buffers
+ {
+ ALuint buffer;
+ alGetError(); /* clear error */
+ alGenBuffers(1,&buffer);
+ if((error=alGetError()) != AL_NO_ERROR)
+ {
+ llwarns << "LLAudioEngine_OpenAL::initWind() Error creating wind buffer: " << error << llendl;
+ break;
+ }
+
+ alBufferData(buffer,
+ AL_FORMAT_STEREO16,
+ mWindGen->windGenerate(mWindBuf,
+ mWindBufSamples, 2),
+ mWindBufBytes,
+ mWindBufFreq);
+ error = alGetError();
+ if(error != AL_NO_ERROR)
+ {
+ llwarns << "LLAudioEngine_OpenAL::updateWind() error swapping (bufferdata) buffers" << llendl;
+ }
+
+ alSourceQueueBuffers(mWindSource, 1, &buffer);
+ error = alGetError();
+ if(error != AL_NO_ERROR)
+ {
+ llwarns << "LLAudioEngine_OpenAL::updateWind() error swapping (queuing) buffers" << llendl;
+ }
+
+ --mNumEmptyWindALBuffers;
+ }
+
+ ALint playing;
+ alGetSourcei(mWindSource, AL_SOURCE_STATE, &playing);
+ if(playing != AL_PLAYING)
+ {
+ alSourcePlay(mWindSource);
+
+ lldebugs << "Wind had stopped - probably ran out of buffers - restarting: " << (unprocessed+mNumEmptyWindALBuffers) << " now queued." << llendl;
+ }
+}
+
diff --git a/linden/indra/llaudio/llaudioengine_openal.h b/linden/indra/llaudio/llaudioengine_openal.h
new file mode 100644
index 0000000..5aca03e
--- /dev/null
+++ b/linden/indra/llaudio/llaudioengine_openal.h
@@ -0,0 +1,114 @@
+/**
+ * @file audioengine_openal.cpp
+ * @brief implementation of audio engine using OpenAL
+ * support as a OpenAL 3D implementation
+ *
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+
+#ifndef LL_AUDIOENGINE_OPENAL_H
+#define LL_AUDIOENGINE_OPENAL_H
+
+#include "llaudioengine.h"
+#include "lllistener_openal.h"
+#include "llwindgen.h"
+
+class LLAudioEngine_OpenAL : public LLAudioEngine
+{
+ public:
+ LLAudioEngine_OpenAL();
+ virtual ~LLAudioEngine_OpenAL();
+
+ virtual bool init(const S32 num_channels, void *user_data);
+ virtual std::string getDriverName(bool verbose);
+ virtual void allocateListener();
+
+ virtual void shutdown();
+
+ void setInternalGain(F32 gain);
+
+ LLAudioBuffer* createBuffer();
+ LLAudioChannel* createChannel();
+
+ /*virtual*/ void initWind();
+ /*virtual*/ void cleanupWind();
+ /*virtual*/ void updateWind(LLVector3 direction, F32 camera_altitude);
+
+ private:
+ void * windDSP(void *newbuffer, int length);
+ typedef S16 WIND_SAMPLE_T;
+ LLWindGen *mWindGen;
+ S16 *mWindBuf;
+ U32 mWindBufFreq;
+ U32 mWindBufSamples;
+ U32 mWindBufBytes;
+ ALuint mWindSource;
+ int mNumEmptyWindALBuffers;
+
+ static const int MAX_NUM_WIND_BUFFERS = 80;
+ static const float WIND_BUFFER_SIZE_SEC = 0.05f; // 1/20th sec
+};
+
+class LLAudioChannelOpenAL : public LLAudioChannel
+{
+ public:
+ LLAudioChannelOpenAL();
+ virtual ~LLAudioChannelOpenAL();
+ protected:
+ /*virtual*/ void play();
+ /*virtual*/ void playSynced(LLAudioChannel *channelp);
+ /*virtual*/ void cleanup();
+ /*virtual*/ bool isPlaying();
+
+ /*virtual*/ bool updateBuffer();
+ /*virtual*/ void update3DPosition();
+ /*virtual*/ void updateLoop();
+
+ ALuint mALSource;
+ ALint mLastSamplePos;
+};
+
+class LLAudioBufferOpenAL : public LLAudioBuffer{
+ public:
+ LLAudioBufferOpenAL();
+ virtual ~LLAudioBufferOpenAL();
+
+ bool loadWAV(const std::string& filename);
+ U32 getLength();
+
+ friend class LLAudioChannelOpenAL;
+ protected:
+ void cleanup();
+ ALuint getBuffer() {return mALBuffer;}
+
+ ALuint mALBuffer;
+};
+
+#endif
diff --git a/linden/indra/llaudio/lllistener.cpp b/linden/indra/llaudio/lllistener.cpp
new file mode 100644
index 0000000..846c6bc
--- /dev/null
+++ b/linden/indra/llaudio/lllistener.cpp
@@ -0,0 +1,142 @@
+/**
+ * @file listener.cpp
+ * @brief Implementation of LISTENER class abstracting the audio support
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "lllistener.h"
+
+#define DEFAULT_AT 0.0f,0.0f,-1.0f
+#define DEFAULT_UP 0.0f,1.0f,0.0f
+
+//-----------------------------------------------------------------------
+// constructor
+//-----------------------------------------------------------------------
+LLListener::LLListener()
+{
+ init();
+}
+
+//-----------------------------------------------------------------------
+LLListener::~LLListener()
+{
+}
+
+//-----------------------------------------------------------------------
+void LLListener::init(void)
+{
+ mPosition.zeroVec();
+ mListenAt.setVec(DEFAULT_AT);
+ mListenUp.setVec(DEFAULT_UP);
+ mVelocity.zeroVec();
+}
+
+//-----------------------------------------------------------------------
+void LLListener::translate(LLVector3 offset)
+{
+ mPosition += offset;
+}
+
+//-----------------------------------------------------------------------
+void LLListener::setPosition(LLVector3 pos)
+{
+ mPosition = pos;
+}
+
+//-----------------------------------------------------------------------
+LLVector3 LLListener::getPosition(void)
+{
+ return(mPosition);
+}
+
+//-----------------------------------------------------------------------
+LLVector3 LLListener::getAt(void)
+{
+ return(mListenAt);
+}
+
+//-----------------------------------------------------------------------
+LLVector3 LLListener::getUp(void)
+{
+ return(mListenUp);
+}
+
+//-----------------------------------------------------------------------
+void LLListener::setVelocity(LLVector3 vel)
+{
+ mVelocity = vel;
+}
+
+//-----------------------------------------------------------------------
+void LLListener::orient(LLVector3 up, LLVector3 at)
+{
+ mListenUp = up;
+ mListenAt = at;
+}
+
+//-----------------------------------------------------------------------
+void LLListener::set(LLVector3 pos, LLVector3 vel, LLVector3 up, LLVector3 at)
+{
+ mPosition = pos;
+ mVelocity = vel;
+
+ setPosition(pos);
+ setVelocity(vel);
+ orient(up,at);
+}
+
+//-----------------------------------------------------------------------
+void LLListener::setDopplerFactor(F32 factor)
+{
+}
+
+//-----------------------------------------------------------------------
+F32 LLListener::getDopplerFactor()
+{
+ return (1.f);
+}
+
+//-----------------------------------------------------------------------
+void LLListener::setRolloffFactor(F32 factor)
+{
+}
+
+//-----------------------------------------------------------------------
+F32 LLListener::getRolloffFactor()
+{
+ return (1.f);
+}
+
+//-----------------------------------------------------------------------
+void LLListener::commitDeferredChanges()
+{
+}
+
diff --git a/linden/indra/llaudio/lllistener.h b/linden/indra/llaudio/lllistener.h
new file mode 100644
index 0000000..e94fbe8
--- /dev/null
+++ b/linden/indra/llaudio/lllistener.h
@@ -0,0 +1,78 @@
+/**
+ * @file listener.h
+ * @brief Description of LISTENER base class abstracting the audio support.
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LISTENER_H
+#define LL_LISTENER_H
+
+#include "v3math.h"
+
+class LLListener
+{
+ private:
+ protected:
+ LLVector3 mPosition;
+ LLVector3 mVelocity;
+ LLVector3 mListenAt;
+ LLVector3 mListenUp;
+
+ public:
+
+ private:
+ protected:
+ public:
+ LLListener();
+ virtual ~LLListener();
+ virtual void init();
+
+ virtual void set(LLVector3 pos, LLVector3 vel, LLVector3 up, LLVector3 at);
+
+ virtual void setPosition(LLVector3 pos);
+ virtual void setVelocity(LLVector3 vel);
+
+ virtual void orient(LLVector3 up, LLVector3 at);
+ virtual void translate(LLVector3 offset);
+
+ virtual void setDopplerFactor(F32 factor);
+ virtual void setRolloffFactor(F32 factor);
+
+ virtual LLVector3 getPosition();
+ virtual LLVector3 getAt();
+ virtual LLVector3 getUp();
+
+ virtual F32 getDopplerFactor();
+ virtual F32 getRolloffFactor();
+
+ virtual void commitDeferredChanges();
+};
+
+#endif
+
diff --git a/linden/indra/llaudio/lllistener_ds3d.h b/linden/indra/llaudio/lllistener_ds3d.h
new file mode 100644
index 0000000..1ff9c17
--- /dev/null
+++ b/linden/indra/llaudio/lllistener_ds3d.h
@@ -0,0 +1,74 @@
+/**
+ * @file listener_ds3d.h
+ * @brief Description of LISTENER class abstracting the audio support
+ * as a DirectSound 3D implementation (windows only)
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LISTENER_DS3D_H
+#define LL_LISTENER_DS3D_H
+
+#include "lllistener.h"
+
+#include
+#include
+#include
+
+class LLListener_DS3D : public LLListener
+{
+ private:
+ protected:
+ IDirectSound3DListener8 *m3DListener;
+ public:
+
+ private:
+ protected:
+ public:
+ LLListener_DS3D();
+ virtual ~LLListener_DS3D();
+ virtual void init();
+
+ virtual void setDS3DLPtr (IDirectSound3DListener8 *listener_p);
+
+ virtual void translate(LLVector3 offset);
+ virtual void setPosition(LLVector3 pos);
+ virtual void setVelocity(LLVector3 vel);
+ virtual void orient(LLVector3 up, LLVector3 at);
+
+ virtual void setDopplerFactor(F32 factor);
+ virtual F32 getDopplerFactor();
+ virtual void setRolloffFactor(F32 factor);
+ virtual F32 getRolloffFactor();
+
+ virtual void commitDeferredChanges();
+};
+
+#endif
+
+
diff --git a/linden/indra/llaudio/lllistener_fmod.cpp b/linden/indra/llaudio/lllistener_fmod.cpp
new file mode 100644
index 0000000..57ad461
--- /dev/null
+++ b/linden/indra/llaudio/lllistener_fmod.cpp
@@ -0,0 +1,131 @@
+/**
+ * @file listener_fmod.cpp
+ * @brief implementation of LISTENER class abstracting the audio
+ * support as a FMOD 3D implementation (windows only)
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+#include "llaudioengine.h"
+#include "lllistener_fmod.h"
+#include "fmod.h"
+
+//-----------------------------------------------------------------------
+// constructor
+//-----------------------------------------------------------------------
+LLListener_FMOD::LLListener_FMOD()
+{
+ init();
+}
+
+//-----------------------------------------------------------------------
+LLListener_FMOD::~LLListener_FMOD()
+{
+}
+
+//-----------------------------------------------------------------------
+void LLListener_FMOD::init(void)
+{
+ // do inherited
+ LLListener::init();
+ mDopplerFactor = 1.0f;
+ mRolloffFactor = 1.0f;
+}
+
+//-----------------------------------------------------------------------
+void LLListener_FMOD::translate(LLVector3 offset)
+{
+ LLListener::translate(offset);
+
+ FSOUND_3D_Listener_SetAttributes(mPosition.mV, NULL, mListenAt.mV[0],mListenAt.mV[1],mListenAt.mV[2], mListenUp.mV[0],mListenUp.mV[1],mListenUp.mV[2]);
+}
+
+//-----------------------------------------------------------------------
+void LLListener_FMOD::setPosition(LLVector3 pos)
+{
+ LLListener::setPosition(pos);
+
+ FSOUND_3D_Listener_SetAttributes(pos.mV, NULL, mListenAt.mV[0],mListenAt.mV[1],mListenAt.mV[2], mListenUp.mV[0],mListenUp.mV[1],mListenUp.mV[2]);
+}
+
+//-----------------------------------------------------------------------
+void LLListener_FMOD::setVelocity(LLVector3 vel)
+{
+ LLListener::setVelocity(vel);
+
+ FSOUND_3D_Listener_SetAttributes(NULL, vel.mV, mListenAt.mV[0],mListenAt.mV[1],mListenAt.mV[2], mListenUp.mV[0],mListenUp.mV[1],mListenUp.mV[2]);
+}
+
+//-----------------------------------------------------------------------
+void LLListener_FMOD::orient(LLVector3 up, LLVector3 at)
+{
+ LLListener::orient(up, at);
+
+ // Welcome to the transition between right and left
+ // (coordinate systems, that is)
+ // Leaving the at vector alone results in a L/R reversal
+ // since DX is left-handed and we (LL, OpenGL, OpenAL) are right-handed
+ at = -at;
+
+ FSOUND_3D_Listener_SetAttributes(NULL, NULL, at.mV[0],at.mV[1],at.mV[2], up.mV[0],up.mV[1],up.mV[2]);
+}
+
+//-----------------------------------------------------------------------
+void LLListener_FMOD::commitDeferredChanges()
+{
+ FSOUND_Update();
+}
+
+
+void LLListener_FMOD::setRolloffFactor(F32 factor)
+{
+ mRolloffFactor = factor;
+ FSOUND_3D_SetRolloffFactor(factor);
+}
+
+
+F32 LLListener_FMOD::getRolloffFactor()
+{
+ return mRolloffFactor;
+}
+
+
+void LLListener_FMOD::setDopplerFactor(F32 factor)
+{
+ mDopplerFactor = factor;
+ FSOUND_3D_SetDopplerFactor(factor);
+}
+
+
+F32 LLListener_FMOD::getDopplerFactor()
+{
+ return mDopplerFactor;
+}
+
+
diff --git a/linden/indra/llaudio/lllistener_fmod.h b/linden/indra/llaudio/lllistener_fmod.h
new file mode 100644
index 0000000..5a48ec8
--- /dev/null
+++ b/linden/indra/llaudio/lllistener_fmod.h
@@ -0,0 +1,64 @@
+/**
+ * @file listener_fmod.h
+ * @brief Description of LISTENER class abstracting the audio support
+ * as an FMOD 3D implementation (windows and Linux)
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LISTENER_FMOD_H
+#define LL_LISTENER_FMOD_H
+
+#include "lllistener.h"
+
+class LLListener_FMOD : public LLListener
+{
+ public:
+ LLListener_FMOD();
+ virtual ~LLListener_FMOD();
+ virtual void init();
+
+ virtual void translate(LLVector3 offset);
+ virtual void setPosition(LLVector3 pos);
+ virtual void setVelocity(LLVector3 vel);
+ virtual void orient(LLVector3 up, LLVector3 at);
+ virtual void commitDeferredChanges();
+
+ virtual void setDopplerFactor(F32 factor);
+ virtual F32 getDopplerFactor();
+ virtual void setRolloffFactor(F32 factor);
+ virtual F32 getRolloffFactor();
+
+ protected:
+ F32 mDopplerFactor;
+ F32 mRolloffFactor;
+};
+
+#endif
+
+
diff --git a/linden/indra/llaudio/lllistener_openal.cpp b/linden/indra/llaudio/lllistener_openal.cpp
new file mode 100644
index 0000000..a96ebd5
--- /dev/null
+++ b/linden/indra/llaudio/lllistener_openal.cpp
@@ -0,0 +1,116 @@
+/**
+ * @file audioengine_openal.cpp
+ * @brief implementation of audio engine using OpenAL
+ * support as a OpenAL 3D implementation
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+#include "llaudioengine.h"
+
+#include "lllistener_openal.h"
+
+LLListener_OpenAL::LLListener_OpenAL()
+{
+ init();
+}
+
+LLListener_OpenAL::~LLListener_OpenAL()
+{
+}
+
+void LLListener_OpenAL::translate(LLVector3 offset)
+{
+ //llinfos << "LLListener_OpenAL::translate() : " << offset << llendl;
+ LLListener::translate(offset);
+}
+
+void LLListener_OpenAL::setPosition(LLVector3 pos)
+{
+ //llinfos << "LLListener_OpenAL::setPosition() : " << pos << llendl;
+ LLListener::setPosition(pos);
+}
+
+void LLListener_OpenAL::setVelocity(LLVector3 vel)
+{
+ LLListener::setVelocity(vel);
+}
+
+void LLListener_OpenAL::orient(LLVector3 up, LLVector3 at)
+{
+ //llinfos << "LLListener_OpenAL::orient() up: " << up << " at: " << at << llendl;
+ LLListener::orient(up, at);
+}
+
+void LLListener_OpenAL::commitDeferredChanges()
+{
+ ALfloat orientation[6];
+ orientation[0] = mListenAt.mV[0];
+ orientation[1] = mListenAt.mV[1];
+ orientation[2] = mListenAt.mV[2];
+ orientation[3] = mListenUp.mV[0];
+ orientation[4] = mListenUp.mV[1];
+ orientation[5] = mListenUp.mV[2];
+
+ ALfloat velocity[3];
+ velocity[0] = mVelocity.mV[0];
+ velocity[1] = mVelocity.mV[1];
+ velocity[2] = mVelocity.mV[2];
+
+ alListenerfv(AL_ORIENTATION, orientation);
+ alListenerfv(AL_POSITION, mPosition.mV);
+ alListenerfv(AL_VELOCITY, velocity);
+}
+
+void LLListener_OpenAL::setDopplerFactor(F32 factor)
+{
+ //llinfos << "LLListener_OpenAL::setDopplerFactor() : " << factor << llendl;
+ alDopplerFactor(factor);
+}
+
+F32 LLListener_OpenAL::getDopplerFactor()
+{
+ ALfloat factor;
+ factor = alGetFloat(AL_DOPPLER_FACTOR);
+ //llinfos << "LLListener_OpenAL::getDopplerFactor() : " << factor << llendl;
+ return factor;
+}
+
+
+void LLListener_OpenAL::setRolloffFactor(F32 factor)
+{
+ mRolloffFactor = factor;
+}
+
+F32 LLListener_OpenAL::getRolloffFactor()
+{
+ return mRolloffFactor;
+}
+
+
diff --git a/linden/indra/llaudio/lllistener_openal.h b/linden/indra/llaudio/lllistener_openal.h
new file mode 100644
index 0000000..0dfeea5
--- /dev/null
+++ b/linden/indra/llaudio/lllistener_openal.h
@@ -0,0 +1,64 @@
+/**
+ * @file listener_openal.h
+ * @brief Description of LISTENER class abstracting the audio support
+ * as an OpenAL implementation
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LISTENER_OPENAL_H
+#define LL_LISTENER_OPENAL_H
+
+#include "lllistener.h"
+
+#include "AL/al.h"
+#include "AL/alut.h"
+
+class LLListener_OpenAL : public LLListener
+{
+ public:
+ LLListener_OpenAL();
+ virtual ~LLListener_OpenAL();
+
+ virtual void translate(LLVector3 offset);
+ virtual void setPosition(LLVector3 pos);
+ virtual void setVelocity(LLVector3 vel);
+ virtual void orient(LLVector3 up, LLVector3 at);
+ virtual void commitDeferredChanges();
+
+ virtual void setDopplerFactor(F32 factor);
+ virtual F32 getDopplerFactor();
+ virtual void setRolloffFactor(F32 factor);
+ virtual F32 getRolloffFactor();
+
+ protected:
+ F32 mRolloffFactor;
+};
+
+#endif
+
diff --git a/linden/indra/llaudio/llstreamingaudio.h b/linden/indra/llaudio/llstreamingaudio.h
new file mode 100644
index 0000000..aa89e6a
--- /dev/null
+++ b/linden/indra/llaudio/llstreamingaudio.h
@@ -0,0 +1,56 @@
+/**
+ * @file streamingaudio.h
+ * @author Tofu Linden
+ * @brief Definition of LLStreamingAudioInterface base class abstracting the streaming audio interface
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_STREAMINGAUDIO_H
+#define LL_STREAMINGAUDIO_H
+
+#include "stdtypes.h" // from llcommon
+
+// Entirely abstract. Based exactly on the historic API.
+class LLStreamingAudioInterface
+{
+ public:
+ virtual ~LLStreamingAudioInterface() {}
+
+ virtual void start(const std::string& url) = 0;
+ virtual void stop() = 0;
+ virtual void pause(int pause) = 0;
+ virtual void update() = 0;
+ virtual int isPlaying() = 0;
+ // use a value from 0.0 to 1.0, inclusive
+ virtual void setGain(F32 vol) = 0;
+ virtual F32 getGain() = 0;
+ virtual std::string getURL() = 0;
+};
+
+#endif // LL_STREAMINGAUDIO_H
diff --git a/linden/indra/llaudio/llstreamingaudio_fmod.cpp b/linden/indra/llaudio/llstreamingaudio_fmod.cpp
new file mode 100644
index 0000000..a71a872
--- /dev/null
+++ b/linden/indra/llaudio/llstreamingaudio_fmod.cpp
@@ -0,0 +1,362 @@
+/**
+ * @file streamingaudio_fmod.cpp
+ * @brief LLStreamingAudio_FMOD implementation
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "llmath.h"
+
+#include "fmod.h"
+#include "fmod_errors.h"
+
+#include "llstreamingaudio_fmod.h"
+
+
+class LLAudioStreamManagerFMOD
+{
+public:
+ LLAudioStreamManagerFMOD(const std::string& url);
+ int startStream();
+ bool stopStream(); // Returns true if the stream was successfully stopped.
+ bool ready();
+
+ const std::string& getURL() { return mInternetStreamURL; }
+
+ int getOpenState();
+protected:
+ FSOUND_STREAM* mInternetStream;
+ bool mReady;
+
+ std::string mInternetStreamURL;
+};
+
+
+
+//---------------------------------------------------------------------------
+// Internet Streaming
+//---------------------------------------------------------------------------
+LLStreamingAudio_FMOD::LLStreamingAudio_FMOD() :
+ mCurrentInternetStreamp(NULL),
+ mFMODInternetStreamChannel(-1),
+ mGain(1.0f)
+{
+ // Number of milliseconds of audio to buffer for the audio card.
+ // Must be larger than the usual Second Life frame stutter time.
+ FSOUND_Stream_SetBufferSize(200);
+
+ // Here's where we set the size of the network buffer and some buffering
+ // parameters. In this case we want a network buffer of 16k, we want it
+ // to prebuffer 40% of that when we first connect, and we want it
+ // to rebuffer 80% of that whenever we encounter a buffer underrun.
+
+ // Leave the net buffer properties at the default.
+ //FSOUND_Stream_Net_SetBufferProperties(20000, 40, 80);
+}
+
+
+LLStreamingAudio_FMOD::~LLStreamingAudio_FMOD()
+{
+ // nothing interesting/safe to do.
+}
+
+
+void LLStreamingAudio_FMOD::start(const std::string& url)
+{
+ //if (!mInited)
+ //{
+ // llwarns << "startInternetStream before audio initialized" << llendl;
+ // return;
+ //}
+
+ // "stop" stream but don't clear url, etc. in case url == mInternetStreamURL
+ stop();
+
+ if (!url.empty())
+ {
+ llinfos << "Starting internet stream: " << url << llendl;
+ mCurrentInternetStreamp = new LLAudioStreamManagerFMOD(url);
+ mURL = url;
+ }
+ else
+ {
+ llinfos << "Set internet stream to null" << llendl;
+ mURL.clear();
+ }
+}
+
+
+void LLStreamingAudio_FMOD::update()
+{
+ // Kill dead internet streams, if possible
+ std::list::iterator iter;
+ for (iter = mDeadStreams.begin(); iter != mDeadStreams.end();)
+ {
+ LLAudioStreamManagerFMOD *streamp = *iter;
+ if (streamp->stopStream())
+ {
+ llinfos << "Closed dead stream" << llendl;
+ delete streamp;
+ mDeadStreams.erase(iter++);
+ }
+ else
+ {
+ iter++;
+ }
+ }
+
+ // Don't do anything if there are no streams playing
+ if (!mCurrentInternetStreamp)
+ {
+ return;
+ }
+
+ int open_state = mCurrentInternetStreamp->getOpenState();
+
+ if (!open_state)
+ {
+ // Stream is live
+
+ // start the stream if it's ready
+ if (mFMODInternetStreamChannel < 0)
+ {
+ mFMODInternetStreamChannel = mCurrentInternetStreamp->startStream();
+
+ if (mFMODInternetStreamChannel != -1)
+ {
+ // Reset volume to previously set volume
+ setGain(getGain());
+ FSOUND_SetPaused(mFMODInternetStreamChannel, false);
+ }
+ }
+ }
+
+ switch(open_state)
+ {
+ default:
+ case 0:
+ // success
+ break;
+ case -1:
+ // stream handle is invalid
+ llwarns << "InternetStream - invalid handle" << llendl;
+ stop();
+ return;
+ case -2:
+ // opening
+ break;
+ case -3:
+ // failed to open, file not found, perhaps
+ llwarns << "InternetSteam - failed to open" << llendl;
+ stop();
+ return;
+ case -4:
+ // connecting
+ break;
+ case -5:
+ // buffering
+ break;
+ }
+
+}
+
+void LLStreamingAudio_FMOD::stop()
+{
+ if (mFMODInternetStreamChannel != -1)
+ {
+ FSOUND_SetPaused(mFMODInternetStreamChannel, true);
+ FSOUND_SetPriority(mFMODInternetStreamChannel, 0);
+ mFMODInternetStreamChannel = -1;
+ }
+
+ if (mCurrentInternetStreamp)
+ {
+ llinfos << "Stopping internet stream: " << mCurrentInternetStreamp->getURL() << llendl;
+ if (mCurrentInternetStreamp->stopStream())
+ {
+ delete mCurrentInternetStreamp;
+ }
+ else
+ {
+ llwarns << "Pushing stream to dead list: " << mCurrentInternetStreamp->getURL() << llendl;
+ mDeadStreams.push_back(mCurrentInternetStreamp);
+ }
+ mCurrentInternetStreamp = NULL;
+ //mURL.clear();
+ }
+}
+
+void LLStreamingAudio_FMOD::pause(int pauseopt)
+{
+ if (pauseopt < 0)
+ {
+ pauseopt = mCurrentInternetStreamp ? 1 : 0;
+ }
+
+ if (pauseopt)
+ {
+ if (mCurrentInternetStreamp)
+ {
+ stop();
+ }
+ }
+ else
+ {
+ start(getURL());
+ }
+}
+
+
+// A stream is "playing" if it has been requested to start. That
+// doesn't necessarily mean audio is coming out of the speakers.
+int LLStreamingAudio_FMOD::isPlaying()
+{
+ if (mCurrentInternetStreamp)
+ {
+ return 1; // Active and playing
+ }
+ else if (!mURL.empty())
+ {
+ return 2; // "Paused"
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+
+F32 LLStreamingAudio_FMOD::getGain()
+{
+ return mGain;
+}
+
+
+std::string LLStreamingAudio_FMOD::getURL()
+{
+ return mURL;
+}
+
+
+void LLStreamingAudio_FMOD::setGain(F32 vol)
+{
+ mGain = vol;
+
+ if (mFMODInternetStreamChannel != -1)
+ {
+ vol = llclamp(vol, 0.f, 1.f);
+ int vol_int = llround(vol * 255.f);
+ FSOUND_SetVolumeAbsolute(mFMODInternetStreamChannel, vol_int);
+ }
+}
+
+
+///////////////////////////////////////////////////////
+// manager of possibly-multiple internet audio streams
+
+LLAudioStreamManagerFMOD::LLAudioStreamManagerFMOD(const std::string& url) :
+ mInternetStream(NULL),
+ mReady(false)
+{
+ mInternetStreamURL = url;
+ mInternetStream = FSOUND_Stream_Open(url.c_str(), FSOUND_NORMAL | FSOUND_NONBLOCKING, 0, 0);
+ if (!mInternetStream)
+ {
+ llwarns << "Couldn't open fmod stream, error "
+ << FMOD_ErrorString(FSOUND_GetError())
+ << llendl;
+ mReady = false;
+ return;
+ }
+
+ mReady = true;
+}
+
+int LLAudioStreamManagerFMOD::startStream()
+{
+ // We need a live and opened stream before we try and play it.
+ if (!mInternetStream || getOpenState())
+ {
+ llwarns << "No internet stream to start playing!" << llendl;
+ return -1;
+ }
+
+ // Make sure the stream is set to 2D mode.
+ FSOUND_Stream_SetMode(mInternetStream, FSOUND_2D);
+
+ return FSOUND_Stream_PlayEx(FSOUND_FREE, mInternetStream, NULL, true);
+}
+
+bool LLAudioStreamManagerFMOD::stopStream()
+{
+ if (mInternetStream)
+ {
+ int read_percent = 0;
+ int status = 0;
+ int bitrate = 0;
+ unsigned int flags = 0x0;
+ FSOUND_Stream_Net_GetStatus(mInternetStream, &status, &read_percent, &bitrate, &flags);
+
+ bool close = true;
+ switch (status)
+ {
+ case FSOUND_STREAM_NET_CONNECTING:
+ close = false;
+ break;
+ case FSOUND_STREAM_NET_NOTCONNECTED:
+ case FSOUND_STREAM_NET_BUFFERING:
+ case FSOUND_STREAM_NET_READY:
+ case FSOUND_STREAM_NET_ERROR:
+ default:
+ close = true;
+ }
+
+ if (close)
+ {
+ FSOUND_Stream_Close(mInternetStream);
+ mInternetStream = NULL;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else
+ {
+ return true;
+ }
+}
+
+int LLAudioStreamManagerFMOD::getOpenState()
+{
+ int open_state = FSOUND_Stream_GetOpenState(mInternetStream);
+ return open_state;
+}
diff --git a/linden/indra/llaudio/llstreamingaudio_fmod.h b/linden/indra/llaudio/llstreamingaudio_fmod.h
new file mode 100644
index 0000000..968ab53
--- /dev/null
+++ b/linden/indra/llaudio/llstreamingaudio_fmod.h
@@ -0,0 +1,68 @@
+/**
+ * @file streamingaudio_fmod.h
+ * @author Tofu Linden
+ * @brief Definition of LLStreamingAudio_FMOD implementation
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_STREAMINGAUDIO_FMOD_H
+#define LL_STREAMINGAUDIO_FMOD_H
+
+#include "stdtypes.h" // from llcommon
+
+#include "llstreamingaudio.h"
+
+class LLAudioStreamManagerFMOD;
+
+class LLStreamingAudio_FMOD : public LLStreamingAudioInterface
+{
+ public:
+ LLStreamingAudio_FMOD();
+ /*virtual*/ ~LLStreamingAudio_FMOD();
+
+ /*virtual*/ void start(const std::string& url);
+ /*virtual*/ void stop();
+ /*virtual*/ void pause(int pause);
+ /*virtual*/ void update();
+ /*virtual*/ int isPlaying();
+ /*virtual*/ void setGain(F32 vol);
+ /*virtual*/ F32 getGain();
+ /*virtual*/ std::string getURL();
+
+private:
+ LLAudioStreamManagerFMOD *mCurrentInternetStreamp;
+ int mFMODInternetStreamChannel;
+ std::list mDeadStreams;
+
+ std::string mURL;
+ F32 mGain;
+};
+
+
+#endif // LL_STREAMINGAUDIO_FMOD_H
diff --git a/linden/indra/llaudio/llvorbisdecode.cpp b/linden/indra/llaudio/llvorbisdecode.cpp
new file mode 100644
index 0000000..4bf70f4
--- /dev/null
+++ b/linden/indra/llaudio/llvorbisdecode.cpp
@@ -0,0 +1,326 @@
+/**
+ * @file vorbisdecode.cpp
+ * @brief Vorbis decoding routine routine for Indra.
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "vorbis/codec.h"
+#include "vorbis/vorbisfile.h"
+#include "llerror.h"
+#include "llmath.h"
+#include "llvfile.h"
+
+#if 0
+
+size_t vfs_read(void *ptr, size_t size, size_t nmemb, void *datasource)
+{
+ LLVFile *file = (LLVFile *)datasource;
+
+ if (size > 0 && file->read((U8*)ptr, size * nmemb)) /*Flawfinder: ignore*/
+ {
+ S32 read = file->getLastBytesRead();
+ return read / size; /*Flawfinder: ignore*/
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+int vfs_seek(void *datasource, ogg_int64_t offset, int whence)
+{
+ LLVFile *file = (LLVFile *)datasource;
+
+ // vfs has 31-bit files
+ if (offset > S32_MAX)
+ {
+ return -1;
+ }
+
+ S32 origin;
+ switch (whence) {
+ case SEEK_SET:
+ origin = 0;
+ break;
+ case SEEK_END:
+ origin = file->getSize();
+ break;
+ case SEEK_CUR:
+ origin = -1;
+ break;
+ default:
+ llerrs << "Invalid whence argument to vfs_seek" << llendl;
+ return -1;
+ }
+
+ if (file->seek((S32)offset, origin))
+ {
+ return 0;
+ }
+ else
+ {
+ return -1;
+ }
+}
+
+int vfs_close (void *datasource)
+{
+ LLVFile *file = (LLVFile *)datasource;
+
+ delete file;
+
+ return 0;
+}
+
+long vfs_tell (void *datasource)
+{
+ LLVFile *file = (LLVFile *)datasource;
+
+ return file->tell();
+}
+
+
+BOOL decode_vorbis_file(LLVFS *vfs, const LLUUID &in_uuid, char *out_fname)
+{
+ ov_callbacks vfs_callbacks;
+ vfs_callbacks.read_func = vfs_read;
+ vfs_callbacks.seek_func = vfs_seek;
+ vfs_callbacks.close_func = vfs_close;
+ vfs_callbacks.tell_func = vfs_tell;
+
+ char pcmout[4096]; /*Flawfinder: ignore*/
+
+ unsigned char temp[64]; /*Flawfinder: ignore*/
+
+ LLVFile *in_vfile;
+
+ U32 data_length = 0;
+
+ llinfos << "Vorbis decode from vfile: " << in_uuid << llendl;
+
+ in_vfile = new LLVFile(vfs, in_uuid, LLAssetType::AT_SOUND);
+ if (! in_vfile->getSize())
+ {
+ llwarning("unable to open vorbis source vfile for reading",0);
+ return(FALSE);
+ }
+
+ //**********************************
+ LLAPRFile outfile ;
+ outfile.open(out_fname,LL_APR_WPB);
+ //**********************************
+ if (!outfile.getFileHandle())
+ {
+ llwarning("unable to open vorbis destination file for writing",0);
+ return(FALSE);
+ }
+ else
+ {
+ // write the .wav format header
+ //"RIFF"
+ temp[0] = 0x52;
+ temp[1] = 0x49;
+ temp[2] = 0x46;
+ temp[3] = 0x46;
+
+ // length = datalen + 36 (to be filled in later)
+ temp[4] = 0x00;
+ temp[5] = 0x00;
+ temp[6] = 0x00;
+ temp[7] = 0x00;
+
+ //"WAVE"
+ temp[8] = 0x57;
+ temp[9] = 0x41;
+ temp[10] = 0x56;
+ temp[11] = 0x45;
+
+ // "fmt "
+ temp[12] = 0x66;
+ temp[13] = 0x6D;
+ temp[14] = 0x74;
+ temp[15] = 0x20;
+
+ // chunk size = 16
+ temp[16] = 0x10;
+ temp[17] = 0x00;
+ temp[18] = 0x00;
+ temp[19] = 0x00;
+
+ // format (1 = PCM)
+ temp[20] = 0x01;
+ temp[21] = 0x00;
+
+ // number of channels
+ temp[22] = 0x01;
+ temp[23] = 0x00;
+
+ // samples per second
+ temp[24] = 0x44;
+ temp[25] = 0xAC;
+ temp[26] = 0x00;
+ temp[27] = 0x00;
+
+ // average bytes per second
+ temp[28] = 0x88;
+ temp[29] = 0x58;
+ temp[30] = 0x01;
+ temp[31] = 0x00;
+
+ // bytes to output at a single time
+ temp[32] = 0x02;
+ temp[33] = 0x00;
+
+ // 16 bits per sample
+ temp[34] = 0x10;
+ temp[35] = 0x00;
+
+ // "data"
+ temp[36] = 0x64;
+ temp[37] = 0x61;
+ temp[38] = 0x74;
+ temp[39] = 0x61;
+
+
+ // these are the length of the data chunk, to be filled in later
+ temp[40] = 0x00;
+ temp[41] = 0x00;
+ temp[42] = 0x00;
+ temp[43] = 0x00;
+
+ outfile.write(temp, 44);
+ }
+
+ OggVorbis_File vf;
+ int eof=0;
+ int current_section;
+
+ int r = ov_open_callbacks(in_vfile, &vf, NULL, 0, vfs_callbacks);
+ if(r < 0)
+ {
+ llwarns << r << " Input to vorbis decode does not appear to be an Ogg bitstream: " << in_uuid << llendl;
+ return(FALSE);
+ }
+
+ {
+ char **ptr=ov_comment(&vf,-1)->user_comments;
+// vorbis_info *vi=ov_info(&vf,-1);
+ while(*ptr){
+ fprintf(stderr,"%s\n",*ptr);
+ ++ptr;
+ }
+// fprintf(stderr,"\nBitstream is %d channel, %ldHz\n",vi->channels,vi->rate);
+// fprintf(stderr,"\nDecoded length: %ld samples\n", (long)ov_pcm_total(&vf,-1));
+// fprintf(stderr,"Encoded by: %s\n\n",ov_comment(&vf,-1)->vendor);
+ }
+
+ while(!eof){
+ long ret=ov_read(&vf,pcmout,sizeof(pcmout),0,2,1,¤t_section);
+ if (ret == 0) {
+ /* EOF */
+ eof=1;
+// llinfos << "Vorbis EOF" << llendl;
+ } else if (ret < 0) {
+ /* error in the stream. Not a problem, just reporting it in
+ case we (the app) cares. In this case, we don't. */
+ llwarning("Error in vorbis stream",0);
+ break;
+
+ } else {
+// llinfos << "Vorbis read " << ret << "bytes" << llendl;
+ /* we don't bother dealing with sample rate changes, etc, but.
+ you'll have to*/
+ data_length += outfile.write(pcmout, ret);
+ }
+ }
+
+ ov_clear(&vf);
+
+ // write "data" chunk length
+ outfile.seek(APR_SET,40);
+ outfile.write(&data_length,4);
+
+ // write overall "RIFF" length
+ data_length += 36;
+ outfile.seek(APR_SET,4);
+ outfile.write(&data_length,1*4);
+
+ // FUCK!!! Vorbis encode/decode messes up loop point transitions (pop)
+ // do a cheap-and-cheesy crossfade
+
+
+ S16 *samplep;
+ S32 i;
+ S32 fade_length;
+
+ fade_length = llmin((S32)128,(S32)(data_length-36)/8);
+
+ outfile.seek(APR_SET,44);
+ outfile.read(pcmout,2*fade_length); //read first 16 samples
+
+ samplep = (S16 *)pcmout;
+
+ for (i = 0 ;i < fade_length; i++)
+ {
+ *samplep++ = ((F32)*samplep * ((F32)i/(F32)fade_length));
+ }
+
+ outfile.seek(APR_SET,44);
+ outfile.write(pcmout,2*fade_length); //write back xfaded first 16 samples
+
+ outfile.seek(APR_END,-fade_length*2);
+ outfile.read(pcmout,2*fade_length); //read last 16 samples
+
+ samplep = (S16 *)pcmout;
+
+ for (i = fade_length-1 ; i >= 0; i--)
+ {
+ *samplep++ = ((F32)*samplep * ((F32)i/(F32)fade_length));
+ }
+
+ outfile.seek(SEEK_END,-fade_length*2);
+ outfile.write(pcmout,2*fade_length); //write back xfaded last 16 samples
+ //*******************
+ outfile.close();
+ //*******************
+
+ if ((36 == data_length) || (!(eof)))
+ {
+ llwarning("BAD Vorbis DECODE!, removing .wav!",0);
+ LLFile::remove(out_fname);
+ return (FALSE);
+ }
+
+// fprintf(stderr,"Done.\n");
+
+ return(TRUE);
+}
+#endif
diff --git a/linden/indra/llaudio/llvorbisdecode.h b/linden/indra/llaudio/llvorbisdecode.h
new file mode 100644
index 0000000..cb67c99
--- /dev/null
+++ b/linden/indra/llaudio/llvorbisdecode.h
@@ -0,0 +1,42 @@
+/**
+ * @file vorbisdecode.h
+ * @brief Vorbis decoding routine routine for Indra.
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_VORBISDECODE_H
+#define LL_VORBISDECODE_H
+
+class LLVFS;
+class LLUUID;
+
+BOOL decode_vorbis_file(LLVFS *vfs, const LLUUID &in_uuid, char *out_fname);
+
+#endif
+
diff --git a/linden/indra/llaudio/llvorbisencode.cpp b/linden/indra/llaudio/llvorbisencode.cpp
new file mode 100644
index 0000000..a24394d
--- /dev/null
+++ b/linden/indra/llaudio/llvorbisencode.cpp
@@ -0,0 +1,505 @@
+/**
+ * @file vorbisencode.cpp
+ * @brief Vorbis encoding routine routine for Indra.
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "vorbis/vorbisenc.h"
+
+#include "llvorbisencode.h"
+#include "llerror.h"
+#include "llrand.h"
+#include "llmath.h"
+#include "llapr.h"
+
+//#if LL_DARWIN
+// MBW -- XXX -- Getting rid of SecondLifeVorbis for now -- no fmod means no name collisions.
+#if 0
+#include "VorbisFramework.h"
+
+#define vorbis_analysis mac_vorbis_analysis
+#define vorbis_analysis_headerout mac_vorbis_analysis_headerout
+#define vorbis_analysis_init mac_vorbis_analysis_init
+#define vorbis_encode_ctl mac_vorbis_encode_ctl
+#define vorbis_encode_setup_init mac_vorbis_encode_setup_init
+#define vorbis_encode_setup_managed mac_vorbis_encode_setup_managed
+
+#define vorbis_info_init mac_vorbis_info_init
+#define vorbis_info_clear mac_vorbis_info_clear
+#define vorbis_comment_init mac_vorbis_comment_init
+#define vorbis_comment_clear mac_vorbis_comment_clear
+#define vorbis_block_init mac_vorbis_block_init
+#define vorbis_block_clear mac_vorbis_block_clear
+#define vorbis_dsp_clear mac_vorbis_dsp_clear
+#define vorbis_analysis_buffer mac_vorbis_analysis_buffer
+#define vorbis_analysis_wrote mac_vorbis_analysis_wrote
+#define vorbis_analysis_blockout mac_vorbis_analysis_blockout
+
+#define ogg_stream_packetin mac_ogg_stream_packetin
+#define ogg_stream_init mac_ogg_stream_init
+#define ogg_stream_flush mac_ogg_stream_flush
+#define ogg_stream_pageout mac_ogg_stream_pageout
+#define ogg_page_eos mac_ogg_page_eos
+#define ogg_stream_clear mac_ogg_stream_clear
+
+#endif
+
+S32 check_for_invalid_wav_formats(const std::string& in_fname, std::string& error_msg)
+{
+ U16 num_channels = 0;
+ U32 sample_rate = 0;
+ U32 bits_per_sample = 0;
+ U32 physical_file_size = 0;
+ U32 chunk_length = 0;
+ U32 raw_data_length = 0;
+ U32 bytes_per_sec = 0;
+ BOOL uncompressed_pcm = FALSE;
+
+ unsigned char wav_header[44]; /*Flawfinder: ignore*/
+
+ error_msg.clear();
+
+ //********************************
+ LLAPRFile infile ;
+ infile.open(in_fname,LL_APR_RB, LLAPRFile::global);
+ //********************************
+ if (!infile.getFileHandle())
+ {
+ error_msg = "CannotUploadSoundFile";
+ return(LLVORBISENC_SOURCE_OPEN_ERR);
+ }
+
+ infile.read(wav_header, 44);
+ physical_file_size = infile.seek(APR_END,0);
+
+ if (strncmp((char *)&(wav_header[0]),"RIFF",4))
+ {
+ error_msg = "SoundFileNotRIFF";
+ return(LLVORBISENC_WAV_FORMAT_ERR);
+ }
+
+ if (strncmp((char *)&(wav_header[8]),"WAVE",4))
+ {
+ error_msg = "SoundFileNotRIFF";
+ return(LLVORBISENC_WAV_FORMAT_ERR);
+ }
+
+ // parse the chunks
+
+ U32 file_pos = 12; // start at the first chunk (usually fmt but not always)
+
+ while ((file_pos + 8)< physical_file_size)
+ {
+ infile.seek(APR_SET,file_pos);
+ infile.read(wav_header, 44);
+
+ chunk_length = ((U32) wav_header[7] << 24)
+ + ((U32) wav_header[6] << 16)
+ + ((U32) wav_header[5] << 8)
+ + wav_header[4];
+
+// llinfos << "chunk found: '" << wav_header[0] << wav_header[1] << wav_header[2] << wav_header[3] << "'" << llendl;
+
+ if (!(strncmp((char *)&(wav_header[0]),"fmt ",4)))
+ {
+ if ((wav_header[8] == 0x01) && (wav_header[9] == 0x00))
+ {
+ uncompressed_pcm = TRUE;
+ }
+ num_channels = ((U16) wav_header[11] << 8) + wav_header[10];
+ sample_rate = ((U32) wav_header[15] << 24)
+ + ((U32) wav_header[14] << 16)
+ + ((U32) wav_header[13] << 8)
+ + wav_header[12];
+ bits_per_sample = ((U16) wav_header[23] << 8) + wav_header[22];
+ bytes_per_sec = ((U32) wav_header[19] << 24)
+ + ((U32) wav_header[18] << 16)
+ + ((U32) wav_header[17] << 8)
+ + wav_header[16];
+ }
+ else if (!(strncmp((char *)&(wav_header[0]),"data",4)))
+ {
+ raw_data_length = chunk_length;
+ }
+ file_pos += (chunk_length + 8);
+ chunk_length = 0;
+ }
+ //****************
+ infile.close();
+ //****************
+
+ if (!uncompressed_pcm)
+ {
+ error_msg = "SoundFileNotPCM";
+ return(LLVORBISENC_PCM_FORMAT_ERR);
+ }
+
+ if ((num_channels < 1) || (num_channels > LLVORBIS_CLIP_MAX_CHANNELS))
+ {
+ error_msg = "SoundFileInvalidChannelCount";
+ return(LLVORBISENC_MULTICHANNEL_ERR);
+ }
+
+ if (sample_rate != LLVORBIS_CLIP_SAMPLE_RATE)
+ {
+ error_msg = "SoundFileInvalidSampleRate";
+ return(LLVORBISENC_UNSUPPORTED_SAMPLE_RATE);
+ }
+
+ if ((bits_per_sample != 16) && (bits_per_sample != 8))
+ {
+ error_msg = "SoundFileInvalidWordSize";
+ return(LLVORBISENC_UNSUPPORTED_WORD_SIZE);
+ }
+
+ if (!raw_data_length)
+ {
+ error_msg = "SoundFileInvalidHeader";
+ return(LLVORBISENC_CLIP_TOO_LONG);
+ }
+
+ F32 clip_length = (F32)raw_data_length/(F32)bytes_per_sec;
+
+ if (clip_length > LLVORBIS_CLIP_MAX_TIME)
+ {
+ error_msg = "SoundFileInvalidTooLong";
+ return(LLVORBISENC_CLIP_TOO_LONG);
+ }
+
+ return(LLVORBISENC_NOERR);
+}
+
+S32 encode_vorbis_file(const std::string& in_fname, const std::string& out_fname)
+{
+#define READ_BUFFER 1024
+ unsigned char readbuffer[READ_BUFFER*4+44]; /* out of the data segment, not the stack */ /*Flawfinder: ignore*/
+
+ ogg_stream_state os; /* take physical pages, weld into a logical stream of packets */
+ ogg_page og; /* one Ogg bitstream page. Vorbis packets are inside */
+ ogg_packet op; /* one raw packet of data for decode */
+
+ vorbis_info vi; /* struct that stores all the static vorbis bitstream settings */
+ vorbis_comment vc; /* struct that stores all the user comments */
+
+ vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */
+ vorbis_block vb; /* local working space for packet->PCM decode */
+
+ int eos=0;
+ int result;
+
+ U16 num_channels = 0;
+ U32 sample_rate = 0;
+ U32 bits_per_sample = 0;
+
+ S32 format_error = 0;
+ std::string error_msg;
+ if ((format_error = check_for_invalid_wav_formats(in_fname, error_msg)))
+ {
+ llwarns << error_msg << ": " << in_fname << llendl;
+ return(format_error);
+ }
+
+#if 1
+ unsigned char wav_header[44]; /*Flawfinder: ignore*/
+
+ S32 data_left = 0;
+
+ LLAPRFile infile ;
+ infile.open(in_fname,LL_APR_RB, LLAPRFile::global);
+ if (!infile.getFileHandle())
+ {
+ llwarns << "Couldn't open temporary ogg file for writing: " << in_fname
+ << llendl;
+ return(LLVORBISENC_SOURCE_OPEN_ERR);
+ }
+
+ LLAPRFile outfile ;
+ outfile.open(out_fname,LL_APR_WPB, LLAPRFile::global);
+ if (!outfile.getFileHandle())
+ {
+ llwarns << "Couldn't open upload sound file for reading: " << in_fname
+ << llendl;
+ return(LLVORBISENC_DEST_OPEN_ERR);
+ }
+
+ // parse the chunks
+ U32 chunk_length = 0;
+ U32 file_pos = 12; // start at the first chunk (usually fmt but not always)
+
+ while (infile.eof() != APR_EOF)
+ {
+ infile.seek(APR_SET,file_pos);
+ infile.read(wav_header, 44);
+
+ chunk_length = ((U32) wav_header[7] << 24)
+ + ((U32) wav_header[6] << 16)
+ + ((U32) wav_header[5] << 8)
+ + wav_header[4];
+
+// llinfos << "chunk found: '" << wav_header[0] << wav_header[1] << wav_header[2] << wav_header[3] << "'" << llendl;
+
+ if (!(strncmp((char *)&(wav_header[0]),"fmt ",4)))
+ {
+ num_channels = ((U16) wav_header[11] << 8) + wav_header[10];
+ sample_rate = ((U32) wav_header[15] << 24)
+ + ((U32) wav_header[14] << 16)
+ + ((U32) wav_header[13] << 8)
+ + wav_header[12];
+ bits_per_sample = ((U16) wav_header[23] << 8) + wav_header[22];
+ }
+ else if (!(strncmp((char *)&(wav_header[0]),"data",4)))
+ {
+ infile.seek(APR_SET,file_pos+8);
+ // leave the file pointer at the beginning of the data chunk data
+ data_left = chunk_length;
+ break;
+ }
+ file_pos += (chunk_length + 8);
+ chunk_length = 0;
+ }
+
+
+ /********** Encode setup ************/
+
+ /* choose an encoding mode */
+ /* (mode 0: 44kHz stereo uncoupled, roughly 128kbps VBR) */
+ vorbis_info_init(&vi);
+
+ // always encode to mono
+
+ // SL-52913 & SL-53779 determined this quality level to be our 'good
+ // enough' general-purpose quality level with a nice low bitrate.
+ // Equivalent to oggenc -q0.5
+ F32 quality = 0.05f;
+// quality = (bitrate==128000 ? 0.4f : 0.1);
+
+// if (vorbis_encode_init(&vi, /* num_channels */ 1 ,sample_rate, -1, bitrate, -1))
+ if (vorbis_encode_init_vbr(&vi, /* num_channels */ 1 ,sample_rate, quality))
+// if (vorbis_encode_setup_managed(&vi,1,sample_rate,-1,bitrate,-1) ||
+// vorbis_encode_ctl(&vi,OV_ECTL_RATEMANAGE_AVG,NULL) ||
+// vorbis_encode_setup_init(&vi))
+ {
+ llwarns << "unable to initialize vorbis codec at quality " << quality << llendl;
+ // llwarns << "unable to initialize vorbis codec at bitrate " << bitrate << llendl;
+ return(LLVORBISENC_DEST_OPEN_ERR);
+ }
+
+ /* add a comment */
+ vorbis_comment_init(&vc);
+// vorbis_comment_add(&vc,"Linden");
+
+ /* set up the analysis state and auxiliary encoding storage */
+ vorbis_analysis_init(&vd,&vi);
+ vorbis_block_init(&vd,&vb);
+
+ /* set up our packet->stream encoder */
+ /* pick a random serial number; that way we can more likely build
+ chained streams just by concatenation */
+ ogg_stream_init(&os, ll_rand());
+
+ /* Vorbis streams begin with three headers; the initial header (with
+ most of the codec setup parameters) which is mandated by the Ogg
+ bitstream spec. The second header holds any comment fields. The
+ third header holds the bitstream codebook. We merely need to
+ make the headers, then pass them to libvorbis one at a time;
+ libvorbis handles the additional Ogg bitstream constraints */
+
+ {
+ ogg_packet header;
+ ogg_packet header_comm;
+ ogg_packet header_code;
+
+ vorbis_analysis_headerout(&vd,&vc,&header,&header_comm,&header_code);
+ ogg_stream_packetin(&os,&header); /* automatically placed in its own
+ page */
+ ogg_stream_packetin(&os,&header_comm);
+ ogg_stream_packetin(&os,&header_code);
+
+ /* We don't have to write out here, but doing so makes streaming
+ * much easier, so we do, flushing ALL pages. This ensures the actual
+ * audio data will start on a new page
+ */
+ while(!eos){
+ int result=ogg_stream_flush(&os,&og);
+ if(result==0)break;
+ outfile.write(og.header, og.header_len);
+ outfile.write(og.body, og.body_len);
+ }
+
+ }
+
+
+ while(!eos)
+ {
+ long bytes_per_sample = bits_per_sample/8;
+
+ long bytes=(long)infile.read(readbuffer,llclamp((S32)(READ_BUFFER*num_channels*bytes_per_sample),0,data_left)); /* stereo hardwired here */
+
+ if (bytes==0)
+ {
+ /* end of file. this can be done implicitly in the mainline,
+ but it's easier to see here in non-clever fashion.
+ Tell the library we're at end of stream so that it can handle
+ the last frame and mark end of stream in the output properly */
+
+ vorbis_analysis_wrote(&vd,0);
+// eos = 1;
+
+ }
+ else
+ {
+ long i;
+ long samples;
+ int temp;
+
+ data_left -= bytes;
+ /* data to encode */
+
+ /* expose the buffer to submit data */
+ float **buffer=vorbis_analysis_buffer(&vd,READ_BUFFER);
+
+ i = 0;
+ samples = bytes / (num_channels * bytes_per_sample);
+
+ if (num_channels == 2)
+ {
+ if (bytes_per_sample == 2)
+ {
+ /* uninterleave samples */
+ for(i=0; i
+class LLWindGen
+{
+public:
+ LLWindGen() :
+ mTargetGain(0.f),
+ mTargetFreq(100.f),
+ mTargetPanGainR(0.5f),
+ mbuf0(0.0),
+ mbuf1(0.0),
+ mbuf2(0.0),
+ mbuf3(0.0),
+ mbuf4(0.0),
+ mbuf5(0.0),
+ mY0(0.0),
+ mY1(0.0),
+ mCurrentGain(0.f),
+ mCurrentFreq(100.f),
+ mCurrentPanGainR(0.5f) {};
+
+ static const U32 getInputSamplingRate() {return mInputSamplingRate;}
+
+ // newbuffer = the buffer passed from the previous DSP unit.
+ // numsamples = length in samples-per-channel at this mix time.
+ // stride = number of bytes between start of each sample.
+ // NOTE: generates L/R interleaved stereo
+ MIXBUFFERFORMAT_T* windGenerate(MIXBUFFERFORMAT_T *newbuffer, int numsamples, int stride)
+ {
+ U8 *cursamplep = (U8*)newbuffer;
+
+ double bandwidth = 50.0F;
+ double a0,b1,b2;
+
+ // calculate resonant filter coeffs
+ b2 = exp(-(F_TWO_PI) * (bandwidth / mInputSamplingRate));
+
+ while (numsamples--)
+ {
+ mCurrentFreq = (float)((0.999 * mCurrentFreq) + (0.001 * mTargetFreq));
+ mCurrentGain = (float)((0.999 * mCurrentGain) + (0.001 * mTargetGain));
+ mCurrentPanGainR = (float)((0.999 * mCurrentPanGainR) + (0.001 * mTargetPanGainR));
+ b1 = (-4.0 * b2) / (1.0 + b2) * cos(F_TWO_PI * (mCurrentFreq / mInputSamplingRate));
+ a0 = (1.0 - b2) * sqrt(1.0 - (b1 * b1) / (4.0 * b2));
+ double nextSample;
+
+ // start with white noise
+ nextSample = ll_frand(2.0f) - 1.0f;
+
+ // apply pinking filter
+ mbuf0 = 0.997f * mbuf0 + 0.0126502f * nextSample;
+ mbuf1 = 0.985f * mbuf1 + 0.0139083f * nextSample;
+ mbuf2 = 0.950f * mbuf2 + 0.0205439f * nextSample;
+ mbuf3 = 0.850f * mbuf3 + 0.0387225f * nextSample;
+ mbuf4 = 0.620f * mbuf4 + 0.0465932f * nextSample;
+ mbuf5 = 0.250f * mbuf5 + 0.1093477f * nextSample;
+
+ nextSample = mbuf0 + mbuf1 + mbuf2 + mbuf3 + mbuf4 + mbuf5;
+
+ // do a resonant filter on the noise
+ nextSample = (double)( a0 * nextSample - b1 * mY0 - b2 * mY1 );
+ mY1 = mY0;
+ mY0 = nextSample;
+
+ nextSample *= mCurrentGain;
+
+ MIXBUFFERFORMAT_T sample;
+
+ sample = llfloor(((F32)nextSample*32768.f*(1.0f - mCurrentPanGainR))+0.5f);
+ *(MIXBUFFERFORMAT_T*)cursamplep = llclamp(sample, (MIXBUFFERFORMAT_T)-32768, (MIXBUFFERFORMAT_T)32767);
+ cursamplep += stride;
+
+ sample = llfloor(((F32)nextSample*32768.f*mCurrentPanGainR)+0.5f);
+ *(MIXBUFFERFORMAT_T*)cursamplep = llclamp(sample, (MIXBUFFERFORMAT_T)-32768, (MIXBUFFERFORMAT_T)32767);
+ cursamplep += stride;
+ }
+
+ return newbuffer;
+ }
+
+ F32 mTargetGain;
+ F32 mTargetFreq;
+ F32 mTargetPanGainR;
+
+private:
+ static const U32 mInputSamplingRate = 44100;
+ F64 mbuf0;
+ F64 mbuf1;
+ F64 mbuf2;
+ F64 mbuf3;
+ F64 mbuf4;
+ F64 mbuf5;
+ F64 mY0;
+ F64 mY1;
+ F32 mCurrentGain;
+ F32 mCurrentFreq;
+ F32 mCurrentPanGainR;
+};
+
+#endif
diff --git a/linden/indra/llaudio/vorbisdecode.cpp b/linden/indra/llaudio/vorbisdecode.cpp
deleted file mode 100644
index 4bf70f4..0000000
--- a/linden/indra/llaudio/vorbisdecode.cpp
+++ /dev/null
@@ -1,326 +0,0 @@
-/**
- * @file vorbisdecode.cpp
- * @brief Vorbis decoding routine routine for Indra.
- *
- * $LicenseInfo:firstyear=2000&license=viewergpl$
- *
- * Copyright (c) 2000-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "linden_common.h"
-
-#include "vorbis/codec.h"
-#include "vorbis/vorbisfile.h"
-#include "llerror.h"
-#include "llmath.h"
-#include "llvfile.h"
-
-#if 0
-
-size_t vfs_read(void *ptr, size_t size, size_t nmemb, void *datasource)
-{
- LLVFile *file = (LLVFile *)datasource;
-
- if (size > 0 && file->read((U8*)ptr, size * nmemb)) /*Flawfinder: ignore*/
- {
- S32 read = file->getLastBytesRead();
- return read / size; /*Flawfinder: ignore*/
- }
- else
- {
- return 0;
- }
-}
-
-int vfs_seek(void *datasource, ogg_int64_t offset, int whence)
-{
- LLVFile *file = (LLVFile *)datasource;
-
- // vfs has 31-bit files
- if (offset > S32_MAX)
- {
- return -1;
- }
-
- S32 origin;
- switch (whence) {
- case SEEK_SET:
- origin = 0;
- break;
- case SEEK_END:
- origin = file->getSize();
- break;
- case SEEK_CUR:
- origin = -1;
- break;
- default:
- llerrs << "Invalid whence argument to vfs_seek" << llendl;
- return -1;
- }
-
- if (file->seek((S32)offset, origin))
- {
- return 0;
- }
- else
- {
- return -1;
- }
-}
-
-int vfs_close (void *datasource)
-{
- LLVFile *file = (LLVFile *)datasource;
-
- delete file;
-
- return 0;
-}
-
-long vfs_tell (void *datasource)
-{
- LLVFile *file = (LLVFile *)datasource;
-
- return file->tell();
-}
-
-
-BOOL decode_vorbis_file(LLVFS *vfs, const LLUUID &in_uuid, char *out_fname)
-{
- ov_callbacks vfs_callbacks;
- vfs_callbacks.read_func = vfs_read;
- vfs_callbacks.seek_func = vfs_seek;
- vfs_callbacks.close_func = vfs_close;
- vfs_callbacks.tell_func = vfs_tell;
-
- char pcmout[4096]; /*Flawfinder: ignore*/
-
- unsigned char temp[64]; /*Flawfinder: ignore*/
-
- LLVFile *in_vfile;
-
- U32 data_length = 0;
-
- llinfos << "Vorbis decode from vfile: " << in_uuid << llendl;
-
- in_vfile = new LLVFile(vfs, in_uuid, LLAssetType::AT_SOUND);
- if (! in_vfile->getSize())
- {
- llwarning("unable to open vorbis source vfile for reading",0);
- return(FALSE);
- }
-
- //**********************************
- LLAPRFile outfile ;
- outfile.open(out_fname,LL_APR_WPB);
- //**********************************
- if (!outfile.getFileHandle())
- {
- llwarning("unable to open vorbis destination file for writing",0);
- return(FALSE);
- }
- else
- {
- // write the .wav format header
- //"RIFF"
- temp[0] = 0x52;
- temp[1] = 0x49;
- temp[2] = 0x46;
- temp[3] = 0x46;
-
- // length = datalen + 36 (to be filled in later)
- temp[4] = 0x00;
- temp[5] = 0x00;
- temp[6] = 0x00;
- temp[7] = 0x00;
-
- //"WAVE"
- temp[8] = 0x57;
- temp[9] = 0x41;
- temp[10] = 0x56;
- temp[11] = 0x45;
-
- // "fmt "
- temp[12] = 0x66;
- temp[13] = 0x6D;
- temp[14] = 0x74;
- temp[15] = 0x20;
-
- // chunk size = 16
- temp[16] = 0x10;
- temp[17] = 0x00;
- temp[18] = 0x00;
- temp[19] = 0x00;
-
- // format (1 = PCM)
- temp[20] = 0x01;
- temp[21] = 0x00;
-
- // number of channels
- temp[22] = 0x01;
- temp[23] = 0x00;
-
- // samples per second
- temp[24] = 0x44;
- temp[25] = 0xAC;
- temp[26] = 0x00;
- temp[27] = 0x00;
-
- // average bytes per second
- temp[28] = 0x88;
- temp[29] = 0x58;
- temp[30] = 0x01;
- temp[31] = 0x00;
-
- // bytes to output at a single time
- temp[32] = 0x02;
- temp[33] = 0x00;
-
- // 16 bits per sample
- temp[34] = 0x10;
- temp[35] = 0x00;
-
- // "data"
- temp[36] = 0x64;
- temp[37] = 0x61;
- temp[38] = 0x74;
- temp[39] = 0x61;
-
-
- // these are the length of the data chunk, to be filled in later
- temp[40] = 0x00;
- temp[41] = 0x00;
- temp[42] = 0x00;
- temp[43] = 0x00;
-
- outfile.write(temp, 44);
- }
-
- OggVorbis_File vf;
- int eof=0;
- int current_section;
-
- int r = ov_open_callbacks(in_vfile, &vf, NULL, 0, vfs_callbacks);
- if(r < 0)
- {
- llwarns << r << " Input to vorbis decode does not appear to be an Ogg bitstream: " << in_uuid << llendl;
- return(FALSE);
- }
-
- {
- char **ptr=ov_comment(&vf,-1)->user_comments;
-// vorbis_info *vi=ov_info(&vf,-1);
- while(*ptr){
- fprintf(stderr,"%s\n",*ptr);
- ++ptr;
- }
-// fprintf(stderr,"\nBitstream is %d channel, %ldHz\n",vi->channels,vi->rate);
-// fprintf(stderr,"\nDecoded length: %ld samples\n", (long)ov_pcm_total(&vf,-1));
-// fprintf(stderr,"Encoded by: %s\n\n",ov_comment(&vf,-1)->vendor);
- }
-
- while(!eof){
- long ret=ov_read(&vf,pcmout,sizeof(pcmout),0,2,1,¤t_section);
- if (ret == 0) {
- /* EOF */
- eof=1;
-// llinfos << "Vorbis EOF" << llendl;
- } else if (ret < 0) {
- /* error in the stream. Not a problem, just reporting it in
- case we (the app) cares. In this case, we don't. */
- llwarning("Error in vorbis stream",0);
- break;
-
- } else {
-// llinfos << "Vorbis read " << ret << "bytes" << llendl;
- /* we don't bother dealing with sample rate changes, etc, but.
- you'll have to*/
- data_length += outfile.write(pcmout, ret);
- }
- }
-
- ov_clear(&vf);
-
- // write "data" chunk length
- outfile.seek(APR_SET,40);
- outfile.write(&data_length,4);
-
- // write overall "RIFF" length
- data_length += 36;
- outfile.seek(APR_SET,4);
- outfile.write(&data_length,1*4);
-
- // FUCK!!! Vorbis encode/decode messes up loop point transitions (pop)
- // do a cheap-and-cheesy crossfade
-
-
- S16 *samplep;
- S32 i;
- S32 fade_length;
-
- fade_length = llmin((S32)128,(S32)(data_length-36)/8);
-
- outfile.seek(APR_SET,44);
- outfile.read(pcmout,2*fade_length); //read first 16 samples
-
- samplep = (S16 *)pcmout;
-
- for (i = 0 ;i < fade_length; i++)
- {
- *samplep++ = ((F32)*samplep * ((F32)i/(F32)fade_length));
- }
-
- outfile.seek(APR_SET,44);
- outfile.write(pcmout,2*fade_length); //write back xfaded first 16 samples
-
- outfile.seek(APR_END,-fade_length*2);
- outfile.read(pcmout,2*fade_length); //read last 16 samples
-
- samplep = (S16 *)pcmout;
-
- for (i = fade_length-1 ; i >= 0; i--)
- {
- *samplep++ = ((F32)*samplep * ((F32)i/(F32)fade_length));
- }
-
- outfile.seek(SEEK_END,-fade_length*2);
- outfile.write(pcmout,2*fade_length); //write back xfaded last 16 samples
- //*******************
- outfile.close();
- //*******************
-
- if ((36 == data_length) || (!(eof)))
- {
- llwarning("BAD Vorbis DECODE!, removing .wav!",0);
- LLFile::remove(out_fname);
- return (FALSE);
- }
-
-// fprintf(stderr,"Done.\n");
-
- return(TRUE);
-}
-#endif
diff --git a/linden/indra/llaudio/vorbisdecode.h b/linden/indra/llaudio/vorbisdecode.h
deleted file mode 100644
index cb67c99..0000000
--- a/linden/indra/llaudio/vorbisdecode.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * @file vorbisdecode.h
- * @brief Vorbis decoding routine routine for Indra.
- *
- * $LicenseInfo:firstyear=2000&license=viewergpl$
- *
- * Copyright (c) 2000-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_VORBISDECODE_H
-#define LL_VORBISDECODE_H
-
-class LLVFS;
-class LLUUID;
-
-BOOL decode_vorbis_file(LLVFS *vfs, const LLUUID &in_uuid, char *out_fname);
-
-#endif
-
diff --git a/linden/indra/llaudio/vorbisencode.h b/linden/indra/llaudio/vorbisencode.h
deleted file mode 100644
index ff5ce3a..0000000
--- a/linden/indra/llaudio/vorbisencode.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * @file vorbisencode.h
- * @brief Vorbis encoding routine routine for Indra.
- *
- * $LicenseInfo:firstyear=2000&license=viewergpl$
- *
- * Copyright (c) 2000-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_VORBISENCODE_H
-#define LL_VORBISENCODE_H
-
-const S32 LLVORBISENC_NOERR = 0; // no error
-const S32 LLVORBISENC_SOURCE_OPEN_ERR = 1; // error opening source
-const S32 LLVORBISENC_DEST_OPEN_ERR = 2; // error opening destination
-const S32 LLVORBISENC_WAV_FORMAT_ERR = 3; // not a WAV
-const S32 LLVORBISENC_PCM_FORMAT_ERR = 4; // not a PCM
-const S32 LLVORBISENC_MONO_ERR = 5; // can't do mono
-const S32 LLVORBISENC_STEREO_ERR = 6; // can't do stereo
-const S32 LLVORBISENC_MULTICHANNEL_ERR = 7; // can't do stereo
-const S32 LLVORBISENC_UNSUPPORTED_SAMPLE_RATE = 8; // unsupported sample rate
-const S32 LLVORBISENC_UNSUPPORTED_WORD_SIZE = 9; // unsupported word size
-const S32 LLVORBISENC_CLIP_TOO_LONG = 10; // source file is too long
-
-
-S32 check_for_invalid_wav_formats(const std::string& in_fname, std::string& error_msg);
-S32 encode_vorbis_file(const std::string& in_fname, const std::string& out_fname);
-
-#endif
-
diff --git a/linden/indra/llaudio/windgen.h b/linden/indra/llaudio/windgen.h
deleted file mode 100644
index 847bfa6..0000000
--- a/linden/indra/llaudio/windgen.h
+++ /dev/null
@@ -1,136 +0,0 @@
-/**
- * @file windgen.h
- * @brief Templated wind noise generation
- *
- * $LicenseInfo:firstyear=2002&license=viewergpl$
- *
- * Copyright (c) 2002-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-#ifndef WINDGEN_H
-#define WINDGEN_H
-
-#include "llcommon.h"
-#include "llrand.h"
-
-template
-class LLWindGen
-{
-public:
- LLWindGen() :
- mTargetGain(0.f),
- mTargetFreq(100.f),
- mTargetPanGainR(0.5f),
- mbuf0(0.0),
- mbuf1(0.0),
- mbuf2(0.0),
- mbuf3(0.0),
- mbuf4(0.0),
- mbuf5(0.0),
- mY0(0.0),
- mY1(0.0),
- mCurrentGain(0.f),
- mCurrentFreq(100.f),
- mCurrentPanGainR(0.5f) {};
-
- static const U32 getInputSamplingRate() {return mInputSamplingRate;}
-
- // newbuffer = the buffer passed from the previous DSP unit.
- // numsamples = length in samples-per-channel at this mix time.
- // stride = number of bytes between start of each sample.
- // NOTE: generates L/R interleaved stereo
- MIXBUFFERFORMAT_T* windGenerate(MIXBUFFERFORMAT_T *newbuffer, int numsamples, int stride)
- {
- U8 *cursamplep = (U8*)newbuffer;
-
- double bandwidth = 50.0F;
- double a0,b1,b2;
-
- // calculate resonant filter coeffs
- b2 = exp(-(F_TWO_PI) * (bandwidth / mInputSamplingRate));
-
- while (numsamples--)
- {
- mCurrentFreq = (float)((0.999 * mCurrentFreq) + (0.001 * mTargetFreq));
- mCurrentGain = (float)((0.999 * mCurrentGain) + (0.001 * mTargetGain));
- mCurrentPanGainR = (float)((0.999 * mCurrentPanGainR) + (0.001 * mTargetPanGainR));
- b1 = (-4.0 * b2) / (1.0 + b2) * cos(F_TWO_PI * (mCurrentFreq / mInputSamplingRate));
- a0 = (1.0 - b2) * sqrt(1.0 - (b1 * b1) / (4.0 * b2));
- double nextSample;
-
- // start with white noise
- nextSample = ll_frand(2.0f) - 1.0f;
-
- // apply pinking filter
- mbuf0 = 0.997f * mbuf0 + 0.0126502f * nextSample;
- mbuf1 = 0.985f * mbuf1 + 0.0139083f * nextSample;
- mbuf2 = 0.950f * mbuf2 + 0.0205439f * nextSample;
- mbuf3 = 0.850f * mbuf3 + 0.0387225f * nextSample;
- mbuf4 = 0.620f * mbuf4 + 0.0465932f * nextSample;
- mbuf5 = 0.250f * mbuf5 + 0.1093477f * nextSample;
-
- nextSample = mbuf0 + mbuf1 + mbuf2 + mbuf3 + mbuf4 + mbuf5;
-
- // do a resonant filter on the noise
- nextSample = (double)( a0 * nextSample - b1 * mY0 - b2 * mY1 );
- mY1 = mY0;
- mY0 = nextSample;
-
- nextSample *= mCurrentGain;
-
- MIXBUFFERFORMAT_T sample;
-
- sample = llfloor(((F32)nextSample*32768.f*(1.0f - mCurrentPanGainR))+0.5f);
- *(MIXBUFFERFORMAT_T*)cursamplep = llclamp(sample, (MIXBUFFERFORMAT_T)-32768, (MIXBUFFERFORMAT_T)32767);
- cursamplep += stride;
-
- sample = llfloor(((F32)nextSample*32768.f*mCurrentPanGainR)+0.5f);
- *(MIXBUFFERFORMAT_T*)cursamplep = llclamp(sample, (MIXBUFFERFORMAT_T)-32768, (MIXBUFFERFORMAT_T)32767);
- cursamplep += stride;
- }
-
- return newbuffer;
- }
-
- F32 mTargetGain;
- F32 mTargetFreq;
- F32 mTargetPanGainR;
-
-private:
- static const U32 mInputSamplingRate = 44100;
- F64 mbuf0;
- F64 mbuf1;
- F64 mbuf2;
- F64 mbuf3;
- F64 mbuf4;
- F64 mbuf5;
- F64 mY0;
- F64 mY1;
- F32 mCurrentGain;
- F32 mCurrentFreq;
- F32 mCurrentPanGainR;
-};
-
-#endif
diff --git a/linden/indra/llcommon/CMakeLists.txt b/linden/indra/llcommon/CMakeLists.txt
index 3f14be6..1c12e55 100644
--- a/linden/indra/llcommon/CMakeLists.txt
+++ b/linden/indra/llcommon/CMakeLists.txt
@@ -42,6 +42,7 @@ set(llcommon_SOURCE_FILES
llmetrics.cpp
llmortician.cpp
llprocessor.cpp
+ llprocesslauncher.cpp
llqueuedthread.cpp
llrand.cpp
llrun.cpp
@@ -136,6 +137,7 @@ set(llcommon_HEADER_FILES
llnametable.h
llpreprocessor.h
llpriqueuemap.h
+ llprocesslauncher.h
llprocessor.h
llptrskiplist.h
llptrskipmap.h
diff --git a/linden/indra/llcommon/llerrorcontrol.h b/linden/indra/llcommon/llerrorcontrol.h
index a55d706..fae7547 100644
--- a/linden/indra/llcommon/llerrorcontrol.h
+++ b/linden/indra/llcommon/llerrorcontrol.h
@@ -73,6 +73,7 @@ namespace LLError
void setFunctionLevel(const std::string& function_name, LLError::ELevel);
void setClassLevel(const std::string& class_name, LLError::ELevel);
void setFileLevel(const std::string& file_name, LLError::ELevel);
+ void setTagLevel(const std::string& file_name, LLError::ELevel);
void configure(const LLSD&);
// the LLSD can configure all of the settings
diff --git a/linden/indra/llcommon/llprocesslauncher.cpp b/linden/indra/llcommon/llprocesslauncher.cpp
new file mode 100644
index 0000000..e27aaa3
--- /dev/null
+++ b/linden/indra/llcommon/llprocesslauncher.cpp
@@ -0,0 +1,346 @@
+/**
+ * @file llprocesslauncher.cpp
+ * @brief Utility class for launching, terminating, and tracking the state of processes.
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "llprocesslauncher.h"
+
+#include
+#if LL_DARWIN || LL_LINUX
+// not required or present on Win32
+#include
+#endif
+
+LLProcessLauncher::LLProcessLauncher()
+{
+#if LL_WINDOWS
+ mProcessHandle = 0;
+#else
+ mProcessID = 0;
+#endif
+}
+
+LLProcessLauncher::~LLProcessLauncher()
+{
+ kill();
+}
+
+void LLProcessLauncher::setExecutable(const std::string &executable)
+{
+ mExecutable = executable;
+}
+
+void LLProcessLauncher::setWorkingDirectory(const std::string &dir)
+{
+ mWorkingDir = dir;
+}
+
+void LLProcessLauncher::clearArguments()
+{
+ mLaunchArguments.clear();
+}
+
+void LLProcessLauncher::addArgument(const std::string &arg)
+{
+ mLaunchArguments.push_back(arg);
+}
+
+void LLProcessLauncher::addArgument(const char *arg)
+{
+ mLaunchArguments.push_back(std::string(arg));
+}
+
+#if LL_WINDOWS
+
+int LLProcessLauncher::launch(void)
+{
+ // If there was already a process associated with this object, kill it.
+ kill();
+ orphan();
+
+ int result = 0;
+
+ PROCESS_INFORMATION pinfo;
+ STARTUPINFOA sinfo;
+ memset(&sinfo, 0, sizeof(sinfo));
+
+ std::string args = "\"" + mExecutable + "\"";
+ for(int i = 0; i < (int)mLaunchArguments.size(); i++)
+ {
+ args += " ";
+ args += mLaunchArguments[i];
+ }
+ LL_INFOS("Plugin") << "Executable: " << mExecutable << " arguments: " << args << LL_ENDL;
+
+ // So retarded. Windows requires that the second parameter to CreateProcessA be a writable (non-const) string...
+ char *args2 = new char[args.size() + 1];
+ strcpy(args2, args.c_str());
+
+ if( ! CreateProcessA( NULL, args2, NULL, NULL, FALSE, 0, NULL, NULL, &sinfo, &pinfo ) )
+ {
+ // TODO: do better than returning the OS-specific error code on failure...
+ result = GetLastError();
+ if(result == 0)
+ {
+ // Make absolutely certain we return a non-zero value on failure.
+ result = -1;
+ }
+ }
+ else
+ {
+ // foo = pinfo.dwProcessId; // get your pid here if you want to use it later on
+ // CloseHandle(pinfo.hProcess); // stops leaks - nothing else
+ mProcessHandle = pinfo.hProcess;
+ CloseHandle(pinfo.hThread); // stops leaks - nothing else
+ }
+
+ delete[] args2;
+
+ return result;
+}
+
+bool LLProcessLauncher::isRunning(void)
+{
+ if(mProcessHandle != 0)
+ {
+ DWORD waitresult = WaitForSingleObject(mProcessHandle, 0);
+ if(waitresult == WAIT_OBJECT_0)
+ {
+ // the process has completed.
+ mProcessHandle = 0;
+ }
+ }
+
+ return (mProcessHandle != 0);
+}
+bool LLProcessLauncher::kill(void)
+{
+ bool result = true;
+
+ if(mProcessHandle != 0)
+ {
+ TerminateProcess(mProcessHandle,0);
+
+ if(isRunning())
+ {
+ result = false;
+ }
+ }
+
+ return result;
+}
+
+void LLProcessLauncher::orphan(void)
+{
+ // Forget about the process
+ mProcessHandle = 0;
+}
+
+// static
+void LLProcessLauncher::reap(void)
+{
+ // No actions necessary on Windows.
+}
+
+#else // Mac and linux
+
+#include
+#include
+#include
+
+static std::list sZombies;
+
+// Attempt to reap a process ID -- returns true if the process has exited and been reaped, false otherwise.
+static bool reap_pid(pid_t pid)
+{
+ bool result = false;
+
+ pid_t wait_result = ::waitpid(pid, NULL, WNOHANG);
+ if(wait_result == pid)
+ {
+ result = true;
+ }
+ else if(wait_result == -1)
+ {
+ if(errno == ECHILD)
+ {
+ // No such process -- this may mean we're ignoring SIGCHILD.
+ result = true;
+ }
+ }
+
+ return result;
+}
+
+int LLProcessLauncher::launch(void)
+{
+ // If there was already a process associated with this object, kill it.
+ kill();
+ orphan();
+
+ int result = 0;
+ int current_wd = -1;
+
+ // create an argv vector for the child process
+ const char ** fake_argv = new const char *[mLaunchArguments.size() + 2]; // 1 for the executable path, 1 for the NULL terminator
+
+ int i = 0;
+
+ // add the executable path
+ fake_argv[i++] = mExecutable.c_str();
+
+ // and any arguments
+ for(int j=0; j < mLaunchArguments.size(); j++)
+ fake_argv[i++] = mLaunchArguments[j].c_str();
+
+ // terminate with a null pointer
+ fake_argv[i] = NULL;
+
+ if(!mWorkingDir.empty())
+ {
+ // save the current working directory
+ current_wd = ::open(".", O_RDONLY);
+
+ // and change to the one the child will be executed in
+ if (::chdir(mWorkingDir.c_str()))
+ {
+ // chdir failed
+ }
+ }
+
+ // flush all buffers before the child inherits them
+ ::fflush(NULL);
+
+ pid_t id = vfork();
+ if(id == 0)
+ {
+ // child process
+
+ ::execv(mExecutable.c_str(), (char * const *)fake_argv);
+
+ // If we reach this point, the exec failed.
+ // Use _exit() instead of exit() per the vfork man page.
+ _exit(0);
+ }
+
+ // parent process
+
+ if(current_wd >= 0)
+ {
+ // restore the previous working directory
+ if (::fchdir(current_wd))
+ {
+ // chdir failed
+ }
+ ::close(current_wd);
+ }
+
+ delete[] fake_argv;
+
+ mProcessID = id;
+
+ // At this point, the child process will have been created (since that's how vfork works -- the child borrowed our execution context until it forked)
+ // If the process doesn't exist at this point, the exec failed.
+ if(!isRunning())
+ {
+ result = -1;
+ }
+
+ return result;
+}
+
+bool LLProcessLauncher::isRunning(void)
+{
+ if(mProcessID != 0)
+ {
+ // Check whether the process has exited, and reap it if it has.
+ if(reap_pid(mProcessID))
+ {
+ // the process has exited.
+ mProcessID = 0;
+ }
+ }
+
+ return (mProcessID != 0);
+}
+
+bool LLProcessLauncher::kill(void)
+{
+ bool result = true;
+
+ if(mProcessID != 0)
+ {
+ // Try to kill the process. We'll do approximately the same thing whether the kill returns an error or not, so we ignore the result.
+ (void)::kill(mProcessID, SIGTERM);
+
+ // This will have the side-effect of reaping the zombie if the process has exited.
+ if(isRunning())
+ {
+ result = false;
+ }
+ }
+
+ return result;
+}
+
+void LLProcessLauncher::orphan(void)
+{
+ // Disassociate the process from this object
+ if(mProcessID != 0)
+ {
+ // We may still need to reap the process's zombie eventually
+ sZombies.push_back(mProcessID);
+
+ mProcessID = 0;
+ }
+}
+
+// static
+void LLProcessLauncher::reap(void)
+{
+ // Attempt to real all saved process ID's.
+
+ std::list::iterator iter = sZombies.begin();
+ while(iter != sZombies.end())
+ {
+ if(reap_pid(*iter))
+ {
+ iter = sZombies.erase(iter);
+ }
+ else
+ {
+ iter++;
+ }
+ }
+}
+
+#endif
diff --git a/linden/indra/llcommon/llprocesslauncher.h b/linden/indra/llcommon/llprocesslauncher.h
new file mode 100644
index 0000000..036732f
--- /dev/null
+++ b/linden/indra/llcommon/llprocesslauncher.h
@@ -0,0 +1,86 @@
+/**
+ * @file llprocesslauncher.h
+ * @brief Utility class for launching, terminating, and tracking the state of processes.
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPROCESSLAUNCHER_H
+#define LL_LLPROCESSLAUNCHER_H
+
+#if LL_WINDOWS
+#include
+#endif
+
+
+/*
+ LLProcessLauncher handles launching external processes with specified command line arguments.
+ It also keeps track of whether the process is still running, and can kill it if required.
+*/
+
+class LLProcessLauncher
+{
+ LOG_CLASS(LLProcessLauncher);
+public:
+ LLProcessLauncher();
+ virtual ~LLProcessLauncher();
+
+ void setExecutable(const std::string &executable);
+ void setWorkingDirectory(const std::string &dir);
+
+ void clearArguments();
+ void addArgument(const std::string &arg);
+ void addArgument(const char *arg);
+
+ int launch(void);
+ bool isRunning(void);
+
+ // Attempt to kill the process -- returns true if the process is no longer running when it returns.
+ // Note that even if this returns false, the process may exit some time after it's called.
+ bool kill(void);
+
+ // Use this if you want the external process to continue execution after the LLProcessLauncher instance controlling it is deleted.
+ // Normally, the destructor will attempt to kill the process and wait for termination.
+ // This should only be used if the viewer is about to exit -- otherwise, the child process will become a zombie after it exits.
+ void orphan(void);
+
+ // This needs to be called periodically on Mac/Linux to clean up zombie processes.
+ static void reap(void);
+private:
+ std::string mExecutable;
+ std::string mWorkingDir;
+ std::vector mLaunchArguments;
+
+#if LL_WINDOWS
+ HANDLE mProcessHandle;
+#else
+ pid_t mProcessID;
+#endif
+};
+
+#endif // LL_LLPROCESSLAUNCHER_H
diff --git a/linden/indra/llinventory/llparcel.cpp b/linden/indra/llinventory/llparcel.cpp
index 9c27476..547862f 100644
--- a/linden/indra/llinventory/llparcel.cpp
+++ b/linden/indra/llinventory/llparcel.cpp
@@ -199,6 +199,12 @@ void LLParcel::init(const LLUUID &owner_id,
mObscureMusic = 1;
mMediaWidth = 0;
mMediaHeight = 0;
+ setMediaCurrentURL(LLStringUtil::null);
+ mMediaURLFilterEnable = FALSE;
+ mMediaURLFilterList = LLSD::emptyArray();
+ mMediaAllowNavigate = TRUE;
+ mMediaURLTimeout = 0.0f;
+ mMediaPreventCameraZoom = FALSE;
mGroupID.setNull();
@@ -314,6 +320,56 @@ void LLParcel::setMediaHeight(S32 height)
{
mMediaHeight = height;
}
+
+void LLParcel::setMediaCurrentURL(const std::string& url)
+{
+ mMediaCurrentURL = url;
+ // The escaping here must match the escaping in the database
+ // abstraction layer if it's ever added.
+ // This should really filter the url in some way. Other than
+ // simply requiring non-printable.
+ LLStringFn::replace_nonprintable_in_ascii(mMediaCurrentURL, LL_UNKNOWN_CHAR);
+
+}
+
+void LLParcel::setMediaURLResetTimer(F32 time)
+{
+ mMediaResetTimer.start();
+ mMediaResetTimer.setTimerExpirySec(time);
+}
+
+void LLParcel::setMediaURLFilterList(LLSD list)
+{
+ // sanity check LLSD
+ // must be array of strings
+ if (!list.isArray())
+ {
+ return;
+ }
+
+ for (S32 i = 0; i < list.size(); i++)
+ {
+ if (!list[i].isString())
+ return;
+ }
+
+ // can't be too big
+ const S32 MAX_SIZE = 50;
+ if (list.size() > MAX_SIZE)
+ {
+ LLSD new_list = LLSD::emptyArray();
+
+ for (S32 i = 0; i < llmin(list.size(), MAX_SIZE); i++)
+ {
+ new_list.append(list[i]);
+ }
+
+ list = new_list;
+ }
+
+ mMediaURLFilterList = list;
+}
+
// virtual
void LLParcel::setLocalID(S32 local_id)
{
@@ -568,6 +624,34 @@ BOOL LLParcel::importAccessEntry(std::istream& input_stream, LLAccessEntry* entr
return input_stream.good();
}
+BOOL LLParcel::importMediaURLFilter(std::istream& input_stream, std::string& url)
+{
+ skip_to_end_of_next_keyword("{", input_stream);
+
+ while(input_stream.good())
+ {
+ skip_comments_and_emptyspace(input_stream);
+ std::string line, keyword, value;
+ get_line(line, input_stream, MAX_STRING);
+ get_keyword_and_value(keyword, value, line);
+
+ if ("}" == keyword)
+ {
+ break;
+ }
+ else if ("url" == keyword)
+ {
+ url = value;
+ }
+ else
+ {
+ llwarns << "Unknown keyword in parcel media url filter section: <"
+ << keyword << ">" << llendl;
+ }
+ }
+ return input_stream.good();
+}
+
// Assumes we are in a block "ParcelData"
void LLParcel::packMessage(LLMessageSystem* msg)
{
@@ -606,9 +690,15 @@ void LLParcel::packMessage(LLSD& msg)
msg["media_height"] = getMediaHeight();
msg["auto_scale"] = getMediaAutoScale();
msg["media_loop"] = getMediaLoop();
+ msg["media_current_url"] = getMediaCurrentURL();
msg["obscure_media"] = getObscureMedia();
msg["obscure_music"] = getObscureMusic();
msg["media_id"] = getMediaID();
+ msg["media_allow_navigate"] = getMediaAllowNavigate();
+ msg["media_prevent_camera_zoom"] = getMediaPreventCameraZoom();
+ msg["media_url_timeout"] = getMediaURLTimeout();
+ msg["media_url_filter_enable"] = getMediaURLFilterEnable();
+ msg["media_url_filter_list"] = getMediaURLFilterList();
msg["group_id"] = getGroupID();
msg["pass_price"] = mPassPrice;
msg["pass_hours"] = mPassHours;
@@ -678,6 +768,21 @@ void LLParcel::unpackMessage(LLMessageSystem* msg)
mObscureMedia = true;
mObscureMusic = true;
}
+
+ if(msg->getNumberOfBlocks("MediaLinkSharing") > 0)
+ {
+ msg->getString("MediaLinkSharing", "MediaCurrentURL", buffer);
+ setMediaCurrentURL(buffer);
+ msg->getU8 ( "MediaLinkSharing", "MediaAllowNavigate", mMediaAllowNavigate );
+ msg->getU8 ( "MediaLinkSharing", "MediaURLFilterEnable", mMediaURLFilterEnable );
+ msg->getU8 ( "MediaLinkSharing", "MediaPreventCameraZoom", mMediaPreventCameraZoom );
+ msg->getF32( "MediaLinkSharing", "MediaURLTimeout", mMediaURLTimeout);
+ }
+ else
+ {
+ setMediaCurrentURL(LLStringUtil::null);
+ }
+
}
void LLParcel::packAccessEntries(LLMessageSystem* msg,
@@ -994,6 +1099,20 @@ BOOL LLParcel::isSaleTimerExpired(const U64& time)
return expired;
}
+BOOL LLParcel::isMediaResetTimerExpired(const U64& time)
+{
+ if (mMediaResetTimer.getStarted() == FALSE)
+ {
+ return FALSE;
+ }
+ BOOL expired = mMediaResetTimer.checkExpirationAndReset(0.0);
+ if (expired)
+ {
+ mMediaResetTimer.stop();
+ }
+ return expired;
+}
+
void LLParcel::startSale(const LLUUID& buyer_id, BOOL is_buyer_group)
{
@@ -1117,6 +1236,12 @@ void LLParcel::clearParcel()
mObscureMusic = 1;
mMediaWidth = 0;
mMediaHeight = 0;
+ setMediaCurrentURL(LLStringUtil::null);
+ setMediaURLFilterList(LLSD::emptyArray());
+ setMediaURLFilterEnable(FALSE);
+ setMediaAllowNavigate(TRUE);
+ setMediaPreventCameraZoom(FALSE);
+ setMediaURLTimeout(0.0f);
setMusicURL(LLStringUtil::null);
setInEscrow(FALSE);
setAuthorizedBuyerID(LLUUID::null);
diff --git a/linden/indra/llinventory/llparcel.h b/linden/indra/llinventory/llparcel.h
index 6f5ae87..47571d0 100644
--- a/linden/indra/llinventory/llparcel.h
+++ b/linden/indra/llinventory/llparcel.h
@@ -247,6 +247,14 @@ public:
void setObscureMusic( U8 flagIn ) { mObscureMusic = flagIn; }
void setMediaWidth(S32 width);
void setMediaHeight(S32 height);
+ void setMediaCurrentURL(const std::string& url);
+ void setMediaURLFilterEnable(U8 enable) { mMediaURLFilterEnable = enable; }
+ void setMediaURLFilterList(LLSD list);
+ void setMediaAllowNavigate(U8 enable) { mMediaAllowNavigate = enable; }
+ void setMediaURLTimeout(F32 timeout) { mMediaURLTimeout = timeout; }
+ void setMediaPreventCameraZoom(U8 enable) { mMediaPreventCameraZoom = enable; }
+
+ void setMediaURLResetTimer(F32 time);
virtual void setLocalID(S32 local_id);
// blow away all the extra crap lurking in parcels, including urls, access lists, etc
@@ -300,6 +308,7 @@ public:
// BOOL importStream(std::istream& input_stream);
BOOL importAccessEntry(std::istream& input_stream, LLAccessEntry* entry);
// BOOL exportStream(std::ostream& output_stream);
+ BOOL importMediaURLFilter(std::istream& input_stream, std::string& url);
void packMessage(LLMessageSystem* msg);
void packMessage(LLSD& msg);
@@ -341,8 +350,15 @@ public:
S32 getMediaHeight() const { return mMediaHeight; }
U8 getMediaAutoScale() const { return mMediaAutoScale; }
U8 getMediaLoop() const { return mMediaLoop; }
+ const std::string& getMediaCurrentURL() const { return mMediaCurrentURL; }
U8 getObscureMedia() const { return mObscureMedia; }
U8 getObscureMusic() const { return mObscureMusic; }
+ U8 getMediaURLFilterEnable() const { return mMediaURLFilterEnable; }
+ LLSD getMediaURLFilterList() const { return mMediaURLFilterList; }
+ U8 getMediaAllowNavigate() const { return mMediaAllowNavigate; }
+ F32 getMediaURLTimeout() const { return mMediaURLTimeout; }
+ U8 getMediaPreventCameraZoom() const { return mMediaPreventCameraZoom; }
+
S32 getLocalID() const { return mLocalID; }
const LLUUID& getOwnerID() const { return mOwnerID; }
const LLUUID& getGroupID() const { return mGroupID; }
@@ -418,6 +434,7 @@ public:
BOOL getRecordTransaction() const { return mRecordTransaction; }
void setRecordTransaction(BOOL record) { mRecordTransaction = record; }
+ BOOL isMediaResetTimerExpired(const U64& time);
// more accessors
U32 getParcelFlags() const { return mParcelFlags; }
@@ -595,6 +612,8 @@ protected:
LLVector3 mUserLookAt;
ELandingType mLandingType;
LLTimer mSaleTimerExpires;
+ LLTimer mMediaResetTimer;
+
S32 mGraceExtension;
BOOL mRecordTransaction;
@@ -624,9 +643,15 @@ protected:
S32 mMediaHeight;
U8 mMediaAutoScale;
U8 mMediaLoop;
+ std::string mMediaCurrentURL;
U8 mObscureMedia;
U8 mObscureMusic;
LLUUID mMediaID;
+ U8 mMediaURLFilterEnable;
+ LLSD mMediaURLFilterList;
+ U8 mMediaAllowNavigate;
+ U8 mMediaPreventCameraZoom;
+ F32 mMediaURLTimeout;
S32 mPassPrice;
F32 mPassHours;
LLVector3 mAABBMin;
diff --git a/linden/indra/llmath/CMakeLists.txt b/linden/indra/llmath/CMakeLists.txt
index e5ec3e1..c05bf1d 100644
--- a/linden/indra/llmath/CMakeLists.txt
+++ b/linden/indra/llmath/CMakeLists.txt
@@ -83,3 +83,4 @@ set_source_files_properties(${llmath_HEADER_FILES}
list(APPEND llmath_SOURCE_FILES ${llmath_HEADER_FILES})
add_library (llmath ${llmath_SOURCE_FILES})
+add_dependencies(llmath prepare)
diff --git a/linden/indra/llmath/llmath.h b/linden/indra/llmath/llmath.h
index 9f8e539..0de568c 100644
--- a/linden/indra/llmath/llmath.h
+++ b/linden/indra/llmath/llmath.h
@@ -35,6 +35,7 @@
#include
#include
+#include
#include "lldefs.h"
#include "llstl.h" // *TODO: Remove when LLString is gone
#include "llstring.h" // *TODO: Remove when LLString is gone
@@ -60,7 +61,9 @@
#endif
// Single Precision Floating Point Routines
-#if _MSC_VER < 1400
+#ifndef fsqrtf
+#define fsqrtf(x) ((F32)sqrt((F64)(x)))
+#endif
#ifndef sqrtf
#define sqrtf(x) ((F32)sqrt((F64)(x)))
#endif
@@ -81,11 +84,6 @@
#ifndef powf
#define powf(x,y) ((F32)pow((F64)(x),(F64)(y)))
#endif
-#endif
-
-#ifndef fsqrtf
-#define fsqrtf(x) sqrtf(x)
-#endif
const F32 GRAVITY = -9.8f;
diff --git a/linden/indra/llmath/llvolume.cpp b/linden/indra/llmath/llvolume.cpp
index 4c94a52..b0b8a94 100644
--- a/linden/indra/llmath/llvolume.cpp
+++ b/linden/indra/llmath/llvolume.cpp
@@ -3376,7 +3376,8 @@ void LLVolume::generateSilhouetteVertices(std::vector &vertices,
std::vector &segments,
const LLVector3& obj_cam_vec,
const LLMatrix4& mat,
- const LLMatrix3& norm_mat)
+ const LLMatrix3& norm_mat,
+ S32 face_mask)
{
LLMemType m1(LLMemType::MTYPE_VOLUME);
@@ -3384,12 +3385,17 @@ void LLVolume::generateSilhouetteVertices(std::vector &vertices,
normals.clear();
segments.clear();
+ S32 cur_index = 0;
//for each face
for (face_list_t::iterator iter = mVolumeFaces.begin();
iter != mVolumeFaces.end(); ++iter)
{
const LLVolumeFace& face = *iter;
+ if (!(face_mask & (0x1 << cur_index++)))
+ {
+ continue;
+ }
if (face.mTypeMask & (LLVolumeFace::CAP_MASK)) {
}
diff --git a/linden/indra/llmath/llvolume.h b/linden/indra/llmath/llvolume.h
index 2b1c60d..0b9002f 100644
--- a/linden/indra/llmath/llvolume.h
+++ b/linden/indra/llmath/llvolume.h
@@ -905,9 +905,13 @@ public:
// returns number of triangle indeces required for path/profile mesh
S32 getNumTriangleIndices() const;
- void generateSilhouetteVertices(std::vector &vertices, std::vector &normals, std::vector &segments, const LLVector3& view_vec,
- const LLMatrix4& mat,
- const LLMatrix3& norm_mat);
+ void generateSilhouetteVertices(std::vector &vertices,
+ std::vector &normals,
+ std::vector &segments,
+ const LLVector3& view_vec,
+ const LLMatrix4& mat,
+ const LLMatrix3& norm_mat,
+ S32 face_index);
//get the face index of the face that intersects with the given line segment at the point
//closest to start. Moves end to the point of intersection. Returns -1 if no intersection.
diff --git a/linden/indra/llmath/v3math.h b/linden/indra/llmath/v3math.h
index 7f96800..8c65d93 100644
--- a/linden/indra/llmath/v3math.h
+++ b/linden/indra/llmath/v3math.h
@@ -411,8 +411,8 @@ inline bool operator<(const LLVector3 &a, const LLVector3 &b)
return (a.mV[0] < b.mV[0]
|| (a.mV[0] == b.mV[0]
&& (a.mV[1] < b.mV[1]
- || (a.mV[1] == b.mV[1])
- && a.mV[2] < b.mV[2])));
+ || ((a.mV[1] == b.mV[1])
+ && a.mV[2] < b.mV[2]))));
}
inline const LLVector3& operator+=(LLVector3 &a, const LLVector3 &b)
diff --git a/linden/indra/llmedia/CMakeLists.txt b/linden/indra/llmedia/CMakeLists.txt
deleted file mode 100644
index c7b5cd1..0000000
--- a/linden/indra/llmedia/CMakeLists.txt
+++ /dev/null
@@ -1,79 +0,0 @@
-# -*- cmake -*-
-
-project(llmedia)
-
-include(00-Common)
-include(LLAudio)
-include(LLCommon)
-include(LLImage)
-include(LLMath)
-include(LLMedia)
-include(LLMessage)
-include(LLWindow)
-include(Mozlib)
-
-include_directories(
- ${GSTREAMER_INCLUDE_DIRS}
- ${GSTREAMER_PLUGINS_BASE_INCLUDE_DIRS}
- ${LLAUDIO_INCLUDE_DIRS}
- ${LLCOMMON_INCLUDE_DIRS}
- ${LLIMAGE_INCLUDE_DIRS}
- ${LLMATH_INCLUDE_DIRS}
- ${LLMESSAGE_INCLUDE_DIRS}
- ${LLWINDOW_INCLUDE_DIRS}
- )
-
-set(llmedia_SOURCE_FILES
- llmediaimplcommon.cpp
- llmediaimplexample1.cpp
- llmediaimplexample2.cpp
- llmediaimplfactory.cpp
- llmediamanager.cpp
- llmediaimplgstreamer.cpp
- llmediaimplgstreamervidplug.cpp
- llgstplaythread.cpp
- )
-
-set(llmedia_HEADER_FILES
- CMakeLists.txt
-
- llmediabase.h
- llmediaemitter.h
- llmediaimplcommon.h
- llmediaimplexample1.h
- llmediaimplexample2.h
- llmediaimplfactory.h
- llmediaimplregister.h
- llmediamanager.h
- llmediaobserver.h
- llmediaimplgstreamer.h
- llmediaimplgstreamervidplug.h
- llgstplaythread.h
- )
-
- # Work around a bad interaction between broken gstreamer headers and
- # g++ 4.3's increased strictness.
-
- if (${CXX_VERSION} MATCHES "4.[23]")
- set_source_files_properties(llmediaimplgstreamervidplug.cpp PROPERTIES
- COMPILE_FLAGS -Wno-error=write-strings)
- endif (${CXX_VERSION} MATCHES "4.[23]")
-
-if (MOZLIB)
- list(APPEND llmedia_SOURCE_FILES llmediaimplllmozlib.cpp)
-
- list(APPEND llmedia_HEADER_FILES llmediaimplllmozlib.h)
-endif (MOZLIB)
-
-set_source_files_properties(${llmedia_HEADER_FILES}
- PROPERTIES HEADER_FILE_ONLY TRUE)
-
-list(APPEND llmedia_SOURCE_FILES ${llmedia_HEADER_FILES})
-
-add_library (llmedia ${llmedia_SOURCE_FILES})
-target_link_libraries(
- llmedia
- ${GSTREAMER_LIBRARIES}
- ${GSTREAMER_PLUGINS_BASE_LIBRARIES}
- ${QUICKTIME_LIBRARY}
- )
diff --git a/linden/indra/llmedia/llgstplaythread.cpp b/linden/indra/llmedia/llgstplaythread.cpp
deleted file mode 100644
index 152f9d9..0000000
--- a/linden/indra/llmedia/llgstplaythread.cpp
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * @file llgstplaythread.cpp
- * @author Jacek Antonelli
- * @brief GStreamer playback management thread class
- *
- * $LicenseInfo:firstyear=2009&license=viewergpl$
- *
- * Copyright (c) 2009, Jacek Antonelli
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR 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.
- *
- * $/LicenseInfo$
- */
-
-#include "llgstplaythread.h"
-#include "llmediaimplgstreamer.h"
-
-LLGstPlayThread::
-LLGstPlayThread( LLMediaImplCommon *impl,
- const std::string& name, apr_pool_t *poolp ):
- LLThread( name, poolp ),
- mMediaImpl( impl )
-{
-}
-
-
-LLGstPlayThread::~LLGstPlayThread()
-{
-}
-
-
-// virtual
-void LLGstPlayThread::run()
-{
- ((LLMediaImplGStreamer *)mMediaImpl)->startPlay();
-}
diff --git a/linden/indra/llmedia/llgstplaythread.h b/linden/indra/llmedia/llgstplaythread.h
deleted file mode 100644
index c3c36a7..0000000
--- a/linden/indra/llmedia/llgstplaythread.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * @file llgstplaythread.h
- * @author Jacek Antonelli
- * @brief GStreamer playback management thread class
- *
- * $LicenseInfo:firstyear=2009&license=viewergpl$
- *
- * Copyright (c) 2009, Jacek Antonelli
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR 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.
- *
- * $/LicenseInfo$
- */
-
-
-#ifndef LL_LLGSTPLAYTHREAD_H
-#define LL_LLGSTPLAYTHREAD_H
-
-#include "linden_common.h"
-
-#include "llthread.h"
-#include "llmediaimplcommon.h"
-
-class LLGstPlayThread: public LLThread
-{
- public:
-
- LLGstPlayThread( LLMediaImplCommon *impl,
- const std::string& name, apr_pool_t *poolp );
-
- ~LLGstPlayThread();
-
- virtual void run();
-
- private:
-
- // Actually, this will really only be an LLMediaImplGStreamer.
- // But we have to jump through some hoops to mutual pointer-holding.
- // There may be a better way, but I don't have the motivation to find it.
- LLMediaImplCommon *mMediaImpl;
-};
-
-
-#endif // LL_LLGSTPLAYTHREAD_H
diff --git a/linden/indra/llmedia/llmediabase.h b/linden/indra/llmedia/llmediabase.h
deleted file mode 100644
index 3bcee4e..0000000
--- a/linden/indra/llmedia/llmediabase.h
+++ /dev/null
@@ -1,265 +0,0 @@
-/**
- * @file llmediabase.h
- * @author Callum Prentice
- * @date 2007-10-22 00:00:00
- * @brief Abstract class that defines LLMedia public interface
- *
- * $LicenseInfo:firstyear=2005&license=viewergpl$
- *
- * Copyright (c) 2005-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LLMEDIABASE_H
-#define LLMEDIABASE_H
-
-#if LL_LLMOZLIB_ENABLED && !defined ( MOZILLA_INTERNAL_API )
- // Without this, nsTAString.h errors out with:
- // "Cannot use internal string classes without MOZILLA_INTERNAL_API defined. Use the frozen header nsStringAPI.h instead."
- // It might be worth our while to figure out if we can use the frozen apis at some point...
- #define MOZILLA_INTERNAL_API 1
-#endif
-
-#include
-
-class LLMediaObserver;
-class LLMediaImplMakerBase;
-
-class LLMediaBase
-{
- public:
- LLMediaBase() {};
- virtual ~LLMediaBase() {};
-
- ////////////////////////////////////////////////////////////////////////////////
- // housekeeping
-
- // local initialization, called by the media manager when creating a source
- virtual bool init() = 0;
-
- // undoes everything init() didm called by the media manager when destroying a source
- virtual bool reset() = 0;
-
-
- /* Mirrors GStreamer debug levels. */
- enum EDebugLevel {
- DEBUG_LEVEL_NONE = 0,
- DEBUG_LEVEL_ERROR,
- DEBUG_LEVEL_WARNING,
- DEBUG_LEVEL_INFO,
- DEBUG_LEVEL_DEBUG,
- DEBUG_LEVEL_LOG,
- DEBUG_LEVEL_COUNT,
- };
-
- /* Set the debug verbosity level. Only implemented for GStreamer. */
- virtual bool setDebugLevel( EDebugLevel level ) = 0;
-
- // accessor for MIME type
- virtual bool setMimeType( const std::string mime_type ) = 0;
- virtual std::string getMimeType() const = 0;
-
- // accessor for intial URL. Note that this may have changed under the hood
- // so pass back the original URL seeded to this impl
- virtual std::string getMediaURL() const = 0;
-
- // ask impl for version string
- virtual std::string getVersion() = 0;
-
- // set/clear URL to visit when a 404 page is reached
- virtual bool set404RedirectUrl( std::string redirect_url ) = 0;
- virtual bool clr404RedirectUrl() = 0;
-
- // sets the background color of the browser window
- virtual bool setBackgroundColor( unsigned int red, unsigned int green, unsigned int blue ) const = 0;
-
- // sets the color of the caret in media impls that have one
- virtual bool setCaretColor( unsigned int red, unsigned int green, unsigned int blue ) const = 0;
-
- ////////////////////////////////////////////////////////////////////////////////
- // media management
-
- // needs to be called regularly to make media stream update itself
- virtual bool updateMedia() = 0;
-
- // allows you to request a change in media width, height - may fail if media doesn't support size change
- virtual bool setRequestedMediaSize( int media_width, int media_height ) = 0;
-
- // gets media width (may change throughout lifetime of media stream) - event emitted when media size changed too
- virtual int getMediaWidth() const = 0;
-
- // gets media height (may change throughout lifetime of media stream) - event emitted when media size changed too
- virtual int getMediaHeight() const = 0;
-
- // allows you to try to explicitly change media depth - may fail if media doesn't support depth change
- virtual bool setMediaDepth( int media_depth ) = 0;
-
- // gets media depth (may change throughout lifetime of media stream) - event emitted when media depth changed too
- virtual int getMediaDepth() const = 0;
-
- // gets size of media buffer for current frame (might NOT be the same as media width * height * depth)
- virtual int getMediaBufferSize() const = 0;
-
- // returns pointer to raw media pixels
- virtual unsigned char* getMediaData() = 0;
-
- // returns the size of the data, which may be different that the size of the media
- virtual int getMediaDataWidth() const = 0;
- virtual int getMediaDataHeight() const = 0;
-
- ////////////////////////////////////////////////////////////////////////////////
- // texture management
-
- // gets internal format to use for OpenGL texture
- virtual int getTextureFormatInternal() const = 0;
-
- // gets primary format to use for OpenGL texture
- virtual int getTextureFormatPrimary() const = 0;
-
- // gets format type to use for OpenGL texture
- virtual int getTextureFormatType() const = 0;
-
-
-
-
- ////////////////////////////////////////////////////////////////////////////////
- // audio
-
- // set/get control volume from media stream if present
- virtual bool setVolume( float volume ) = 0;
- virtual float getVolume() const = 0;
-
-
- ////////////////////////////////////////////////////////////////////////////////
- // transport control etc.
- enum ECommand {
- COMMAND_NONE = 0,
- COMMAND_STOP = 1,
- COMMAND_START = 2,
- COMMAND_PAUSE = 4,
- COMMAND_BACK = 5,
- COMMAND_FORWARD = 6
- };
- enum EStatus {
- STATUS_UNKNOWN = 0,
- STATUS_INITIALIZING = 1,
- STATUS_NAVIGATING = 2,
- STATUS_STARTED = 3,
- STATUS_STOPPED = 4,
- STATUS_PAUSED = 6,
- STATUS_RESETTING = 7,
- STATUS_DEAD = 8
- };
- virtual bool addCommand( ECommand cmd ) = 0;
- virtual bool clearCommand() = 0;
- virtual bool updateCommand() = 0;
- virtual EStatus getStatus() = 0;
- virtual bool seek( double time ) = 0;
- virtual bool setLooping( bool enable) = 0;
- virtual bool isLooping() = 0;
-
- ////////////////////////////////////////////////////////////////////////////////
- // scaling
-
- // autoscale means try to scale media to size of texture - may fail if media doesn't support size change
- virtual bool setAutoScaled( bool auto_scaled ) = 0;
- virtual bool isAutoScaled() const = 0;
-
-
- ////////////////////////////////////////////////////////////////////////////////
- // mouse and keyboard interaction
- virtual bool mouseDown( int x_pos, int y_pos ) = 0;
- virtual bool mouseUp( int x_pos, int y_pos ) = 0;
- virtual bool mouseMove( int x_pos, int y_pos ) = 0;
- virtual bool keyPress( int key_code ) = 0;
- virtual bool scrollByLines( int lines ) = 0;
- virtual bool focus( bool focus ) = 0;
- virtual bool unicodeInput( unsigned long uni_char ) = 0;
- virtual bool mouseLeftDoubleClick( int x_pos, int y_pos ) = 0;
-
-
- ////////////////////////////////////////////////////////////////////////////////
- // navigation
- virtual bool navigateTo( const std::string url ) = 0;
- virtual bool navigateForward() = 0;
- virtual bool navigateBack() = 0;
- virtual bool canNavigateForward() = 0;
- virtual bool canNavigateBack() = 0;
-
- ////////////////////////////////////////////////////////////////////////////////
- // caching/cookies
- virtual bool enableCookies( bool enable ) = 0;
- virtual bool clearCache() = 0;
- virtual bool clearCookies() = 0;
-
- ////////////////////////////////////////////////////////////////////////////////
- // proxy
- virtual bool enableProxy(bool enable, std::string proxy_host_name, int proxy_port) = 0;
-
- ////////////////////////////////////////////////////////////////////////////////
- // observer interface
- virtual bool addObserver( LLMediaObserver* subject ) = 0;
- virtual bool remObserver( LLMediaObserver* subject ) = 0;
-
- ////////////////////////////////////////////////////////////////////////////////
- // factory interface
- virtual void setImplMaker(LLMediaImplMakerBase* impl_maker) = 0;
-
- ////////////////////////////////////////////////////////////////////////////////
- // type registry interface
- virtual bool supportsMediaType(std::string scheme, std::string type) = 0;
-};
-
-//////////////////////////////////////////////////////////////
-// media key codes - (mirroring mozilla's values)
-const unsigned long LL_MEDIA_KEY_BACKSPACE = 0x08;
-const unsigned long LL_MEDIA_KEY_TAB = 0x09;
-const unsigned long LL_MEDIA_KEY_RETURN = 0x0D;
-const unsigned long LL_MEDIA_KEY_PAD_RETURN = 0x0E;
-const unsigned long LL_MEDIA_KEY_ESCAPE = 0x1B;
-const unsigned long LL_MEDIA_KEY_PAGE_UP = 0x21;
-const unsigned long LL_MEDIA_KEY_PAGE_DOWN = 0x22;
-const unsigned long LL_MEDIA_KEY_END = 0x23;
-const unsigned long LL_MEDIA_KEY_HOME = 0x24;
-const unsigned long LL_MEDIA_KEY_LEFT = 0x25;
-const unsigned long LL_MEDIA_KEY_UP = 0x26;
-const unsigned long LL_MEDIA_KEY_RIGHT = 0x27;
-const unsigned long LL_MEDIA_KEY_DOWN = 0x28;
-const unsigned long LL_MEDIA_KEY_INSERT = 0x2D;
-const unsigned long LL_MEDIA_KEY_DELETE = 0x2E;
-
-//////////////////////////////////////////////////////////////
-// media frame buffer types - (mirroring GL values)
-const int LL_MEDIA_UNSIGNED_BYTE = 0x1401;
-const int LL_MEDIA_RGB = 0x1907;
-const int LL_MEDIA_RGBA = 0x1908;
-const int LL_MEDIA_RGB8 = 0x8051;
-const int LL_MEDIA_UNSIGNED_INT_8_8_8_8 = 0x8035;
-const int LL_MEDIA_UNSIGNED_INT_8_8_8_8_REV = 0x8367;
-const int LL_MEDIA_BGR = 0x80E0;
-const int LL_MEDIA_BGRA = 0x80E1;
-
-
-#endif // LLMEDIABASE_H
diff --git a/linden/indra/llmedia/llmediaemitter.h b/linden/indra/llmedia/llmediaemitter.h
deleted file mode 100644
index ef3caeb..0000000
--- a/linden/indra/llmedia/llmediaemitter.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/**
- * @file llmediaemitter.h
- * @author Callum Prentice
- * @date 2007-10-22 00:00:00
- * @brief Manages and emits events to observers
- *
- * $LicenseInfo:firstyear=2005&license=viewergpl$
- *
- * Copyright (c) 2005-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LLMEDIAEMITTER_H
-#define LLMEDIAEMITTER_H
-
-#include
-#include
-#include
-
-///////////////////////////////////////////////////////////////////////////////
-//
-template< class T >
-class LLMediaEmitter
-{
- public:
- LLMediaEmitter() { };
- ~LLMediaEmitter() { };
-
- typedef typename T::EventType EventType;
- typedef std::list< T* > ObserverContainer;
- typedef void( T::*observerMethod )( const EventType& );
-
- ///////////////////////////////////////////////////////////////////////////////
- //
- bool addObserver( T* observer_in )
- {
- if ( ! observer_in )
- return false;
-
- if ( std::find( observers.begin(), observers.end(), observer_in) != observers.end() )
- return false;
-
- observers.push_back( observer_in );
-
- return true;
- };
-
- ///////////////////////////////////////////////////////////////////////////////
- //
- bool remObserver( T* observer_in )
- {
- if ( ! observer_in )
- return false;
-
- observers.remove( observer_in );
- observers.remove( observer_in );
- observers.remove( observer_in );
-
-
-
- return true;
- };
-
- ///////////////////////////////////////////////////////////////////////////////
- //
- void update( observerMethod method, const EventType& msgIn )
- {
- typename std::list< T* >::iterator iter = observers.begin();
-
- while( iter != observers.end() )
- {
- ( ( *iter )->*method )( msgIn );
-
- ++iter;
- };
- };
-
- protected:
- ObserverContainer observers;
-};
-
-#endif // LLMEDIAEMITTER_H
diff --git a/linden/indra/llmedia/llmediaimplcommon.cpp b/linden/indra/llmedia/llmediaimplcommon.cpp
deleted file mode 100644
index 166e86d..0000000
--- a/linden/indra/llmedia/llmediaimplcommon.cpp
+++ /dev/null
@@ -1,552 +0,0 @@
-/**
- * @file llmediaimplcommon.cpp
- * @brief Common impl functionality
- *
- * $LicenseInfo:firstyear=2007&license=viewergpl$
- *
- * Copyright (c) 2007-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "llmediaimplcommon.h"
-#include "llmediaemitter.h"
-#include "llmediaimplfactory.h"
-#include "llmediaobserver.h"
-
-#ifdef WIN32
- // platform specific includes needed before OpenGL header
- #include
- #include
-#elif defined(__APPLE__)
- // framework-style include path when building on the Mac.
- #include
-#else // Assume this is linux
- // Linux, MESA headers, but not necessarily assuming MESA runtime.
- // quotes so we get libraries/.../GL/ version
- #include "GL/gl.h"
-#endif
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-LLMediaImplCommon::LLMediaImplCommon() :
- mMimeType( std::string() ),
- mInitialURL( std::string() ),
- mImplMaker( NULL ),
- mAutoScaled( false ),
- mMediaWidth( 0 ),
- mMediaPrevWidth( 0 ),
- mMediaHeight( 0 ),
- mMediaPrevHeight( 0 ),
- mMediaDepth( 0 ),
- mMediaPrevDepth( 0 ),
- mMediaRowSpan( 0 ),
- mMediaRequestedWidth( 0 ),
- mMediaRequestedHeight( 0 ),
- mCommand( LLMediaBase::COMMAND_NONE ),
- mStatus( LLMediaBase::STATUS_UNKNOWN ),
- mVolume( 0 ),
- mLooping( false ),
- mDebugLevel( LLMediaBase::DEBUG_LEVEL_NONE )
-{
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-LLMediaImplCommon::~LLMediaImplCommon()
-{
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::init()
-{
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::reset()
-{
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::setDebugLevel( LLMediaBase::EDebugLevel level )
-{
- mDebugLevel = level;
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::setMimeType( const std::string mime_type )
-{
- mMimeType = mime_type;
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-std::string LLMediaImplCommon::getMimeType() const
-{
- return mMimeType;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-std::string LLMediaImplCommon::getMediaURL() const
-{
- return mInitialURL;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-std::string LLMediaImplCommon::getVersion()
-{
- return std::string( "" );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::set404RedirectUrl( std::string redirect_url )
-{
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::clr404RedirectUrl()
-{
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::setBackgroundColor( unsigned int red, unsigned int green, unsigned int blue ) const
-{
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::setCaretColor( unsigned int red, unsigned int green, unsigned int blue ) const
-{
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::updateMedia()
-{
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-unsigned char* LLMediaImplCommon::getMediaData()
-{
- return 0;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-int LLMediaImplCommon::getMediaDataWidth() const
-{
- return getMediaWidth();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-int LLMediaImplCommon::getMediaDataHeight() const
-{
- return getMediaHeight();
-}
-
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::setMediaSize( int media_width, int media_height )
-{
- // if nothing changed, don't do anything
- if ( ( mMediaWidth == media_width ) &&
- ( mMediaHeight == media_height ) )
- return false;
-
- // save old values so we can tell elsewhere if media size has changed
- mMediaPrevWidth = mMediaWidth;
- mMediaPrevHeight = mMediaHeight;
-
- mMediaWidth = media_width;
- mMediaHeight = media_height;
-
- // only fire an event if the width changed
- LLMediaEvent event( this );
- mEventEmitter.update( &LLMediaObserver::onMediaSizeChange, event );
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-int LLMediaImplCommon::getMediaWidth() const
-{
- return mMediaWidth;
-}
-
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-int LLMediaImplCommon::getMediaHeight() const
-{
- return mMediaHeight;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::setRequestedMediaSize(int width, int height)
-{
- mMediaRequestedWidth = width;
- mMediaRequestedHeight = height;
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::setMediaDepth( int media_depth )
-{
- // if nothing changed, don't do anything
- if ( mMediaDepth == media_depth )
- return false;
-
- // save old values so we can tell elsewhere if media size has changed
- mMediaPrevDepth = mMediaDepth;
- mMediaDepth = media_depth;
-
- // update value of rowspan too since it's based on media width & depth
- mMediaRowSpan = mMediaWidth * mMediaDepth;
-
- // only fire an event if the depth changed
- //LLMediaEvent event( this );
- //mEventEmitter.update( &LLMediaObserver::onMediaSizeChange, event );
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-int LLMediaImplCommon::getMediaDepth() const
-{
- return mMediaDepth;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-int LLMediaImplCommon::getMediaBufferSize() const
-{
- return mMediaRowSpan * mMediaHeight;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-int LLMediaImplCommon::getTextureFormatInternal() const
-{
- return LL_MEDIA_RGB;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-int LLMediaImplCommon::getTextureFormatPrimary() const
-{
- return LL_MEDIA_RGB;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-int LLMediaImplCommon::getTextureFormatType() const
-{
- return LL_MEDIA_UNSIGNED_BYTE;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::setVolume( float volume )
-{
- mVolume = volume;
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-float LLMediaImplCommon::getVolume() const
-{
- return mVolume;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::addCommand( LLMediaBase::ECommand cmd )
-{
- // eventually will be a std::queue so you can add multiple commands
- mCommand = cmd;
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::clearCommand()
-{
- // eventually will be a std::queue so you can add multiple commands
- mCommand = LLMediaBase::COMMAND_NONE;
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::updateCommand()
-{
- if ( nextCommand() == LLMediaBase::COMMAND_START )
- {
- setStatus( LLMediaBase::STATUS_STARTED );
- clearCommand();
- };
-
- if ( nextCommand() == LLMediaBase::COMMAND_STOP )
- {
- setStatus( LLMediaBase::STATUS_STOPPED );
- clearCommand();
- };
-
- if ( nextCommand() == LLMediaBase::COMMAND_PAUSE )
- {
- setStatus( LLMediaBase::STATUS_PAUSED );
- clearCommand();
- };
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// non-virtual (only impls use this)
-LLMediaBase::ECommand LLMediaImplCommon::nextCommand()
-{
- return mCommand;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-LLMediaBase::EStatus LLMediaImplCommon::getStatus()
-{
- return mStatus;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// non-virtual (only impls set this)
-bool LLMediaImplCommon::setStatus( LLMediaBase::EStatus status )
-{
- mStatus = status;
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::seek( double time )
-{
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::navigateTo( const std::string url )
-{
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::setAutoScaled( bool auto_scaled )
-{
- mAutoScaled = auto_scaled;
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::isAutoScaled() const
-{
- return mAutoScaled;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::mouseDown( int x_pos, int y_pos )
-{
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::mouseUp( int x_pos, int y_pos )
-{
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::mouseMove( int x_pos, int y_pos )
-{
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::keyPress( int key_code )
-{
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::scrollByLines( int lines )
-{
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::focus( bool focus )
-{
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::unicodeInput( unsigned long uni_char )
-{
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::mouseLeftDoubleClick( int x_pos, int y_pos )
-{
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::navigateForward()
-{
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::navigateBack()
-{
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::canNavigateForward()
-{
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::canNavigateBack()
-{
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::enableCookies( bool enable )
-{
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::clearCache()
-{
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::clearCookies()
-{
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual (derives from LLMediaBase)
-bool LLMediaImplCommon::enableProxy(bool enable, std::string proxy_host_name, int proxy_port)
-{
- return false;
-}
-////////////////////////////////////////////////////////////////////////////////
-//
-bool LLMediaImplCommon::addObserver( LLMediaObserver* subject )
-{
- return mEventEmitter.addObserver( subject );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-bool LLMediaImplCommon::remObserver( LLMediaObserver* subject )
-{
- return mEventEmitter.remObserver( subject );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaImplCommon::setImplMaker(LLMediaImplMakerBase* impl_maker)
-{
- mImplMaker = impl_maker;
-}
-////////////////////////////////////////////////////////////////////////////////
-//
-bool LLMediaImplCommon::supportsMediaType(std::string scheme, std::string type)
-{
- int idx1 = type.find("/");
- int len = (idx1 == std::string::npos) ? 0 : idx1;
- std::string category = type.substr(0,len);
-
- return mImplMaker->supportsScheme(scheme) ||
- mImplMaker->supportsMimeType(type) ||
- mImplMaker->supportsMimeTypeCategory(category);
-}
diff --git a/linden/indra/llmedia/llmediaimplcommon.h b/linden/indra/llmedia/llmediaimplcommon.h
deleted file mode 100644
index 845429c..0000000
--- a/linden/indra/llmedia/llmediaimplcommon.h
+++ /dev/null
@@ -1,164 +0,0 @@
-/**
- * @file llmediaimplcommon.h
- * @brief Common impl functionality
- *
- * $LicenseInfo:firstyear=2007&license=viewergpl$
- *
- * Copyright (c) 2007-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LLMEDIAIMPLCOMMON_H
-#define LLMEDIAIMPLCOMMON_H
-
-#include "llmediabase.h"
-#include "llmediaemitter.h"
-#include "llmediaobserver.h"
-
-#include
-
-class LLMediaImplMakerBase;
-
-class LLMediaImplCommon :
- public LLMediaBase
-{
- public:
- LLMediaImplCommon();
- virtual ~LLMediaImplCommon();
-
- ////////////////////////////////////////////////////////////////////////////////
- // begin: default implementation of the abstract interface
- // see llmediabase.h for documentation
-
- // housekeeping
- virtual bool init();
- virtual bool reset();
- virtual bool setDebugLevel( LLMediaBase::EDebugLevel level );
- virtual bool setMimeType( const std::string url );
- virtual std::string getMimeType() const;
- virtual std::string getMediaURL() const;
- virtual std::string getVersion();
- virtual bool set404RedirectUrl( std::string redirect_url );
- virtual bool clr404RedirectUrl();
- virtual bool setBackgroundColor( unsigned int red, unsigned int green, unsigned int blue ) const;
- virtual bool setCaretColor( unsigned int red, unsigned int green, unsigned int blue ) const;
-
- // media management
- virtual bool updateMedia();
- virtual bool setRequestedMediaSize( int width, int height );
- virtual int getMediaWidth() const;
- virtual int getMediaHeight() const;
- virtual int getMediaDepth() const;
- virtual int getMediaBufferSize() const;
- virtual unsigned char* getMediaData();
- virtual int getMediaDataWidth() const;
- virtual int getMediaDataHeight() const;
-
- // texture management
- virtual int getTextureFormatInternal() const;
- virtual int getTextureFormatPrimary() const;
- virtual int getTextureFormatType() const;
-
- // audio
- virtual bool setVolume( float volume );
- virtual float getVolume() const;
-
- // transport control
- virtual bool addCommand( ECommand cmd );
- virtual bool clearCommand();
- virtual bool updateCommand();
- LLMediaBase::ECommand nextCommand();
- virtual LLMediaBase::EStatus getStatus();
- bool setStatus( LLMediaBase::EStatus status );
-
- virtual bool seek( double time );
- virtual bool setLooping(bool enable) { mLooping = enable; return true; }
- virtual bool isLooping() { return mLooping; }
- virtual bool navigateTo( const std::string url );
-
- // scaling
- virtual bool setAutoScaled( bool auto_scaled );
- virtual bool isAutoScaled() const;
-
- // mouse and keyboard interaction
- virtual bool mouseDown( int x_pos, int y_pos );
- virtual bool mouseUp( int x_pos, int y_pos );
- virtual bool mouseMove( int x_pos, int y_pos );
- virtual bool keyPress( int key_code );
- virtual bool scrollByLines( int lines );
- virtual bool focus( bool focus );
- virtual bool unicodeInput( unsigned long uni_char );
- virtual bool mouseLeftDoubleClick( int x_pos, int y_pos );
-
- // navigation
- virtual bool navigateForward();
- virtual bool navigateBack();
- virtual bool canNavigateForward();
- virtual bool canNavigateBack();
-
- // caching/cookies
- virtual bool enableCookies( bool enable );
- virtual bool clearCache();
- virtual bool clearCookies();
-
- virtual bool enableProxy(bool enable, std::string proxy_host_name, int proxy_port);
-
- // observer interface
- bool addObserver( LLMediaObserver* subject );
- bool remObserver( LLMediaObserver* subject );
-
- // type registry interface
- void setImplMaker(LLMediaImplMakerBase* impl_maker);
- bool supportsMediaType(std::string scheme, std::string type);
-
- protected:
- virtual bool setMediaSize( int width, int height );
- virtual bool setMediaDepth( int media_depth );
-
- LLMediaEmitter< LLMediaObserver > mEventEmitter;
-
- // Back pointer to the construction object, which is used to discover types handled
- // by the Impl, and meta data associated with the Impl.
- LLMediaImplMakerBase* mImplMaker;
- std::string mMimeType;
- std::string mInitialURL;
- bool mAutoScaled;
- int mMediaWidth;
- int mMediaPrevWidth;
- int mMediaHeight;
- int mMediaPrevHeight;
- int mMediaDepth;
- int mMediaPrevDepth;
- int mMediaRowSpan;
- int mMediaRequestedWidth;
- int mMediaRequestedHeight;
- float mVolume;
- LLMediaBase::ECommand mCommand;
- LLMediaBase::EStatus mStatus;
- bool mLooping;
- LLMediaBase::EDebugLevel mDebugLevel;
-};
-
-#endif // LLMEDIAIMPLCOMMON_H
diff --git a/linden/indra/llmedia/llmediaimplexample1.cpp b/linden/indra/llmedia/llmediaimplexample1.cpp
deleted file mode 100644
index fe7b7e2..0000000
--- a/linden/indra/llmedia/llmediaimplexample1.cpp
+++ /dev/null
@@ -1,231 +0,0 @@
-/**
- * @file llmediaimplexample1.cpp
- * @brief Example 1 of a media impl concrete class
- *
- * $LicenseInfo:firstyear=2007&license=viewergpl$
- *
- * Copyright (c) 2007-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "llmediaimplexample1.h"
-#include "llmediaimplregister.h"
-
-#include
-
-// register this impl with media manager factory
-static LLMediaImplRegister sLLMediaImplExample1Reg( "LLMediaImplExample1", new LLMediaImplExample1Maker() );
-
-#include
-
-#include
-
-///////////////////////////////////////////////////////////////////////////////
-//
-LLMediaImplExample1Maker::LLMediaImplExample1Maker()
-{
- // Register to handle the scheme
- mSchema.push_back( "example1" );
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//
-LLMediaImplExample1::LLMediaImplExample1() :
- mMediaPixels( 0 )
-{
- setRequestedMediaSize( 400, 200 );
- setMediaDepth( 3 );
-
- srand( (unsigned int)(time( NULL )) );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// (static) super-initialization - called once at application startup
-bool LLMediaImplExample1::startup( LLMediaManagerData* init_data )
-{
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// (static) super-uninitialization - called once at application closedown
-bool LLMediaImplExample1::closedown()
-{
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplExample1::init()
-{
- int buffer_size = getMediaBufferSize();
-
- mMediaPixels = new unsigned char[ buffer_size ];
-
- memset( mMediaPixels, 0xAA, buffer_size );
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplExample1::navigateTo( const std::string url )
-{
- std::cout << "LLMediaImplExample1::navigateTo" << std::endl;
-
- setStatus( LLMediaBase::STATUS_NAVIGATING );
-
- // force a size change event for new URL
- LLMediaEvent event( this );
- mEventEmitter.update( &LLMediaObserver::onMediaSizeChange, event );
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-std::string LLMediaImplExample1::getVersion()
-{
- std::string version_string = "[" + sLLMediaImplExample1Reg.getImplName() + "] - " + "1.0.0.0";
-
- return version_string;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplExample1::updateMedia()
-{
- if ( mMediaPixels && getStatus() == LLMediaBase::STATUS_STARTED )
- {
- // first time - make sure it's a few seconds back so first update happens immediately
- static time_t t = time( 0 ) - 4;
-
- // selected time period elapsed (1 second)
- if ( time( 0 ) - t > 1 )
- {
- // display checkerboard
- const int num_squares = rand() % 20 + 4;
- int sqr1_r = rand() % 0x80;
- int sqr1_g = rand() % 0x80;
- int sqr1_b = rand() % 0x80;
- int sqr2_r = rand() % 0x80;
- int sqr2_g = rand() % 0x80;
- int sqr2_b = rand() % 0x80;
-
- for ( int y1 = 0; y1 < num_squares; ++y1 )
- {
- for ( int x1 = 0; x1 < num_squares; ++x1 )
- {
- int px_start = getMediaWidth() * x1 / num_squares;
- int px_end = ( getMediaWidth() * ( x1 + 1 ) ) / num_squares;
- int py_start = getMediaHeight() * y1 / num_squares;
- int py_end = ( getMediaHeight() * ( y1 + 1 ) ) / num_squares;
-
- for( int y2 = py_start; y2 < py_end; ++y2 )
- {
- for( int x2 = px_start; x2 < px_end; ++x2 )
- {
- int rowspan = getMediaWidth() * getMediaDepth();
-
- if ( ( y1 % 2 ) ^ ( x1 % 2 ) )
- {
- mMediaPixels[ y2 * rowspan + x2 * getMediaDepth() + 0 ] = sqr1_r;
- mMediaPixels[ y2 * rowspan + x2 * getMediaDepth() + 1 ] = sqr1_g;
- mMediaPixels[ y2 * rowspan + x2 * getMediaDepth() + 2 ] = sqr1_b;
- }
- else
- {
- mMediaPixels[ y2 * rowspan + x2 * getMediaDepth() + 0 ] = sqr2_r;
- mMediaPixels[ y2 * rowspan + x2 * getMediaDepth() + 1 ] = sqr2_g;
- mMediaPixels[ y2 * rowspan + x2 * getMediaDepth() + 2 ] = sqr2_b;
- };
- };
- };
- };
- };
-
- // emit an event to say that something in the media stream changed
- LLMediaEvent event( this );
- mEventEmitter.update( &LLMediaObserver::onMediaContentsChange, event );
-
- // reset time
- t = time( 0 );
-
- return true;
- };
- };
-
- // update the command (e.g. transport controls) state
- updateCommand();
-
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-unsigned char* LLMediaImplExample1::getMediaData()
-{
- return mMediaPixels;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplExample1::reset()
-{
- if ( mMediaPixels )
- {
- delete [] mMediaPixels;
- };
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplExample1::mouseMove( int x_pos, int y_pos )
-{
- if ( mMediaPixels && getStatus() == LLMediaBase::STATUS_STARTED )
- {
- int base_pos = x_pos * getMediaDepth() + y_pos * getMediaDepth() * getMediaWidth();
- // example: write a bright pixel to the display when we move the mouse
- mMediaPixels[ base_pos + 0 ] = rand() % 0x80 + 0x80;
- mMediaPixels[ base_pos + 1 ] = rand() % 0x80 + 0x80;
- mMediaPixels[ base_pos + 2 ] = rand() % 0x80 + 0x80;
-
- // emit an event to say that something in the media stream changed
- LLMediaEvent event( this );
- mEventEmitter.update( &LLMediaObserver::onMediaContentsChange, event );
- };
-
- return true;
-}
-
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplExample1::setRequestedMediaSize( int width, int height )
-{
- // we accept any size:
- return setMediaSize(width, height);
-}
diff --git a/linden/indra/llmedia/llmediaimplexample1.h b/linden/indra/llmedia/llmediaimplexample1.h
deleted file mode 100644
index 1b90e93..0000000
--- a/linden/indra/llmedia/llmediaimplexample1.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- * @file llmediaimplexample1.h
- * @brief Example 1 of a media impl concrete class
- *
- * $LicenseInfo:firstyear=2007&license=viewergpl$
- *
- * Copyright (c) 2007-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LLMEDIAIMPLEXAMPLE1_H
-#define LLMEDIAIMPLEXAMPLE1_H
-
-#include "llmediaimplcommon.h"
-#include "llmediaimplfactory.h"
-
-class LLMediaManagerData;
-
-class LLMediaImplExample1 :
- public LLMediaImplCommon
-{
- public:
- LLMediaImplExample1();
-
- static bool startup( LLMediaManagerData* init_data );
- static bool closedown();
-
- /* virtual */ bool init();
- /* virtual */ bool navigateTo( const std::string url );
- /* virtual */ bool updateMedia();
- /* virtual */ std::string getVersion();
- /* virtual */ unsigned char* getMediaData();
- /* virtual */ bool reset();
- /* virtual */ bool mouseMove( int x_pos, int y_pos );
- /* virtual */ bool setRequestedMediaSize( int width, int height );
-
- private:
- unsigned char* mMediaPixels;
-};
-
-class LLMediaImplExample1Maker : public LLMediaImplMaker
-{
- public:
- LLMediaImplExample1Maker();
- LLMediaImplExample1* create()
- {
- return new LLMediaImplExample1();
- }
-};
-
-#endif // LLMEDIAIMPLEXAMPLE1_H
diff --git a/linden/indra/llmedia/llmediaimplexample2.cpp b/linden/indra/llmedia/llmediaimplexample2.cpp
deleted file mode 100644
index 7590e19..0000000
--- a/linden/indra/llmedia/llmediaimplexample2.cpp
+++ /dev/null
@@ -1,198 +0,0 @@
-/**
- * @file llmediaimplexample2.cpp
- * @brief Example 2 of a media impl concrete class
- *
- * $LicenseInfo:firstyear=2007&license=viewergpl$
- *
- * Copyright (c) 2007-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "llmediaimplexample2.h"
-#include "llmediaimplregister.h"
-
-#include
-
-// register this impl with media manager factory
-static LLMediaImplRegister sLLMediaImplExample2Reg( "LLMediaImplExample2", new LLMediaImplExample2Maker() );
-
-#include
-#include
-
-///////////////////////////////////////////////////////////////////////////////
-//
-LLMediaImplExample2Maker::LLMediaImplExample2Maker()
-{
- // Register to handle the scheme
- mSchema.push_back( "example2." );
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//
-LLMediaImplExample2::LLMediaImplExample2() :
- mMediaPixels( 0 )
-{
- setRequestedMediaSize( 500, 500 );
- setMediaDepth( 3 );
-
- mXpos = ( getMediaWidth() / 2 ) + rand() % ( getMediaWidth() / 16 ) - ( getMediaWidth() / 32 );
- mYpos = ( getMediaHeight() / 2 ) + rand() % ( getMediaHeight() / 16 ) - ( getMediaHeight() / 32 );
-
- srand( (unsigned int)(time( NULL )) );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// (static) super-initialization - called once at application startup
-bool LLMediaImplExample2::startup( LLMediaManagerData* init_data )
-{
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// (static) super-uninitialization - called once at application closedown
-bool LLMediaImplExample2::closedown()
-{
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplExample2::init()
-{
- int buffer_size = getMediaBufferSize();
-
- mMediaPixels = new unsigned char[ buffer_size ];
-
- memset( mMediaPixels, 0x00, buffer_size );
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplExample2::navigateTo( const std::string url )
-{
- std::cout << "LLMediaImplExample2::navigateTo" << std::endl;
-
- setStatus( LLMediaBase::STATUS_NAVIGATING );
-
- // force a size change event for new URL
- LLMediaEvent event( this );
- mEventEmitter.update( &LLMediaObserver::onMediaSizeChange, event );
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-std::string LLMediaImplExample2::getVersion()
-{
- std::string version_string = "[" + sLLMediaImplExample2Reg.getImplName() + "] - " + "1.0.0.0";
-
- return version_string;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplExample2::updateMedia()
-{
- if ( mMediaPixels && getStatus() == LLMediaBase::STATUS_STARTED )
- {
- static int x_inc = rand() % 5 + 2;
- static int y_inc = rand() % 5 + 2;
- int block_size = 32;
-
- for( int y = 0; y < block_size; ++y )
- {
- for( int x = 0; x < block_size; ++x )
- {
- int rowspan = getMediaWidth() * getMediaDepth();
- mMediaPixels[ ( mXpos + x ) * getMediaDepth() + ( mYpos + y ) * rowspan + 0 ] = 0;
- mMediaPixels[ ( mXpos + x ) * getMediaDepth() + ( mYpos + y ) * rowspan + 1 ] = 0;
- mMediaPixels[ ( mXpos + x ) * getMediaDepth() + ( mYpos + y ) * rowspan + 2 ] = 0;
- };
- };
-
- if ( mXpos + x_inc < 0 || mXpos + x_inc >= getMediaWidth() - block_size )
- x_inc =- x_inc;
-
- if ( mYpos + y_inc < 0 || mYpos + y_inc >= getMediaHeight() - block_size )
- y_inc =- y_inc;
-
- mXpos += x_inc;
- mYpos += y_inc;
-
- unsigned char col_r = rand() % 0xff;
- unsigned char col_g = rand() % 0xff;
- unsigned char col_b = rand() % 0xff;
-
- for( int y = 0; y < block_size; ++y )
- {
- for( int x = 0; x < block_size; ++x )
- {
- int rowspan = getMediaWidth() * getMediaDepth();
- mMediaPixels[ ( mXpos + x ) * getMediaDepth() + ( mYpos + y ) * rowspan + 0 ] = col_r;
- mMediaPixels[ ( mXpos + x ) * getMediaDepth() + ( mYpos + y ) * rowspan + 1 ] = col_g;
- mMediaPixels[ ( mXpos + x ) * getMediaDepth() + ( mYpos + y ) * rowspan + 2 ] = col_b;
- };
- };
-
- // emit an event to say that something in the media stream changed
- LLMediaEvent event( this );
- mEventEmitter.update( &LLMediaObserver::onMediaContentsChange, event );
- };
-
- // update the command (e.g. transport controls) state
- updateCommand();
-
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-unsigned char* LLMediaImplExample2::getMediaData()
-{
- return mMediaPixels;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplExample2::reset()
-{
- if ( mMediaPixels )
- {
- delete [] mMediaPixels;
- };
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplExample2::setRequestedMediaSize( int width, int height )
-{
- // we accept any size:
- return setMediaSize(width, height);
-}
diff --git a/linden/indra/llmedia/llmediaimplexample2.h b/linden/indra/llmedia/llmediaimplexample2.h
deleted file mode 100644
index 6a4f80b..0000000
--- a/linden/indra/llmedia/llmediaimplexample2.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * @file llmediaimplexample2.h
- * @brief Example 2 of a media impl concrete class
- *
- * $LicenseInfo:firstyear=2007&license=viewergpl$
- *
- * Copyright (c) 2007-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LLMEDIAIMPLEXAMPLE2_H
-#define LLMEDIAIMPLEXAMPLE2_H
-
-#include "llmediaimplcommon.h"
-#include "llmediaimplfactory.h"
-
-class LLMediaManagerData;
-class LLMediaImplMaker;
-
-class LLMediaImplExample2 :
- public LLMediaImplCommon
-{
- public:
- LLMediaImplExample2();
-
- static bool startup( LLMediaManagerData* init_data );
- static bool closedown();
-
- /* virtual */ bool init();
- /* virtual */ bool navigateTo( const std::string url );
- /* virtual */ bool load( const std::string url );
- /* virtual */ std::string getVersion();
- /* virtual */ bool updateMedia();
- /* virtual */ unsigned char* getMediaData();
- /* virtual */ bool reset();
- /* virtual */ bool setRequestedMediaSize( int width, int height );
-
- private:
- unsigned char* mMediaPixels;
- int mXpos;
- int mYpos;
-};
-
-class LLMediaImplExample2Maker : public LLMediaImplMaker
-{
- public:
- LLMediaImplExample2Maker();
- LLMediaImplExample2* create()
- {
- return new LLMediaImplExample2();
- }
-};
-
-#endif // LLMEDIAIMPLEXAMPLE2_H
diff --git a/linden/indra/llmedia/llmediaimplfactory.cpp b/linden/indra/llmedia/llmediaimplfactory.cpp
deleted file mode 100644
index c5d098f..0000000
--- a/linden/indra/llmedia/llmediaimplfactory.cpp
+++ /dev/null
@@ -1,105 +0,0 @@
-/**
- * @file llmediaimplfactory.cpp
- * @brief Creates media impls that have registered themselves with LLMediaRegster
- *
- * $LicenseInfo:firstyear=2007&license=viewergpl$
- *
- * Copyright (c) 2007-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "llmediaimplfactory.h"
-
-#include
-
-LLMediaImplFactory* LLMediaImplFactory::sInstance = NULL;
-
-///////////////////////////////////////////////////////////////////////////////
-// static
-LLMediaImplFactory* LLMediaImplFactory::getInstance()
-{
- if ( ! sInstance )
- sInstance = new LLMediaImplFactory();
-
- return sInstance;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaImplFactory::registerImpl( const std::string& impl_name, LLMediaImplMakerBase* impl_maker )
-{
- mNameImplMakerContainer.insert( name_impl_maker_container_t::value_type( impl_name, impl_maker ) );
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//
-LLMediaImplMakerBase* LLMediaImplFactory::getImplMaker( const std::string& scheme, const std::string& type )
-{
- name_impl_maker_container_t::const_iterator iter;
- name_impl_maker_container_t::const_iterator begin = mNameImplMakerContainer.begin();
- name_impl_maker_container_t::const_iterator end = mNameImplMakerContainer.end();
-
- for(iter = begin; iter != end; ++iter)
- {
- if(( *iter->second ).supportsScheme(scheme))
- {
- return ( iter->second );
- }
- }
-
- for(iter = begin; iter != end; ++iter)
- {
- if(( *iter->second ).supportsMimeType(type))
- {
- return ( iter->second );
- }
- }
- int idx1 = type.find("/");
- int len = (idx1 == std::string::npos) ? 0 : idx1;
- std::string category = type.substr(0,len);
- for(iter = begin; iter != end; ++iter)
- {
- if(( *iter->second ).supportsMimeTypeCategory(category))
- {
- return ( iter->second );
- }
- }
-
- return NULL;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-//
-LLMediaImplMakerBase* LLMediaImplFactory::getImplMaker( const std::string& impl_name )
-{
- name_impl_maker_container_t::const_iterator found = mNameImplMakerContainer.find( impl_name );
-
- if ( found == mNameImplMakerContainer.end() )
- {
- return NULL;
- };
-
- return found->second;
-}
diff --git a/linden/indra/llmedia/llmediaimplfactory.h b/linden/indra/llmedia/llmediaimplfactory.h
deleted file mode 100644
index 93a7cc1..0000000
--- a/linden/indra/llmedia/llmediaimplfactory.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/**
- * @file llmediaimplfactory.h
- * @brief Creates media impls that have registered themselves with LLMediaRegster
- *
- * $LicenseInfo:firstyear=2007&license=viewergpl$
- *
- * Copyright (c) 2007-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LLMEDIAIMPLFACTORY_H
-#define LLMEDIAIMPLFACTORY_H
-
-#include
-#include
-#include
-#include
-
-#include "llmediabase.h"
-
-///////////////////////////////////////////////////////////////////////////////
-//
-class LLMediaImplMakerBase
-{
- public:
- virtual bool supportsScheme(std::string scheme) = 0;
- virtual bool supportsMimeType(std::string type) = 0;
- virtual bool supportsMimeTypeCategory(std::string category) = 0;
- virtual LLMediaBase* create() = 0;
- virtual ~LLMediaImplMakerBase() {};
-
- protected:
- typedef std::vector vector_impl_registry_t;
- vector_impl_registry_t mSchema;
- vector_impl_registry_t mMimeTypes;
- vector_impl_registry_t mMimeTypeCategories;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-//
-class LLMediaImplMaker : public LLMediaImplMakerBase
-{
- public:
- bool supportsScheme(std::string scheme)
- {
- vector_impl_registry_t::iterator found = std::find(mSchema.begin(), mSchema.end(), scheme);
- return found != mSchema.end();
- }
- bool supportsMimeType(std::string type)
- {
- vector_impl_registry_t::iterator found = std::find(mMimeTypes.begin(), mMimeTypes.end(), type);
- return found != mMimeTypes.end();
- }
- bool supportsMimeTypeCategory(std::string category)
- {
- vector_impl_registry_t::iterator found = std::find(mMimeTypeCategories.begin(), mMimeTypeCategories.end(), category);
- return found != mMimeTypeCategories.end();
- }
-};
-
-///////////////////////////////////////////////////////////////////////////////
-//
-class LLMediaImplFactory
-{
- public:
- static LLMediaImplFactory* getInstance();
- void registerImpl( const std::string& impl_name, LLMediaImplMakerBase* impl_maker );
- LLMediaImplMakerBase* getImplMaker( const std::string& scheme, const std::string& type );
- LLMediaImplMakerBase* getImplMaker( const std::string& impl_name);
-
- private:
- typedef std::map< std::string, LLMediaImplMakerBase* > name_impl_maker_container_t;
- name_impl_maker_container_t mNameImplMakerContainer;
-
- static LLMediaImplFactory* sInstance;
-};
-
-#endif // LLMEDIAIMPLFACTORY_H
diff --git a/linden/indra/llmedia/llmediaimplgstreamer.h b/linden/indra/llmedia/llmediaimplgstreamer.h
deleted file mode 100644
index 8d2e756..0000000
--- a/linden/indra/llmedia/llmediaimplgstreamer.h
+++ /dev/null
@@ -1,164 +0,0 @@
-/**
- * @file llmediaimplgstreamer.h
- * @author Tofu Linden
- * @brief implementation that supports media playback via GStreamer.
- *
- * $LicenseInfo:firstyear=2007&license=viewergpl$
- *
- * Copyright (c) 2007-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-// header guard
-#ifndef llmediaimplgstreamer_h
-#define llmediaimplgstreamer_h
-
-#include "llmediaimplcommon.h"
-#include "llmediaimplfactory.h"
-
-///#if LL_GSTREAMER_ENABLED
-
-extern "C" {
-#include
-}
-
-#include
-#include "apr_pools.h"
-#include "apr_dso.h"
-
-
-#include "llmediaimplgstreamervidplug.h"
-#include "llgstplaythread.h"
-
-class LLMediaManagerData;
-class LLMediaImplMaker;
-
-///////////////////////////////////////////////////////////////////////////
-class LLMediaImplGStreamer:
- public LLMediaImplCommon
-{
- friend class LLGstPlayThread;
-
- public:
- LLMediaImplGStreamer ();
- virtual ~LLMediaImplGStreamer ();
-
- ////////////////////////////////////////////////////////
- // implementation of the media public interface
-
- static bool startup( LLMediaManagerData* init_data );
- static bool closedown();
-
- // Sets GST_PLUGIN_PATH env var for GStreamer.
- static void set_gst_plugin_path();
-
- /* virtual */ bool setDebugLevel( LLMediaBase::EDebugLevel level );
-
- // Function given to GStreamer for handling debug messages
- static void gstreamer_log(GstDebugCategory *category,
- GstDebugLevel level,
- const gchar *file,
- const gchar *function,
- gint line,
- GObject *object,
- GstDebugMessage *message,
- gpointer data)
-#if __GNUC__
- // recommended by the gstreamer docs
- G_GNUC_NO_INSTRUMENT
-#endif
- ;
-
- /* virtual */ std::string getVersion();
- /* virtual */ bool navigateTo( const std::string url );
- /* virtual */ bool updateMedia();
- /* virtual */ unsigned char* getMediaData();
- /* virtual */ int getTextureFormatPrimary() const;
- /* virtual */ int getTextureFormatType() const;
- /* virtual */ int getTextureFormatInternal() const;
- /* virtual */ bool seek( double time );
- /* virtual */ bool setVolume( float volume );
-
- LLMediaEmitter< LLMediaObserver > getEventEmitter() const {return mEventEmitter;};
-
- protected:
-
- void startPlay();
-
-
- private:
-
- // misc
- bool unload();
- bool pause();
- bool stop();
- bool play();
-
- static gboolean bus_callback (GstBus *bus,
- GstMessage *message,
- gpointer data);
-
- unsigned char* mediaData;
- int mMediaRowbytes;
- int mTextureFormatPrimary;
- int mTextureFormatType;
-
- // GStreamer-specific
- GMainLoop *mPump; // event pump for this media
- GstElement *mPlaybin;
- GstSLVideo *mVideoSink;
- std::string mLastTitle;
- GstState mState;
- GstState getState() const { return mState; }
-
- LLGstPlayThread *mPlayThread;
-};
-
-class LLMediaImplGStreamerMaker : public LLMediaImplMaker
-{
- public:
- LLMediaImplGStreamerMaker();
- LLMediaImplGStreamer* create()
- {
- return new LLMediaImplGStreamer();
- }
-};
-
-/////////////////////////////////////////////////////////////////////////
-// Debug/Info/Warning macros.
-#define STDERRMSG(...) do{\
- fprintf(stderr, "%s:%d: ", __FUNCTION__, __LINE__);\
- fprintf(stderr, __VA_ARGS__);\
- fputc('\n',stderr);\
- }while(0)
-#define NULLMSG(...) do{}while(0)
-
-#define DEBUGMSG NULLMSG
-#define INFOMSG STDERRMSG
-#define WARNMSG STDERRMSG
-/////////////////////////////////////////////////////////////////////////
-
-///#endif // LL_GSTREAMER_ENABLED
-
-#endif // llmediaimplgstreamer_h
diff --git a/linden/indra/llmedia/llmediaimplgstreamervidplug.cpp b/linden/indra/llmedia/llmediaimplgstreamervidplug.cpp
deleted file mode 100644
index f2c0e88..0000000
--- a/linden/indra/llmedia/llmediaimplgstreamervidplug.cpp
+++ /dev/null
@@ -1,448 +0,0 @@
-/**
- * @file llmediaimplgstreamervidplug.h
- * @brief Video-consuming static GStreamer plugin for gst-to-LLMediaImpl
- *
- * $LicenseInfo:firstyear=2007&license=viewergpl$
- *
- * Copyright (c) 2007-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-///#if LL_GSTREAMER_ENABLED
-
-#include "linden_common.h"
-
-#include
-#include
-#include
-
-#include "llthread.h"
-
-#include "llmediaimplgstreamervidplug.h"
-
-GST_DEBUG_CATEGORY_STATIC (gst_slvideo_debug);
-#define GST_CAT_DEFAULT gst_slvideo_debug
-
-/* Filter signals and args */
-enum
-{
- /* FILL ME */
- LAST_SIGNAL
-};
-
-enum
-{
- ARG_0
-};
-
-#define SLV_SIZECAPS ", width=(int){1,2,4,8,16,32,64,128,256,512,1024}, height=(int){1,2,4,8,16,32,64,128,256,512,1024} "
-#define SLV_ALLCAPS GST_VIDEO_CAPS_RGBx SLV_SIZECAPS ";" GST_VIDEO_CAPS_BGRx SLV_SIZECAPS
-
-static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE (
- "sink",
- GST_PAD_SINK,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS (SLV_ALLCAPS)
- );
-
-GST_BOILERPLATE (GstSLVideo, gst_slvideo, GstVideoSink,
- GST_TYPE_VIDEO_SINK);
-
-static void gst_slvideo_set_property (GObject * object, guint prop_id,
- const GValue * value,
- GParamSpec * pspec);
-static void gst_slvideo_get_property (GObject * object, guint prop_id,
- GValue * value, GParamSpec * pspec);
-
-static void
-gst_slvideo_base_init (gpointer gclass)
-{
- static GstElementDetails element_details = {
- (gchar*)"PluginTemplate",
- (gchar*)"Generic/PluginTemplate",
- (gchar*)"Generic Template Element",
- (gchar*)"Linden Lab"
- };
- GstElementClass *element_class = GST_ELEMENT_CLASS (gclass);
-
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
- gst_element_class_set_details (element_class, &element_details);
-}
-
-
-static void
-gst_slvideo_finalize (GObject * object)
-{
- GstSLVideo *slvideo;
- slvideo = GST_SLVIDEO (object);
- if (slvideo->caps)
- {
- gst_caps_unref(slvideo->caps);
- }
-
- G_OBJECT_CLASS(parent_class)->finalize (object);
-}
-
-
-static GstFlowReturn
-gst_slvideo_show_frame (GstBaseSink * bsink, GstBuffer * buf)
-{
- GstSLVideo *slvideo;
- g_return_val_if_fail (buf != NULL, GST_FLOW_ERROR);
-
- slvideo = GST_SLVIDEO(bsink);
-
-#if 0
- fprintf(stderr, "\n\ntransferring a frame of %dx%d <- %p (%d)\n\n",
- slvideo->width, slvideo->height, GST_BUFFER_DATA(buf),
- slvideo->format);
-#endif
- if (GST_BUFFER_DATA(buf))
- {
- // copy frame and frame info into neutral territory
- GST_OBJECT_LOCK(slvideo);
- slvideo->retained_frame_ready = TRUE;
- slvideo->retained_frame_width = slvideo->width;
- slvideo->retained_frame_height = slvideo->height;
- slvideo->retained_frame_format = slvideo->format;
- int rowbytes =
- SLVPixelFormatBytes[slvideo->retained_frame_format] *
- slvideo->retained_frame_width;
- int needbytes = rowbytes * slvideo->retained_frame_width;
- // resize retained frame hunk only if necessary
- if (needbytes != slvideo->retained_frame_allocbytes)
- {
- delete[] slvideo->retained_frame_data;
- slvideo->retained_frame_data = new unsigned char[needbytes];
- slvideo->retained_frame_allocbytes = needbytes;
-
- }
- // copy the actual frame data to neutral territory -
- // flipped, for GL reasons
- for (int ypos=0; yposheight; ++ypos)
- {
- memcpy(&slvideo->retained_frame_data[(slvideo->height-1-ypos)*rowbytes],
- &(((unsigned char*)GST_BUFFER_DATA(buf))[ypos*rowbytes]),
- rowbytes);
- }
- // done with the shared data
- GST_OBJECT_UNLOCK(slvideo);
- }
-
- return GST_FLOW_OK;
-}
-
-
-static GstStateChangeReturn
-gst_slvideo_change_state(GstElement * element, GstStateChange transition)
-{
- GstSLVideo *slvideo;
- GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
-
- slvideo = GST_SLVIDEO (element);
-
- switch (transition) {
- case GST_STATE_CHANGE_NULL_TO_READY:
- break;
- case GST_STATE_CHANGE_READY_TO_PAUSED:
- break;
- case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
- break;
- default:
- break;
- }
-
- ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
- if (ret == GST_STATE_CHANGE_FAILURE)
- return ret;
-
- switch (transition) {
- case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
- break;
- case GST_STATE_CHANGE_PAUSED_TO_READY:
- slvideo->fps_n = 0;
- slvideo->fps_d = 1;
- GST_VIDEO_SINK_WIDTH(slvideo) = 0;
- GST_VIDEO_SINK_HEIGHT(slvideo) = 0;
- break;
- case GST_STATE_CHANGE_READY_TO_NULL:
- break;
- default:
- break;
- }
-
- return ret;
-}
-
-
-static GstCaps *
-gst_slvideo_get_caps (GstBaseSink * bsink)
-{
- GstSLVideo *slvideo;
- slvideo = GST_SLVIDEO(bsink);
-
- return gst_caps_ref (slvideo->caps);
-}
-
-
-/* this function handles the link with other elements */
-static gboolean
-gst_slvideo_set_caps (GstBaseSink * bsink, GstCaps * caps)
-{
- GstSLVideo *filter;
- GstStructure *structure;
- GstCaps *intersection;
-
- GST_DEBUG ("set caps with %" GST_PTR_FORMAT, caps);
-
- filter = GST_SLVIDEO(bsink);
-
- intersection = gst_caps_intersect (filter->caps, caps);
- if (gst_caps_is_empty (intersection))
- {
- // no overlap between our caps and requested caps
- return FALSE;
- }
- gst_caps_unref(intersection);
-
- int width = 0;
- int height = 0;
- gboolean ret;
- const GValue *fps;
- const GValue *par;
- structure = gst_caps_get_structure (caps, 0);
- ret = gst_structure_get_int (structure, "width", &width);
- ret = ret && gst_structure_get_int (structure, "height", &height);
- fps = gst_structure_get_value (structure, "framerate");
- ret = ret && (fps != NULL);
- par = gst_structure_get_value (structure, "pixel-aspect-ratio");
- if (!ret)
- return FALSE;
-
- filter->width = width;
- filter->height = height;
- filter->fps_n = gst_value_get_fraction_numerator(fps);
- filter->fps_d = gst_value_get_fraction_denominator(fps);
- if (par)
- {
- filter->par_n = gst_value_get_fraction_numerator(par);
- filter->par_d = gst_value_get_fraction_denominator(par);
- }
- else
- {
- filter->par_n = 1;
- filter->par_d = 1;
- }
- GST_VIDEO_SINK_WIDTH(filter) = width;
- GST_VIDEO_SINK_HEIGHT(filter) = height;
-
- filter->format = SLV_PF_UNKNOWN;
- if (0 == strcmp(gst_structure_get_name(structure),
- "video/x-raw-rgb"))
- {
- int red_mask;
- int green_mask;
- int blue_mask;
- gst_structure_get_int(structure, "red_mask", &red_mask);
- gst_structure_get_int(structure, "green_mask", &green_mask);
- gst_structure_get_int(structure, "blue_mask", &blue_mask);
- if ((unsigned int)red_mask == 0xFF000000 &&
- (unsigned int)green_mask == 0x00FF0000 &&
- (unsigned int)blue_mask == 0x0000FF00)
- {
- filter->format = SLV_PF_RGBX;
- //fprintf(stderr, "\n\nPIXEL FORMAT RGB\n\n");
- } else if ((unsigned int)red_mask == 0x0000FF00 &&
- (unsigned int)green_mask == 0x00FF0000 &&
- (unsigned int)blue_mask == 0xFF000000)
- {
- filter->format = SLV_PF_BGRX;
- //fprintf(stderr, "\n\nPIXEL FORMAT BGR\n\n");
- }
- }
-
- return TRUE;
-}
-
-
-static gboolean
-gst_slvideo_start (GstBaseSink * bsink)
-{
- GstSLVideo *slvideo;
- gboolean ret = TRUE;
-
- slvideo = GST_SLVIDEO(bsink);
-
- return ret;
-}
-
-static gboolean
-gst_slvideo_stop (GstBaseSink * bsink)
-{
- GstSLVideo *slvideo;
- slvideo = GST_SLVIDEO(bsink);
-
- // free-up retained frame buffer
- GST_OBJECT_LOCK(slvideo);
- slvideo->retained_frame_ready = FALSE;
- delete[] slvideo->retained_frame_data;
- slvideo->retained_frame_data = NULL;
- slvideo->retained_frame_allocbytes = 0;
- GST_OBJECT_UNLOCK(slvideo);
-
- return TRUE;
-}
-
-
-/* initialize the plugin's class */
-static void
-gst_slvideo_class_init (GstSLVideoClass * klass)
-{
- GObjectClass *gobject_class;
- GstElementClass *gstelement_class;
- GstBaseSinkClass *gstbasesink_class;
-
- gobject_class = (GObjectClass *) klass;
- gstelement_class = (GstElementClass *) klass;
- gstbasesink_class = (GstBaseSinkClass *) klass;
-
- gobject_class->finalize = gst_slvideo_finalize;
- gobject_class->set_property = gst_slvideo_set_property;
- gobject_class->get_property = gst_slvideo_get_property;
-
- gstelement_class->change_state = gst_slvideo_change_state;
-
-#define LLGST_DEBUG_FUNCPTR(p) (p)
- gstbasesink_class->get_caps = LLGST_DEBUG_FUNCPTR (gst_slvideo_get_caps);
- gstbasesink_class->set_caps = LLGST_DEBUG_FUNCPTR( gst_slvideo_set_caps);
- //gstbasesink_class->buffer_alloc=LLGST_DEBUG_FUNCPTR(gst_slvideo_buffer_alloc);
- //gstbasesink_class->get_times = LLGST_DEBUG_FUNCPTR (gst_slvideo_get_times);
- gstbasesink_class->preroll = LLGST_DEBUG_FUNCPTR (gst_slvideo_show_frame);
- gstbasesink_class->render = LLGST_DEBUG_FUNCPTR (gst_slvideo_show_frame);
-
- gstbasesink_class->start = LLGST_DEBUG_FUNCPTR (gst_slvideo_start);
- gstbasesink_class->stop = LLGST_DEBUG_FUNCPTR (gst_slvideo_stop);
-
- // gstbasesink_class->unlock = LLGST_DEBUG_FUNCPTR (gst_slvideo_unlock);
-#undef LLGST_DEBUG_FUNCPTR
-}
-
-
-static void
-gst_slvideo_update_caps (GstSLVideo * slvideo)
-{
- GstCaps *caps;
-
- // GStreamer will automatically convert colourspace if necessary.
- // GStreamer will automatically resize media to one of these enumerated
- // powers-of-two that we ask for (yay GStreamer!)
- caps = gst_caps_from_string (SLV_ALLCAPS);
-
- gst_caps_replace (&slvideo->caps, caps);
-}
-
-
-/* initialize the new element
- * instantiate pads and add them to element
- * set functions
- * initialize structure
- */
-static void
-gst_slvideo_init (GstSLVideo * filter,
- GstSLVideoClass * gclass)
-{
- filter->width = -1;
- filter->height = -1;
-
- // this is the info we share with the client app
- GST_OBJECT_LOCK(filter);
- filter->retained_frame_ready = FALSE;
- filter->retained_frame_data = NULL;
- filter->retained_frame_allocbytes = 0;
- filter->retained_frame_width = filter->width;
- filter->retained_frame_height = filter->height;
- filter->retained_frame_format = SLV_PF_UNKNOWN;
- GST_OBJECT_UNLOCK(filter);
-
- gst_slvideo_update_caps(filter);
-}
-
-static void
-gst_slvideo_set_property (GObject * object, guint prop_id,
- const GValue * value, GParamSpec * pspec)
-{
- g_return_if_fail (GST_IS_SLVIDEO (object));
-
- if (prop_id) {
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- }
-}
-
-static void
-gst_slvideo_get_property (GObject * object, guint prop_id,
- GValue * value, GParamSpec * pspec)
-{
- g_return_if_fail (GST_IS_SLVIDEO (object));
-
- if (prop_id) {
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- }
-}
-
-
-/* entry point to initialize the plug-in
- * initialize the plug-in itself
- * register the element factories and pad templates
- * register the features
- */
-static gboolean
-plugin_init (GstPlugin * plugin)
-{
- //fprintf(stderr, "\n\n\nPLUGIN INIT\n\n\n");
-
- GST_DEBUG_CATEGORY_INIT (gst_slvideo_debug, (gchar*)"private-slvideo-plugin",
- 0, (gchar*)"Second Life Video Sink");
-
- return gst_element_register (plugin, "private-slvideo",
- GST_RANK_NONE, GST_TYPE_SLVIDEO);
-}
-
-
-void gst_slvideo_init_class (void)
-{
- gst_plugin_register_static( GST_VERSION_MAJOR,
- GST_VERSION_MINOR,
- (const gchar *)"private-slvideoplugin",
- (gchar *)"SL Video sink plugin",
- plugin_init,
- (const gchar *)"0.1",
- GST_LICENSE_UNKNOWN,
- (const gchar *)"Second Life",
- (const gchar *)"Second Life",
- (const gchar *)"http://www.secondlife.com/" );
-}
-
-///#endif // LL_GSTREAMER_ENABLED
diff --git a/linden/indra/llmedia/llmediaimplgstreamervidplug.h b/linden/indra/llmedia/llmediaimplgstreamervidplug.h
deleted file mode 100644
index 3a984a9..0000000
--- a/linden/indra/llmedia/llmediaimplgstreamervidplug.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/**
- * @file llmediaimplgstreamervidplug.h
- * @brief Video-consuming static GStreamer plugin for gst-to-LLMediaImpl
- *
- * $LicenseInfo:firstyear=2007&license=viewergpl$
- *
- * Copyright (c) 2007-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef __GST_SLVIDEO_H__
-#define __GST_SLVIDEO_H__
-
-///#if LL_GSTREAMER_ENABLED
-
-extern "C" {
-#include
-#include
-#include
-#include
-}
-
-G_BEGIN_DECLS
-
-/* #defines don't like whitespacey bits */
-#define GST_TYPE_SLVIDEO \
- (gst_slvideo_get_type())
-#define GST_SLVIDEO(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SLVIDEO,GstSLVideo))
-#define GST_SLVIDEO_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SLVIDEO,GstSLVideoClass))
-#define GST_IS_SLVIDEO(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SLVIDEO))
-#define GST_IS_SLVIDEO_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SLVIDEO))
-
-typedef struct _GstSLVideo GstSLVideo;
-typedef struct _GstSLVideoClass GstSLVideoClass;
-
-typedef enum {
- SLV_PF_UNKNOWN = 0,
- SLV_PF_RGBX = 1,
- SLV_PF_BGRX = 2,
- SLV__END = 3
-} SLVPixelFormat;
-const int SLVPixelFormatBytes[SLV__END] = {1, 4, 4};
-
-struct _GstSLVideo
-{
- GstVideoSink video_sink;
-
- GstCaps *caps;
-
- int fps_n, fps_d;
- int par_n, par_d;
- int height, width;
- SLVPixelFormat format;
-
- // SHARED WITH APPLICATION:
- // Access to the following should be protected by GST_OBJECT_LOCK() on
- // the GstSLVideo object, and should be totally consistent upon UNLOCK
- // (i.e. all written at once to reflect the current retained frame info
- // when the retained frame is updated.)
- bool retained_frame_ready; // new frame ready since flag last reset. (*TODO: could get the writer to wait on a semaphore instead of having the reader poll, potentially making dropped frames somewhat cheaper.)
- unsigned char* retained_frame_data;
- int retained_frame_allocbytes;
- int retained_frame_width, retained_frame_height;
- SLVPixelFormat retained_frame_format;
-};
-
-struct _GstSLVideoClass
-{
- GstVideoSinkClass parent_class;
-};
-
-GType gst_slvideo_get_type (void);
-
-void gst_slvideo_init_class (void);
-
-G_END_DECLS
-
-///#endif // LL_GSTREAMER_ENABLED
-
-#endif /* __GST_SLVIDEO_H__ */
diff --git a/linden/indra/llmedia/llmediaimplllmozlib.cpp b/linden/indra/llmedia/llmediaimplllmozlib.cpp
deleted file mode 100644
index 5b4b02e..0000000
--- a/linden/indra/llmedia/llmediaimplllmozlib.cpp
+++ /dev/null
@@ -1,624 +0,0 @@
-/**
- * @file llmediaimplllmozlib.cpp
- * @brief Example 2 of a media impl concrete class
- *
- * $LicenseInfo:firstyear=2007&license=viewergpl$
- *
- * Copyright (c) 2007-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "llmediaimplllmozlib.h"
-
-#if LL_LLMOZLIB_ENABLED
-
-#include "llmediaimplregister.h"
-#include "llmediamanager.h"
-
-#ifdef WIN32
- // platform specific includes needed before OpenGL header
- #include
- #include
-#elif defined(__APPLE__)
- // framework-style include path when building on the Mac.
- #include
-#else // Assume this is linux
- // Linux, MESA headers, but not necessarily assuming MESA runtime.
- // quotes so we get libraries/.../GL/ version
- #include "GL/gl.h"
-#endif
-
-
-#include
-
-
-#include
-
-// register this impl with media manager factory
-static LLMediaImplRegister sLLMediaImplLLMozLibReg( "LLMediaImplLLMozLib", new LLMediaImplLLMozLibMaker() );
-
-///////////////////////////////////////////////////////////////////////////////
-//
-LLMediaImplLLMozLibMaker::LLMediaImplLLMozLibMaker()
-{
- // Register to handle the mime category
- mMimeTypes.push_back( "image/svg+xml" );
- mMimeTypeCategories.push_back( "text" );
-#if !LL_QUICKTIME_ENABLED
- mMimeTypeCategories.push_back( "image" );
-#endif
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//
-LLMediaImplLLMozLib::LLMediaImplLLMozLib() :
- mBrowserWindowWidth( 800 ),
- mBrowserWindowHeight( 600 ),
- mMediaDataWidth( 0 ),
- mMediaDataHeight( 0 ),
- mWindowId( 0 ),
- mNeedsUpdate( false )
-{
- setRequestedMediaSize( mBrowserWindowWidth, mBrowserWindowHeight );
-
- setMediaDepth( 4 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// (static) super-initialization - called once at application startup
-bool LLMediaImplLLMozLib::startup( LLMediaManagerData* init_data )
-{
-
- // Yuck, Mozilla's GTK callbacks play with the locale - push/pop
- // the locale to protect it, as exotic/non-C locales
- // causes our code lots of general critical weirdness
- // and crashness. (SL-35450)
- static std::string saved_locale;
- saved_locale = setlocale(LC_ALL, NULL);
-
-
- bool result = LLMozLib::getInstance()->init( init_data->getBrowserApplicationDir(),
- init_data->getBrowserComponentDir(),
- init_data->getBrowserProfileDir(),
- init_data->getBrowserParentWindow() );
-
-
- setlocale(LC_ALL, saved_locale.c_str() );
-
-
- return result;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// (static) super-uninitialization - called once at application closedown
-bool LLMediaImplLLMozLib::closedown()
-{
- // name discrepancy - this reset actually shuts down LLMozLib
- LLMozLib::getInstance()->reset();
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// (static)
-bool LLMediaImplLLMozLib::setBrowserUserAgent(std::string user_agent)
-{
- // append special string to the embedded browser user agent string
- LLMozLib::getInstance()->setBrowserAgentId(user_agent);
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplLLMozLib::init()
-{
- // if mWindowId is non-0, it's we already called init() and shouldn't call it again
- // (::reset() will zero this value)
- if ( mWindowId )
- return false;
-
-#if defined(LL_LINUX) || defined(WIN32)
- static std::string saved_locale;
- saved_locale = setlocale(LC_ALL, NULL);
-#endif // defined(LL_LINUX) || defined(WIN32)
-
- mWindowId = LLMozLib::getInstance()->createBrowserWindow( mBrowserWindowWidth, mBrowserWindowHeight );
-
- LLMozLib::getInstance()->setSize( mWindowId, mBrowserWindowWidth, mBrowserWindowHeight );
-
- LLMozLib::getInstance()->setBackgroundColor( mWindowId, 0x00, 0x00, 0x00 );
-
- LLMozLib::getInstance()->addObserver( mWindowId, this );
-
- // plugins only work with some client-side hackery and they cause
- // exception handling issues (DEV-10020) so we turn them off
- LLMozLib::getInstance()->enablePlugins( false );
-
- // second life client needs the bitmap flipped
- LLMozLib::getInstance()->flipWindow( mWindowId, true );
-
- // set media depth now we have created a browser window and know what it is
- setMediaDepth( LLMozLib::getInstance()->getBrowserDepth( mWindowId ) );
-
-#if defined(LL_LINUX) || defined(WIN32)
- setlocale(LC_ALL, saved_locale.c_str() );
-#endif // defined(LL_LINUX) || defined(WIN32)
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-std::string LLMediaImplLLMozLib::getVersion()
-{
- std::string version_string = "[" + sLLMediaImplLLMozLibReg.getImplName() + "] - " + LLMozLib::getInstance()->getVersion();
-
- return version_string;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplLLMozLib::set404RedirectUrl( std::string redirect_url )
-{
- return LLMozLib::getInstance()->set404RedirectUrl( mWindowId, redirect_url );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-
-bool LLMediaImplLLMozLib::clr404RedirectUrl()
-{
- return LLMozLib::getInstance()->clr404RedirectUrl( mWindowId );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplLLMozLib::setBackgroundColor( unsigned int red, unsigned int green, unsigned int blue ) const
-{
- return LLMozLib::getInstance()->setBackgroundColor( mWindowId, red, green, blue );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplLLMozLib::setCaretColor( unsigned int red, unsigned int green, unsigned int blue ) const
-{
- return LLMozLib::getInstance()->setCaretColor( mWindowId, red, green, blue );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplLLMozLib::navigateTo( const std::string url )
-{
- // pass url to llmozlib
- LLMozLib::getInstance()->navigateTo( mWindowId, url );
-
- // emit event with size change to kick things off
- LLMediaEvent event( this );
- mEventEmitter.update( &LLMediaObserver::onMediaSizeChange, event );
-
- // not that useful right now but maybe later
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplLLMozLib::updateMedia()
-{
- if ( getStatus() == LLMediaBase::STATUS_STARTED )
- {
- // if flag set, the page changed and we need to update
- if ( mNeedsUpdate )
- {
- // snap browser pixels
- LLMozLib::getInstance()->grabBrowserWindow( mWindowId );
-
- // update media width - rendering the page can change it
- mMediaDataWidth = LLMozLib::getInstance()->getBrowserRowSpan( mWindowId ) / getMediaDepth();
- mMediaDataHeight = LLMozLib::getInstance()->getBrowserHeight( mWindowId );
-
- // emit an event to say that something in the media stream changed
- LLMediaEvent event( this );
- mEventEmitter.update( &LLMediaObserver::onMediaContentsChange, event );
-
- // flag that we've done the update and one isn't needed next frame
- mNeedsUpdate = false;
- };
- };
-
- // update the state (e.g. transport controls) state
- updateState();
-
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-bool LLMediaImplLLMozLib::updateState()
-{
- if ( nextCommand() == LLMediaBase::COMMAND_START )
- {
- setStatus( LLMediaBase::STATUS_STARTED );
- clearCommand();
- };
-
- if ( nextCommand() == LLMediaBase::COMMAND_STOP )
- {
- setStatus( LLMediaBase::STATUS_STOPPED );
- clearCommand();
- };
-
- if ( nextCommand() == LLMediaBase::COMMAND_BACK )
- {
- setStatus( LLMediaBase::STATUS_STARTED );
- LLMozLib::getInstance()->navigateBack( mWindowId );
- clearCommand();
- };
-
- if ( nextCommand() == LLMediaBase::COMMAND_FORWARD )
- {
- setStatus( LLMediaBase::STATUS_STARTED );
- LLMozLib::getInstance()->navigateForward( mWindowId );
- clearCommand();
- };
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-void LLMediaImplLLMozLib::onPageChanged( const EventType& eventIn )
-{
- // force an update when the contents of the page changes
- mNeedsUpdate = true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-void LLMediaImplLLMozLib::onClickLinkHref( const EventType& eventIn )
-{
- LLMediaEvent event( this, eventIn.getStringValue(), eventIn.getStringValue2() );
- mEventEmitter.update( &LLMediaObserver::onClickLinkHref, event );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-void LLMediaImplLLMozLib::onClickLinkNoFollow( const EventType& eventIn )
-{
- LLMediaEvent event( this, eventIn.getStringValue() );
- mEventEmitter.update( &LLMediaObserver::onClickLinkNoFollow, event );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-void LLMediaImplLLMozLib::onUpdateProgress( const EventType& eventIn )
-{
- LLMediaEvent event( this, eventIn.getIntValue() );
- mEventEmitter.update( &LLMediaObserver::onUpdateProgress, event );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-void LLMediaImplLLMozLib::onStatusTextChange( const EventType& eventIn )
-{
- LLMediaEvent event( this, eventIn.getStringValue() );
- mEventEmitter.update( &LLMediaObserver::onStatusTextChange, event );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-void LLMediaImplLLMozLib::onLocationChange( const EventType& eventIn )
-{
- LLMediaEvent event( this, eventIn.getEventUri() );
- mEventEmitter.update( &LLMediaObserver::onLocationChange, event );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-void LLMediaImplLLMozLib::onNavigateBegin( const EventType& eventIn )
-{
- LLMediaEvent event( this, eventIn.getEventUri() );
- mEventEmitter.update( &LLMediaObserver::onNavigateBegin, event );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-void LLMediaImplLLMozLib::onNavigateComplete( const EventType& eventIn )
-{
- // force an update when the page is finished
- mNeedsUpdate = true;
-
- // pass in url and HTML response code (200/404 etc.)
- LLMediaEvent event( this, eventIn.getEventUri(), eventIn.getIntValue() );
- mEventEmitter.update( &LLMediaObserver::onNavigateComplete, event );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-unsigned char* LLMediaImplLLMozLib::getMediaData()
-{
- return (unsigned char*)LLMozLib::getInstance()->getBrowserWindowPixels( mWindowId );
-}
-
-// helper func to compute size of media data
-bool LLMediaImplLLMozLib::recomputeSizes()
-{
- int new_width = mMediaRequestedWidth;
- int new_height = mMediaRequestedHeight;
-
- if (new_width < 0)
- new_width = 512;
-
- if (new_height < 0)
- new_height = 512;
-
- if (mAutoScaled)
- {
- new_width = LLMediaManager::textureWidthFromMediaWidth( new_width );
- new_height = LLMediaManager::textureHeightFromMediaHeight( new_height );
- }
-
- bool status = LLMozLib::getInstance()->setSize( mWindowId, new_width, new_height );
-
- if (status)
- setMediaSize(new_width, new_height);
-
- return status;
-}
-
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-int LLMediaImplLLMozLib::getMediaDataWidth() const
-{
- return mMediaDataWidth;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-int LLMediaImplLLMozLib::getMediaDataHeight() const
-{
- return mMediaDataHeight;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplLLMozLib::setRequestedMediaSize(int width, int height)
-{
- LLMediaImplCommon::setRequestedMediaSize(width, height);
-
- return recomputeSizes();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplLLMozLib::setAutoScaled( bool auto_scaled )
-{
- LLMediaImplCommon::setAutoScaled(auto_scaled);
-
- return recomputeSizes();
-}
-
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-int LLMediaImplLLMozLib::getTextureFormatPrimary() const
-{
-#if defined(__APPLE__) || defined(MACOSX)
- return GL_BGRA_EXT;
-#else
- return LLMozLib::getInstance()->getBrowserDepth( mWindowId ) == 3 ? GL_BGR_EXT : GL_BGRA_EXT;
-#endif
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-int LLMediaImplLLMozLib::getTextureFormatType() const
-{
-#if defined(__APPLE__) || defined(MACOSX)
- #ifdef __BIG_ENDIAN__
- return GL_UNSIGNED_INT_8_8_8_8_REV;
- #else
- return GL_UNSIGNED_INT_8_8_8_8;
- #endif
-#else
- return GL_UNSIGNED_BYTE;
-#endif
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplLLMozLib::mouseDown( int x_pos, int y_pos )
-{
- return LLMozLib::getInstance()->mouseDown( mWindowId, x_pos, y_pos );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplLLMozLib::mouseUp( int x_pos, int y_pos )
-{
- LLMozLib::getInstance()->mouseUp( mWindowId, x_pos, y_pos );
-
- // this seems better than sending focus on mouse down (still need to improve this)
- LLMozLib::getInstance()->focusBrowser( mWindowId, true );
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplLLMozLib::mouseMove( int x_pos, int y_pos )
-{
- return LLMozLib::getInstance()->mouseMove( mWindowId, x_pos, y_pos );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplLLMozLib::keyPress( int key_code )
-{
- // We don't have to deal with printable characters here - they should
- // go through handleUnicodeChar(). This table could be more complete
- // than it is, but I think this covers all of the important
- // non-printables.
-
- unsigned long moz_key;
-
- switch(key_code)
- {
- case LL_MEDIA_KEY_BACKSPACE:
- moz_key = LL_DOM_VK_BACK_SPACE; break;
- case LL_MEDIA_KEY_TAB:
- moz_key = LL_DOM_VK_TAB; break;
- case LL_MEDIA_KEY_RETURN:
- moz_key = LL_DOM_VK_RETURN; break;
- case LL_MEDIA_KEY_PAD_RETURN:
- moz_key = LL_DOM_VK_ENTER; break;
- case LL_MEDIA_KEY_ESCAPE:
- moz_key = LL_DOM_VK_ESCAPE; break;
- case LL_MEDIA_KEY_PAGE_UP:
- moz_key = LL_DOM_VK_PAGE_UP; break;
- case LL_MEDIA_KEY_PAGE_DOWN:
- moz_key = LL_DOM_VK_PAGE_DOWN; break;
- case LL_MEDIA_KEY_END:
- moz_key = LL_DOM_VK_END; break;
- case LL_MEDIA_KEY_HOME:
- moz_key = LL_DOM_VK_HOME; break;
- case LL_MEDIA_KEY_LEFT:
- moz_key = LL_DOM_VK_LEFT; break;
- case LL_MEDIA_KEY_UP:
- moz_key = LL_DOM_VK_UP; break;
- case LL_MEDIA_KEY_RIGHT:
- moz_key = LL_DOM_VK_RIGHT; break;
- case LL_MEDIA_KEY_DOWN:
- moz_key = LL_DOM_VK_DOWN; break;
- case LL_MEDIA_KEY_INSERT:
- moz_key = LL_DOM_VK_INSERT; break;
- case LL_MEDIA_KEY_DELETE:
- moz_key = LL_DOM_VK_DELETE; break;
-
- default:
- return false; // don't know how to map this key.
- }
-
- return LLMozLib::getInstance()->keyPress( mWindowId, moz_key );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplLLMozLib::scrollByLines( int lines )
-{
- return LLMozLib::getInstance()->scrollByLines(mWindowId, lines);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplLLMozLib::focus( bool focus )
-{
- return LLMozLib::getInstance()->focusBrowser(mWindowId, focus);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplLLMozLib::unicodeInput( unsigned long uni_char )
-{
- return LLMozLib::getInstance()->unicodeInput(mWindowId, uni_char);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplLLMozLib::mouseLeftDoubleClick( int x_pos, int y_pos )
-{
- return LLMozLib::getInstance()->mouseLeftDoubleClick( mWindowId, x_pos, y_pos );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplLLMozLib::navigateForward()
-{
- return LLMozLib::getInstance()->navigateForward(mWindowId);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplLLMozLib::navigateBack()
-{
- return LLMozLib::getInstance()->navigateBack(mWindowId);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplLLMozLib::canNavigateForward()
-{
- return LLMozLib::getInstance()->canNavigateForward(mWindowId);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplLLMozLib::canNavigateBack()
-{
- return LLMozLib::getInstance()->canNavigateBack(mWindowId);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplLLMozLib::enableCookies(bool enable)
-{
- return LLMozLib::getInstance()->enableCookies(enable);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplLLMozLib::enableProxy(bool enable, std::string proxy_host_name, int proxy_port)
-{
- return LLMozLib::getInstance()->enableProxy(enable, proxy_host_name, proxy_port);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplLLMozLib::clearCache()
-{
- return LLMozLib::getInstance()->clearCache();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplLLMozLib::clearCookies()
-{
- return LLMozLib::getInstance()->clearAllCookies();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplLLMozLib::reset()
-{
- LLMozLib::getInstance()->remObserver( mWindowId, this );
-
- LLMozLib::getInstance()->destroyBrowserWindow( mWindowId );
-
- mWindowId = 0;
-
- return true;
-}
-
-#endif // LL_LLMOZLIB_ENABLED
diff --git a/linden/indra/llmedia/llmediaimplllmozlib.h b/linden/indra/llmedia/llmediaimplllmozlib.h
deleted file mode 100644
index f71300e..0000000
--- a/linden/indra/llmedia/llmediaimplllmozlib.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/**
- * @file llmediaimplllmozlib.cpp
- * @brief Example 2 of a media impl concrete class
- *
- * $LicenseInfo:firstyear=2007&license=viewergpl$
- *
- * Copyright (c) 2007-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LLMEDIAIMPLLLMOZLIB_H
-#define LLMEDIAIMPLLLMOZLIB_H
-
-#include "llmediaimplcommon.h"
-#include "llmediaimplfactory.h"
-
-#if LL_LLMOZLIB_ENABLED
-
-#include "llmozlib2.h"
-
-class LLMediaManagerData;
-
-class LLMediaImplLLMozLib :
- public LLMediaImplCommon,
- public LLEmbeddedBrowserWindowObserver
-{
- public:
- LLMediaImplLLMozLib();
-
- static bool startup( LLMediaManagerData* init_data );
- static bool closedown();
-
- // Update the user-agent string reported when the browser requests
- // web page, because we need to include the Second Life version
- // and skin name (which can change without restarts).
- // Must be called after startup().
- static bool setBrowserUserAgent(std::string user_agent);
-
- /* virtual */ bool init();
- /* virtual */ std::string getVersion();
- /* virtual */ bool set404RedirectUrl( std::string redirect_url );
- /* virtual */ bool clr404RedirectUrl();
- /* virtual */ bool setBackgroundColor( unsigned int red, unsigned int green, unsigned int blue ) const;
- /* virtual */ bool setCaretColor( unsigned int red, unsigned int green, unsigned int blue ) const;
- /* virtual */ bool navigateTo( const std::string url );
- /* virtual */ bool updateMedia();
- /* virtual */ unsigned char* getMediaData();
- /* virtual */ int getMediaDataWidth() const;
- /* virtual */ int getMediaDataHeight() const;
- /* virtual */ bool setRequestedMediaSize(int width, int height);
- /* virtual */ bool setAutoScaled( bool auto_scaled );
- /* virtual */ int getTextureFormatPrimary() const;
- /* virtual */ int getTextureFormatType() const;
- /* virtual */ bool mouseDown( int x_pos, int y_pos );
- /* virtual */ bool mouseUp( int x_pos, int y_pos );
- /* virtual */ bool mouseMove( int x_pos, int y_pos );
- /* virtual */ bool keyPress( int key_code );
- /* virtual */ bool scrollByLines( int lines );
- /* virtual */ bool focus( bool focus );
- /* virtual */ bool unicodeInput( unsigned long uni_char );
- /* virtual */ bool mouseLeftDoubleClick( int x_pos, int y_pos );
- /* virtual */ bool navigateForward();
- /* virtual */ bool navigateBack();
- /* virtual */ bool canNavigateForward();
- /* virtual */ bool canNavigateBack();
- /* virtual */ bool enableCookies(bool enable);
- /* virtual */ bool enableProxy(bool enable, std::string proxy_host_name, int proxy_port);
- /* virtual */ bool clearCache();
- /* virtual */ bool clearCookies();
- /* virtual */ bool reset();
-
- // LLMozLib observerables
- virtual void onNavigateBegin( const EventType& eventIn );
- virtual void onNavigateComplete( const EventType& eventIn );
- virtual void onUpdateProgress( const EventType& eventIn );
- virtual void onPageChanged( const EventType& eventIn );
- virtual void onStatusTextChange( const EventType& eventIn );
- virtual void onLocationChange( const EventType& eventIn );
- virtual void onClickLinkHref( const EventType& eventIn );
- virtual void onClickLinkNoFollow( const EventType& eventIn );
-
- private:
- bool recomputeSizes();
- int mWindowId;
- int mBrowserWindowWidth;
- int mBrowserWindowHeight;
- int mMediaDataWidth;
- int mMediaDataHeight;
- bool mNeedsUpdate;
- bool updateState();
-};
-
-// The maker class
-class LLMediaImplLLMozLibMaker : public LLMediaImplMaker
-{
- public:
- LLMediaImplLLMozLibMaker();
- LLMediaImplLLMozLib* create()
- {
- return new LLMediaImplLLMozLib();
- }
-};
-#endif // LL_LLMOZLIB_ENABLED
-
-#endif // LLMEDIAIMPLLLMOZLIB_H
diff --git a/linden/indra/llmedia/llmediaimplquicktime.cpp b/linden/indra/llmedia/llmediaimplquicktime.cpp
deleted file mode 100644
index 76cacee..0000000
--- a/linden/indra/llmedia/llmediaimplquicktime.cpp
+++ /dev/null
@@ -1,657 +0,0 @@
-/**
- * @file llmediaimplquicktime.cpp
- * @brief QuickTime media impl concrete class
- *
- * $LicenseInfo:firstyear=2007&license=viewergpl$
- *
- * Copyright (c) 2007-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "llmediaimplquicktime.h"
-
-#if LL_QUICKTIME_ENABLED
-
-#include "llmediamanager.h"
-#include "llmediaimplregister.h"
-
-#if LL_WINDOWS
-#include
-#endif
-
-#include
-#include
-
-// register this impl with media manager factory
-static LLMediaImplRegister sLLMediaImplQuickTimeReg( "LLMediaImplQuickTime", new LLMediaImplQuickTimeMaker() );
-
-///////////////////////////////////////////////////////////////////////////////
-//
-LLMediaImplQuickTimeMaker::LLMediaImplQuickTimeMaker()
-{
- // Register to handle the scheme
- mSchema.push_back( "rtsp" );
-
- // Register to handle the category
- mMimeTypeCategories.push_back( "video" );
- mMimeTypeCategories.push_back( "audio" );
- mMimeTypeCategories.push_back( "image" );
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//
-LLMediaImplQuickTime::LLMediaImplQuickTime() :
- mMovieHandle( 0 ),
- mGWorldHandle( 0 ),
- mMovieController( 0 ),
- mMinWidth( 32 ),
- mMaxWidth( 2048 ),
- mMinHeight( 32 ),
- mMaxHeight( 2048 ),
- mCurVolume( 0 )
-{
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//
-LLMediaImplQuickTime::~LLMediaImplQuickTime()
-{
- unload();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// (static) super-initialization - called once at application startup
-bool LLMediaImplQuickTime::startup( LLMediaManagerData* init_data )
-{
-#ifdef WIN32
- if ( InitializeQTML( 0L ) != noErr )
- {
- return false;
- };
-#endif
-
- EnterMovies();
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// (static) super-uninitialization - called once at application closedown
-bool LLMediaImplQuickTime::closedown()
-{
- ExitMovies();
-
-#ifdef WIN32
- TerminateQTML();
-#endif
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// private
-bool LLMediaImplQuickTime::load( const std::string url )
-{
- if ( url.empty() )
- return false;
-
- //In case std::string::c_str() makes a copy of the url data,
- //make sure there is memory to hold it before allocating memory for handle.
- //if fails, NewHandleClear(...) should return NULL.
- const char* url_string = url.c_str() ;
- Handle handle = NewHandleClear( ( Size )( url.length() + 1 ) );
- if ( NULL == handle )
- return false;
- if(noErr != MemError() || NULL == *handle)
- {
- return false ;
- }
-
- BlockMove( url_string, *handle, ( Size )( url.length() + 1 ) );
-
- //std::cout << "LLMediaImplQuickTime::load( " << url << " )" << std::endl;
-
- // TODO: supposed to use NewMovieFromDataParams now
- OSErr err = NewMovieFromDataRef( &mMovieHandle, newMovieActive | newMovieDontInteractWithUser | newMovieAsyncOK | newMovieIdleImportOK, nil, handle, URLDataHandlerSubType );
- DisposeHandle( handle );
- if ( noErr != err )
- return false;
-
- // do pre-roll actions (typically fired for streaming movies but not always)
- PrePrerollMovie( mMovieHandle, 0, GetMoviePreferredRate( mMovieHandle ), moviePrePrerollCompleteCallback, ( void * )this );
-
- // get movie rect (and check for min/max)
- Rect movie_rect;
- setMovieBoxEnhanced( &movie_rect );
-
- // make a new movie controller
- mMovieController = NewMovieController( mMovieHandle, &movie_rect, mcNotVisible | mcTopLeftMovie );
-
-#if defined(__APPLE__) || defined(MACOSX)
- setMediaDepth( 4 );
-#else
- setMediaDepth( 3 );
-#endif
-
- // tell manager about the media size
- setMediaSize( movie_rect.right - movie_rect.left, movie_rect.bottom - movie_rect.top);
-
- // movie controller
- MCSetActionFilterWithRefCon( mMovieController, mcActionFilterCallBack, ( long )this );
-
- SetMoviePlayHints( mMovieHandle, hintsAllowDynamicResize, hintsAllowDynamicResize );
-
- // function that gets called when a frame is drawn
- SetMovieDrawingCompleteProc( mMovieHandle, movieDrawingCallWhenChanged, movieDrawingCompleteCallback, ( long )this );
-
- // emit an event to say that a media source was loaded
- LLMediaEvent event( this );
- mEventEmitter.update( &LLMediaObserver::onMediaLoaded, event );
-
- // set up inital state
- sizeChanged();
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-std::string LLMediaImplQuickTime::getVersion()
-{
- long version;
- Gestalt( gestaltQuickTimeVersion, &version );
-
- std::ostringstream codec( "" );
- codec << "[";
- codec << sLLMediaImplQuickTimeReg.getImplName();
- codec << "] - ";
- codec << "QuickTime: " << std::hex << version;
-
- return codec.str();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplQuickTime::navigateTo( const std::string url )
-{
- // tell engine what we're doing
- setStatus( LLMediaBase::STATUS_NAVIGATING );
-
- // remove the movie we were looking at
- unload();
-
- // load the new one (no real 'go to this url' function in QT)
- load( url );
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplQuickTime::sizeChanged()
-{
- if ( ! mMovieHandle )
- return false;
-
- // sanitize size of movie
- Rect movie_rect;
- setMovieBoxEnhanced( &movie_rect );
-
- // we need this later
- int width = ( movie_rect.right - movie_rect.left );
- int height = ( movie_rect.bottom - movie_rect.top );
-
- std::cout << "LLMEDIA> size changed to " << width << " x " << height << std::endl;
-
- setMediaSize( width, height );
-
- // media depth won't change
- int depth_bits = getMediaDepth() * 8;
-
- GWorldPtr old_gworld_handle = mGWorldHandle;
-
- if (old_gworld_handle)
- {
- GWorldFlags result = UpdateGWorld( &mGWorldHandle, depth_bits, &movie_rect, NULL, NULL, 0 );
- if ( gwFlagErr == result )
- {
- // TODO: unrecoverable?? throw exception? return something?
- return false;
- }
- }
- else
- {
- OSErr result = NewGWorld( &mGWorldHandle, depth_bits, &movie_rect, NULL, NULL, keepLocal | pixelsLocked );
- if ( noErr != result )
- {
- // ATODO: unrecoverable?? throw exception? return something?
- return false;
- }
-
- // clear memory in GWorld to avoid random screen visual fuzz from uninitialized texture data
- if ( mGWorldHandle )
- {
- PixMapHandle pix_map_handle = GetGWorldPixMap( mGWorldHandle );
- unsigned char* ptr = ( unsigned char* )GetPixBaseAddr( pix_map_handle );
- memset( ptr, 0x00, height * QTGetPixMapHandleRowBytes( pix_map_handle ) );
- }
- }
-
- // point movie at GWorld if it's new
- if ( mMovieHandle && ! old_gworld_handle )
- {
- SetMovieGWorld( mMovieHandle, mGWorldHandle, GetGWorldDevice ( mGWorldHandle ) );
- }
-
- // update movie controller
- if ( mMovieController )
- {
- MCSetControllerPort( mMovieController, mGWorldHandle );
- MCPositionController( mMovieController, &movie_rect, &movie_rect,
- mcTopLeftMovie | mcPositionDontInvalidate );
- MCMovieChanged( mMovieController, mMovieHandle );
- }
-
- // Emit event with size change so the calling app knows about it too
- LLMediaEvent event( this );
- mEventEmitter.update( &LLMediaObserver::onMediaSizeChange, event );
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// static
-Boolean LLMediaImplQuickTime::mcActionFilterCallBack( MovieController mc, short action, void *params, long ref )
-{
- Boolean result = false;
-
- LLMediaImplQuickTime* self = ( LLMediaImplQuickTime* )ref;
-
- switch( action )
- {
- // handle window resizing
- case mcActionControllerSizeChanged:
- self->sizeChanged();
- break;
-
- // Block any movie controller actions that open URLs.
- case mcActionLinkToURL:
- case mcActionGetNextURL:
- case mcActionLinkToURLExtended:
- // Prevent the movie controller from handling the message
- result = true;
- break;
-
- default:
- break;
- };
-
- return result;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// private
-bool LLMediaImplQuickTime::unload()
-{
- if ( mMovieHandle )
- {
- StopMovie( mMovieHandle );
- if ( mMovieController )
- {
- MCMovieChanged( mMovieController, mMovieHandle );
- };
- };
-
- if ( mMovieController )
- {
- MCSetActionFilterWithRefCon( mMovieController, NULL, (long)this );
- DisposeMovieController( mMovieController );
- mMovieController = NULL;
- };
-
- if ( mMovieHandle )
- {
- SetMovieDrawingCompleteProc( mMovieHandle, movieDrawingCallWhenChanged, nil, ( long )this );
- DisposeMovie ( mMovieHandle );
- mMovieHandle = NULL;
- };
-
- if ( mGWorldHandle )
- {
- DisposeGWorld( mGWorldHandle );
- mGWorldHandle = NULL;
- };
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// static
-OSErr LLMediaImplQuickTime::movieDrawingCompleteCallback( Movie call_back_movie, long ref )
-{
- LLMediaImplQuickTime* self = ( LLMediaImplQuickTime* )ref;
-
- // IMPORTANT: typically, a consumer who is observing this event will set a flag
- // when this event is fired then render later. Be aware that the media stream
- // can change during this period - dimensions, depth, format etc.
- LLMediaEvent event( self );
- self->mEventEmitter.update( &LLMediaObserver::onMediaContentsChange, event );
-
- return noErr;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// static
-void LLMediaImplQuickTime::moviePrePrerollCompleteCallback( Movie movie, OSErr preroll_err, void *ref )
-{
- LLMediaImplQuickTime* self = ( LLMediaImplQuickTime* )ref;
-
- LLMediaEvent event( self );
- self->mEventEmitter.update( &LLMediaObserver::onMediaPreroll, event );
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// used for stop / loop
-void LLMediaImplQuickTime::rewind()
-{
- GoToBeginningOfMovie ( mMovieHandle );
-
- MCMovieChanged( mMovieController, mMovieHandle );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-bool LLMediaImplQuickTime::processState()
-{
- // start stream
- if ( nextCommand() == LLMediaBase::COMMAND_START )
- {
- // valid when we are in these states
- if ( getStatus() == LLMediaBase::STATUS_NAVIGATING|| getStatus() == LLMediaBase::STATUS_STOPPED || getStatus() == LLMediaBase::STATUS_PAUSED )
- {
- // it appears that the movie must be in a loaded state before we do this command
- if ( GetMovieLoadState( mMovieHandle ) >= kMovieLoadStatePlaythroughOK )
- {
- MCDoAction( mMovieController, mcActionPrerollAndPlay, (void*)GetMoviePreferredRate( mMovieHandle ) );
-
- MCDoAction( mMovieController, mcActionSetVolume, (void*)mCurVolume );
-
- setStatus( LLMediaBase::STATUS_STARTED );
-
- clearCommand();
- }
- }
- }
- else
- if ( nextCommand() == LLMediaBase::COMMAND_STOP )
- {
- // valid when we are in these states
- if ( getStatus() == LLMediaBase::STATUS_NAVIGATING || getStatus() == LLMediaBase::STATUS_STARTED || getStatus() == LLMediaBase::STATUS_PAUSED )
- {
- // it appears that the movie must be in a loaded state before we do this command
- if ( GetMovieLoadState( mMovieHandle ) >= kMovieLoadStatePlaythroughOK )
- {
- // stop playing
- Fixed rate = X2Fix( 0.0 );
- MCDoAction( mMovieController, mcActionPlay, (void*)rate );
-
- // go back to start
- rewind();
-
- setStatus( LLMediaBase::STATUS_STOPPED );
- clearCommand();
- };
- };
- }
- else
- if ( nextCommand() == LLMediaBase::COMMAND_PAUSE )
- {
- // valid when we are in these states
- if ( getStatus() == LLMediaBase::STATUS_NAVIGATING || getStatus() == LLMediaBase::STATUS_STARTED || getStatus() == LLMediaBase::STATUS_STOPPED )
- {
- // it appears that the movie must be in a loaded state before we do this command
- if ( GetMovieLoadState( mMovieHandle ) >= kMovieLoadStatePlaythroughOK )
- {
- // stop playing
- Fixed rate = X2Fix( 0.0 );
- MCDoAction( mMovieController, mcActionPlay, (void*)rate );
-
- setStatus( LLMediaBase::STATUS_PAUSED );
- clearCommand();
- };
- };
- };
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplQuickTime::setMovieBoxEnhanced( Rect* rect )
-{
- // get movie rect
- GetMovieNaturalBoundsRect( mMovieHandle, rect );
-
- int natural_width = ( rect->right - rect->left );
- int natural_height = ( rect->bottom - rect->top );
-
- int width = natural_width;
- int height = natural_height;
-
- // if the user has requested a specific size, use it:
- if ((mMediaRequestedWidth != 0) && (mMediaRequestedHeight != 0))
- {
- width = mMediaRequestedWidth;
- height = mMediaRequestedHeight;
- }
-
- // if the user has requested, resize media to exactly fit texture
- if (mAutoScaled)
- {
- width = LLMediaManager::textureWidthFromMediaWidth( width );
- height = LLMediaManager::textureHeightFromMediaHeight( height );
- }
-
- // make sure it falls in valid range
- if ( width < mMinWidth )
- width = mMinWidth;
-
- if ( width > mMaxWidth )
- width = mMaxWidth;
-
- if ( height < mMinHeight )
- height = mMinHeight;
-
- if ( height > mMaxHeight )
- height = mMaxHeight;
-
-
- // scale movie to fit rect and invert vertically to match opengl image format
- MatrixRecord transform;
- SetIdentityMatrix( &transform ); // transforms are additive so start from identify matrix
- double scaleX = (double) width / natural_width;
- double scaleY = -1.0 * (double) height / natural_height;
- double centerX = width / 2.0;
- double centerY = height / 2.0;
- ScaleMatrix( &transform, X2Fix ( scaleX ), X2Fix ( scaleY ), X2Fix ( centerX ), X2Fix ( centerY ) );
- SetMovieMatrix( mMovieHandle, &transform );
-
- // return the new rect
- rect->right = width;
- rect->bottom = height;
- rect->left = 0;
- rect->top = 0;
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplQuickTime::updateMedia()
-{
- if ( ! mMovieHandle )
- return false;
-
- if ( ! mMovieController )
- return false;
-
- if ( ! mGWorldHandle )
- return false;
-
- // service QuickTime
- MoviesTask( mMovieHandle, 0 );
- MCIdle( mMovieController );
-
- // update state machine (deals with transport controls for example)
- processState();
-
- // special code for looping - need to rewind at the end of the movie
-
- if ( isLooping() )
- {
- // QT call to see if we are at the end - can't do with controller
- if ( IsMovieDone( mMovieHandle ) )
- {
- // go back to start
- rewind();
-
- // kick off new play
- MCDoAction( mMovieController, mcActionPrerollAndPlay, (void*)GetMoviePreferredRate( mMovieHandle ) );
-
- // set the volume
- MCDoAction( mMovieController, mcActionSetVolume, (void*)mCurVolume );
- }
- }
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-unsigned char* LLMediaImplQuickTime::getMediaData()
-{
- unsigned char* ptr = NULL;
-
- if ( mGWorldHandle )
- {
- PixMapHandle pix_map_handle = GetGWorldPixMap( mGWorldHandle );
-
- ptr = ( unsigned char* )GetPixBaseAddr( pix_map_handle );
- };
-
- return ptr;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-int LLMediaImplQuickTime::getMediaDataWidth() const
-{
- if ( mGWorldHandle )
- {
- int depth = getMediaDepth();
-
- if (depth < 1)
- depth = 1;
-
- // ALWAYS use the row bytes from the PixMap if we have a GWorld because
- // sometimes it's not the same as mMediaDepth * mMediaWidth !
- PixMapHandle pix_map_handle = GetGWorldPixMap( mGWorldHandle );
- return QTGetPixMapHandleRowBytes( pix_map_handle ) / depth;
- }
- else
- {
- return LLMediaImplCommon::getMediaDataWidth();
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-int LLMediaImplQuickTime::getTextureFormatPrimary() const
-{
-#if defined(__APPLE__) || defined(MACOSX)
- return LL_MEDIA_BGRA;
-#else
- return LL_MEDIA_RGB;
-#endif
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-int LLMediaImplQuickTime::getTextureFormatType() const
-{
-#if defined(__APPLE__) || defined(MACOSX)
- #ifdef __BIG_ENDIAN__
- return LL_MEDIA_UNSIGNED_INT_8_8_8_8_REV;
- #else
- return LL_MEDIA_UNSIGNED_INT_8_8_8_8;
- #endif
-#else
- return LL_MEDIA_UNSIGNED_BYTE;
-#endif
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplQuickTime::seek( double time )
-{
- if ( mMovieController )
- {
- TimeRecord when;
- when.scale = GetMovieTimeScale( mMovieHandle );
- when.base = 0;
-
- // 'time' is in (floating point) seconds. The timebase time will be in 'units', where
- // there are 'scale' units per second.
- SInt64 raw_time = ( SInt64 )( time * (double)( when.scale ) );
-
- when.value.hi = ( SInt32 )( raw_time >> 32 );
- when.value.lo = ( SInt32 )( ( raw_time & 0x00000000FFFFFFFF ) );
-
- MCDoAction( mMovieController, mcActionGoToTime, &when );
-
- return true;
- }
-
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-bool LLMediaImplQuickTime::setVolume( float volume )
-{
- mCurVolume = (short)(volume * ( double ) 0x100 );
-
- if ( mMovieController )
- {
- MCDoAction( mMovieController, mcActionSetVolume, (void*)mCurVolume );
-
- return true;
- }
-
- return false;
-}
-
-#endif // _3DNOW_InstructionExtensions/ LL_QUICKTIME_ENABLED
-
diff --git a/linden/indra/llmedia/llmediaimplquicktime.h b/linden/indra/llmedia/llmediaimplquicktime.h
deleted file mode 100644
index d4e1db8..0000000
--- a/linden/indra/llmedia/llmediaimplquicktime.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/**
- * @file llmediaimplquicktime.h
- * @brief QuickTime media impl concrete class
- *
- * $LicenseInfo:firstyear=2007&license=viewergpl$
- *
- * Copyright (c) 2007-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LLMEDIAIMPLQUICKTIME_H
-#define LLMEDIAIMPLQUICKTIME_H
-
-#include "llmediaimplcommon.h"
-#include "llmediaimplfactory.h"
-
-#if LL_QUICKTIME_ENABLED
-
-#include
-
-// QuickTime includes
-#if defined(__APPLE__)
- #include
-#elif defined(WIN32)
- #include "MacTypes.h"
- #include "QTML.h"
- #include "Movies.h"
- #include "QDoffscreen.h"
- #include "FixMath.h"
-#endif
-
-class LLMediaManagerData;
-
-class LLMediaImplQuickTime :
- public LLMediaImplCommon
-{
- public:
- LLMediaImplQuickTime();
- virtual ~LLMediaImplQuickTime();
-
- static bool startup( LLMediaManagerData* init_data );
- static bool closedown();
-
- /* virtual */ std::string getVersion();
- /* virtual */ bool navigateTo( const std::string url );
- /* virtual */ bool updateMedia();
- /* virtual */ unsigned char* getMediaData();
- /* virtual */ int getMediaDataWidth() const;
- /* virtual */ int getTextureFormatPrimary() const;
- /* virtual */ int getTextureFormatType() const;
- /* virtual */ bool seek( double time );
- /* virtual */ bool setVolume( float volume );
-
- bool sizeChanged();
-
- private:
- static OSErr movieDrawingCompleteCallback( Movie call_back_movie, long ref );
- static Boolean mcActionFilterCallBack( MovieController mc, short action, void *params, long ref );
- static void moviePrePrerollCompleteCallback( Movie movie, OSErr preroll_err, void *refcon );
-
- bool load( const std::string url );
- bool unload();
- void rewind();
- bool processState();
- bool setMovieBoxEnhanced( Rect* rect );
-
- Movie mMovieHandle;
- GWorldPtr mGWorldHandle;
- ComponentInstance mMovieController;
- const int mMinWidth;
- const int mMaxWidth;
- const int mMinHeight;
- const int mMaxHeight;
- int mCurVolume;
-};
-
-// The maker class
-class LLMediaImplQuickTimeMaker : public LLMediaImplMaker
-{
- public:
- LLMediaImplQuickTimeMaker();
- LLMediaImplQuickTime* create()
- {
- return new LLMediaImplQuickTime();
- }
-};
-
-#endif // LL_QUICKTIME_ENABLED
-
-#endif // LLMEDIAIMPLQUICKTIME_H
diff --git a/linden/indra/llmedia/llmediaimplregister.h b/linden/indra/llmedia/llmediaimplregister.h
deleted file mode 100644
index 5191274..0000000
--- a/linden/indra/llmedia/llmediaimplregister.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- * @file llmediaimplregister.h
- * @brief Allow impls to register themselves with the impl factory
- *
- * $LicenseInfo:firstyear=2007&license=viewergpl$
- *
- * Copyright (c) 2007-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LLIMEDIAIMPLREGISTER_H
-#define LLIMEDIAIMPLREGISTER_H
-
-#include
-
-#include "llmediaimplfactory.h"
-
-///////////////////////////////////////////////////////////////////////////////
-//
-class LLMediaImplRegister
-{
- public:
- LLMediaImplRegister( std::string impl_name, LLMediaImplMaker* impl_maker ) :
- mImplName( impl_name )
- {
- LLMediaImplFactory::getInstance()->registerImpl( impl_name, impl_maker );
- };
-
- std::string getImplName()
- {
- return mImplName;
- };
-
- private:
- std::string mImplName;
-};
-
-#endif // LLIMEDIAIMPLREGISTER_H
diff --git a/linden/indra/llmedia/llmediamanager.cpp b/linden/indra/llmedia/llmediamanager.cpp
deleted file mode 100644
index 48da808..0000000
--- a/linden/indra/llmedia/llmediamanager.cpp
+++ /dev/null
@@ -1,295 +0,0 @@
-/**
- * @file llmediamanager.cpp
- * @brief Manages instances of media impls
- *
- * $LicenseInfo:firstyear=2007&license=viewergpl$
- *
- * Copyright (c) 2007-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "llmediamanager.h"
-
-#if LL_WINDOWS
- // GStreamer 0.10.22 - gstutils.h - conversion from 'guint64' to 'guint8'.
- // This was an intentional change to make GStreamer more threadsafe, and
- // is okay. Delete this bit if GStreamer ever gets more VS-friendly -- McCabe
- #pragma warning(disable : 4244)
-#endif
-#include "llmediaimplgstreamer.h"
-#if LL_WINDOWS
- #pragma warning(default : 4244)
-#endif
-
-#include "llmediaimplfactory.h"
-
-#include "llmediaimplexample1.h"
-#include "llmediaimplexample2.h"
-#include "llmediaimplquicktime.h"
-
-#if LL_LLMOZLIB_ENABLED
-# include "llmediaimplllmozlib.h"
-#endif
-
-#include "llerror.h"
-LLMediaManager* LLMediaManager::sInstance = 0;
-
-
-////////////////////////////////////////////////////////////////////////////////
-// (private)
-LLMediaManager::LLMediaManager()
-{
-}
-
-////////////////////////////////////////////////////////////////////////////////
-LLMediaManager::~LLMediaManager()
-{
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Early initialization for web browser for the viewer, so we can show
-// the login screen and defer initialization of QuickTime, etc. JC
-// (static)
-void LLMediaManager::initBrowser( LLMediaManagerData* init_data )
-{
- if ( ! sInstance )
- sInstance = new LLMediaManager();
-
-#if LL_LLMOZLIB_ENABLED
- LLMediaImplLLMozLib::startup( init_data );
-#endif // LL_LLMOZLIB_ENABLED
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// (static)
-void LLMediaManager::initClass( LLMediaManagerData* init_data )
-{
- if ( ! sInstance )
- sInstance = new LLMediaManager();
-
- LL_DEBUGS("MediaManager") << "LLMediaManager::initClass" << LL_ENDL;
- // Initialize impl classes here - this breaks the encapsulation model
- // but some of the initialization takes a long time and we only want to
- // do it once at app startup before any of the impls have been created
- // Each impl provides a static startup method that does any initialization
- // which takes a significant amount of time.
- LLMediaImplExample1::startup( init_data );
- LLMediaImplExample2::startup( init_data );
-
-#if LL_QUICKTIME_ENABLED
- LL_DEBUGS("MediaManager") << "LLMediaManager::initClass: starting quicktime." << LL_ENDL;
- LLMediaImplQuickTime::startup( init_data );
-#endif // LL_QUICKTIME_ENABLED
-
-///#if LL_GSTREAMER_ENABLED
- LL_DEBUGS("MediaManager") << "LLMediaManager::initClass: starting gstreamer" << LL_ENDL;
- LLMediaImplGStreamer::startup( init_data );
-///#endif // LL_GSTREAMER_ENABLED
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// (static)
-void LLMediaManager::updateClass()
-{
- if (!sInstance) return;
-
- media_impl_container_t::iterator it
- = sInstance->mMediaImplContainer.begin();
- media_impl_container_t::iterator end
- = sInstance->mMediaImplContainer.end();
- for ( ; it != end; ++it )
- {
- LLMediaBase* impl = *it;
- impl->updateMedia();
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// (static)
-void LLMediaManager::cleanupClass()
-{
- // Uninitialize impl classes here - this breaks the encapsulation model
- // but some of the uninitialization takes a long time and we only want to
- // do it once at app startup before any of the impls have been created.
- // Each impl provides a static closedown method that does any uninitialization
- // which takes a significant amount of time.
- LLMediaImplExample1::closedown();
- LLMediaImplExample2::closedown();
-
-#if LL_LLMOZLIB_ENABLED
- LLMediaImplLLMozLib::closedown();
-#endif // LL_LLMOZLIB_ENABLED
-
-#if LL_QUICKTIME_ENABLED
- LLMediaImplQuickTime::closedown();
-#endif // LL_QUICKTIME_ENABLED
-
-///#if LL_GSTREAMER_ENABLED
- LLMediaImplGStreamer::closedown();
-///#endif // LL_QUICKTIME_ENABLED
-
- if ( sInstance )
- delete sInstance;
-
- sInstance = 0;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// (static)
-LLMediaManager* LLMediaManager::getInstance()
-{
- return sInstance;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// (static)
-void LLMediaManager::setBrowserUserAgent(std::string user_agent)
-{
-#if LL_LLMOZLIB_ENABLED
- // *HACK: Breaks encapsulation model, as initClass does above. JC
- LLMediaImplLLMozLib::setBrowserUserAgent(user_agent);
-#endif // LL_LLMOZLIB_ENABLED
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-LLMediaBase* LLMediaManager::createSourceFromMimeType( std::string scheme, std::string mime_type )
-{
-
- LLMediaImplMakerBase* impl_maker = LLMediaImplFactory::getInstance()->getImplMaker( scheme, mime_type );
-
- // If an impl maker is return it means this media type is supported
- if ( impl_maker )
- {
- LLMediaBase* media_impl = impl_maker->create();
- if( media_impl )
- {
- media_impl->setImplMaker( impl_maker );
- std::pair< media_impl_container_t::iterator, bool > result =
- mMediaImplContainer.insert( media_impl );
-
- if ( result.second )
- {
- media_impl->setMimeType( mime_type );
-
- media_impl->init();
-
- return media_impl;
- };
- };
- };
-
- return 0;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-bool LLMediaManager::destroySource( LLMediaBase* media_impl )
-{
- media_impl_container_t::iterator iter =
- mMediaImplContainer.find( media_impl );
-
- if ( iter != mMediaImplContainer.end() )
- {
- if ( *iter )
- {
- ( *iter)->reset();
-
- delete ( *iter );
-
- mMediaImplContainer.erase( iter );
-
- return true;
- };
- };
-
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-bool LLMediaManager::addMimeTypeImplNameMap( std::string mime_type, std::string impl_name )
-{
- std::pair< mime_type_impl_name_container_t::iterator, bool > result =
- mMimeTypeImplNameContainer.insert( std::make_pair( mime_type, impl_name ) );
-
- return result.second;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-std::string LLMediaManager::getImplNameFromMimeType( std::string mime_type )
-{
- mime_type_impl_name_container_t::iterator iter =
- mMimeTypeImplNameContainer.find( mime_type );
-
- if ( iter != mMimeTypeImplNameContainer.end() )
- {
- return ( *iter ).second;
- }
- else
- {
- return std::string( "" );
- };
-}
-////////////////////////////////////////////////////////////////////////////////
-//
-bool LLMediaManager::supportsMediaType( const std::string& impl_name, const std::string& scheme, const std::string& mime_type )
-{
- LLMediaImplMakerBase* impl_maker = LLMediaImplFactory::getInstance()->getImplMaker( impl_name );
- if( impl_maker )
- {
- int idx1 = mime_type.find("/");
- int len = (idx1 == std::string::npos) ? 0 : idx1;
- std::string category = mime_type.substr(0,len);
-
- return impl_maker->supportsScheme(scheme) ||
- impl_maker->supportsMimeType(mime_type) ||
- impl_maker->supportsMimeTypeCategory(category);
- }
- return false;
-}
-
-// static
-int LLMediaManager::textureWidthFromMediaWidth( int media_width )
-{
- int texture_width = 1;
- while ( texture_width < media_width )
- {
- texture_width <<= 1;
- };
- return texture_width;
-}
-
-// static
-int LLMediaManager::textureHeightFromMediaHeight( int media_height )
-{
- int texture_height = 1;
- while ( texture_height < media_height )
- {
- texture_height <<= 1;
- };
- return texture_height;
-}
diff --git a/linden/indra/llmedia/llmediamanager.h b/linden/indra/llmedia/llmediamanager.h
deleted file mode 100644
index dc832d5..0000000
--- a/linden/indra/llmedia/llmediamanager.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/**
- * @file llmediamanager.h
- * @brief Manages instances of media impls
- *
- * $LicenseInfo:firstyear=2007&license=viewergpl$
- *
- * Copyright (c) 2007-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LLMEDIAMANAGER_H
-#define LLMEDIAMANAGER_H
-
-#include
-#include
-
-#include "llmediaimplcommon.h"
-
-////////////////////////////////////////////////////////////////////////////////
-//
-class LLMediaManagerData
-{
- public:
- LLMediaManagerData() :
- mBrowserParentWindow( 0 ),
- mBrowserProfileDir( "" ),
- mBrowserProfileName ( "" )
- { };
-
- void setBrowserApplicationDir( const std::string& browser_application_dir ) { mBrowserApplicationDir = browser_application_dir; };
- std::string& getBrowserApplicationDir() { return mBrowserApplicationDir; };
-
- void setBrowserComponentDir( const std::string& browser_component_dir ) { mBrowserComponentDir = browser_component_dir; };
- std::string& getBrowserComponentDir() { return mBrowserComponentDir; };
-
- void setBrowserParentWindow( void* browser_parent_window ) { mBrowserParentWindow = browser_parent_window; };
- void* getBrowserParentWindow() { return mBrowserParentWindow; };
-
- void setBrowserProfileDir( const std::string& browser_profile_dir ) { mBrowserProfileDir = browser_profile_dir; };
- std::string& getBrowserProfileDir() { return mBrowserProfileDir; };
-
- void setBrowserProfileName( const std::string& browser_profile_name ) { mBrowserProfileName = browser_profile_name; };
- std::string& getBrowserProfileName() { return mBrowserProfileName; };
-
- private:
- void* mBrowserParentWindow;
- std::string mBrowserProfileDir;
- std::string mBrowserProfileName;
- std::string mBrowserApplicationDir;
- std::string mBrowserComponentDir;
-};
-
-////////////////////////////////////////////////////////////////////////////////
-//
-class LLMediaManager
-{
- public:
- virtual ~LLMediaManager();
-
- // Special case early init for just web browser component
- // so we can show login screen. See .cpp file for details. JC
- static void initBrowser( LLMediaManagerData* init_data );
-
- static void initClass( LLMediaManagerData* init_data );
- static void cleanupClass();
- static LLMediaManager* getInstance();
-
- // We append the skin name to the browser user agent string, so
- // we need to change it while the app is running, not just at
- // init time.
- // Must be called after initClass() above.
- // *HACK: Breaks encapsulation model. JC
- static void setBrowserUserAgent(std::string user_agent);
-
- // Calls update on all media sources
- static void updateClass();
-
- // Given an URL and mime_type, construct/destroy a playback engine for
- // it (a "media impl").
- LLMediaBase* createSourceFromMimeType( std::string scheme, std::string mime_type );
- bool destroySource( LLMediaBase* media_impl );
-
- // mime type to impl mapping functions
- bool addMimeTypeImplNameMap( std::string mime_type, std::string impl_name );
- std::string getImplNameFromMimeType( std::string mime_type );
-
- // Name accessor for querying type support
- bool supportsMediaType( const std::string& impl_name, const std::string& scheme, const std::string& mime_type );
-
- // convenience functions for getting suggested texture sizes to hold various size media
- static int textureWidthFromMediaWidth( int media_width );
- static int textureHeightFromMediaHeight( int media_height );
-
- private:
- LLMediaManager();
- static LLMediaManager* sInstance;
-
- typedef std::set< LLMediaBase* > media_impl_container_t;
- media_impl_container_t mMediaImplContainer;
-
- typedef std::map< std::string, std::string > mime_type_impl_name_container_t;
- mime_type_impl_name_container_t mMimeTypeImplNameContainer;
-};
-
-#endif // LLMEDIAMANAGER_H
diff --git a/linden/indra/llmedia/llmediaobserver.h b/linden/indra/llmedia/llmediaobserver.h
deleted file mode 100644
index ab8d755..0000000
--- a/linden/indra/llmedia/llmediaobserver.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/**
- * @file llmediaobserver.h
- * @brief Derrive from this class and override methods to observe events from emitter class
- *
- * $LicenseInfo:firstyear=2007&license=viewergpl$
- *
- * Copyright (c) 2007-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LLMEDIAEOBSERVER_H
-#define LLMEDIAEOBSERVER_H
-
-class LLMediaBase;
-
-class LLMediaEvent
-{
- public:
- LLMediaEvent( LLMediaBase* subject ) :
- mSubject( subject ), mIntValue(-1)
- {
- };
-
- LLMediaEvent( LLMediaBase* subject, std::string in ) :
- mSubject( subject ), mIntValue(-1), mStringValue(in)
- {
- };
-
- LLMediaEvent( LLMediaBase* subject, std::string string_in, std::string string_ex_in ) :
- mSubject( subject ), mIntValue(-1), mStringValue(string_in), mStringValueEx(string_ex_in)
- {
- };
-
- LLMediaEvent( LLMediaBase* subject, std::string string_in, int int_in ) :
- mSubject( subject ), mIntValue(int_in), mStringValue(string_in)
- {
- };
-
- LLMediaEvent( LLMediaBase* subject, int in ) :
- mSubject( subject ), mIntValue(in)
- {
- };
-
- virtual ~LLMediaEvent() { }
-
- LLMediaBase* getSubject() const
- {
- return mSubject;
- };
-
- int getIntValue() const
- {
- return mIntValue;
- }
-
- std::string getStringValue() const
- {
- return mStringValue;
- }
-
- std::string getStringValueEx() const
- {
- return mStringValueEx;
- }
-
- private:
- LLMediaBase* mSubject;
- int mIntValue;
- std::string mStringValue;
- std::string mStringValueEx;
-};
-
-class LLMediaObserver
-{
- public:
- virtual ~LLMediaObserver() {}
-
- typedef LLMediaEvent EventType;
- virtual void onMediaPreroll( const EventType& event_in ) { }
- virtual void onMediaLoaded( const EventType& event_in ) { }
- virtual void onMediaSizeChange( const EventType& event_in ) { }
- virtual void onMediaContentsChange( const EventType& event_in ) { }
- virtual void onMediaStatusTextChange( const EventType& event_in ) { }
- virtual void onMediaTitleChange( const EventType &event_in ) { }
- virtual void onNavigateBegin( const EventType& event_in ) { }
- virtual void onNavigateComplete( const EventType& event_in ) { }
- virtual void onUpdateProgress( const EventType& event_in ) { }
- virtual void onStatusTextChange( const EventType& event_in ) { }
- virtual void onLocationChange( const EventType& event_in ) { }
- virtual void onClickLinkHref( const EventType& event_in ) { }
- virtual void onClickLinkNoFollow( const EventType& event_in ) { }
-};
-
-#endif // LLMEDIAEOBSERVER_H
diff --git a/linden/indra/llmessage/tests/commtest.h b/linden/indra/llmessage/tests/commtest.h
new file mode 100644
index 0000000..cf1461e
--- /dev/null
+++ b/linden/indra/llmessage/tests/commtest.h
@@ -0,0 +1,83 @@
+/**
+ * @file commtest.h
+ * @author Nat Goodspeed
+ * @date 2009-01-09
+ * @brief
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_COMMTEST_H)
+#define LL_COMMTEST_H
+
+#include "networkio.h"
+#include "llevents.h"
+#include "llsd.h"
+#include "llhost.h"
+#include "stringize.h"
+#include
+
+/**
+ * This struct is shared by a couple of standalone comm tests (ADD_COMM_BUILD_TEST).
+ */
+struct commtest_data
+{
+ NetworkIO& netio;
+ LLEventPumps& pumps;
+ LLEventStream replyPump, errorPump;
+ LLSD result;
+ bool success;
+ LLHost host;
+ std::string server;
+
+ commtest_data():
+ netio(NetworkIO::instance()),
+ pumps(LLEventPumps::instance()),
+ replyPump("reply"),
+ errorPump("error"),
+ success(false),
+ host("127.0.0.1", 8000),
+ server(STRINGIZE("http://" << host.getString() << "/"))
+ {
+ replyPump.listen("self", boost::bind(&commtest_data::outcome, this, _1, true));
+ errorPump.listen("self", boost::bind(&commtest_data::outcome, this, _1, false));
+ }
+
+ bool outcome(const LLSD& _result, bool _success)
+ {
+// std::cout << "commtest_data::outcome(" << _result << ", " << _success << ")\n";
+ result = _result;
+ success = _success;
+ // Break the wait loop in NetworkIO::pump(), otherwise devs get
+ // irritated at making the big monolithic test executable take longer
+ pumps.obtain("done").post(success);
+ return false;
+ }
+};
+
+#endif /* ! defined(LL_COMMTEST_H) */
diff --git a/linden/indra/llmessage/tests/llcurl_stub.cpp b/linden/indra/llmessage/tests/llcurl_stub.cpp
new file mode 100644
index 0000000..c73a565
--- /dev/null
+++ b/linden/indra/llmessage/tests/llcurl_stub.cpp
@@ -0,0 +1,100 @@
+/**
+ * @file llcurl_stub.cpp
+ * @brief stub class to allow unit testing
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+#include "llcurl.h"
+
+LLCurl::Responder::Responder() : mReferenceCount(0)
+{
+}
+
+void LLCurl::Responder::completed(U32 status, std::basic_string, std::allocator > const &reason,
+ LLSD const& mContent)
+{
+ if (isGoodStatus(status))
+ {
+ result(mContent);
+ }
+ else
+ {
+ error(status, reason, mContent);
+ }
+}
+
+void LLCurl::Responder::completedHeader(unsigned,
+ std::basic_string, std::allocator > const&,
+ LLSD const&)
+{
+}
+
+void LLCurl::Responder::completedRaw(unsigned,
+ std::basic_string, std::allocator > const&,
+ LLChannelDescriptors const&,
+ boost::shared_ptr const&)
+{
+}
+
+void LLCurl::Responder::error(unsigned,
+ std::basic_string, std::allocator > const&,
+ LLSD const&)
+{
+}
+
+LLCurl::Responder::~Responder ()
+{
+}
+
+void LLCurl::Responder::error(unsigned,
+ std::basic_string, std::allocator > const&)
+{
+}
+
+void LLCurl::Responder::result(LLSD const&)
+{
+}
+
+namespace boost
+{
+ void intrusive_ptr_add_ref(LLCurl::Responder* p)
+ {
+ ++p->mReferenceCount;
+ }
+
+ void intrusive_ptr_release(LLCurl::Responder* p)
+ {
+ if(p && 0 == --p->mReferenceCount)
+ {
+ delete p;
+ }
+ }
+};
+
diff --git a/linden/indra/llmessage/tests/llhttpclientadapter_test.cpp b/linden/indra/llmessage/tests/llhttpclientadapter_test.cpp
new file mode 100644
index 0000000..7065c9d
--- /dev/null
+++ b/linden/indra/llmessage/tests/llhttpclientadapter_test.cpp
@@ -0,0 +1,170 @@
+/**
+ * @file
+ * @brief
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llhttpclientadapter.h"
+
+#include "../test/lltut.h"
+#include "llhttpclient.h"
+#include "llcurl_stub.cpp"
+
+float const HTTP_REQUEST_EXPIRY_SECS = 1.0F;
+
+std::vector get_urls;
+std::vector > get_responders;
+void LLHTTPClient::get(const std::string& url, boost::intrusive_ptr responder, const LLSD& headers, const F32 timeout)
+{
+ get_urls.push_back(url);
+ get_responders.push_back(responder);
+}
+
+std::vector put_urls;
+std::vector put_body;
+std::vector > put_responders;
+
+void LLHTTPClient::put(const std::string& url, const LLSD& body, boost::intrusive_ptr responder, const LLSD& headers, const F32 timeout)
+{
+ put_urls.push_back(url);
+ put_responders.push_back(responder);
+ put_body.push_back(body);
+
+}
+
+
+namespace tut
+{
+ struct LLHTTPClientAdapterData
+ {
+ LLHTTPClientAdapterData()
+ {
+ get_urls.clear();
+ get_responders.clear();
+ put_urls.clear();
+ put_responders.clear();
+ put_body.clear();
+ }
+ };
+
+ typedef test_group factory;
+ typedef factory::object object;
+}
+
+namespace
+{
+ tut::factory tf("LLHTTPClientAdapterData test");
+}
+
+namespace tut
+{
+ // Ensure we can create the object
+ template<> template<>
+ void object::test<1>()
+ {
+ LLHTTPClientAdapter adapter;
+ }
+
+ // Does the get pass the appropriate arguments to the LLHTTPClient
+ template<> template<>
+ void object::test<2>()
+ {
+ LLHTTPClientAdapter adapter;
+
+ boost::intrusive_ptr responder = new LLCurl::Responder();
+
+ adapter.get("Made up URL", responder);
+ ensure_equals(get_urls.size(), 1);
+ ensure_equals(get_urls[0], "Made up URL");
+ }
+
+ // Ensure the responder matches the one passed to get
+ template<> template<>
+ void object::test<3>()
+ {
+ LLHTTPClientAdapter adapter;
+ boost::intrusive_ptr responder = new LLCurl::Responder();
+
+ adapter.get("Made up URL", responder);
+
+ ensure_equals(get_responders.size(), 1);
+ ensure_equals(get_responders[0].get(), responder.get());
+ }
+
+ // Ensure the correct url is used in the put
+ template<> template<>
+ void object::test<4>()
+ {
+ LLHTTPClientAdapter adapter;
+
+ boost::intrusive_ptr responder = new LLCurl::Responder();
+
+ LLSD body;
+ body["TestBody"] = "Foobar";
+
+ adapter.put("Made up URL", body, responder);
+ ensure_equals(put_urls.size(), 1);
+ ensure_equals(put_urls[0], "Made up URL");
+ }
+
+ // Ensure the correct responder is used by put
+ template<> template<>
+ void object::test<5>()
+ {
+ LLHTTPClientAdapter adapter;
+
+ boost::intrusive_ptr responder = new LLCurl::Responder();
+
+ LLSD body;
+ body["TestBody"] = "Foobar";
+
+ adapter.put("Made up URL", body, responder);
+
+ ensure_equals(put_responders.size(), 1);
+ ensure_equals(put_responders[0].get(), responder.get());
+ }
+
+ // Ensure the message body is passed through the put properly
+ template<> template<>
+ void object::test<6>()
+ {
+ LLHTTPClientAdapter adapter;
+
+ boost::intrusive_ptr responder = new LLCurl::Responder();
+
+ LLSD body;
+ body["TestBody"] = "Foobar";
+
+ adapter.put("Made up URL", body, responder);
+
+ ensure_equals(put_body.size(), 1);
+ ensure_equals(put_body[0]["TestBody"].asString(), "Foobar");
+ }
+}
+
diff --git a/linden/indra/llmessage/tests/lltemplatemessagedispatcher_test.cpp b/linden/indra/llmessage/tests/lltemplatemessagedispatcher_test.cpp
new file mode 100644
index 0000000..d57f17f
--- /dev/null
+++ b/linden/indra/llmessage/tests/lltemplatemessagedispatcher_test.cpp
@@ -0,0 +1,165 @@
+/**
+ * @file lltrustedmessageservice_test.cpp
+ * @brief LLTrustedMessageService unit tests
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "lltemplatemessagedispatcher.h"
+#include "lltut.h"
+
+#include "llhttpnode.h"
+#include "llhost.h"
+#include "message.h"
+#include "llsd.h"
+
+#include "llhost.cpp" // Needed for copy operator
+#include "net.cpp" // Needed by LLHost.
+
+LLMessageSystem * gMessageSystem = NULL;
+
+// sensor test doubles
+bool gClearRecvWasCalled = false;
+void LLMessageSystem::clearReceiveState(void)
+{
+ gClearRecvWasCalled = true;
+}
+
+char gUdpDispatchedData[MAX_BUFFER_SIZE];
+bool gUdpDispatchWasCalled = false;
+BOOL LLTemplateMessageReader::readMessage(const U8* data,class LLHost const &)
+{
+ gUdpDispatchWasCalled = true;
+ strcpy(gUdpDispatchedData, reinterpret_cast(data));
+ return true;
+}
+
+BOOL gValidateMessage = FALSE;
+BOOL LLTemplateMessageReader::validateMessage(const U8*, S32 buffer_size, LLHost const &sender, bool trusted)
+{
+ return gValidateMessage;
+}
+
+LLHost host;
+const LLHost& LLMessageSystem::getSender() const
+{
+ return host;
+}
+
+const char* gBinaryTemplateData = "BINARYTEMPLATEDATA";
+void fillVector(std::vector& vector_data, const char* data)
+{
+ vector_data.resize(strlen(data) + 1);
+ strcpy(reinterpret_cast(&vector_data[0]), data);
+}
+
+namespace tut
+{
+ static LLTemplateMessageReader::message_template_number_map_t numberMap;
+
+ struct LLTemplateMessageDispatcherData
+ {
+ LLTemplateMessageDispatcherData()
+ {
+ mMessageName = "MessageName";
+ gUdpDispatchWasCalled = false;
+ gClearRecvWasCalled = false;
+ gValidateMessage = FALSE;
+ mMessage["body"]["binary-template-data"] = std::vector();
+ }
+
+ LLSD mMessage;
+ LLHTTPNode::ResponsePtr mResponsePtr;
+ std::string mMessageName;
+ };
+
+ typedef test_group factory;
+ typedef factory::object object;
+}
+
+namespace
+{
+ tut::factory tf("LLTemplateMessageDispatcher test");
+}
+
+namespace tut
+{
+ // does an empty message stop processing?
+ template<> template<>
+ void object::test<1>()
+ {
+ LLTemplateMessageReader* pReader = NULL;
+ LLTemplateMessageDispatcher t(*pReader);
+ t.dispatch(mMessageName, mMessage, mResponsePtr);
+ ensure(! gUdpDispatchWasCalled);
+ ensure(! gClearRecvWasCalled);
+ }
+
+ // does the disaptch invoke the udp send method?
+ template<> template<>
+ void object::test<2>()
+ {
+ LLTemplateMessageReader* pReader = NULL;
+ LLTemplateMessageDispatcher t(*pReader);
+ gValidateMessage = TRUE;
+ std::vector vector_data;
+ fillVector(vector_data, gBinaryTemplateData);
+ mMessage["body"]["binary-template-data"] = vector_data;
+ t.dispatch(mMessageName, mMessage, mResponsePtr);
+ ensure("udp dispatch was called", gUdpDispatchWasCalled);
+ }
+
+ // what if the message wasn't valid? We would hope the message gets cleared!
+ template<> template<>
+ void object::test<3>()
+ {
+ LLTemplateMessageReader* pReader = NULL;
+ LLTemplateMessageDispatcher t(*pReader);
+ std::vector vector_data;
+ fillVector(vector_data, gBinaryTemplateData);
+ mMessage["body"]["binary-template-data"] = vector_data;
+ gValidateMessage = FALSE;
+ t.dispatch(mMessageName, mMessage, mResponsePtr);
+ ensure("clear received message was called", gClearRecvWasCalled);
+ }
+
+ // is the binary data passed through correctly?
+ template<> template<>
+ void object::test<4>()
+ {
+ LLTemplateMessageReader* pReader = NULL;
+ LLTemplateMessageDispatcher t(*pReader);
+ gValidateMessage = TRUE;
+ std::vector vector_data;
+ fillVector(vector_data, gBinaryTemplateData);
+ mMessage["body"]["binary-template-data"] = vector_data;
+ t.dispatch(mMessageName, mMessage, mResponsePtr);
+ ensure("data couriered correctly", strcmp(gBinaryTemplateData, gUdpDispatchedData) == 0);
+ }
+}
+
diff --git a/linden/indra/llmessage/tests/lltesthttpclientadapter.cpp b/linden/indra/llmessage/tests/lltesthttpclientadapter.cpp
new file mode 100644
index 0000000..6361f1c
--- /dev/null
+++ b/linden/indra/llmessage/tests/lltesthttpclientadapter.cpp
@@ -0,0 +1,67 @@
+/**
+ * @file
+ * @brief
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+#include "lltesthttpclientadapter.h"
+
+LLTestHTTPClientAdapter::LLTestHTTPClientAdapter()
+{
+}
+
+LLTestHTTPClientAdapter::~LLTestHTTPClientAdapter()
+{
+}
+
+void LLTestHTTPClientAdapter::get(const std::string& url, LLCurl::ResponderPtr responder)
+{
+ mGetUrl.push_back(url);
+ mGetResponder.push_back(responder);
+}
+
+void LLTestHTTPClientAdapter::put(const std::string& url, const LLSD& body, LLCurl::ResponderPtr responder)
+{
+ mPutUrl.push_back(url);
+ mPutBody.push_back(body);
+ mPutResponder.push_back(responder);
+}
+
+U32 LLTestHTTPClientAdapter::putCalls() const
+{
+ return mPutUrl.size();
+}
+
+void LLTestHTTPClientAdapter::get(const std::string& url, LLCurl::ResponderPtr responder, const LLSD& headers)
+{
+ mGetUrl.push_back(url);
+ mGetHeaders.push_back(headers);
+ mGetResponder.push_back(responder);
+}
+
+
diff --git a/linden/indra/llmessage/tests/lltesthttpclientadapter.h b/linden/indra/llmessage/tests/lltesthttpclientadapter.h
new file mode 100644
index 0000000..ac2afa8
--- /dev/null
+++ b/linden/indra/llmessage/tests/lltesthttpclientadapter.h
@@ -0,0 +1,63 @@
+/**
+ * @file
+ * @brief
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+/* Macro Definitions */
+#ifndef LL_LLTESTHTTPCLIENTADAPTER_H
+#define LL_LLTESTHTTPCLIENTADAPTER_H
+
+
+#include "linden_common.h"
+#include "llhttpclientinterface.h"
+
+class LLTestHTTPClientAdapter : public LLHTTPClientInterface
+{
+public:
+ LLTestHTTPClientAdapter();
+ virtual ~LLTestHTTPClientAdapter();
+ virtual void get(const std::string& url, LLCurl::ResponderPtr responder);
+ virtual void get(const std::string& url, LLCurl::ResponderPtr responder, const LLSD& headers);
+
+ virtual void put(const std::string& url, const LLSD& body, LLCurl::ResponderPtr responder);
+ U32 putCalls() const;
+
+ std::vector mPutBody;
+ std::vector mGetHeaders;
+ std::vector mPutUrl;
+ std::vector mGetUrl;
+ std::vector mPutResponder;
+ std::vector mGetResponder;
+};
+
+
+
+#endif //LL_LLSIMULATORPRESENCESENDER_H
+
diff --git a/linden/indra/llmessage/tests/lltestmessagesender.cpp b/linden/indra/llmessage/tests/lltestmessagesender.cpp
new file mode 100644
index 0000000..5e8a87f
--- /dev/null
+++ b/linden/indra/llmessage/tests/lltestmessagesender.cpp
@@ -0,0 +1,44 @@
+/**
+ * @file
+ * @brief
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+#include "lltestmessagesender.h"
+
+LLTestMessageSender::~LLTestMessageSender()
+{
+}
+
+
+S32 LLTestMessageSender::sendMessage(const LLHost& host, LLStoredMessagePtr message)
+{
+ mSendHosts.push_back(host);
+ mSendMessages.push_back(message);
+ return 0;
+}
diff --git a/linden/indra/llmessage/tests/lltestmessagesender.h b/linden/indra/llmessage/tests/lltestmessagesender.h
new file mode 100644
index 0000000..f57210e
--- /dev/null
+++ b/linden/indra/llmessage/tests/lltestmessagesender.h
@@ -0,0 +1,57 @@
+/**
+ * @file
+ * @brief
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+/* Macro Definitions */
+#ifndef LL_LLTESTMESSAGESENDER_H
+#define LL_LLTESTMESSAGESENDER_H
+
+
+#include "linden_common.h"
+#include "llmessagesenderinterface.h"
+#include
+
+
+
+class LLTestMessageSender : public LLMessageSenderInterface
+{
+public:
+ virtual ~LLTestMessageSender();
+ virtual S32 sendMessage(const LLHost& host, LLStoredMessagePtr message);
+
+ std::vector mSendHosts;
+ std::vector mSendMessages;
+};
+
+
+
+#endif //LL_LLTESTMESSAGESENDER_H
+
diff --git a/linden/indra/llmessage/tests/lltrustedmessageservice_test.cpp b/linden/indra/llmessage/tests/lltrustedmessageservice_test.cpp
new file mode 100644
index 0000000..0a3da4b
--- /dev/null
+++ b/linden/indra/llmessage/tests/lltrustedmessageservice_test.cpp
@@ -0,0 +1,146 @@
+/**
+ * @file lltrustedmessageservice_test.cpp
+ * @brief LLTrustedMessageService unit tests
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "lltrustedmessageservice.h"
+#include "../test/lltut.h"
+
+#include "llhost.cpp" // LLHost is a value type for test purposes.
+#include "net.cpp" // Needed by LLHost.
+
+#include "message.h"
+#include "llmessageconfig.h"
+
+LLMessageSystem* gMessageSystem = NULL;
+
+LLMessageConfig::SenderTrust
+LLMessageConfig::getSenderTrustedness(const std::string& msg_name)
+{
+ return LLMessageConfig::NOT_SET;
+}
+
+void LLMessageSystem::receivedMessageFromTrustedSender()
+{
+}
+
+bool LLMessageSystem::isTrustedSender(const LLHost& host) const
+{
+ return false;
+}
+
+bool LLMessageSystem::isTrustedMessage(const std::string& name) const
+{
+ return false;
+}
+
+bool messageDispatched = false;
+bool messageDispatchedAsBinary = false;
+LLSD lastLLSD;
+std::string lastMessageName;
+
+void LLMessageSystem::dispatch(const std::string& msg_name,
+ const LLSD& message,
+ LLHTTPNode::ResponsePtr responsep)
+{
+ messageDispatched = true;
+ lastLLSD = message;
+ lastMessageName = msg_name;
+}
+
+void LLMessageSystem::dispatchTemplate(const std::string& msg_name,
+ const LLSD& message,
+ LLHTTPNode::ResponsePtr responsep)
+{
+ lastLLSD = message;
+ lastMessageName = msg_name;
+ messageDispatchedAsBinary = true;
+}
+
+namespace tut
+{
+ struct LLTrustedMessageServiceData
+ {
+ LLTrustedMessageServiceData()
+ {
+ LLSD emptyLLSD;
+ lastLLSD = emptyLLSD;
+ lastMessageName = "uninitialised message name";
+ messageDispatched = false;
+ messageDispatchedAsBinary = false;
+ }
+ };
+
+ typedef test_group factory;
+ typedef factory::object object;
+}
+
+namespace
+{
+ tut::factory tf("LLTrustedMessageServiceData test");
+}
+
+namespace tut
+{
+ // characterisation tests
+
+ // 1) test that messages get forwarded with names etc. as current behaviour (something like LLMessageSystem::dispatch(name, data...)
+
+ // test llsd messages are sent as normal using LLMessageSystem::dispatch() (eventually)
+ template<> template<>
+ void object::test<1>()
+ {
+ LLHTTPNode::ResponsePtr response;
+ LLSD input;
+ LLSD context;
+ LLTrustedMessageService adapter;
+ adapter.post(response, context, input);
+ // test original ting got called wit nowt, ya get me blood?
+ ensure_equals(messageDispatched, true);
+ ensure(lastLLSD.has("body"));
+ }
+
+ // test that llsd wrapped binary-template-data messages are
+ // sent via LLMessageSystem::binaryDispatch() or similar
+ template<> template<>
+ void object::test<2>()
+ {
+ LLHTTPNode::ResponsePtr response;
+ LLSD input;
+ input["binary-template-data"] = "10001010110"; //make me a message here.
+ LLSD context;
+ LLTrustedMessageService adapter;
+
+ adapter.post(response, context, input);
+ ensure("check template-binary-data message was dispatched as binary", messageDispatchedAsBinary);
+ ensure_equals(lastLLSD["body"]["binary-template-data"].asString(), "10001010110");
+ // test somit got called with "10001010110" (something like LLMessageSystem::dispatchTemplate(blah))
+ }
+}
diff --git a/linden/indra/llmessage/tests/networkio.h b/linden/indra/llmessage/tests/networkio.h
new file mode 100644
index 0000000..0ebe369
--- /dev/null
+++ b/linden/indra/llmessage/tests/networkio.h
@@ -0,0 +1,116 @@
+/**
+ * @file networkio.h
+ * @author Nat Goodspeed
+ * @date 2009-01-09
+ * @brief
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_NETWORKIO_H)
+#define LL_NETWORKIO_H
+
+#include "llmemory.h" // LLSingleton
+#include "llapr.h"
+#include "llares.h"
+#include "llpumpio.h"
+#include "llhttpclient.h"
+
+/*****************************************************************************
+* NetworkIO
+*****************************************************************************/
+// Doing this initialization in a class constructor makes sense. But we don't
+// want to redo it for each different test. Nor do we want to do it at static-
+// init time. Use the lazy, on-demand initialization we get from LLSingleton.
+class NetworkIO: public LLSingleton
+{
+public:
+ NetworkIO():
+ mServicePump(NULL),
+ mDone(false)
+ {
+ ll_init_apr();
+ if (! gAPRPoolp)
+ {
+ throw std::runtime_error("Can't initialize APR");
+ }
+
+ // Create IO Pump to use for HTTP Requests.
+ mServicePump = new LLPumpIO(gAPRPoolp);
+ LLHTTPClient::setPump(*mServicePump);
+ if (ll_init_ares() == NULL || !gAres->isInitialized())
+ {
+ throw std::runtime_error("Can't start DNS resolver");
+ }
+
+ // You can interrupt pump() without waiting the full timeout duration
+ // by posting an event to the LLEventPump named "done".
+ LLEventPumps::instance().obtain("done").listen("self",
+ boost::bind(&NetworkIO::done, this, _1));
+ }
+
+ bool pump(F32 timeout=10)
+ {
+ // Reset the done flag so we don't pop out prematurely
+ mDone = false;
+ // Evidently the IO structures underlying LLHTTPClient need to be
+ // "pumped". Do some stuff normally performed in the viewer's main
+ // loop.
+ LLTimer timer;
+ while (timer.getElapsedTimeF32() < timeout)
+ {
+ if (mDone)
+ {
+// std::cout << "NetworkIO::pump(" << timeout << "): breaking loop after "
+// << timer.getElapsedTimeF32() << " seconds\n";
+ return true;
+ }
+ pumpOnce();
+ }
+ return false;
+ }
+
+ void pumpOnce()
+ {
+ gAres->process();
+ mServicePump->pump();
+ mServicePump->callback();
+ }
+
+ bool done(const LLSD&)
+ {
+ mDone = true;
+ return false;
+ }
+
+private:
+ LLPumpIO* mServicePump;
+ bool mDone;
+};
+
+#endif /* ! defined(LL_NETWORKIO_H) */
diff --git a/linden/indra/llmessage/tests/test_llsdmessage_peer.py b/linden/indra/llmessage/tests/test_llsdmessage_peer.py
new file mode 100644
index 0000000..655169d
--- /dev/null
+++ b/linden/indra/llmessage/tests/test_llsdmessage_peer.py
@@ -0,0 +1,153 @@
+#!/usr/bin/python
+"""\
+@file test_llsdmessage_peer.py
+@author Nat Goodspeed
+@date 2008-10-09
+@brief This script asynchronously runs the executable (with args) specified on
+ the command line, returning its result code. While that executable is
+ running, we provide dummy local services for use by C++ tests.
+
+$LicenseInfo:firstyear=2008&license=viewergpl$
+
+Copyright (c) 2008-2009, Linden Research, Inc.
+
+Second Life Viewer Source Code
+The source code in this file ("Source Code") is provided by Linden Lab
+to you under the terms of the GNU General Public License, version 2.0
+("GPL"), unless you have obtained a separate licensing agreement
+("Other License"), formally executed by you and Linden Lab. Terms of
+the GPL can be found in doc/GPL-license.txt in this distribution, or
+online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+
+There are special exceptions to the terms and conditions of the GPL as
+it is applied to this Source Code. View the full text of the exception
+in the file doc/FLOSS-exception.txt in this software distribution, or
+online at
+http://secondlifegrid.net/programs/open_source/licensing/flossexception
+
+By copying, modifying or distributing this software, you acknowledge
+that you have read and understood your obligations described above,
+and agree to abide by those obligations.
+
+ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+COMPLETENESS OR PERFORMANCE.
+$/LicenseInfo$
+"""
+
+import os
+import sys
+from threading import Thread
+from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
+mydir = os.path.dirname(__file__) # expected to be .../indra/llmessage/tests/
+sys.path.insert(0, os.path.join(mydir, os.pardir, os.pardir, "lib", "python"))
+from indra.util.fastest_elementtree import parse as xml_parse
+from indra.base import llsd
+
+def debug(*args):
+ sys.stdout.writelines(args)
+ sys.stdout.flush()
+# comment out the line below to enable debug output
+debug = lambda *args: None
+
+class TestHTTPRequestHandler(BaseHTTPRequestHandler):
+ """This subclass of BaseHTTPRequestHandler is to receive and echo
+ LLSD-flavored messages sent by the C++ LLHTTPClient.
+ """
+ def read(self):
+ # The following logic is adapted from the library module
+ # SimpleXMLRPCServer.py.
+ # Get arguments by reading body of request.
+ # We read this in chunks to avoid straining
+ # socket.read(); around the 10 or 15Mb mark, some platforms
+ # begin to have problems (bug #792570).
+ try:
+ size_remaining = int(self.headers["content-length"])
+ except (KeyError, ValueError):
+ return ""
+ max_chunk_size = 10*1024*1024
+ L = []
+ while size_remaining:
+ chunk_size = min(size_remaining, max_chunk_size)
+ chunk = self.rfile.read(chunk_size)
+ L.append(chunk)
+ size_remaining -= len(chunk)
+ return ''.join(L)
+ # end of swiped read() logic
+
+ def read_xml(self):
+ # This approach reads the entire POST data into memory first
+ return llsd.parse(self.read())
+## # This approach attempts to stream in the LLSD XML from self.rfile,
+## # assuming that the underlying XML parser reads its input file
+## # incrementally. Unfortunately I haven't been able to make it work.
+## tree = xml_parse(self.rfile)
+## debug("Finished raw parse\n")
+## debug("parsed XML tree %s\n" % tree)
+## debug("parsed root node %s\n" % tree.getroot())
+## debug("root node tag %s\n" % tree.getroot().tag)
+## return llsd.to_python(tree.getroot())
+
+ def do_GET(self):
+ # Of course, don't attempt to read data.
+ self.answer(dict(reply="success", status=500,
+ reason="Your GET operation requested failure"))
+
+ def do_POST(self):
+ # Read the provided POST data.
+ self.answer(self.read_xml())
+
+ def answer(self, data):
+ if "fail" not in self.path:
+ response = llsd.format_xml(data.get("reply", llsd.LLSD("success")))
+ self.send_response(200)
+ self.send_header("Content-type", "application/llsd+xml")
+ self.send_header("Content-Length", str(len(response)))
+ self.end_headers()
+ self.wfile.write(response)
+ else: # fail requested
+ status = data.get("status", 500)
+ reason = data.get("reason",
+ self.responses.get(status,
+ ("fail requested",
+ "Your request specified failure status %s "
+ "without providing a reason" % status))[1])
+ self.send_error(status, reason)
+
+ def log_request(self, code, size=None):
+ # For present purposes, we don't want the request splattered onto
+ # stderr, as it would upset devs watching the test run
+ pass
+
+ def log_error(self, format, *args):
+ # Suppress error output as well
+ pass
+
+class TestHTTPServer(Thread):
+ def run(self):
+ httpd = HTTPServer(('127.0.0.1', 8000), TestHTTPRequestHandler)
+ debug("Starting HTTP server...\n")
+ httpd.serve_forever()
+
+def main(*args):
+ # Start HTTP server thread. Note that this and all other comm server
+ # threads should be daemon threads: we'll let them run "forever,"
+ # confident that the whole process will terminate when the main thread
+ # terminates, which will be when the test executable child process
+ # terminates.
+ httpThread = TestHTTPServer(name="httpd")
+ httpThread.setDaemon(True)
+ httpThread.start()
+ # choice of os.spawnv():
+ # - [v vs. l] pass a list of args vs. individual arguments,
+ # - [no p] don't use the PATH because we specifically want to invoke the
+ # executable passed as our first arg,
+ # - [no e] child should inherit this process's environment.
+ debug("Running %s...\n" % (" ".join(args)))
+ sys.stdout.flush()
+ rc = os.spawnv(os.P_WAIT, args[0], args)
+ debug("%s returned %s\n" % (args[0], rc))
+ return rc
+
+if __name__ == "__main__":
+ sys.exit(main(*sys.argv[1:]))
diff --git a/linden/indra/llplugin/CMakeLists.txt b/linden/indra/llplugin/CMakeLists.txt
new file mode 100644
index 0000000..6706775
--- /dev/null
+++ b/linden/indra/llplugin/CMakeLists.txt
@@ -0,0 +1,55 @@
+# -*- cmake -*-
+
+project(llplugin)
+
+include(00-Common)
+include(LLCommon)
+include(LLImage)
+include(LLMath)
+include(LLMessage)
+include(LLRender)
+include(LLXML)
+include(LLWindow)
+
+include_directories(
+ ${LLCOMMON_INCLUDE_DIRS}
+ ${LLIMAGE_INCLUDE_DIRS}
+ ${LLMATH_INCLUDE_DIRS}
+ ${LLMESSAGE_INCLUDE_DIRS}
+ ${LLRENDER_INCLUDE_DIRS}
+ ${LLXML_INCLUDE_DIRS}
+ ${LLWINDOW_INCLUDE_DIRS}
+ )
+
+set(llplugin_SOURCE_FILES
+ llpluginclassmedia.cpp
+ llplugininstance.cpp
+ llpluginmessage.cpp
+ llpluginmessagepipe.cpp
+ llpluginprocesschild.cpp
+ llpluginprocessparent.cpp
+ llpluginsharedmemory.cpp
+ )
+
+set(llplugin_HEADER_FILES
+ CMakeLists.txt
+
+ llpluginclassmedia.h
+ llpluginclassmediaowner.h
+ llplugininstance.h
+ llpluginmessage.h
+ llpluginmessageclasses.h
+ llpluginmessagepipe.h
+ llpluginprocesschild.h
+ llpluginprocessparent.h
+ llpluginsharedmemory.h
+ )
+
+set_source_files_properties(${llplugin_HEADER_FILES}
+ PROPERTIES HEADER_FILE_ONLY TRUE)
+
+list(APPEND llplugin_SOURCE_FILES ${llplugin_HEADER_FILES})
+
+add_library (llplugin ${llplugin_SOURCE_FILES})
+
+add_subdirectory(slplugin)
diff --git a/linden/indra/llplugin/llpluginclassmedia.cpp b/linden/indra/llplugin/llpluginclassmedia.cpp
new file mode 100644
index 0000000..a6f6f30
--- /dev/null
+++ b/linden/indra/llplugin/llpluginclassmedia.cpp
@@ -0,0 +1,1162 @@
+/**
+ * @file llpluginclassmedia.cpp
+ * @brief LLPluginClassMedia handles a plugin which knows about the "media" message class.
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+#include "indra_constants.h"
+
+#include "llpluginclassmedia.h"
+#include "llpluginmessageclasses.h"
+
+static int LOW_PRIORITY_TEXTURE_SIZE_DEFAULT = 256;
+
+static int nextPowerOf2( int value )
+{
+ int next_power_of_2 = 1;
+ while ( next_power_of_2 < value )
+ {
+ next_power_of_2 <<= 1;
+ }
+
+ return next_power_of_2;
+}
+
+LLPluginClassMedia::LLPluginClassMedia(LLPluginClassMediaOwner *owner)
+{
+ mOwner = owner;
+ mPlugin = NULL;
+ reset();
+}
+
+
+LLPluginClassMedia::~LLPluginClassMedia()
+{
+ reset();
+}
+
+bool LLPluginClassMedia::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path)
+{
+ LL_DEBUGS("Plugin") << "launcher: " << launcher_filename << LL_ENDL;
+ LL_DEBUGS("Plugin") << "plugin: " << plugin_filename << LL_ENDL;
+ LL_DEBUGS("Plugin") << "user_data_path: " << user_data_path << LL_ENDL;
+
+ mPlugin = new LLPluginProcessParent(this);
+ mPlugin->setSleepTime(mSleepTime);
+ mPlugin->init(launcher_filename, plugin_filename, debug, user_data_path);
+
+ return true;
+}
+
+
+void LLPluginClassMedia::reset()
+{
+ if(mPlugin != NULL)
+ {
+ delete mPlugin;
+ mPlugin = NULL;
+ }
+
+ mTextureParamsReceived = false;
+ mRequestedTextureDepth = 0;
+ mRequestedTextureInternalFormat = 0;
+ mRequestedTextureFormat = 0;
+ mRequestedTextureType = 0;
+ mRequestedTextureSwapBytes = false;
+ mRequestedTextureCoordsOpenGL = false;
+ mTextureSharedMemorySize = 0;
+ mTextureSharedMemoryName.clear();
+ mDefaultMediaWidth = 0;
+ mDefaultMediaHeight = 0;
+ mNaturalMediaWidth = 0;
+ mNaturalMediaHeight = 0;
+ mSetMediaWidth = -1;
+ mSetMediaHeight = -1;
+ mRequestedMediaWidth = 0;
+ mRequestedMediaHeight = 0;
+ mFullMediaWidth = 0;
+ mFullMediaHeight = 0;
+ mTextureWidth = 0;
+ mTextureHeight = 0;
+ mMediaWidth = 0;
+ mMediaHeight = 0;
+ mDirtyRect = LLRect::null;
+ mAutoScaleMedia = false;
+ mRequestedVolume = 1.0f;
+ mPriority = PRIORITY_NORMAL;
+ mLowPrioritySizeLimit = LOW_PRIORITY_TEXTURE_SIZE_DEFAULT;
+ mAllowDownsample = false;
+ mPadding = 0;
+ mLastMouseX = 0;
+ mLastMouseY = 0;
+ mStatus = LLPluginClassMediaOwner::MEDIA_NONE;
+ mSleepTime = 1.0f / 100.0f;
+ mCanCut = false;
+ mCanCopy = false;
+ mCanPaste = false;
+ mMediaName.clear();
+ mMediaDescription.clear();
+
+ // media_browser class
+ mNavigateURI.clear();
+ mNavigateResultCode = -1;
+ mNavigateResultString.clear();
+ mHistoryBackAvailable = false;
+ mHistoryForwardAvailable = false;
+ mStatusText.clear();
+ mProgressPercent = 0;
+
+ // media_time class
+ mCurrentTime = 0.0f;
+ mDuration = 0.0f;
+ mCurrentRate = 0.0f;
+ mLoadedDuration = 0.0f;
+}
+
+void LLPluginClassMedia::idle(void)
+{
+ if(mPlugin)
+ {
+ mPlugin->idle();
+ }
+
+ if((mMediaWidth == -1) || (!mTextureParamsReceived) || (mPlugin == NULL))
+ {
+ // Can't process a size change at this time
+ }
+ else if((mRequestedMediaWidth != mMediaWidth) || (mRequestedMediaHeight != mMediaHeight))
+ {
+ // Calculate the correct size for the media texture
+ mRequestedTextureHeight = mRequestedMediaHeight;
+ if(mPadding < 0)
+ {
+ // negative values indicate the plugin wants a power of 2
+ mRequestedTextureWidth = nextPowerOf2(mRequestedMediaWidth);
+ }
+ else
+ {
+ mRequestedTextureWidth = mRequestedMediaWidth;
+
+ if(mPadding > 1)
+ {
+ // Pad up to a multiple of the specified number of bytes per row
+ int rowbytes = mRequestedTextureWidth * mRequestedTextureDepth;
+ int pad = rowbytes % mPadding;
+ if(pad != 0)
+ {
+ rowbytes += mPadding - pad;
+ }
+
+ if(rowbytes % mRequestedTextureDepth == 0)
+ {
+ mRequestedTextureWidth = rowbytes / mRequestedTextureDepth;
+ }
+ else
+ {
+ LL_WARNS("Plugin") << "Unable to pad texture width, padding size " << mPadding << "is not a multiple of pixel size " << mRequestedTextureDepth << LL_ENDL;
+ }
+ }
+ }
+
+
+ // Size change has been requested but not initiated yet.
+ size_t newsize = mRequestedTextureWidth * mRequestedTextureHeight * mRequestedTextureDepth;
+
+ // Add an extra line for padding, just in case.
+ newsize += mRequestedTextureWidth * mRequestedTextureDepth;
+
+ if(newsize != mTextureSharedMemorySize)
+ {
+ if(!mTextureSharedMemoryName.empty())
+ {
+ // Tell the plugin to remove the old memory segment
+ mPlugin->removeSharedMemory(mTextureSharedMemoryName);
+ mTextureSharedMemoryName.clear();
+ }
+
+ mTextureSharedMemorySize = newsize;
+ mTextureSharedMemoryName = mPlugin->addSharedMemory(mTextureSharedMemorySize);
+ if(!mTextureSharedMemoryName.empty())
+ {
+ void *addr = mPlugin->getSharedMemoryAddress(mTextureSharedMemoryName);
+
+ // clear texture memory to avoid random screen visual fuzz from uninitialized texture data
+ memset( addr, 0x00, newsize );
+
+ // We could do this to force an update, but textureValid() will still be returning false until the first roundtrip to the plugin,
+ // so it may not be worthwhile.
+ // mDirtyRect.setOriginAndSize(0, 0, mRequestedMediaWidth, mRequestedMediaHeight);
+ }
+ }
+
+ // This is our local indicator that a change is in progress.
+ mTextureWidth = -1;
+ mTextureHeight = -1;
+ mMediaWidth = -1;
+ mMediaHeight = -1;
+
+ // This invalidates any existing dirty rect.
+ resetDirty();
+
+ // Send a size change message to the plugin
+ {
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change");
+ message.setValue("name", mTextureSharedMemoryName);
+ message.setValueS32("width", mRequestedMediaWidth);
+ message.setValueS32("height", mRequestedMediaHeight);
+ message.setValueS32("texture_width", mRequestedTextureWidth);
+ message.setValueS32("texture_height", mRequestedTextureHeight);
+ mPlugin->sendMessage(message); // DO NOT just use sendMessage() here -- we want this to jump ahead of the queue.
+
+ LL_DEBUGS("Plugin") << "Sending size_change" << LL_ENDL;
+ }
+ }
+
+ if(mPlugin && mPlugin->isRunning())
+ {
+ // Send queued messages
+ while(!mSendQueue.empty())
+ {
+ LLPluginMessage message = mSendQueue.front();
+ mSendQueue.pop();
+ mPlugin->sendMessage(message);
+ }
+ }
+}
+
+int LLPluginClassMedia::getTextureWidth() const
+{
+ return nextPowerOf2(mTextureWidth);
+}
+
+int LLPluginClassMedia::getTextureHeight() const
+{
+ return nextPowerOf2(mTextureHeight);
+}
+
+unsigned char* LLPluginClassMedia::getBitsData()
+{
+ unsigned char *result = NULL;
+ if((mPlugin != NULL) && !mTextureSharedMemoryName.empty())
+ {
+ result = (unsigned char*)mPlugin->getSharedMemoryAddress(mTextureSharedMemoryName);
+ }
+ return result;
+}
+
+void LLPluginClassMedia::setSize(int width, int height)
+{
+ if((width > 0) && (height > 0))
+ {
+ mSetMediaWidth = width;
+ mSetMediaHeight = height;
+ }
+ else
+ {
+ mSetMediaWidth = -1;
+ mSetMediaHeight = -1;
+ }
+
+ setSizeInternal();
+}
+
+void LLPluginClassMedia::setSizeInternal(void)
+{
+ if((mSetMediaWidth > 0) && (mSetMediaHeight > 0))
+ {
+ mRequestedMediaWidth = mSetMediaWidth;
+ mRequestedMediaHeight = mSetMediaHeight;
+ }
+ else if((mNaturalMediaWidth > 0) && (mNaturalMediaHeight > 0))
+ {
+ mRequestedMediaWidth = mNaturalMediaWidth;
+ mRequestedMediaHeight = mNaturalMediaHeight;
+ }
+ else
+ {
+ mRequestedMediaWidth = mDefaultMediaWidth;
+ mRequestedMediaHeight = mDefaultMediaHeight;
+ }
+
+ // Save these for size/interest calculations
+ mFullMediaWidth = mRequestedMediaWidth;
+ mFullMediaHeight = mRequestedMediaHeight;
+
+ if(mAllowDownsample)
+ {
+ switch(mPriority)
+ {
+ case PRIORITY_SLIDESHOW:
+ case PRIORITY_LOW:
+ // Reduce maximum texture dimension to (or below) mLowPrioritySizeLimit
+ while((mRequestedMediaWidth > mLowPrioritySizeLimit) || (mRequestedMediaHeight > mLowPrioritySizeLimit))
+ {
+ mRequestedMediaWidth /= 2;
+ mRequestedMediaHeight /= 2;
+ }
+ break;
+
+ default:
+ // Don't adjust texture size
+ break;
+ }
+ }
+
+ if(mAutoScaleMedia)
+ {
+ mRequestedMediaWidth = nextPowerOf2(mRequestedMediaWidth);
+ mRequestedMediaHeight = nextPowerOf2(mRequestedMediaHeight);
+ }
+
+ if(mRequestedMediaWidth > 2048)
+ mRequestedMediaWidth = 2048;
+
+ if(mRequestedMediaHeight > 2048)
+ mRequestedMediaHeight = 2048;
+}
+
+void LLPluginClassMedia::setAutoScale(bool auto_scale)
+{
+ if(auto_scale != mAutoScaleMedia)
+ {
+ mAutoScaleMedia = auto_scale;
+ setSizeInternal();
+ }
+}
+
+bool LLPluginClassMedia::textureValid(void)
+{
+ if(
+ !mTextureParamsReceived ||
+ mTextureWidth <= 0 ||
+ mTextureHeight <= 0 ||
+ mMediaWidth <= 0 ||
+ mMediaHeight <= 0 ||
+ mRequestedMediaWidth != mMediaWidth ||
+ mRequestedMediaHeight != mMediaHeight ||
+ getBitsData() == NULL
+ )
+ return false;
+
+ return true;
+}
+
+bool LLPluginClassMedia::getDirty(LLRect *dirty_rect)
+{
+ bool result = !mDirtyRect.isNull();
+
+ if(dirty_rect != NULL)
+ {
+ *dirty_rect = mDirtyRect;
+ }
+
+ return result;
+}
+
+void LLPluginClassMedia::resetDirty(void)
+{
+ mDirtyRect = LLRect::null;
+}
+
+std::string LLPluginClassMedia::translateModifiers(MASK modifiers)
+{
+ std::string result;
+
+
+ if(modifiers & MASK_CONTROL)
+ {
+ result += "control|";
+ }
+
+ if(modifiers & MASK_ALT)
+ {
+ result += "alt|";
+ }
+
+ if(modifiers & MASK_SHIFT)
+ {
+ result += "shift|";
+ }
+
+ // TODO: should I deal with platform differences here or in callers?
+ // TODO: how do we deal with the Mac "command" key?
+/*
+ if(modifiers & MASK_SOMETHING)
+ {
+ result += "meta|";
+ }
+*/
+ return result;
+}
+
+void LLPluginClassMedia::mouseEvent(EMouseEventType type, int button, int x, int y, MASK modifiers)
+{
+ if(type == MOUSE_EVENT_MOVE)
+ {
+ if((x == mLastMouseX) && (y == mLastMouseY))
+ {
+ // Don't spam unnecessary mouse move events.
+ return;
+ }
+
+ mLastMouseX = x;
+ mLastMouseY = y;
+ }
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "mouse_event");
+ std::string temp;
+ switch(type)
+ {
+ case MOUSE_EVENT_DOWN: temp = "down"; break;
+ case MOUSE_EVENT_UP: temp = "up"; break;
+ case MOUSE_EVENT_MOVE: temp = "move"; break;
+ case MOUSE_EVENT_DOUBLE_CLICK: temp = "double_click"; break;
+ }
+ message.setValue("event", temp);
+
+ message.setValueS32("button", button);
+
+ message.setValueS32("x", x);
+
+ // Incoming coordinates are OpenGL-style ((0,0) = lower left), so flip them here if the plugin has requested it.
+ if(!mRequestedTextureCoordsOpenGL)
+ {
+ // TODO: Should I use mMediaHeight or mRequestedMediaHeight here?
+ y = mMediaHeight - y;
+ }
+ message.setValueS32("y", y);
+
+ message.setValue("modifiers", translateModifiers(modifiers));
+
+ sendMessage(message);
+}
+
+bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifiers)
+{
+ bool result = true;
+
+ // FIXME:
+ // HACK: we don't have an easy way to tell if the plugin is going to handle a particular keycode.
+ // For now, return false for the ones the webkit plugin won't handle properly.
+
+ switch(key_code)
+ {
+ case KEY_BACKSPACE:
+ case KEY_TAB:
+ case KEY_RETURN:
+ case KEY_PAD_RETURN:
+ case KEY_SHIFT:
+ case KEY_CONTROL:
+ case KEY_ALT:
+ case KEY_CAPSLOCK:
+ case KEY_ESCAPE:
+ case KEY_PAGE_UP:
+ case KEY_PAGE_DOWN:
+ case KEY_END:
+ case KEY_HOME:
+ case KEY_LEFT:
+ case KEY_UP:
+ case KEY_RIGHT:
+ case KEY_DOWN:
+ case KEY_INSERT:
+ case KEY_DELETE:
+ // These will be handled
+ break;
+
+ default:
+ // regular ASCII characters will also be handled
+ if(key_code >= KEY_SPECIAL)
+ {
+ // Other "special" codes will not work properly.
+ result = false;
+ }
+ break;
+ }
+
+ if(result)
+ {
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "key_event");
+ std::string temp;
+ switch(type)
+ {
+ case KEY_EVENT_DOWN: temp = "down"; break;
+ case KEY_EVENT_UP: temp = "up"; break;
+ case KEY_EVENT_REPEAT: temp = "repeat"; break;
+ }
+ message.setValue("event", temp);
+
+ message.setValueS32("key", key_code);
+
+ message.setValue("modifiers", translateModifiers(modifiers));
+
+ sendMessage(message);
+ }
+
+ return result;
+}
+
+void LLPluginClassMedia::scrollEvent(int x, int y, MASK modifiers)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "scroll_event");
+
+ message.setValueS32("x", x);
+ message.setValueS32("y", y);
+ message.setValue("modifiers", translateModifiers(modifiers));
+
+ sendMessage(message);
+}
+
+bool LLPluginClassMedia::textInput(const std::string &text, MASK modifiers)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "text_event");
+
+ message.setValue("text", text);
+ message.setValue("modifiers", translateModifiers(modifiers));
+
+ sendMessage(message);
+
+ return true;
+}
+
+void LLPluginClassMedia::loadURI(const std::string &uri)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "load_uri");
+
+ message.setValue("uri", uri);
+
+ sendMessage(message);
+}
+
+const char* LLPluginClassMedia::priorityToString(EPriority priority)
+{
+ const char* result = "UNKNOWN";
+ switch(priority)
+ {
+ case PRIORITY_UNLOADED: result = "unloaded"; break;
+ case PRIORITY_STOPPED: result = "stopped"; break;
+ case PRIORITY_HIDDEN: result = "hidden"; break;
+ case PRIORITY_SLIDESHOW: result = "slideshow"; break;
+ case PRIORITY_LOW: result = "low"; break;
+ case PRIORITY_NORMAL: result = "normal"; break;
+ case PRIORITY_HIGH: result = "high"; break;
+ }
+
+ return result;
+}
+
+void LLPluginClassMedia::setPriority(EPriority priority)
+{
+ if(mPriority != priority)
+ {
+ mPriority = priority;
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "set_priority");
+
+ std::string priority_string = priorityToString(priority);
+ switch(priority)
+ {
+ case PRIORITY_UNLOADED:
+ mSleepTime = 1.0f;
+ break;
+ case PRIORITY_STOPPED:
+ mSleepTime = 1.0f;
+ break;
+ case PRIORITY_HIDDEN:
+ mSleepTime = 1.0f;
+ break;
+ case PRIORITY_SLIDESHOW:
+ mSleepTime = 1.0f;
+ break;
+ case PRIORITY_LOW:
+ mSleepTime = 1.0f / 25.0f;
+ break;
+ case PRIORITY_NORMAL:
+ mSleepTime = 1.0f / 50.0f;
+ break;
+ case PRIORITY_HIGH:
+ mSleepTime = 1.0f / 100.0f;
+ break;
+ }
+
+ message.setValue("priority", priority_string);
+
+ sendMessage(message);
+
+ if(mPlugin)
+ {
+ mPlugin->setSleepTime(mSleepTime);
+ }
+
+ LL_DEBUGS("PluginPriority") << this << ": setting priority to " << priority_string << LL_ENDL;
+
+ // This may affect the calculated size, so recalculate it here.
+ setSizeInternal();
+ }
+}
+
+void LLPluginClassMedia::setLowPrioritySizeLimit(int size)
+{
+ int power = nextPowerOf2(size);
+ if(mLowPrioritySizeLimit != power)
+ {
+ mLowPrioritySizeLimit = power;
+
+ // This may affect the calculated size, so recalculate it here.
+ setSizeInternal();
+ }
+}
+
+F64 LLPluginClassMedia::getCPUUsage()
+{
+ F64 result = 0.0f;
+
+ if(mPlugin)
+ {
+ result = mPlugin->getCPUUsage();
+ }
+
+ return result;
+}
+
+void LLPluginClassMedia::cut()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_cut");
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::copy()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_copy");
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::paste()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_paste");
+ sendMessage(message);
+}
+
+/* virtual */
+void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)
+{
+ std::string message_class = message.getClass();
+
+ if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA)
+ {
+ std::string message_name = message.getName();
+ if(message_name == "texture_params")
+ {
+ mRequestedTextureDepth = message.getValueS32("depth");
+ mRequestedTextureInternalFormat = message.getValueU32("internalformat");
+ mRequestedTextureFormat = message.getValueU32("format");
+ mRequestedTextureType = message.getValueU32("type");
+ mRequestedTextureSwapBytes = message.getValueBoolean("swap_bytes");
+ mRequestedTextureCoordsOpenGL = message.getValueBoolean("coords_opengl");
+
+ // These two are optional, and will default to 0 if they're not specified.
+ mDefaultMediaWidth = message.getValueS32("default_width");
+ mDefaultMediaHeight = message.getValueS32("default_height");
+
+ mAllowDownsample = message.getValueBoolean("allow_downsample");
+ mPadding = message.getValueS32("padding");
+
+ setSizeInternal();
+
+ mTextureParamsReceived = true;
+ }
+ else if(message_name == "updated")
+ {
+ if(message.hasValue("left"))
+ {
+ LLRect newDirtyRect;
+ newDirtyRect.mLeft = message.getValueS32("left");
+ newDirtyRect.mTop = message.getValueS32("top");
+ newDirtyRect.mRight = message.getValueS32("right");
+ newDirtyRect.mBottom = message.getValueS32("bottom");
+
+ // The plugin is likely to have top and bottom switched, due to vertical flip and OpenGL coordinate confusion.
+ // If they're backwards, swap them.
+ if(newDirtyRect.mTop < newDirtyRect.mBottom)
+ {
+ S32 temp = newDirtyRect.mTop;
+ newDirtyRect.mTop = newDirtyRect.mBottom;
+ newDirtyRect.mBottom = temp;
+ }
+
+ if(mDirtyRect.isNull())
+ {
+ mDirtyRect = newDirtyRect;
+ }
+ else
+ {
+ mDirtyRect.unionWith(newDirtyRect);
+ }
+
+ LL_DEBUGS("Plugin") << "adjusted incoming rect is: ("
+ << newDirtyRect.mLeft << ", "
+ << newDirtyRect.mTop << ", "
+ << newDirtyRect.mRight << ", "
+ << newDirtyRect.mBottom << "), new dirty rect is: ("
+ << mDirtyRect.mLeft << ", "
+ << mDirtyRect.mTop << ", "
+ << mDirtyRect.mRight << ", "
+ << mDirtyRect.mBottom << ")"
+ << LL_ENDL;
+
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CONTENT_UPDATED);
+ }
+
+
+ bool time_duration_updated = false;
+ int previous_percent = mProgressPercent;
+
+ if(message.hasValue("current_time"))
+ {
+ mCurrentTime = message.getValueReal("current_time");
+ time_duration_updated = true;
+ }
+ if(message.hasValue("duration"))
+ {
+ mDuration = message.getValueReal("duration");
+ time_duration_updated = true;
+ }
+
+ if(message.hasValue("current_rate"))
+ {
+ mCurrentRate = message.getValueReal("current_rate");
+ }
+
+ if(message.hasValue("loaded_duration"))
+ {
+ mLoadedDuration = message.getValueReal("loaded_duration");
+ time_duration_updated = true;
+ }
+ else
+ {
+ // If the message doesn't contain a loaded_duration param, assume it's equal to duration
+ mLoadedDuration = mDuration;
+ }
+
+ // Calculate a percentage based on the loaded duration and total duration.
+ if(mDuration != 0.0f) // Don't divide by zero.
+ {
+ mProgressPercent = (int)((mLoadedDuration * 100.0f)/mDuration);
+ }
+
+ if(time_duration_updated)
+ {
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_TIME_DURATION_UPDATED);
+ }
+
+ if(previous_percent != mProgressPercent)
+ {
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_PROGRESS_UPDATED);
+ }
+ }
+ else if(message_name == "media_status")
+ {
+ std::string status = message.getValue("status");
+
+ LL_DEBUGS("Plugin") << "Status changed to: " << status << LL_ENDL;
+
+ if(status == "loading")
+ {
+ mStatus = LLPluginClassMediaOwner::MEDIA_LOADING;
+ }
+ else if(status == "loaded")
+ {
+ mStatus = LLPluginClassMediaOwner::MEDIA_LOADED;
+ }
+ else if(status == "error")
+ {
+ mStatus = LLPluginClassMediaOwner::MEDIA_ERROR;
+ }
+ else if(status == "playing")
+ {
+ mStatus = LLPluginClassMediaOwner::MEDIA_PLAYING;
+ }
+ else if(status == "paused")
+ {
+ mStatus = LLPluginClassMediaOwner::MEDIA_PAUSED;
+ }
+ else if(status == "done")
+ {
+ mStatus = LLPluginClassMediaOwner::MEDIA_DONE;
+ }
+ else
+ {
+ // empty string or any unknown string
+ mStatus = LLPluginClassMediaOwner::MEDIA_NONE;
+ }
+ }
+ else if(message_name == "size_change_request")
+ {
+ S32 width = message.getValueS32("width");
+ S32 height = message.getValueS32("height");
+ std::string name = message.getValue("name");
+
+ // TODO: check that name matches?
+ mNaturalMediaWidth = width;
+ mNaturalMediaHeight = height;
+
+ setSizeInternal();
+ }
+ else if(message_name == "size_change_response")
+ {
+ std::string name = message.getValue("name");
+
+ // TODO: check that name matches?
+
+ mTextureWidth = message.getValueS32("texture_width");
+ mTextureHeight = message.getValueS32("texture_height");
+ mMediaWidth = message.getValueS32("width");
+ mMediaHeight = message.getValueS32("height");
+
+ // This invalidates any existing dirty rect.
+ resetDirty();
+
+ // TODO: should we verify that the plugin sent back the right values?
+ // Two size changes in a row may cause them to not match, due to queueing, etc.
+
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_SIZE_CHANGED);
+ }
+ else if(message_name == "cursor_changed")
+ {
+ mCursorName = message.getValue("name");
+
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CURSOR_CHANGED);
+ }
+ else if(message_name == "edit_state")
+ {
+ if(message.hasValue("cut"))
+ {
+ mCanCut = message.getValueBoolean("cut");
+ }
+ if(message.hasValue("copy"))
+ {
+ mCanCopy = message.getValueBoolean("copy");
+ }
+ if(message.hasValue("paste"))
+ {
+ mCanPaste = message.getValueBoolean("paste");
+ }
+ }
+ else if(message_name == "name_text")
+ {
+ mMediaName = message.getValue("name");
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_NAME_CHANGED);
+ }
+ else
+ {
+ LL_WARNS("Plugin") << "Unknown " << message_name << " class message: " << message_name << LL_ENDL;
+ }
+ }
+ else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER)
+ {
+ std::string message_name = message.getName();
+ if(message_name == "navigate_begin")
+ {
+ mNavigateURI = message.getValue("uri");
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_NAVIGATE_BEGIN);
+ }
+ else if(message_name == "navigate_complete")
+ {
+ mNavigateURI = message.getValue("uri");
+ mNavigateResultCode = message.getValueS32("result_code");
+ mNavigateResultString = message.getValue("result_string");
+ mHistoryBackAvailable = message.getValueBoolean("history_back_available");
+ mHistoryForwardAvailable = message.getValueBoolean("history_forward_available");
+
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_NAVIGATE_COMPLETE);
+ }
+ else if(message_name == "progress")
+ {
+ mProgressPercent = message.getValueS32("percent");
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_PROGRESS_UPDATED);
+ }
+ else if(message_name == "status_text")
+ {
+ mStatusText = message.getValue("status");
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_STATUS_TEXT_CHANGED);
+ }
+ else if(message_name == "location_changed")
+ {
+ mLocation = message.getValue("uri");
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_LOCATION_CHANGED);
+ }
+ else if(message_name == "click_href")
+ {
+ mClickURL = message.getValue("uri");
+ mClickTarget = message.getValue("target");
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLICK_LINK_HREF);
+ }
+ else if(message_name == "click_nofollow")
+ {
+ mClickURL = message.getValue("uri");
+ mClickTarget.clear();
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLICK_LINK_NOFOLLOW);
+ }
+ else
+ {
+ LL_WARNS("Plugin") << "Unknown " << message_name << " class message: " << message_name << LL_ENDL;
+ }
+ }
+ else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME)
+ {
+ std::string message_name = message.getName();
+
+ // This class hasn't defined any incoming messages yet.
+// if(message_name == "message_name")
+// {
+// }
+// else
+ {
+ LL_WARNS("Plugin") << "Unknown " << message_name << " class message: " << message_name << LL_ENDL;
+ }
+ }
+
+}
+
+/* virtual */
+void LLPluginClassMedia::pluginLaunchFailed()
+{
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_PLUGIN_FAILED_LAUNCH);
+}
+
+/* virtual */
+void LLPluginClassMedia::pluginDied()
+{
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_PLUGIN_FAILED);
+}
+
+void LLPluginClassMedia::mediaEvent(LLPluginClassMediaOwner::EMediaEvent event)
+{
+ if(mOwner)
+ {
+ mOwner->handleMediaEvent(this, event);
+ }
+}
+
+void LLPluginClassMedia::sendMessage(const LLPluginMessage &message)
+{
+ if(mPlugin && mPlugin->isRunning())
+ {
+ mPlugin->sendMessage(message);
+ }
+ else
+ {
+ // The plugin isn't set up yet -- queue this message to be sent after initialization.
+ mSendQueue.push(message);
+ }
+}
+
+////////////////////////////////////////////////////////////
+// MARK: media_browser class functions
+bool LLPluginClassMedia::pluginSupportsMediaBrowser(void)
+{
+ std::string version = mPlugin->getMessageClassVersion(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER);
+ return !version.empty();
+}
+
+void LLPluginClassMedia::focus(bool focused)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "focus");
+
+ message.setValueBoolean("focused", focused);
+
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::clear_cache()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "clear_cache");
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::clear_cookies()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "clear_cookies");
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::enable_cookies(bool enable)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "enable_cookies");
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::proxy_setup(bool enable, const std::string &host, int port)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "proxy_setup");
+
+ message.setValueBoolean("enable", enable);
+ message.setValue("host", host);
+ message.setValueS32("port", port);
+
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::browse_stop()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "browse_stop");
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::browse_reload(bool ignore_cache)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "browse_reload");
+
+ message.setValueBoolean("ignore_cache", ignore_cache);
+
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::browse_forward()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "browse_forward");
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::browse_back()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "browse_back");
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::set_status_redirect(int code, const std::string &url)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "set_status_redirect");
+
+ message.setValueS32("code", code);
+ message.setValue("url", url);
+
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::setBrowserUserAgent(const std::string& user_agent)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "set_user_agent");
+
+ message.setValue("user_agent", user_agent);
+
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::crashPlugin()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "crash");
+
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::hangPlugin()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "hang");
+
+ sendMessage(message);
+}
+
+
+////////////////////////////////////////////////////////////
+// MARK: media_time class functions
+bool LLPluginClassMedia::pluginSupportsMediaTime(void)
+{
+ std::string version = mPlugin->getMessageClassVersion(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME);
+ return !version.empty();
+}
+
+void LLPluginClassMedia::stop()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME, "stop");
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::start(float rate)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME, "start");
+
+ message.setValueReal("rate", rate);
+
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::pause()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME, "pause");
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::seek(float time)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME, "seek");
+
+ message.setValueReal("time", time);
+
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::setLoop(bool loop)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME, "set_loop");
+
+ message.setValueBoolean("loop", loop);
+
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::setVolume(float volume)
+{
+ if(volume != mRequestedVolume)
+ {
+ mRequestedVolume = volume;
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME, "set_volume");
+
+ message.setValueReal("volume", volume);
+
+ sendMessage(message);
+ }
+}
+
+float LLPluginClassMedia::getVolume()
+{
+ return mRequestedVolume;
+}
+
+void LLPluginClassMedia::initializeUrlHistory(const LLSD& url_history)
+{
+ // Send URL history to plugin
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "init_history");
+ message.setValueLLSD("history", url_history);
+ sendMessage(message);
+
+ LL_DEBUGS("Plugin") << "Sending history" << LL_ENDL;
+}
+
diff --git a/linden/indra/llplugin/llpluginclassmedia.h b/linden/indra/llplugin/llpluginclassmedia.h
new file mode 100644
index 0000000..c45010e
--- /dev/null
+++ b/linden/indra/llplugin/llpluginclassmedia.h
@@ -0,0 +1,352 @@
+/**
+ * @file llpluginclassmedia.h
+ * @brief LLPluginClassMedia handles interaction with a plugin which knows about the "media" message class.
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPLUGINCLASSMEDIA_H
+#define LL_LLPLUGINCLASSMEDIA_H
+
+#include "llgltypes.h"
+#include "llpluginprocessparent.h"
+#include "llrect.h"
+#include "llpluginclassmediaowner.h"
+#include
+
+
+class LLPluginClassMedia : public LLPluginProcessParentOwner
+{
+ LOG_CLASS(LLPluginClassMedia);
+public:
+ LLPluginClassMedia(LLPluginClassMediaOwner *owner);
+ virtual ~LLPluginClassMedia();
+
+ // local initialization, called by the media manager when creating a source
+ virtual bool init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path);
+
+ // undoes everything init() didm called by the media manager when destroying a source
+ virtual void reset();
+
+ void idle(void);
+
+ // All of these may return 0 or an actual valid value.
+ // Callers need to check the return for 0, and not use the values in that case.
+ int getWidth() const { return (mMediaWidth > 0) ? mMediaWidth : 0; };
+ int getHeight() const { return (mMediaHeight > 0) ? mMediaHeight : 0; };
+ int getNaturalWidth() const { return mNaturalMediaWidth; };
+ int getNaturalHeight() const { return mNaturalMediaHeight; };
+ int getSetWidth() const { return mSetMediaWidth; };
+ int getSetHeight() const { return mSetMediaHeight; };
+ int getBitsWidth() const { return (mTextureWidth > 0) ? mTextureWidth : 0; };
+ int getBitsHeight() const { return (mTextureHeight > 0) ? mTextureHeight : 0; };
+ int getTextureWidth() const;
+ int getTextureHeight() const;
+ int getFullWidth() const { return mFullMediaWidth; };
+ int getFullHeight() const { return mFullMediaHeight; };
+
+ // This may return NULL. Callers need to check for and handle this case.
+ unsigned char* getBitsData();
+
+ // gets the format details of the texture data
+ // These may return 0 if they haven't been set up yet. The caller needs to detect this case.
+ int getTextureDepth() const { return mRequestedTextureDepth; };
+ int getTextureFormatInternal() const { return mRequestedTextureInternalFormat; };
+ int getTextureFormatPrimary() const { return mRequestedTextureFormat; };
+ int getTextureFormatType() const { return mRequestedTextureType; };
+ bool getTextureFormatSwapBytes() const { return mRequestedTextureSwapBytes; };
+ bool getTextureCoordsOpenGL() const { return mRequestedTextureCoordsOpenGL; };
+
+ void setSize(int width, int height);
+ void setAutoScale(bool auto_scale);
+
+ // Returns true if all of the texture parameters (depth, format, size, and texture size) are set up and consistent.
+ // This will initially be false, and will also be false for some time after setSize while the resize is processed.
+ // Note that if this returns true, it is safe to use all the get() functions above without checking for invalid return values
+ // until you call idle() again.
+ bool textureValid(void);
+
+ bool getDirty(LLRect *dirty_rect = NULL);
+ void resetDirty(void);
+
+ typedef enum
+ {
+ MOUSE_EVENT_DOWN,
+ MOUSE_EVENT_UP,
+ MOUSE_EVENT_MOVE,
+ MOUSE_EVENT_DOUBLE_CLICK
+ }EMouseEventType;
+
+ void mouseEvent(EMouseEventType type, int button, int x, int y, MASK modifiers);
+
+ typedef enum
+ {
+ KEY_EVENT_DOWN,
+ KEY_EVENT_UP,
+ KEY_EVENT_REPEAT
+ }EKeyEventType;
+
+ bool keyEvent(EKeyEventType type, int key_code, MASK modifiers);
+
+ void scrollEvent(int x, int y, MASK modifiers);
+
+ // Text may be unicode (utf8 encoded)
+ bool textInput(const std::string &text, MASK modifiers);
+
+ void loadURI(const std::string &uri);
+
+ // "Loading" means uninitialized or any state prior to fully running (processing commands)
+ bool isPluginLoading(void) { return mPlugin?mPlugin->isLoading():false; };
+
+ // "Running" means the steady state -- i.e. processing messages
+ bool isPluginRunning(void) { return mPlugin?mPlugin->isRunning():false; };
+
+ // "Exited" means any regular or error state after "Running" (plugin may have crashed or exited normally)
+ bool isPluginExited(void) { return mPlugin?mPlugin->isDone():false; };
+
+ std::string getPluginVersion() { return mPlugin?mPlugin->getPluginVersion():std::string(""); };
+
+ bool getDisableTimeout() { return mPlugin?mPlugin->getDisableTimeout():false; };
+ void setDisableTimeout(bool disable) { if(mPlugin) mPlugin->setDisableTimeout(disable); };
+
+ // Inherited from LLPluginProcessParentOwner
+ /* virtual */ void receivePluginMessage(const LLPluginMessage &message);
+ /* virtual */ void pluginLaunchFailed();
+ /* virtual */ void pluginDied();
+
+
+ typedef enum
+ {
+ PRIORITY_UNLOADED, // media plugin isn't even loaded.
+ PRIORITY_STOPPED, // media is not playing, shouldn't need to update at all.
+ PRIORITY_HIDDEN, // media is not being displayed or is out of view, don't need to do graphic updates, but may still update audio, playhead, etc.
+ PRIORITY_SLIDESHOW, // media is in the far distance, updates very infrequently
+ PRIORITY_LOW, // media is in the distance, may be rendered at reduced size
+ PRIORITY_NORMAL, // normal (default) priority
+ PRIORITY_HIGH // media has user focus and/or is taking up most of the screen
+ }EPriority;
+
+ static const char* priorityToString(EPriority priority);
+ void setPriority(EPriority priority);
+ void setLowPrioritySizeLimit(int size);
+
+ F64 getCPUUsage();
+
+ // Valid after a MEDIA_EVENT_CURSOR_CHANGED event
+ std::string getCursorName() const { return mCursorName; };
+
+ LLPluginClassMediaOwner::EMediaStatus getStatus() const { return mStatus; }
+
+ void cut();
+ bool canCut() const { return mCanCut; };
+
+ void copy();
+ bool canCopy() const { return mCanCopy; };
+
+ void paste();
+ bool canPaste() const { return mCanPaste; };
+
+ ///////////////////////////////////
+ // media browser class functions
+ bool pluginSupportsMediaBrowser(void);
+
+ void focus(bool focused);
+ void clear_cache();
+ void clear_cookies();
+ void enable_cookies(bool enable);
+ void proxy_setup(bool enable, const std::string &host = LLStringUtil::null, int port = 0);
+ void browse_stop();
+ void browse_reload(bool ignore_cache = false);
+ void browse_forward();
+ void browse_back();
+ void set_status_redirect(int code, const std::string &url);
+ void setBrowserUserAgent(const std::string& user_agent);
+
+ // This is valid after MEDIA_EVENT_NAVIGATE_BEGIN or MEDIA_EVENT_NAVIGATE_COMPLETE
+ std::string getNavigateURI() const { return mNavigateURI; };
+
+ // These are valid after MEDIA_EVENT_NAVIGATE_COMPLETE
+ S32 getNavigateResultCode() const { return mNavigateResultCode; };
+ std::string getNavigateResultString() const { return mNavigateResultString; };
+ bool getHistoryBackAvailable() const { return mHistoryBackAvailable; };
+ bool getHistoryForwardAvailable() const { return mHistoryForwardAvailable; };
+
+ // This is valid after MEDIA_EVENT_PROGRESS_UPDATED
+ int getProgressPercent() const { return mProgressPercent; };
+
+ // This is valid after MEDIA_EVENT_STATUS_TEXT_CHANGED
+ std::string getStatusText() const { return mStatusText; };
+
+ // This is valid after MEDIA_EVENT_LOCATION_CHANGED
+ std::string getLocation() const { return mLocation; };
+
+ // This is valid after MEDIA_EVENT_CLICK_LINK_HREF or MEDIA_EVENT_CLICK_LINK_NOFOLLOW
+ std::string getClickURL() const { return mClickURL; };
+
+ // This is valid after MEDIA_EVENT_CLICK_LINK_HREF
+ std::string getClickTarget() const { return mClickTarget; };
+
+ std::string getMediaName() const { return mMediaName; };
+ std::string getMediaDescription() const { return mMediaDescription; };
+
+ // Crash the plugin. If you use this outside of a testbed, you will be punished.
+ void crashPlugin();
+
+ // Hang the plugin. If you use this outside of a testbed, you will be punished.
+ void hangPlugin();
+
+ ///////////////////////////////////
+ // media time class functions
+ bool pluginSupportsMediaTime(void);
+ void stop();
+ void start(float rate = 0.0f);
+ void pause();
+ void seek(float time);
+ void setLoop(bool loop);
+ void setVolume(float volume);
+ float getVolume();
+
+ F64 getCurrentTime(void) const { return mCurrentTime; };
+ F64 getDuration(void) const { return mDuration; };
+ F64 getCurrentPlayRate(void) { return mCurrentRate; };
+ F64 getLoadedDuration(void) const { return mLoadedDuration; };
+
+ // Initialize the URL history of the plugin by sending
+ // "init_history" message
+ void initializeUrlHistory(const LLSD& url_history);
+
+protected:
+
+ LLPluginClassMediaOwner *mOwner;
+
+ // Notify this object's owner that an event has occurred.
+ void mediaEvent(LLPluginClassMediaOwner::EMediaEvent event);
+
+ void sendMessage(const LLPluginMessage &message); // Send message internally, either queueing or sending directly.
+ std::queue mSendQueue; // Used to queue messages while the plugin initializes.
+
+ void setSizeInternal(void);
+
+ bool mTextureParamsReceived; // the mRequestedTexture* fields are only valid when this is true
+ S32 mRequestedTextureDepth;
+ LLGLenum mRequestedTextureInternalFormat;
+ LLGLenum mRequestedTextureFormat;
+ LLGLenum mRequestedTextureType;
+ bool mRequestedTextureSwapBytes;
+ bool mRequestedTextureCoordsOpenGL;
+
+ std::string mTextureSharedMemoryName;
+ size_t mTextureSharedMemorySize;
+
+ // True to scale requested media up to the full size of the texture (i.e. next power of two)
+ bool mAutoScaleMedia;
+
+ // default media size for the plugin, from the texture_params message.
+ int mDefaultMediaWidth;
+ int mDefaultMediaHeight;
+
+ // Size that has been requested by the plugin itself
+ int mNaturalMediaWidth;
+ int mNaturalMediaHeight;
+
+ // Size that has been requested with setSize()
+ int mSetMediaWidth;
+ int mSetMediaHeight;
+
+ // Full calculated media size (before auto-scale and downsample calculations)
+ int mFullMediaWidth;
+ int mFullMediaHeight;
+
+ // Actual media size being set (after auto-scale)
+ int mRequestedMediaWidth;
+ int mRequestedMediaHeight;
+
+ // Texture size calculated from actual media size
+ int mRequestedTextureWidth;
+ int mRequestedTextureHeight;
+
+ // Size that the plugin has acknowledged
+ int mTextureWidth;
+ int mTextureHeight;
+ int mMediaWidth;
+ int mMediaHeight;
+
+ float mRequestedVolume;
+
+ // Priority of this media stream
+ EPriority mPriority;
+ int mLowPrioritySizeLimit;
+
+ bool mAllowDownsample;
+ int mPadding;
+
+
+ LLPluginProcessParent *mPlugin;
+
+ LLRect mDirtyRect;
+
+ std::string translateModifiers(MASK modifiers);
+
+ std::string mCursorName;
+ int mLastMouseX;
+ int mLastMouseY;
+
+ LLPluginClassMediaOwner::EMediaStatus mStatus;
+
+ F64 mSleepTime;
+
+ bool mCanCut;
+ bool mCanCopy;
+ bool mCanPaste;
+
+ std::string mMediaName;
+ std::string mMediaDescription;
+
+ /////////////////////////////////////////
+ // media_browser class
+ std::string mNavigateURI;
+ S32 mNavigateResultCode;
+ std::string mNavigateResultString;
+ bool mHistoryBackAvailable;
+ bool mHistoryForwardAvailable;
+ std::string mStatusText;
+ int mProgressPercent;
+ std::string mLocation;
+ std::string mClickURL;
+ std::string mClickTarget;
+
+ /////////////////////////////////////////
+ // media_time class
+ F64 mCurrentTime;
+ F64 mDuration;
+ F64 mCurrentRate;
+ F64 mLoadedDuration;
+
+};
+
+#endif // LL_LLPLUGINCLASSMEDIA_H
diff --git a/linden/indra/llplugin/llpluginclassmediaowner.h b/linden/indra/llplugin/llpluginclassmediaowner.h
new file mode 100644
index 0000000..182eb92
--- /dev/null
+++ b/linden/indra/llplugin/llpluginclassmediaowner.h
@@ -0,0 +1,82 @@
+/**
+ * @file llpluginclassmediaowner.h
+ * @brief LLPluginClassMedia handles interaction with a plugin which knows about the "media" message class.
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPLUGINCLASSMEDIAOWNER_H
+#define LL_LLPLUGINCLASSMEDIAOWNER_H
+
+#include "llpluginprocessparent.h"
+#include "llrect.h"
+#include
+
+class LLPluginClassMedia;
+
+class LLPluginClassMediaOwner
+{
+public:
+ typedef enum
+ {
+ MEDIA_EVENT_CONTENT_UPDATED, // contents/dirty rect have updated
+ MEDIA_EVENT_TIME_DURATION_UPDATED, // current time and/or duration have updated
+ MEDIA_EVENT_SIZE_CHANGED, // media size has changed
+ MEDIA_EVENT_CURSOR_CHANGED, // plugin has requested a cursor change
+
+ MEDIA_EVENT_NAVIGATE_BEGIN, // browser has begun navigation
+ MEDIA_EVENT_NAVIGATE_COMPLETE, // browser has finished navigation
+ MEDIA_EVENT_PROGRESS_UPDATED, // browser has updated loading progress
+ MEDIA_EVENT_STATUS_TEXT_CHANGED, // browser has updated the status text
+ MEDIA_EVENT_NAME_CHANGED, // browser has updated the name of the media (typically tag)
+ MEDIA_EVENT_LOCATION_CHANGED, // browser location (URL) has changed (maybe due to internal navagation/frames/etc)
+ MEDIA_EVENT_CLICK_LINK_HREF, // I'm not entirely sure what the semantics of these two are
+ MEDIA_EVENT_CLICK_LINK_NOFOLLOW,
+
+ MEDIA_EVENT_PLUGIN_FAILED_LAUNCH, // The plugin failed to launch
+ MEDIA_EVENT_PLUGIN_FAILED // The plugin died unexpectedly
+
+ } EMediaEvent;
+
+ typedef enum
+ {
+ MEDIA_NONE, // Uninitialized -- no useful state
+ MEDIA_LOADING, // loading or navigating
+ MEDIA_LOADED, // navigation/preroll complete
+ MEDIA_ERROR, // navigation/preroll failed
+ MEDIA_PLAYING, // playing (only for time-based media)
+ MEDIA_PAUSED, // paused (only for time-based media)
+ MEDIA_DONE // finished playing (only for time-based media)
+
+ } EMediaStatus;
+
+ virtual ~LLPluginClassMediaOwner() {};
+ virtual void handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent /*event*/) {};
+};
+
+#endif // LL_LLPLUGINCLASSMEDIAOWNER_H
diff --git a/linden/indra/llplugin/llplugininstance.cpp b/linden/indra/llplugin/llplugininstance.cpp
new file mode 100644
index 0000000..5185b36
--- /dev/null
+++ b/linden/indra/llplugin/llplugininstance.cpp
@@ -0,0 +1,172 @@
+/**
+ * @file llplugininstance.cpp
+ * @brief LLPluginInstance handles loading the dynamic library of a plugin and setting up its entry points for message passing.
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "llplugininstance.h"
+
+#include "llapr.h"
+
+/** Virtual destructor. */
+LLPluginInstanceMessageListener::~LLPluginInstanceMessageListener()
+{
+}
+
+/**
+ * TODO:DOC describe how it's used
+ */
+const char *LLPluginInstance::PLUGIN_INIT_FUNCTION_NAME = "LLPluginInitEntryPoint";
+
+/**
+ * Constructor.
+ *
+ * @param[in] owner Plugin instance. TODO:DOC is this a good description of what "owner" is?
+ */
+LLPluginInstance::LLPluginInstance(LLPluginInstanceMessageListener *owner) :
+ mDSOHandle(NULL),
+ mPluginUserData(NULL),
+ mPluginSendMessageFunction(NULL)
+{
+ mOwner = owner;
+}
+
+/**
+ * Destructor.
+ */
+LLPluginInstance::~LLPluginInstance()
+{
+ if(mDSOHandle != NULL)
+ {
+ apr_dso_unload(mDSOHandle);
+ mDSOHandle = NULL;
+ }
+}
+
+/**
+ * Dynamically loads the plugin and runs the plugin's init function.
+ *
+ * @param[in] plugin_file Name of plugin dll/dylib/so. TODO:DOC is this correct? see .h
+ * @return 0 if successful, APR error code or error code from the plugin's init function on failure.
+ */
+int LLPluginInstance::load(std::string &plugin_file)
+{
+ pluginInitFunction init_function = NULL;
+
+ int result = apr_dso_load(&mDSOHandle,
+ plugin_file.c_str(),
+ gAPRPoolp);
+ if(result != APR_SUCCESS)
+ {
+ char buf[1024];
+ apr_dso_error(mDSOHandle, buf, sizeof(buf));
+
+ LL_WARNS("Plugin") << "apr_dso_load of " << plugin_file << " failed with error " << result << " , additional info string: " << buf << LL_ENDL;
+
+ }
+
+ if(result == APR_SUCCESS)
+ {
+ result = apr_dso_sym((apr_dso_handle_sym_t*)&init_function,
+ mDSOHandle,
+ PLUGIN_INIT_FUNCTION_NAME);
+
+ if(result != APR_SUCCESS)
+ {
+ LL_WARNS("Plugin") << "apr_dso_sym failed with error " << result << LL_ENDL;
+ }
+ }
+
+ if(result == APR_SUCCESS)
+ {
+ result = init_function(staticReceiveMessage, (void*)this, &mPluginSendMessageFunction, &mPluginUserData);
+
+ if(result != APR_SUCCESS)
+ {
+ LL_WARNS("Plugin") << "call to init function failed with error " << result << LL_ENDL;
+ }
+ }
+
+ return (int)result;
+}
+
+/**
+ * Sends a message to the plugin.
+ *
+ * @param[in] message Message
+ */
+void LLPluginInstance::sendMessage(const std::string &message)
+{
+ if(mPluginSendMessageFunction)
+ {
+ LL_DEBUGS("Plugin") << "sending message to plugin: \"" << message << "\"" << LL_ENDL;
+ mPluginSendMessageFunction(message.c_str(), &mPluginUserData);
+ }
+ else
+ {
+ LL_WARNS("Plugin") << "dropping message: \"" << message << "\"" << LL_ENDL;
+ }
+}
+
+/**
+ * Idle. TODO:DOC what's the purpose of this?
+ *
+ */
+void LLPluginInstance::idle(void)
+{
+}
+
+// static
+void LLPluginInstance::staticReceiveMessage(const char *message_string, void **user_data)
+{
+ // TODO: validate that the user_data argument is still a valid LLPluginInstance pointer
+ // we could also use a key that's looked up in a map (instead of a direct pointer) for safety, but that's probably overkill
+ LLPluginInstance *self = (LLPluginInstance*)*user_data;
+ self->receiveMessage(message_string);
+}
+
+/**
+ * Plugin receives message from plugin loader shell.
+ *
+ * @param[in] message_string Message
+ */
+void LLPluginInstance::receiveMessage(const char *message_string)
+{
+ if(mOwner)
+ {
+ LL_DEBUGS("Plugin") << "processing incoming message: \"" << message_string << "\"" << LL_ENDL;
+ mOwner->receivePluginMessage(message_string);
+ }
+ else
+ {
+ LL_WARNS("Plugin") << "dropping incoming message: \"" << message_string << "\"" << LL_ENDL;
+ }
+}
diff --git a/linden/indra/llplugin/llplugininstance.h b/linden/indra/llplugin/llplugininstance.h
new file mode 100644
index 0000000..0b53b5f
--- /dev/null
+++ b/linden/indra/llplugin/llplugininstance.h
@@ -0,0 +1,104 @@
+/**
+ * @file llplugininstance.h
+ * @brief LLPluginInstance handles loading the dynamic library of a plugin and setting up its entry points for message passing.
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPLUGININSTANCE_H
+#define LL_LLPLUGININSTANCE_H
+
+#include "llstring.h"
+#include "llapr.h"
+
+#include "apr_dso.h"
+
+/**
+ * @brief LLPluginInstanceMessageListener receives messages sent from the plugin loader shell to the plugin.
+ */
+class LLPluginInstanceMessageListener
+{
+public:
+ virtual ~LLPluginInstanceMessageListener();
+ /** Plugin receives message from plugin loader shell. */
+ virtual void receivePluginMessage(const std::string &message) = 0;
+};
+
+/**
+ * @brief LLPluginInstance handles loading the dynamic library of a plugin and setting up its entry points for message passing.
+ */
+class LLPluginInstance
+{
+ LOG_CLASS(LLPluginInstance);
+public:
+ LLPluginInstance(LLPluginInstanceMessageListener *owner);
+ virtual ~LLPluginInstance();
+
+ // Load a plugin dll/dylib/so
+ // Returns 0 if successful, APR error code or error code returned from the plugin's init function on failure.
+ int load(std::string &plugin_file);
+
+ // Sends a message to the plugin.
+ void sendMessage(const std::string &message);
+
+ // TODO:DOC is this comment obsolete? can't find "send_count" anywhere in indra tree.
+ // send_count is the maximum number of message to process from the send queue. If negative, it will drain the queue completely.
+ // The receive queue is always drained completely.
+ // Returns the total number of messages processed from both queues.
+ void idle(void);
+
+ /** The signature of the function for sending a message from plugin to plugin loader shell.
+ *
+ * @param[in] message_string Null-terminated C string
+ * @param[in] user_data The opaque reference that the callee supplied during setup.
+ */
+ typedef void (*sendMessageFunction) (const char *message_string, void **user_data);
+
+ /** The signature of the plugin init function. TODO:DOC check direction (pluging loader shell to plugin?)
+ *
+ * @param[in] host_user_data Data from plugin loader shell.
+ * @param[in] plugin_send_function Function for sending from the plugin loader shell to plugin.
+ */
+ typedef int (*pluginInitFunction) (sendMessageFunction host_send_func, void *host_user_data, sendMessageFunction *plugin_send_func, void **plugin_user_data);
+
+ /** Name of plugin init function */
+ static const char *PLUGIN_INIT_FUNCTION_NAME;
+
+private:
+ static void staticReceiveMessage(const char *message_string, void **user_data);
+ void receiveMessage(const char *message_string);
+
+ apr_dso_handle_t *mDSOHandle;
+
+ void *mPluginUserData;
+ sendMessageFunction mPluginSendMessageFunction;
+
+ LLPluginInstanceMessageListener *mOwner;
+};
+
+#endif // LL_LLPLUGININSTANCE_H
diff --git a/linden/indra/llplugin/llpluginmessage.cpp b/linden/indra/llplugin/llpluginmessage.cpp
new file mode 100644
index 0000000..67ac995
--- /dev/null
+++ b/linden/indra/llplugin/llpluginmessage.cpp
@@ -0,0 +1,442 @@
+/**
+ * @file llpluginmessage.cpp
+ * @brief LLPluginMessage encapsulates the serialization/deserialization of messages passed to and from plugins.
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "llpluginmessage.h"
+#include "llsdserialize.h"
+#include "u64.h"
+
+/**
+ * Constructor.
+ */
+LLPluginMessage::LLPluginMessage()
+{
+}
+
+/**
+ * Constructor.
+ *
+ * @param[in] p Existing message
+ */
+LLPluginMessage::LLPluginMessage(const LLPluginMessage &p)
+{
+ mMessage = p.mMessage;
+}
+
+/**
+ * Constructor.
+ *
+ * @param[in] message_class Message class
+ * @param[in] message_name Message name
+ */
+LLPluginMessage::LLPluginMessage(const std::string &message_class, const std::string &message_name)
+{
+ setMessage(message_class, message_name);
+}
+
+
+/**
+ * Destructor.
+ */
+LLPluginMessage::~LLPluginMessage()
+{
+}
+
+/**
+ * Reset all internal state.
+ */
+void LLPluginMessage::clear()
+{
+ mMessage = LLSD::emptyMap();
+ mMessage["params"] = LLSD::emptyMap();
+}
+
+/**
+ * Sets the message class and name. Also has the side-effect of clearing any key-value pairs in the message.
+ *
+ * @param[in] message_class Message class
+ * @param[in] message_name Message name
+ */
+void LLPluginMessage::setMessage(const std::string &message_class, const std::string &message_name)
+{
+ clear();
+ mMessage["class"] = message_class;
+ mMessage["name"] = message_name;
+}
+
+/**
+ * Sets a key/value pair in the message, where the value is a string.
+ *
+ * @param[in] key Key
+ * @param[in] value String value
+ */
+void LLPluginMessage::setValue(const std::string &key, const std::string &value)
+{
+ mMessage["params"][key] = value;
+}
+
+/**
+ * Sets a key/value pair in the message, where the value is LLSD.
+ *
+ * @param[in] key Key
+ * @param[in] value LLSD value
+ */
+void LLPluginMessage::setValueLLSD(const std::string &key, const LLSD &value)
+{
+ mMessage["params"][key] = value;
+}
+
+/**
+ * Sets a key/value pair in the message, where the value is signed 32-bit.
+ *
+ * @param[in] key Key
+ * @param[in] value 32-bit signed value
+ */
+void LLPluginMessage::setValueS32(const std::string &key, S32 value)
+{
+ mMessage["params"][key] = value;
+}
+
+/**
+ * Sets a key/value pair in the message, where the value is unsigned 32-bit. The value is stored as a string beginning with "0x".
+ *
+ * @param[in] key Key
+ * @param[in] value 32-bit unsigned value
+ */
+void LLPluginMessage::setValueU32(const std::string &key, U32 value)
+{
+ std::stringstream temp;
+ temp << "0x" << std::hex << value;
+ setValue(key, temp.str());
+}
+
+/**
+ * Sets a key/value pair in the message, where the value is a bool.
+ *
+ * @param[in] key Key
+ * @param[in] value Boolean value
+ */
+void LLPluginMessage::setValueBoolean(const std::string &key, bool value)
+{
+ mMessage["params"][key] = value;
+}
+
+/**
+ * Sets a key/value pair in the message, where the value is a double.
+ *
+ * @param[in] key Key
+ * @param[in] value Boolean value
+ */
+void LLPluginMessage::setValueReal(const std::string &key, F64 value)
+{
+ mMessage["params"][key] = value;
+}
+
+/**
+ * Sets a key/value pair in the message, where the value is a pointer. The pointer is stored as a string.
+ *
+ * @param[in] key Key
+ * @param[in] value Pointer value
+ */
+void LLPluginMessage::setValuePointer(const std::string &key, void* value)
+{
+ std::stringstream temp;
+ // iostreams should output pointer values in hex with an initial 0x by default.
+ temp << value;
+ setValue(key, temp.str());
+}
+
+/**
+ * Gets the message class.
+ *
+ * @return Message class
+ */
+std::string LLPluginMessage::getClass(void) const
+{
+ return mMessage["class"];
+}
+
+/**
+ * Gets the message name.
+ *
+ * @return Message name
+ */
+std::string LLPluginMessage::getName(void) const
+{
+ return mMessage["name"];
+}
+
+/**
+ * Returns true if the specified key exists in this message (useful for optional parameters).
+ *
+ * @param[in] key Key
+ *
+ * @return True if key exists, false otherwise.
+ */
+bool LLPluginMessage::hasValue(const std::string &key) const
+{
+ bool result = false;
+
+ if(mMessage["params"].has(key))
+ {
+ result = true;
+ }
+
+ return result;
+}
+
+/**
+ * Gets the value of a key as a string. If the key does not exist, an empty string will be returned.
+ *
+ * @param[in] key Key
+ *
+ * @return String value of key if key exists, empty string if key does not exist.
+ */
+std::string LLPluginMessage::getValue(const std::string &key) const
+{
+ std::string result;
+
+ if(mMessage["params"].has(key))
+ {
+ result = mMessage["params"][key].asString();
+ }
+
+ return result;
+}
+
+/**
+ * Gets the value of a key as LLSD. If the key does not exist, a null LLSD will be returned.
+ *
+ * @param[in] key Key
+ *
+ * @return LLSD value of key if key exists, null LLSD if key does not exist.
+ */
+LLSD LLPluginMessage::getValueLLSD(const std::string &key) const
+{
+ LLSD result;
+
+ if(mMessage["params"].has(key))
+ {
+ result = mMessage["params"][key];
+ }
+
+ return result;
+}
+
+/**
+ * Gets the value of a key as signed 32-bit int. If the key does not exist, 0 will be returned.
+ *
+ * @param[in] key Key
+ *
+ * @return Signed 32-bit int value of key if key exists, 0 if key does not exist.
+ */
+S32 LLPluginMessage::getValueS32(const std::string &key) const
+{
+ S32 result = 0;
+
+ if(mMessage["params"].has(key))
+ {
+ result = mMessage["params"][key].asInteger();
+ }
+
+ return result;
+}
+
+/**
+ * Gets the value of a key as unsigned 32-bit int. If the key does not exist, 0 will be returned.
+ *
+ * @param[in] key Key
+ *
+ * @return Unsigned 32-bit int value of key if key exists, 0 if key does not exist.
+ */
+U32 LLPluginMessage::getValueU32(const std::string &key) const
+{
+ U32 result = 0;
+
+ if(mMessage["params"].has(key))
+ {
+ std::string value = mMessage["params"][key].asString();
+
+ result = (U32)strtoul(value.c_str(), NULL, 16);
+ }
+
+ return result;
+}
+
+/**
+ * Gets the value of a key as a bool. If the key does not exist, false will be returned.
+ *
+ * @param[in] key Key
+ *
+ * @return Boolean value of key if it exists, false otherwise.
+ */
+bool LLPluginMessage::getValueBoolean(const std::string &key) const
+{
+ bool result = false;
+
+ if(mMessage["params"].has(key))
+ {
+ result = mMessage["params"][key].asBoolean();
+ }
+
+ return result;
+}
+
+/**
+ * Gets the value of a key as a double. If the key does not exist, 0 will be returned.
+ *
+ * @param[in] key Key
+ *
+ * @return Value as a double if key exists, 0 otherwise.
+ */
+F64 LLPluginMessage::getValueReal(const std::string &key) const
+{
+ F64 result = 0.0f;
+
+ if(mMessage["params"].has(key))
+ {
+ result = mMessage["params"][key].asReal();
+ }
+
+ return result;
+}
+
+/**
+ * Gets the value of a key as a pointer. If the key does not exist, NULL will be returned.
+ *
+ * @param[in] key Key
+ *
+ * @return Pointer value if key exists, NULL otherwise.
+ */
+void* LLPluginMessage::getValuePointer(const std::string &key) const
+{
+ void* result = NULL;
+
+ if(mMessage["params"].has(key))
+ {
+ std::string value = mMessage["params"][key].asString();
+
+ result = (void*)llstrtou64(value.c_str(), NULL, 16);
+ }
+
+ return result;
+}
+
+/**
+ * Flatten the message into a string.
+ *
+ * @return Message as a string.
+ */
+std::string LLPluginMessage::generate(void) const
+{
+ std::ostringstream result;
+
+ // Pretty XML may be slightly easier to deal with while debugging...
+// LLSDSerialize::toXML(mMessage, result);
+ LLSDSerialize::toPrettyXML(mMessage, result);
+
+ return result.str();
+}
+
+/**
+ * Parse an incoming message into component parts. Clears all existing state before starting the parse.
+ *
+ * @return Returns -1 on failure, otherwise returns the number of key/value pairs in the incoming message.
+ */
+int LLPluginMessage::parse(const std::string &message)
+{
+ // clear any previous state
+ clear();
+
+ std::istringstream input(message);
+
+ S32 parse_result = LLSDSerialize::fromXML(mMessage, input);
+
+ return (int)parse_result;
+}
+
+
+/**
+ * Destructor
+ */
+LLPluginMessageListener::~LLPluginMessageListener()
+{
+ // TODO: should listeners have a way to ensure they're removed from dispatcher lists when deleted?
+}
+
+
+/**
+ * Destructor
+ */
+LLPluginMessageDispatcher::~LLPluginMessageDispatcher()
+{
+
+}
+
+/**
+ * Add a message listener. TODO:DOC need more info on what uses this. when are multiple listeners needed?
+ *
+ * @param[in] listener Message listener
+ */
+void LLPluginMessageDispatcher::addPluginMessageListener(LLPluginMessageListener *listener)
+{
+ mListeners.insert(listener);
+}
+
+/**
+ * Remove a message listener.
+ *
+ * @param[in] listener Message listener
+ */
+void LLPluginMessageDispatcher::removePluginMessageListener(LLPluginMessageListener *listener)
+{
+ mListeners.erase(listener);
+}
+
+/**
+ * Distribute a message to all message listeners.
+ *
+ * @param[in] message Message
+ */
+void LLPluginMessageDispatcher::dispatchPluginMessage(const LLPluginMessage &message)
+{
+ for (listener_set_t::iterator it = mListeners.begin();
+ it != mListeners.end();
+ )
+ {
+ LLPluginMessageListener* listener = *it;
+ listener->receivePluginMessage(message);
+ // In case something deleted an entry.
+ it = mListeners.upper_bound(listener);
+ }
+}
diff --git a/linden/indra/llplugin/llpluginmessage.h b/linden/indra/llplugin/llpluginmessage.h
new file mode 100644
index 0000000..8bcb896
--- /dev/null
+++ b/linden/indra/llplugin/llpluginmessage.h
@@ -0,0 +1,142 @@
+/**
+ * @file llpluginmessage.h
+ * @brief LLPluginMessage encapsulates the serialization/deserialization of messages passed to and from plugins.
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPLUGINMESSAGE_H
+#define LL_LLPLUGINMESSAGE_H
+
+#include "llsd.h"
+
+/**
+ * @brief LLPluginMessage encapsulates the serialization/deserialization of messages passed to and from plugins.
+ */
+class LLPluginMessage
+{
+ LOG_CLASS(LLPluginMessage);
+public:
+ LLPluginMessage();
+ LLPluginMessage(const LLPluginMessage &p);
+ LLPluginMessage(const std::string &message_class, const std::string &message_name);
+ ~LLPluginMessage();
+
+ // reset all internal state
+ void clear(void);
+
+ // Sets the message class and name
+ // Also has the side-effect of clearing any key/value pairs in the message.
+ void setMessage(const std::string &message_class, const std::string &message_name);
+
+ // Sets a key/value pair in the message
+ void setValue(const std::string &key, const std::string &value);
+ void setValueLLSD(const std::string &key, const LLSD &value);
+ void setValueS32(const std::string &key, S32 value);
+ void setValueU32(const std::string &key, U32 value);
+ void setValueBoolean(const std::string &key, bool value);
+ void setValueReal(const std::string &key, F64 value);
+ void setValuePointer(const std::string &key, void *value);
+
+ std::string getClass(void) const;
+ std::string getName(void) const;
+
+ // Returns true if the specified key exists in this message (useful for optional parameters)
+ bool hasValue(const std::string &key) const;
+
+ // get the value of a particular key as a string. If the key doesn't exist in the message, an empty string will be returned.
+ std::string getValue(const std::string &key) const;
+
+ // get the value of a particular key as LLSD. If the key doesn't exist in the message, a null LLSD will be returned.
+ LLSD getValueLLSD(const std::string &key) const;
+
+ // get the value of a key as a S32. If the value wasn't set as a S32, behavior is undefined.
+ S32 getValueS32(const std::string &key) const;
+
+ // get the value of a key as a U32. Since there isn't an LLSD type for this, we use a hexadecimal string instead.
+ U32 getValueU32(const std::string &key) const;
+
+ // get the value of a key as a Boolean.
+ bool getValueBoolean(const std::string &key) const;
+
+ // get the value of a key as a float.
+ F64 getValueReal(const std::string &key) const;
+
+ // get the value of a key as a pointer.
+ void* getValuePointer(const std::string &key) const;
+
+ // Flatten the message into a string
+ std::string generate(void) const;
+
+ // Parse an incoming message into component parts
+ // (this clears out all existing state before starting the parse)
+ // Returns -1 on failure, otherwise returns the number of key/value pairs in the message.
+ int parse(const std::string &message);
+
+
+private:
+
+ LLSD mMessage;
+
+};
+
+/**
+ * @brief Listener for plugin messages.
+ */
+class LLPluginMessageListener
+{
+public:
+ virtual ~LLPluginMessageListener();
+ /** Plugin receives message from plugin loader shell. */
+ virtual void receivePluginMessage(const LLPluginMessage &message) = 0;
+
+};
+
+/**
+ * @brief Dispatcher for plugin messages.
+ *
+ * Manages the set of plugin message listeners and distributes messages to plugin message listeners.
+ */
+class LLPluginMessageDispatcher
+{
+public:
+ virtual ~LLPluginMessageDispatcher();
+
+ void addPluginMessageListener(LLPluginMessageListener *);
+ void removePluginMessageListener(LLPluginMessageListener *);
+protected:
+ void dispatchPluginMessage(const LLPluginMessage &message);
+
+ /** A set of message listeners. */
+ typedef std::set listener_set_t;
+ /** The set of message listeners. */
+ listener_set_t mListeners;
+};
+
+
+#endif // LL_LLPLUGINMESSAGE_H
diff --git a/linden/indra/llplugin/llpluginmessageclasses.h b/linden/indra/llplugin/llpluginmessageclasses.h
new file mode 100644
index 0000000..1f60d5e
--- /dev/null
+++ b/linden/indra/llplugin/llpluginmessageclasses.h
@@ -0,0 +1,57 @@
+/**
+ * @file llpluginmessageclasses.h
+ * @brief This file defines the versions of existing message classes for LLPluginMessage.
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPLUGINMESSAGECLASSES_H
+#define LL_LLPLUGINMESSAGECLASSES_H
+
+// Version strings for each plugin message class.
+// Backwards-compatible changes (i.e. changes which only add new messges) should increment the minor version (i.e. "1.0" -> "1.1").
+// Non-backwards-compatible changes (which delete messages or change their semantics) should increment the major version (i.e. "1.1" -> "2.0").
+// Plugins will supply the set of message classes they understand, with version numbers, as part of their init_response message.
+// The contents and semantics of the base:init message must NEVER change in a non-backwards-compatible way, as a special case.
+
+#define LLPLUGIN_MESSAGE_CLASS_INTERNAL "internal"
+#define LLPLUGIN_MESSAGE_CLASS_INTERNAL_VERSION "1.0"
+
+#define LLPLUGIN_MESSAGE_CLASS_BASE "base"
+#define LLPLUGIN_MESSAGE_CLASS_BASE_VERSION "1.0"
+
+#define LLPLUGIN_MESSAGE_CLASS_MEDIA "media"
+#define LLPLUGIN_MESSAGE_CLASS_MEDIA_VERSION "1.0"
+
+#define LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER "media_browser"
+#define LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER_VERSION "1.0"
+
+#define LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME "media_time"
+#define LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME_VERSION "1.0"
+
+#endif // LL_LLPLUGINMESSAGECLASSES_H
diff --git a/linden/indra/llplugin/llpluginmessagepipe.cpp b/linden/indra/llplugin/llpluginmessagepipe.cpp
new file mode 100644
index 0000000..209f49f
--- /dev/null
+++ b/linden/indra/llplugin/llpluginmessagepipe.cpp
@@ -0,0 +1,316 @@
+/**
+ * @file llpluginmessagepipe.cpp
+ * @brief Classes that implement connections from the plugin system to pipes/pumps.
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "llpluginmessagepipe.h"
+#include "llbufferstream.h"
+
+#include "llapr.h"
+
+static const char MESSAGE_DELIMITER = '\0';
+
+LLPluginMessagePipeOwner::LLPluginMessagePipeOwner() :
+ mMessagePipe(NULL),
+ mSocketError(APR_SUCCESS)
+{
+}
+
+// virtual
+LLPluginMessagePipeOwner::~LLPluginMessagePipeOwner()
+{
+ killMessagePipe();
+}
+
+// virtual
+apr_status_t LLPluginMessagePipeOwner::socketError(apr_status_t error)
+{
+ mSocketError = error;
+ return error;
+};
+
+//virtual
+void LLPluginMessagePipeOwner::setMessagePipe(LLPluginMessagePipe *read_pipe)
+{
+ // Save a reference to this pipe
+ mMessagePipe = read_pipe;
+}
+
+bool LLPluginMessagePipeOwner::canSendMessage(void)
+{
+ return (mMessagePipe != NULL);
+}
+
+bool LLPluginMessagePipeOwner::writeMessageRaw(const std::string &message)
+{
+ bool result = true;
+ if(mMessagePipe != NULL)
+ {
+ result = mMessagePipe->addMessage(message);
+ }
+ else
+ {
+ LL_WARNS("Plugin") << "dropping message: " << message << LL_ENDL;
+ result = false;
+ }
+
+ return result;
+}
+
+void LLPluginMessagePipeOwner::killMessagePipe(void)
+{
+ if(mMessagePipe != NULL)
+ {
+ delete mMessagePipe;
+ mMessagePipe = NULL;
+ }
+}
+
+LLPluginMessagePipe::LLPluginMessagePipe(LLPluginMessagePipeOwner *owner, LLSocket::ptr_t socket)
+{
+ mOwner = owner;
+ mOwner->setMessagePipe(this);
+ mSocket = socket;
+}
+
+LLPluginMessagePipe::~LLPluginMessagePipe()
+{
+ if(mOwner != NULL)
+ {
+ mOwner->setMessagePipe(NULL);
+ }
+}
+
+bool LLPluginMessagePipe::addMessage(const std::string &message)
+{
+ // queue the message for later output
+ mOutput += message;
+ mOutput += MESSAGE_DELIMITER; // message separator
+
+ return true;
+}
+
+void LLPluginMessagePipe::clearOwner(void)
+{
+ // The owner is done with this pipe. The next call to process_impl should send any remaining data and exit.
+ mOwner = NULL;
+}
+
+void LLPluginMessagePipe::setSocketTimeout(apr_interval_time_t timeout_usec)
+{
+ // We never want to sleep forever, so force negative timeouts to become non-blocking.
+
+ // according to this page: http://dev.ariel-networks.com/apr/apr-tutorial/html/apr-tutorial-13.html
+ // blocking/non-blocking with apr sockets is somewhat non-portable.
+
+ if(timeout_usec <= 0)
+ {
+ // Make the socket non-blocking
+ apr_socket_opt_set(mSocket->getSocket(), APR_SO_NONBLOCK, 1);
+ apr_socket_timeout_set(mSocket->getSocket(), 0);
+ }
+ else
+ {
+ // Make the socket blocking-with-timeout
+ apr_socket_opt_set(mSocket->getSocket(), APR_SO_NONBLOCK, 1);
+ apr_socket_timeout_set(mSocket->getSocket(), timeout_usec);
+ }
+}
+
+bool LLPluginMessagePipe::pump(F64 timeout)
+{
+ bool result = true;
+
+ if(mSocket)
+ {
+ apr_status_t status;
+ apr_size_t size;
+
+ if(!mOutput.empty())
+ {
+ // write any outgoing messages
+ size = (apr_size_t)mOutput.size();
+
+ setSocketTimeout(0);
+
+// LL_INFOS("Plugin") << "before apr_socket_send, size = " << size << LL_ENDL;
+
+ status = apr_socket_send(
+ mSocket->getSocket(),
+ (const char*)mOutput.data(),
+ &size);
+
+// LL_INFOS("Plugin") << "after apr_socket_send, size = " << size << LL_ENDL;
+
+ if(status == APR_SUCCESS)
+ {
+ // success
+ mOutput = mOutput.substr(size);
+ }
+ else if(APR_STATUS_IS_EAGAIN(status))
+ {
+ // Socket buffer is full...
+ // remove the written part from the buffer and try again later.
+ mOutput = mOutput.substr(size);
+ }
+ else
+ {
+ // some other error
+ // Treat this as fatal.
+ ll_apr_warn_status(status);
+
+ if(mOwner)
+ {
+ mOwner->socketError(status);
+ }
+ result = false;
+ }
+ }
+
+ // FIXME: For some reason, the apr timeout stuff isn't working properly on windows.
+ // Until such time as we figure out why, don't try to use the socket timeout -- just sleep here instead.
+#if LL_WINDOWS
+ if(result)
+ {
+ if(timeout != 0.0f)
+ {
+ ms_sleep((int)(timeout * 1000.0f));
+ timeout = 0.0f;
+ }
+ }
+#endif
+
+ // Check for incoming messages
+ if(result)
+ {
+ char input_buf[1024];
+ apr_size_t request_size;
+
+ // Start out by reading one byte, so that any data received will wake us up.
+ request_size = 1;
+
+ // and use the timeout so we'll sleep if no data is available.
+ setSocketTimeout((apr_interval_time_t)(timeout * 1000000));
+
+ while(1)
+ {
+ size = request_size;
+
+// LL_INFOS("Plugin") << "before apr_socket_recv, size = " << size << LL_ENDL;
+
+ status = apr_socket_recv(
+ mSocket->getSocket(),
+ input_buf,
+ &size);
+
+// LL_INFOS("Plugin") << "after apr_socket_recv, size = " << size << LL_ENDL;
+
+ if(size > 0)
+ mInput.append(input_buf, size);
+
+ if(status == APR_SUCCESS)
+ {
+// llinfos << "success, read " << size << llendl;
+
+ if(size != request_size)
+ {
+ // This was a short read, so we're done.
+ break;
+ }
+ }
+ else if(APR_STATUS_IS_TIMEUP(status))
+ {
+// llinfos << "TIMEUP, read " << size << llendl;
+
+ // Timeout was hit. Since the initial read is 1 byte, this should never be a partial read.
+ break;
+ }
+ else if(APR_STATUS_IS_EAGAIN(status))
+ {
+// llinfos << "EAGAIN, read " << size << llendl;
+
+ // We've been doing partial reads, and we're done now.
+ break;
+ }
+ else
+ {
+ // some other error
+ // Treat this as fatal.
+ ll_apr_warn_status(status);
+
+ if(mOwner)
+ {
+ mOwner->socketError(status);
+ }
+ result = false;
+ break;
+ }
+
+ // Second and subsequent reads should not use the timeout
+ setSocketTimeout(0);
+ // and should try to fill the input buffer
+ request_size = sizeof(input_buf);
+ }
+
+ processInput();
+ }
+ }
+
+ if(!result)
+ {
+ // If we got an error, we're done.
+ LL_INFOS("Plugin") << "Error from socket, cleaning up." << LL_ENDL;
+ delete this;
+ }
+
+ return result;
+}
+
+void LLPluginMessagePipe::processInput(void)
+{
+ // Look for input delimiter(s) in the input buffer.
+ int start = 0;
+ int delim;
+ while((delim = mInput.find(MESSAGE_DELIMITER, start)) != std::string::npos)
+ {
+ // Let the owner process this message
+ mOwner->receiveMessageRaw(mInput.substr(start, delim - start));
+
+ start = delim + 1;
+ }
+
+ // Remove delivered messages from the input buffer.
+ if(start != 0)
+ mInput = mInput.substr(start);
+
+}
+
diff --git a/linden/indra/llplugin/llpluginmessagepipe.h b/linden/indra/llplugin/llpluginmessagepipe.h
new file mode 100644
index 0000000..9bf1781
--- /dev/null
+++ b/linden/indra/llplugin/llpluginmessagepipe.h
@@ -0,0 +1,92 @@
+/**
+ * @file llpluginmessagepipe.h
+ * @brief Classes that implement connections from the plugin system to pipes/pumps.
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPLUGINMESSAGEPIPE_H
+#define LL_LLPLUGINMESSAGEPIPE_H
+
+#include "lliosocket.h"
+
+class LLPluginMessagePipe;
+
+// Inherit from this to be able to receive messages from the LLPluginMessagePipe
+class LLPluginMessagePipeOwner
+{
+ LOG_CLASS(LLPluginMessagePipeOwner);
+public:
+ LLPluginMessagePipeOwner();
+ virtual ~LLPluginMessagePipeOwner();
+ // called with incoming messages
+ virtual void receiveMessageRaw(const std::string &message) = 0;
+ // called when the socket has an error
+ virtual apr_status_t socketError(apr_status_t error);
+
+ // called from LLPluginMessagePipe to manage the connection with LLPluginMessagePipeOwner -- do not use!
+ virtual void setMessagePipe(LLPluginMessagePipe *message_pipe) ;
+
+protected:
+ // returns false if writeMessageRaw() would drop the message
+ bool canSendMessage(void);
+ // call this to send a message over the pipe
+ bool writeMessageRaw(const std::string &message);
+ // call this to close the pipe
+ void killMessagePipe(void);
+
+ LLPluginMessagePipe *mMessagePipe;
+ apr_status_t mSocketError;
+};
+
+class LLPluginMessagePipe
+{
+ LOG_CLASS(LLPluginMessagePipe);
+public:
+ LLPluginMessagePipe(LLPluginMessagePipeOwner *owner, LLSocket::ptr_t socket);
+ virtual ~LLPluginMessagePipe();
+
+ bool addMessage(const std::string &message);
+ void clearOwner(void);
+
+ bool pump(F64 timeout = 0.0f);
+
+protected:
+ void processInput(void);
+
+ // used internally by pump()
+ void setSocketTimeout(apr_interval_time_t timeout_usec);
+
+ std::string mInput;
+ std::string mOutput;
+
+ LLPluginMessagePipeOwner *mOwner;
+ LLSocket::ptr_t mSocket;
+};
+
+#endif // LL_LLPLUGINMESSAGE_H
diff --git a/linden/indra/llplugin/llpluginprocesschild.cpp b/linden/indra/llplugin/llpluginprocesschild.cpp
new file mode 100644
index 0000000..9b5eafc
--- /dev/null
+++ b/linden/indra/llplugin/llpluginprocesschild.cpp
@@ -0,0 +1,490 @@
+/**
+ * @file llpluginprocesschild.cpp
+ * @brief LLPluginProcessChild handles the child side of the external-process plugin API.
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "llpluginprocesschild.h"
+#include "llplugininstance.h"
+#include "llpluginmessagepipe.h"
+#include "llpluginmessageclasses.h"
+
+static const F32 HEARTBEAT_SECONDS = 1.0f;
+static const F32 PLUGIN_IDLE_SECONDS = 1.0f / 100.0f; // Each call to idle will give the plugin this much time.
+
+LLPluginProcessChild::LLPluginProcessChild()
+{
+ mInstance = NULL;
+ mSocket = LLSocket::create(gAPRPoolp, LLSocket::STREAM_TCP);
+ mSleepTime = PLUGIN_IDLE_SECONDS; // default: send idle messages at 100Hz
+ mCPUElapsed = 0.0f;
+}
+
+LLPluginProcessChild::~LLPluginProcessChild()
+{
+ if(mInstance != NULL)
+ {
+ sendMessageToPlugin(LLPluginMessage("base", "cleanup"));
+ delete mInstance;
+ mInstance = NULL;
+ }
+}
+
+void LLPluginProcessChild::killSockets(void)
+{
+ killMessagePipe();
+ mSocket.reset();
+}
+
+void LLPluginProcessChild::init(U32 launcher_port)
+{
+ mLauncherHost = LLHost("127.0.0.1", launcher_port);
+ setState(STATE_INITIALIZED);
+}
+
+void LLPluginProcessChild::idle(void)
+{
+ bool idle_again;
+ do
+ {
+ if(mSocketError != APR_SUCCESS)
+ {
+ LL_INFOS("Plugin") << "message pipe is in error state, moving to STATE_ERROR"<< LL_ENDL;
+ setState(STATE_ERROR);
+ }
+
+ if((mState > STATE_INITIALIZED) && (mMessagePipe == NULL))
+ {
+ // The pipe has been closed -- we're done.
+ // TODO: This could be slightly more subtle, but I'm not sure it needs to be.
+ LL_INFOS("Plugin") << "message pipe went away, moving to STATE_ERROR"<< LL_ENDL;
+ setState(STATE_ERROR);
+ }
+
+ // If a state needs to go directly to another state (as a performance enhancement), it can set idle_again to true after calling setState().
+ // USE THIS CAREFULLY, since it can starve other code. Specifically make sure there's no way to get into a closed cycle and never return.
+ // When in doubt, don't do it.
+ idle_again = false;
+
+ if(mInstance != NULL)
+ {
+ // Provide some time to the plugin
+ mInstance->idle();
+ }
+
+ switch(mState)
+ {
+ case STATE_UNINITIALIZED:
+ break;
+
+ case STATE_INITIALIZED:
+ if(mSocket->blockingConnect(mLauncherHost))
+ {
+ // This automatically sets mMessagePipe
+ new LLPluginMessagePipe(this, mSocket);
+
+ setState(STATE_CONNECTED);
+ }
+ else
+ {
+ // connect failed
+ setState(STATE_ERROR);
+ }
+ break;
+
+ case STATE_CONNECTED:
+ sendMessageToParent(LLPluginMessage(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "hello"));
+ setState(STATE_PLUGIN_LOADING);
+ break;
+
+ case STATE_PLUGIN_LOADING:
+ if(!mPluginFile.empty())
+ {
+ mInstance = new LLPluginInstance(this);
+ if(mInstance->load(mPluginFile) == 0)
+ {
+ mHeartbeat.start();
+ mHeartbeat.setTimerExpirySec(HEARTBEAT_SECONDS);
+ mCPUElapsed = 0.0f;
+ setState(STATE_PLUGIN_LOADED);
+ }
+ else
+ {
+ setState(STATE_ERROR);
+ }
+ }
+ break;
+
+ case STATE_PLUGIN_LOADED:
+ {
+ setState(STATE_PLUGIN_INITIALIZING);
+ LLPluginMessage message("base", "init");
+ message.setValue("user_data_path", mUserDataPath);
+ sendMessageToPlugin(message);
+ }
+ break;
+
+ case STATE_PLUGIN_INITIALIZING:
+ // waiting for init_response...
+ break;
+
+ case STATE_RUNNING:
+ if(mInstance != NULL)
+ {
+ // Provide some time to the plugin
+ LLPluginMessage message("base", "idle");
+ message.setValueReal("time", PLUGIN_IDLE_SECONDS);
+ sendMessageToPlugin(message);
+
+ mInstance->idle();
+
+ if(mHeartbeat.hasExpired())
+ {
+
+ // This just proves that we're not stuck down inside the plugin code.
+ LLPluginMessage heartbeat(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "heartbeat");
+
+ // Calculate the approximage CPU usage fraction (floating point value between 0 and 1) used by the plugin this heartbeat cycle.
+ // Note that this will not take into account any threads or additional processes the plugin spawns, but it's a first approximation.
+ // If we could write OS-specific functions to query the actual CPU usage of this process, that would be a better approximation.
+ heartbeat.setValueReal("cpu_usage", mCPUElapsed / mHeartbeat.getElapsedTimeF64());
+
+ sendMessageToParent(heartbeat);
+
+ mHeartbeat.reset();
+ mHeartbeat.setTimerExpirySec(HEARTBEAT_SECONDS);
+ mCPUElapsed = 0.0f;
+ }
+ }
+ // receivePluginMessage will transition to STATE_UNLOADING
+ break;
+
+ case STATE_UNLOADING:
+ if(mInstance != NULL)
+ {
+ sendMessageToPlugin(LLPluginMessage("base", "cleanup"));
+ delete mInstance;
+ mInstance = NULL;
+ }
+ setState(STATE_UNLOADED);
+ break;
+
+ case STATE_UNLOADED:
+ killSockets();
+ setState(STATE_DONE);
+ break;
+
+ case STATE_ERROR:
+ // Close the socket to the launcher
+ killSockets();
+ // TODO: Where do we go from here? Just exit()?
+ setState(STATE_DONE);
+ break;
+
+ case STATE_DONE:
+ // just sit here.
+ break;
+ }
+
+ } while (idle_again);
+}
+
+void LLPluginProcessChild::sleep(F64 seconds)
+{
+ if(mMessagePipe)
+ {
+ mMessagePipe->pump(seconds);
+ }
+ else
+ {
+ ms_sleep((int)(seconds * 1000.0f));
+ }
+}
+
+void LLPluginProcessChild::pump(void)
+{
+ if(mMessagePipe)
+ {
+ mMessagePipe->pump(0.0f);
+ }
+ else
+ {
+ // Should we warn here?
+ }
+}
+
+
+bool LLPluginProcessChild::isRunning(void)
+{
+ bool result = false;
+
+ if(mState == STATE_RUNNING)
+ result = true;
+
+ return result;
+}
+
+bool LLPluginProcessChild::isDone(void)
+{
+ bool result = false;
+
+ switch(mState)
+ {
+ case STATE_DONE:
+ result = true;
+ break;
+ default:
+ break;
+ }
+
+ return result;
+}
+
+void LLPluginProcessChild::sendMessageToPlugin(const LLPluginMessage &message)
+{
+ std::string buffer = message.generate();
+
+ LL_DEBUGS("Plugin") << "Sending to plugin: " << buffer << LL_ENDL;
+ LLTimer elapsed;
+
+ mInstance->sendMessage(buffer);
+
+ mCPUElapsed += elapsed.getElapsedTimeF64();
+}
+
+void LLPluginProcessChild::sendMessageToParent(const LLPluginMessage &message)
+{
+ std::string buffer = message.generate();
+
+ LL_DEBUGS("Plugin") << "Sending to parent: " << buffer << LL_ENDL;
+
+ writeMessageRaw(buffer);
+}
+
+void LLPluginProcessChild::receiveMessageRaw(const std::string &message)
+{
+ // Incoming message from the TCP Socket
+
+ LL_DEBUGS("Plugin") << "Received from parent: " << message << LL_ENDL;
+
+ bool passMessage = true;
+
+ // FIXME: how should we handle queueing here?
+
+ {
+ // Decode this message
+ LLPluginMessage parsed;
+ parsed.parse(message);
+
+ std::string message_class = parsed.getClass();
+ if(message_class == LLPLUGIN_MESSAGE_CLASS_INTERNAL)
+ {
+ passMessage = false;
+
+ std::string message_name = parsed.getName();
+ if(message_name == "load_plugin")
+ {
+ mPluginFile = parsed.getValue("file");
+ mUserDataPath = parsed.getValue("user_data_path");
+ }
+ else if(message_name == "shm_add")
+ {
+ std::string name = parsed.getValue("name");
+ size_t size = (size_t)parsed.getValueS32("size");
+
+ sharedMemoryRegionsType::iterator iter = mSharedMemoryRegions.find(name);
+ if(iter != mSharedMemoryRegions.end())
+ {
+ // Need to remove the old region first
+ LL_WARNS("Plugin") << "Adding a duplicate shared memory segment!" << LL_ENDL;
+ }
+ else
+ {
+ // This is a new region
+ LLPluginSharedMemory *region = new LLPluginSharedMemory;
+ if(region->attach(name, size))
+ {
+ mSharedMemoryRegions.insert(sharedMemoryRegionsType::value_type(name, region));
+
+ std::stringstream addr;
+ addr << region->getMappedAddress();
+
+ // Send the add notification to the plugin
+ LLPluginMessage message("base", "shm_added");
+ message.setValue("name", name);
+ message.setValueS32("size", (S32)size);
+ message.setValuePointer("address", region->getMappedAddress());
+ sendMessageToPlugin(message);
+
+ // and send the response to the parent
+ message.setMessage(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "shm_add_response");
+ message.setValue("name", name);
+ sendMessageToParent(message);
+ }
+ else
+ {
+ LL_WARNS("Plugin") << "Couldn't create a shared memory segment!" << LL_ENDL;
+ }
+ }
+
+ }
+ else if(message_name == "shm_remove")
+ {
+ std::string name = parsed.getValue("name");
+ sharedMemoryRegionsType::iterator iter = mSharedMemoryRegions.find(name);
+ if(iter != mSharedMemoryRegions.end())
+ {
+ // forward the remove request to the plugin -- its response will trigger us to detach the segment.
+ LLPluginMessage message("base", "shm_remove");
+ message.setValue("name", name);
+ sendMessageToPlugin(message);
+ }
+ else
+ {
+ LL_WARNS("Plugin") << "shm_remove for unknown memory segment!" << LL_ENDL;
+ }
+ }
+ else if(message_name == "sleep_time")
+ {
+ mSleepTime = parsed.getValueReal("time");
+ }
+ else if(message_name == "crash")
+ {
+ // Crash the plugin
+ LL_ERRS("Plugin") << "Plugin crash requested." << LL_ENDL;
+ }
+ else if(message_name == "hang")
+ {
+ // Hang the plugin
+ LL_WARNS("Plugin") << "Plugin hang requested." << LL_ENDL;
+ while(1)
+ {
+ // wheeeeeeeee......
+ }
+ }
+ else
+ {
+ LL_WARNS("Plugin") << "Unknown internal message from parent: " << message_name << LL_ENDL;
+ }
+ }
+ }
+
+ if(passMessage && mInstance != NULL)
+ {
+ LLTimer elapsed;
+
+ mInstance->sendMessage(message);
+
+ mCPUElapsed += elapsed.getElapsedTimeF64();
+ }
+}
+
+/* virtual */
+void LLPluginProcessChild::receivePluginMessage(const std::string &message)
+{
+ LL_DEBUGS("Plugin") << "Received from plugin: " << message << LL_ENDL;
+
+ // Incoming message from the plugin instance
+ bool passMessage = true;
+
+ // FIXME: how should we handle queueing here?
+
+ // Intercept certain base messages (responses to ones sent by this class)
+ {
+ // Decode this message
+ LLPluginMessage parsed;
+ parsed.parse(message);
+ std::string message_class = parsed.getClass();
+ if(message_class == "base")
+ {
+ std::string message_name = parsed.getName();
+ if(message_name == "init_response")
+ {
+ // The plugin has finished initializing.
+ setState(STATE_RUNNING);
+
+ // Don't pass this message up to the parent
+ passMessage = false;
+
+ LLPluginMessage new_message(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "load_plugin_response");
+ LLSD versions = parsed.getValueLLSD("versions");
+ new_message.setValueLLSD("versions", versions);
+
+ if(parsed.hasValue("plugin_version"))
+ {
+ std::string plugin_version = parsed.getValue("plugin_version");
+ new_message.setValueLLSD("plugin_version", plugin_version);
+ }
+
+ // Let the parent know it's loaded and initialized.
+ sendMessageToParent(new_message);
+ }
+ else if(message_name == "shm_remove_response")
+ {
+ // Don't pass this message up to the parent
+ passMessage = false;
+
+ std::string name = parsed.getValue("name");
+ sharedMemoryRegionsType::iterator iter = mSharedMemoryRegions.find(name);
+ if(iter != mSharedMemoryRegions.end())
+ {
+ // detach the shared memory region
+ iter->second->detach();
+
+ // and remove it from our map
+ mSharedMemoryRegions.erase(iter);
+
+ // Finally, send the response to the parent.
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "shm_remove_response");
+ message.setValue("name", name);
+ sendMessageToParent(message);
+ }
+ else
+ {
+ LL_WARNS("Plugin") << "shm_remove_response for unknown memory segment!" << LL_ENDL;
+ }
+ }
+ }
+ }
+
+ if(passMessage)
+ {
+ LL_DEBUGS("Plugin") << "Passing through to parent: " << message << LL_ENDL;
+ writeMessageRaw(message);
+ }
+}
+
+
+void LLPluginProcessChild::setState(EState state)
+{
+ LL_DEBUGS("Plugin") << "setting state to " << state << LL_ENDL;
+ mState = state;
+};
diff --git a/linden/indra/llplugin/llpluginprocesschild.h b/linden/indra/llplugin/llpluginprocesschild.h
new file mode 100644
index 0000000..16a1ae8
--- /dev/null
+++ b/linden/indra/llplugin/llpluginprocesschild.h
@@ -0,0 +1,112 @@
+/**
+ * @file llpluginprocesschild.h
+ * @brief LLPluginProcessChild handles the child side of the external-process plugin API.
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPLUGINPROCESSCHILD_H
+#define LL_LLPLUGINPROCESSCHILD_H
+
+#include "llpluginmessage.h"
+#include "llpluginmessagepipe.h"
+#include "llplugininstance.h"
+#include "llhost.h"
+#include "llpluginsharedmemory.h"
+
+class LLPluginInstance;
+
+class LLPluginProcessChild: public LLPluginMessagePipeOwner, public LLPluginInstanceMessageListener
+{
+ LOG_CLASS(LLPluginProcessChild);
+public:
+ LLPluginProcessChild();
+ ~LLPluginProcessChild();
+
+ void init(U32 launcher_port);
+ void idle(void);
+ void sleep(F64 seconds);
+ void pump();
+
+ // returns true if the plugin is in the steady state (processing messages)
+ bool isRunning(void);
+
+ // returns true if the plugin is unloaded or we're in an unrecoverable error state.
+ bool isDone(void);
+
+ void killSockets(void);
+
+ F64 getSleepTime(void) const { return mSleepTime; };
+
+ void sendMessageToPlugin(const LLPluginMessage &message);
+ void sendMessageToParent(const LLPluginMessage &message);
+
+ // Inherited from LLPluginMessagePipeOwner
+ /* virtual */ void receiveMessageRaw(const std::string &message);
+
+ // Inherited from LLPluginInstanceMessageListener
+ /* virtual */ void receivePluginMessage(const std::string &message);
+
+private:
+
+ enum EState
+ {
+ STATE_UNINITIALIZED,
+ STATE_INITIALIZED, // init() has been called
+ STATE_CONNECTED, // connected back to launcher
+ STATE_PLUGIN_LOADING, // plugin library needs to be loaded
+ STATE_PLUGIN_LOADED, // plugin library has been loaded
+ STATE_PLUGIN_INITIALIZING, // plugin is processing init message
+ STATE_RUNNING, // steady state (processing messages)
+ STATE_UNLOADING, // plugin has sent shutdown_response and needs to be unloaded
+ STATE_UNLOADED, // plugin has been unloaded
+ STATE_ERROR, // generic bailout state
+ STATE_DONE // state machine will sit in this state after either error or normal termination.
+ };
+ EState mState;
+ void setState(EState state);
+
+ LLHost mLauncherHost;
+ LLSocket::ptr_t mSocket;
+
+ std::string mPluginFile;
+
+ std::string mUserDataPath;
+
+ LLPluginInstance *mInstance;
+
+ typedef std::map sharedMemoryRegionsType;
+ sharedMemoryRegionsType mSharedMemoryRegions;
+
+ LLTimer mHeartbeat;
+ F64 mSleepTime;
+ F64 mCPUElapsed;
+
+};
+
+#endif // LL_LLPLUGINPROCESSCHILD_H
diff --git a/linden/indra/llplugin/llpluginprocessparent.cpp b/linden/indra/llplugin/llpluginprocessparent.cpp
new file mode 100644
index 0000000..bd36d11
--- /dev/null
+++ b/linden/indra/llplugin/llpluginprocessparent.cpp
@@ -0,0 +1,714 @@
+/**
+ * @file llpluginprocessparent.cpp
+ * @brief LLPluginProcessParent handles the parent side of the external-process plugin API.
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "llpluginprocessparent.h"
+#include "llpluginmessagepipe.h"
+#include "llpluginmessageclasses.h"
+
+#include "llapr.h"
+
+//virtual
+LLPluginProcessParentOwner::~LLPluginProcessParentOwner()
+{
+
+}
+
+LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner)
+{
+ mOwner = owner;
+ mBoundPort = 0;
+ mState = STATE_UNINITIALIZED;
+ mDisableTimeout = false;
+ mDebug = false;
+
+ mPluginLaunchTimeout = 60.0f;
+ mPluginLockupTimeout = 30.0f;
+
+ // Don't start the timer here -- start it when we actually launch the plugin process.
+ mHeartbeat.stop();
+}
+
+LLPluginProcessParent::~LLPluginProcessParent()
+{
+ LL_DEBUGS("Plugin") << "destructor" << LL_ENDL;
+
+ // Destroy any remaining shared memory regions
+ sharedMemoryRegionsType::iterator iter;
+ while((iter = mSharedMemoryRegions.begin()) != mSharedMemoryRegions.end())
+ {
+ // destroy the shared memory region
+ iter->second->destroy();
+
+ // and remove it from our map
+ mSharedMemoryRegions.erase(iter);
+ }
+
+ // orphaning the process means it won't be killed when the LLProcessLauncher is destructed.
+ // This is what we want -- it should exit cleanly once it notices the sockets have been closed.
+ mProcess.orphan();
+ killSockets();
+}
+
+void LLPluginProcessParent::killSockets(void)
+{
+ killMessagePipe();
+ mListenSocket.reset();
+ mSocket.reset();
+}
+
+void LLPluginProcessParent::errorState(void)
+{
+ if(mState < STATE_RUNNING)
+ setState(STATE_LAUNCH_FAILURE);
+ else
+ setState(STATE_ERROR);
+}
+
+void LLPluginProcessParent::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path)
+{
+ mProcess.setExecutable(launcher_filename);
+ mPluginFile = plugin_filename;
+ mCPUUsage = 0.0f;
+ mDebug = debug;
+ mUserDataPath = user_data_path;
+
+ setState(STATE_INITIALIZED);
+}
+
+bool LLPluginProcessParent::accept()
+{
+ bool result = false;
+
+ apr_status_t status = APR_EGENERAL;
+ apr_socket_t *new_socket = NULL;
+
+ status = apr_socket_accept(
+ &new_socket,
+ mListenSocket->getSocket(),
+ gAPRPoolp);
+
+
+ if(status == APR_SUCCESS)
+ {
+// llinfos << "SUCCESS" << llendl;
+ // Success. Create a message pipe on the new socket
+
+ // we MUST create a new pool for the LLSocket, since it will take ownership of it and delete it in its destructor!
+ apr_pool_t* new_pool = NULL;
+ status = apr_pool_create(&new_pool, gAPRPoolp);
+
+ mSocket = LLSocket::create(new_socket, new_pool);
+ new LLPluginMessagePipe(this, mSocket);
+
+ result = true;
+ }
+ else if(APR_STATUS_IS_EAGAIN(status))
+ {
+// llinfos << "EAGAIN" << llendl;
+
+ // No incoming connections. This is not an error.
+ status = APR_SUCCESS;
+ }
+ else
+ {
+// llinfos << "Error:" << llendl;
+ ll_apr_warn_status(status);
+
+ // Some other error.
+ errorState();
+ }
+
+ return result;
+}
+
+void LLPluginProcessParent::idle(void)
+{
+ bool idle_again;
+
+ do
+ {
+ // Give time to network processing
+ if(mMessagePipe)
+ {
+ if(!mMessagePipe->pump())
+ {
+// LL_WARNS("Plugin") << "Message pipe hit an error state" << LL_ENDL;
+ errorState();
+ }
+ }
+
+ if((mSocketError != APR_SUCCESS) && (mState <= STATE_RUNNING))
+ {
+ // The socket is in an error state -- the plugin is gone.
+ LL_WARNS("Plugin") << "Socket hit an error state (" << mSocketError << ")" << LL_ENDL;
+ errorState();
+ }
+
+ // If a state needs to go directly to another state (as a performance enhancement), it can set idle_again to true after calling setState().
+ // USE THIS CAREFULLY, since it can starve other code. Specifically make sure there's no way to get into a closed cycle and never return.
+ // When in doubt, don't do it.
+ idle_again = false;
+ switch(mState)
+ {
+ case STATE_UNINITIALIZED:
+ break;
+
+ case STATE_INITIALIZED:
+ {
+
+ apr_status_t status = APR_SUCCESS;
+ apr_sockaddr_t* addr = NULL;
+ mListenSocket = LLSocket::create(gAPRPoolp, LLSocket::STREAM_TCP);
+ mBoundPort = 0;
+
+ // This code is based on parts of LLSocket::create() in lliosocket.cpp.
+
+ status = apr_sockaddr_info_get(
+ &addr,
+ "127.0.0.1",
+ APR_INET,
+ 0, // port 0 = ephemeral ("find me a port")
+ 0,
+ gAPRPoolp);
+
+ if(ll_apr_warn_status(status))
+ {
+ killSockets();
+ errorState();
+ break;
+ }
+
+ // This allows us to reuse the address on quick down/up. This is unlikely to create problems.
+ ll_apr_warn_status(apr_socket_opt_set(mListenSocket->getSocket(), APR_SO_REUSEADDR, 1));
+
+ status = apr_socket_bind(mListenSocket->getSocket(), addr);
+ if(ll_apr_warn_status(status))
+ {
+ killSockets();
+ errorState();
+ break;
+ }
+
+ // Get the actual port the socket was bound to
+ {
+ apr_sockaddr_t* bound_addr = NULL;
+ if(ll_apr_warn_status(apr_socket_addr_get(&bound_addr, APR_LOCAL, mListenSocket->getSocket())))
+ {
+ killSockets();
+ errorState();
+ break;
+ }
+ mBoundPort = bound_addr->port;
+
+ if(mBoundPort == 0)
+ {
+ LL_WARNS("Plugin") << "Bound port number unknown, bailing out." << LL_ENDL;
+
+ killSockets();
+ errorState();
+ break;
+ }
+ }
+
+ LL_DEBUGS("Plugin") << "Bound tcp socket to port: " << addr->port << LL_ENDL;
+
+ // Make the listen socket non-blocking
+ status = apr_socket_opt_set(mListenSocket->getSocket(), APR_SO_NONBLOCK, 1);
+ if(ll_apr_warn_status(status))
+ {
+ killSockets();
+ errorState();
+ break;
+ }
+
+ apr_socket_timeout_set(mListenSocket->getSocket(), 0);
+ if(ll_apr_warn_status(status))
+ {
+ killSockets();
+ errorState();
+ break;
+ }
+
+ // If it's a stream based socket, we need to tell the OS
+ // to keep a queue of incoming connections for ACCEPT.
+ status = apr_socket_listen(
+ mListenSocket->getSocket(),
+ 10); // FIXME: Magic number for queue size
+
+ if(ll_apr_warn_status(status))
+ {
+ killSockets();
+ errorState();
+ break;
+ }
+
+ // If we got here, we're listening.
+ setState(STATE_LISTENING);
+ }
+ break;
+
+ case STATE_LISTENING:
+ {
+ // Launch the plugin process.
+
+ // Only argument to the launcher is the port number we're listening on
+ std::stringstream stream;
+ stream << mBoundPort;
+ mProcess.addArgument(stream.str());
+ if(mProcess.launch() != 0)
+ {
+ errorState();
+ }
+ else
+ {
+ if(mDebug)
+ {
+ #if LL_DARWIN
+ // If we're set to debug, start up a gdb instance in a new terminal window and have it attach to the plugin process and continue.
+
+ // The command we're constructing would look like this on the command line:
+ // osascript -e 'tell application "Terminal"' -e 'set win to do script "gdb -pid 12345"' -e 'do script "continue" in win' -e 'end tell'
+
+ std::stringstream cmd;
+
+ mDebugger.setExecutable("/usr/bin/osascript");
+ mDebugger.addArgument("-e");
+ mDebugger.addArgument("tell application \"Terminal\"");
+ mDebugger.addArgument("-e");
+ cmd << "set win to do script \"gdb -pid " << mProcess.getProcessID() << "\"";
+ mDebugger.addArgument(cmd.str());
+ mDebugger.addArgument("-e");
+ mDebugger.addArgument("do script \"continue\" in win");
+ mDebugger.addArgument("-e");
+ mDebugger.addArgument("end tell");
+ mDebugger.launch();
+
+ #endif
+ }
+
+ // This will allow us to time out if the process never starts.
+ mHeartbeat.start();
+ mHeartbeat.setTimerExpirySec(mPluginLaunchTimeout);
+ setState(STATE_LAUNCHED);
+ }
+ }
+ break;
+
+ case STATE_LAUNCHED:
+ // waiting for the plugin to connect
+ if(pluginLockedUpOrQuit())
+ {
+ errorState();
+ }
+ else
+ {
+ // Check for the incoming connection.
+ if(accept())
+ {
+ // Stop listening on the server port
+ mListenSocket.reset();
+ setState(STATE_CONNECTED);
+ }
+ }
+ break;
+
+ case STATE_CONNECTED:
+ // waiting for hello message from the plugin
+
+ if(pluginLockedUpOrQuit())
+ {
+ errorState();
+ }
+ break;
+
+ case STATE_HELLO:
+ LL_DEBUGS("Plugin") << "received hello message" << llendl;
+
+ // Send the message to load the plugin
+ {
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "load_plugin");
+ message.setValue("file", mPluginFile);
+ message.setValue("user_data_path", mUserDataPath);
+ sendMessage(message);
+ }
+
+ setState(STATE_LOADING);
+ break;
+
+ case STATE_LOADING:
+ // The load_plugin_response message will kick us from here into STATE_RUNNING
+ if(pluginLockedUpOrQuit())
+ {
+ errorState();
+ }
+ break;
+
+ case STATE_RUNNING:
+ if(pluginLockedUpOrQuit())
+ {
+ errorState();
+ }
+ break;
+
+ case STATE_EXITING:
+ if(!mProcess.isRunning())
+ {
+ setState(STATE_CLEANUP);
+ }
+ else if(pluginLockedUp())
+ {
+ LL_WARNS("Plugin") << "timeout in exiting state, bailing out" << llendl;
+ errorState();
+ }
+ break;
+
+ case STATE_LAUNCH_FAILURE:
+ if(mOwner != NULL)
+ {
+ mOwner->pluginLaunchFailed();
+ }
+ setState(STATE_CLEANUP);
+ break;
+
+ case STATE_ERROR:
+ if(mOwner != NULL)
+ {
+ mOwner->pluginDied();
+ }
+ setState(STATE_CLEANUP);
+ break;
+
+ case STATE_CLEANUP:
+ // Don't do a kill here anymore -- closing the sockets is the new 'kill'.
+ mProcess.orphan();
+ killSockets();
+ setState(STATE_DONE);
+ break;
+
+
+ case STATE_DONE:
+ // just sit here.
+ break;
+
+ }
+
+ } while (idle_again);
+}
+
+bool LLPluginProcessParent::isLoading(void)
+{
+ bool result = false;
+
+ if(mState <= STATE_LOADING)
+ result = true;
+
+ return result;
+}
+
+bool LLPluginProcessParent::isRunning(void)
+{
+ bool result = false;
+
+ if(mState == STATE_RUNNING)
+ result = true;
+
+ return result;
+}
+
+bool LLPluginProcessParent::isDone(void)
+{
+ bool result = false;
+
+ if(mState == STATE_DONE)
+ result = true;
+
+ return result;
+}
+
+void LLPluginProcessParent::setSleepTime(F64 sleep_time, bool force_send)
+{
+ if(force_send || (sleep_time != mSleepTime))
+ {
+ // Cache the time locally
+ mSleepTime = sleep_time;
+
+ if(canSendMessage())
+ {
+ // and send to the plugin.
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "sleep_time");
+ message.setValueReal("time", mSleepTime);
+ sendMessage(message);
+ }
+ else
+ {
+ // Too early to send -- the load_plugin_response message will trigger us to send mSleepTime later.
+ }
+ }
+}
+
+void LLPluginProcessParent::sendMessage(const LLPluginMessage &message)
+{
+
+ std::string buffer = message.generate();
+ LL_DEBUGS("Plugin") << "Sending: " << buffer << LL_ENDL;
+ writeMessageRaw(buffer);
+}
+
+
+void LLPluginProcessParent::receiveMessageRaw(const std::string &message)
+{
+ LL_DEBUGS("Plugin") << "Received: " << message << LL_ENDL;
+
+ // FIXME: should this go into a queue instead?
+
+ LLPluginMessage parsed;
+ if(parsed.parse(message) != -1)
+ {
+ receiveMessage(parsed);
+ }
+}
+
+void LLPluginProcessParent::receiveMessage(const LLPluginMessage &message)
+{
+ std::string message_class = message.getClass();
+ if(message_class == LLPLUGIN_MESSAGE_CLASS_INTERNAL)
+ {
+ // internal messages should be handled here
+ std::string message_name = message.getName();
+ if(message_name == "hello")
+ {
+ if(mState == STATE_CONNECTED)
+ {
+ // Plugin host has launched. Tell it which plugin to load.
+ setState(STATE_HELLO);
+ }
+ else
+ {
+ LL_WARNS("Plugin") << "received hello message in wrong state -- bailing out" << LL_ENDL;
+ errorState();
+ }
+
+ }
+ else if(message_name == "load_plugin_response")
+ {
+ if(mState == STATE_LOADING)
+ {
+ // Plugin has been loaded.
+
+ mPluginVersionString = message.getValue("plugin_version");
+ LL_INFOS("Plugin") << "plugin version string: " << mPluginVersionString << LL_ENDL;
+
+ // Check which message classes/versions the plugin supports.
+ // TODO: check against current versions
+ // TODO: kill plugin on major mismatches?
+ mMessageClassVersions = message.getValueLLSD("versions");
+ LLSD::map_iterator iter;
+ for(iter = mMessageClassVersions.beginMap(); iter != mMessageClassVersions.endMap(); iter++)
+ {
+ LL_INFOS("Plugin") << "message class: " << iter->first << " -> version: " << iter->second.asString() << LL_ENDL;
+ }
+
+ // Send initial sleep time
+ setSleepTime(mSleepTime, true);
+
+ setState(STATE_RUNNING);
+ }
+ else
+ {
+ LL_WARNS("Plugin") << "received load_plugin_response message in wrong state -- bailing out" << LL_ENDL;
+ errorState();
+ }
+ }
+ else if(message_name == "heartbeat")
+ {
+ // this resets our timer.
+ mHeartbeat.setTimerExpirySec(mPluginLockupTimeout);
+
+ mCPUUsage = message.getValueReal("cpu_usage");
+
+ LL_DEBUGS("Plugin") << "cpu usage reported as " << mCPUUsage << LL_ENDL;
+
+ }
+ else if(message_name == "shm_add_response")
+ {
+ // Nothing to do here.
+ }
+ else if(message_name == "shm_remove_response")
+ {
+ std::string name = message.getValue("name");
+ sharedMemoryRegionsType::iterator iter = mSharedMemoryRegions.find(name);
+
+ if(iter != mSharedMemoryRegions.end())
+ {
+ // destroy the shared memory region
+ iter->second->destroy();
+
+ // and remove it from our map
+ mSharedMemoryRegions.erase(iter);
+ }
+ }
+ else
+ {
+ LL_WARNS("Plugin") << "Unknown internal message from child: " << message_name << LL_ENDL;
+ }
+ }
+ else
+ {
+ if(mOwner != NULL)
+ {
+ mOwner->receivePluginMessage(message);
+ }
+ }
+}
+
+std::string LLPluginProcessParent::addSharedMemory(size_t size)
+{
+ std::string name;
+
+ LLPluginSharedMemory *region = new LLPluginSharedMemory;
+
+ // This is a new region
+ if(region->create(size))
+ {
+ name = region->getName();
+
+ mSharedMemoryRegions.insert(sharedMemoryRegionsType::value_type(name, region));
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "shm_add");
+ message.setValue("name", name);
+ message.setValueS32("size", (S32)size);
+ sendMessage(message);
+ }
+ else
+ {
+ LL_WARNS("Plugin") << "Couldn't create a shared memory segment!" << LL_ENDL;
+
+ // Don't leak
+ delete region;
+ }
+
+ return name;
+}
+
+void LLPluginProcessParent::removeSharedMemory(const std::string &name)
+{
+ sharedMemoryRegionsType::iterator iter = mSharedMemoryRegions.find(name);
+
+ if(iter != mSharedMemoryRegions.end())
+ {
+ // This segment exists. Send the message to the child to unmap it. The response will cause the parent to unmap our end.
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "shm_remove");
+ message.setValue("name", name);
+ sendMessage(message);
+ }
+ else
+ {
+ LL_WARNS("Plugin") << "Request to remove an unknown shared memory segment." << LL_ENDL;
+ }
+}
+size_t LLPluginProcessParent::getSharedMemorySize(const std::string &name)
+{
+ size_t result = 0;
+
+ sharedMemoryRegionsType::iterator iter = mSharedMemoryRegions.find(name);
+ if(iter != mSharedMemoryRegions.end())
+ {
+ result = iter->second->getSize();
+ }
+
+ return result;
+}
+void *LLPluginProcessParent::getSharedMemoryAddress(const std::string &name)
+{
+ void *result = NULL;
+
+ sharedMemoryRegionsType::iterator iter = mSharedMemoryRegions.find(name);
+ if(iter != mSharedMemoryRegions.end())
+ {
+ result = iter->second->getMappedAddress();
+ }
+
+ return result;
+}
+
+std::string LLPluginProcessParent::getMessageClassVersion(const std::string &message_class)
+{
+ std::string result;
+
+ if(mMessageClassVersions.has(message_class))
+ {
+ result = mMessageClassVersions[message_class].asString();
+ }
+
+ return result;
+}
+
+std::string LLPluginProcessParent::getPluginVersion(void)
+{
+ return mPluginVersionString;
+}
+
+void LLPluginProcessParent::setState(EState state)
+{
+ LL_DEBUGS("Plugin") << "setting state to " << state << LL_ENDL;
+ mState = state;
+};
+
+bool LLPluginProcessParent::pluginLockedUpOrQuit()
+{
+ bool result = false;
+
+ if(!mDisableTimeout && !mDebug)
+ {
+ if(!mProcess.isRunning())
+ {
+ LL_WARNS("Plugin") << "child exited" << llendl;
+ result = true;
+ }
+ else if(pluginLockedUp())
+ {
+ LL_WARNS("Plugin") << "timeout" << llendl;
+ result = true;
+ }
+ }
+
+ return result;
+}
+
+bool LLPluginProcessParent::pluginLockedUp()
+{
+ // If the timer is running and has expired, the plugin has locked up.
+ return (mHeartbeat.getStarted() && mHeartbeat.hasExpired());
+}
+
diff --git a/linden/indra/llplugin/llpluginprocessparent.h b/linden/indra/llplugin/llpluginprocessparent.h
new file mode 100644
index 0000000..00c60b5
--- /dev/null
+++ b/linden/indra/llplugin/llpluginprocessparent.h
@@ -0,0 +1,169 @@
+/**
+ * @file llpluginprocessparent.h
+ * @brief LLPluginProcessParent handles the parent side of the external-process plugin API.
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPLUGINPROCESSPARENT_H
+#define LL_LLPLUGINPROCESSPARENT_H
+
+#include "llapr.h"
+#include "llprocesslauncher.h"
+#include "llpluginmessage.h"
+#include "llpluginmessagepipe.h"
+#include "llpluginsharedmemory.h"
+
+#include "lliosocket.h"
+
+class LLPluginProcessParentOwner
+{
+public:
+ virtual ~LLPluginProcessParentOwner();
+ virtual void receivePluginMessage(const LLPluginMessage &message) = 0;
+ // This will only be called when the plugin has died unexpectedly
+ virtual void pluginLaunchFailed() {};
+ virtual void pluginDied() {};
+};
+
+class LLPluginProcessParent : public LLPluginMessagePipeOwner
+{
+ LOG_CLASS(LLPluginProcessParent);
+public:
+ LLPluginProcessParent(LLPluginProcessParentOwner *owner);
+ ~LLPluginProcessParent();
+
+ void init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path);
+ void idle(void);
+
+ // returns true if the plugin is on its way to steady state
+ bool isLoading(void);
+
+ // returns true if the plugin is in the steady state (processing messages)
+ bool isRunning(void);
+
+ // returns true if the process has exited or we've had a fatal error
+ bool isDone(void);
+
+ void killSockets(void);
+
+ // Go to the proper error state
+ void errorState(void);
+
+ void setSleepTime(F64 sleep_time, bool force_send = false);
+ F64 getSleepTime(void) const { return mSleepTime; };
+
+ void sendMessage(const LLPluginMessage &message);
+
+ void receiveMessage(const LLPluginMessage &message);
+
+ // Inherited from LLPluginMessagePipeOwner
+ void receiveMessageRaw(const std::string &message);
+
+ // This adds a memory segment shared with the client, generating a name for the segment. The name generated is guaranteed to be unique on the host.
+ // The caller must call removeSharedMemory first (and wait until getSharedMemorySize returns 0 for the indicated name) before re-adding a segment with the same name.
+ std::string addSharedMemory(size_t size);
+ // Negotiates for the removal of a shared memory segment. It is the caller's responsibility to ensure that nothing touches the memory
+ // after this has been called, since the segment will be unmapped shortly thereafter.
+ void removeSharedMemory(const std::string &name);
+ size_t getSharedMemorySize(const std::string &name);
+ void *getSharedMemoryAddress(const std::string &name);
+
+ // Returns the version string the plugin indicated for the message class, or an empty string if that class wasn't in the list.
+ std::string getMessageClassVersion(const std::string &message_class);
+
+ std::string getPluginVersion(void);
+
+ bool getDisableTimeout() { return mDisableTimeout; };
+ void setDisableTimeout(bool disable) { mDisableTimeout = disable; };
+
+ void setLaunchTimeout(F32 timeout) { mPluginLaunchTimeout = timeout; };
+ void setLockupTimeout(F32 timeout) { mPluginLockupTimeout = timeout; };
+
+ F64 getCPUUsage() { return mCPUUsage; };
+
+private:
+
+ enum EState
+ {
+ STATE_UNINITIALIZED,
+ STATE_INITIALIZED, // init() has been called
+ STATE_LISTENING, // listening for incoming connection
+ STATE_LAUNCHED, // process has been launched
+ STATE_CONNECTED, // process has connected
+ STATE_HELLO, // first message from the plugin process has been received
+ STATE_LOADING, // process has been asked to load the plugin
+ STATE_RUNNING, //
+ STATE_LAUNCH_FAILURE, // Failure before plugin loaded
+ STATE_ERROR, // generic bailout state
+ STATE_CLEANUP, // clean everything up
+ STATE_EXITING, // Tried to kill process, waiting for it to exit
+ STATE_DONE //
+
+ };
+ EState mState;
+ void setState(EState state);
+
+ bool pluginLockedUp();
+ bool pluginLockedUpOrQuit();
+
+ bool accept();
+
+ LLSocket::ptr_t mListenSocket;
+ LLSocket::ptr_t mSocket;
+ U32 mBoundPort;
+
+ LLProcessLauncher mProcess;
+
+ std::string mPluginFile;
+
+ std::string mUserDataPath;
+
+ LLPluginProcessParentOwner *mOwner;
+
+ typedef std::map sharedMemoryRegionsType;
+ sharedMemoryRegionsType mSharedMemoryRegions;
+
+ LLSD mMessageClassVersions;
+ std::string mPluginVersionString;
+
+ LLTimer mHeartbeat;
+ F64 mSleepTime;
+ F64 mCPUUsage;
+
+ bool mDisableTimeout;
+ bool mDebug;
+
+ LLProcessLauncher mDebugger;
+
+ F32 mPluginLaunchTimeout; // Somewhat longer timeout for initial launch.
+ F32 mPluginLockupTimeout; // If we don't receive a heartbeat in this many seconds, we declare the plugin locked up.
+
+};
+
+#endif // LL_LLPLUGINPROCESSPARENT_H
diff --git a/linden/indra/llplugin/llpluginsharedmemory.cpp b/linden/indra/llplugin/llpluginsharedmemory.cpp
new file mode 100644
index 0000000..2be4648
--- /dev/null
+++ b/linden/indra/llplugin/llpluginsharedmemory.cpp
@@ -0,0 +1,506 @@
+/**
+ * @file llpluginsharedmemory.cpp
+ * @brief LLPluginSharedMemory manages a shared memory segment for use by the LLPlugin API.
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "llpluginsharedmemory.h"
+
+// on Mac and Linux, we use the native shm_open/mmap interface by using
+// #define USE_SHM_OPEN_SHARED_MEMORY 1
+// in the appropriate sections below.
+
+// For Windows, use:
+// #define USE_WIN32_SHARED_MEMORY 1
+
+// If we ever want to fall back to the apr implementation for a platform, use:
+// #define USE_APR_SHARED_MEMORY 1
+
+#if LL_WINDOWS
+// #define USE_APR_SHARED_MEMORY 1
+ #define USE_WIN32_SHARED_MEMORY 1
+#elif LL_DARWIN
+ #define USE_SHM_OPEN_SHARED_MEMORY 1
+#elif LL_LINUX
+ #define USE_SHM_OPEN_SHARED_MEMORY 1
+#endif
+
+
+// FIXME: This path thing is evil and unacceptable.
+#if LL_WINDOWS
+ #define APR_SHARED_MEMORY_PREFIX_STRING "C:\\LLPlugin_"
+ // Apparnently using the "Global\\" prefix here only works from administrative accounts under Vista.
+ // Other options I've seen referenced are "Local\\" and "Session\\".
+ #define WIN32_SHARED_MEMORY_PREFIX_STRING "Local\\LL_"
+#else
+ // mac and linux
+ #define APR_SHARED_MEMORY_PREFIX_STRING "/tmp/LLPlugin_"
+ #define SHM_OPEN_SHARED_MEMORY_PREFIX_STRING "/LL"
+#endif
+
+#if USE_APR_SHARED_MEMORY
+ #include "llapr.h"
+ #include "apr_shm.h"
+#elif USE_SHM_OPEN_SHARED_MEMORY
+ #include
+ #include
+ #include
+#elif USE_WIN32_SHARED_MEMORY
+#include
+#endif // USE_APR_SHARED_MEMORY
+
+
+int LLPluginSharedMemory::sSegmentNumber = 0;
+
+std::string LLPluginSharedMemory::createName(void)
+{
+ std::stringstream newname;
+
+#if LL_WINDOWS
+ newname << GetCurrentProcessId();
+#else // LL_WINDOWS
+ newname << getpid();
+#endif // LL_WINDOWS
+
+ newname << "_" << sSegmentNumber++;
+
+ return newname.str();
+}
+
+/**
+ * @brief LLPluginSharedMemoryImpl is the platform-dependent implementation of LLPluginSharedMemory. TODO:DOC is this necessary/sufficient? kinda obvious.
+ *
+ */
+class LLPluginSharedMemoryPlatformImpl
+{
+public:
+ LLPluginSharedMemoryPlatformImpl();
+ ~LLPluginSharedMemoryPlatformImpl();
+
+#if USE_APR_SHARED_MEMORY
+ apr_shm_t* mAprSharedMemory;
+#elif USE_SHM_OPEN_SHARED_MEMORY
+ int mSharedMemoryFD;
+#elif USE_WIN32_SHARED_MEMORY
+ HANDLE mMapFile;
+#endif
+
+};
+
+/**
+ * Constructor. Creates a shared memory segment.
+ */
+LLPluginSharedMemory::LLPluginSharedMemory()
+{
+ mSize = 0;
+ mMappedAddress = NULL;
+ mNeedsDestroy = false;
+
+ mImpl = new LLPluginSharedMemoryPlatformImpl;
+}
+
+/**
+ * Destructor. Uses destroy() and detach() to ensure shared memory segment is cleaned up.
+ */
+LLPluginSharedMemory::~LLPluginSharedMemory()
+{
+ if(mNeedsDestroy)
+ destroy();
+ else
+ detach();
+
+ unlink();
+
+ delete mImpl;
+}
+
+#if USE_APR_SHARED_MEMORY
+// MARK: apr implementation
+
+LLPluginSharedMemoryPlatformImpl::LLPluginSharedMemoryPlatformImpl()
+{
+ mAprSharedMemory = NULL;
+}
+
+LLPluginSharedMemoryPlatformImpl::~LLPluginSharedMemoryPlatformImpl()
+{
+
+}
+
+bool LLPluginSharedMemory::map(void)
+{
+ mMappedAddress = apr_shm_baseaddr_get(mImpl->mAprSharedMemory);
+ if(mMappedAddress == NULL)
+ {
+ return false;
+ }
+
+ return true;
+}
+
+bool LLPluginSharedMemory::unmap(void)
+{
+ // This is a no-op under apr.
+ return true;
+}
+
+bool LLPluginSharedMemory::close(void)
+{
+ // This is a no-op under apr.
+ return true;
+}
+
+bool LLPluginSharedMemory::unlink(void)
+{
+ // This is a no-op under apr.
+ return true;
+}
+
+
+bool LLPluginSharedMemory::create(size_t size)
+{
+ mName = APR_SHARED_MEMORY_PREFIX_STRING;
+ mName += createName();
+ mSize = size;
+
+ apr_status_t status = apr_shm_create( &(mImpl->mAprSharedMemory), mSize, mName.c_str(), gAPRPoolp );
+
+ if(ll_apr_warn_status(status))
+ {
+ return false;
+ }
+
+ mNeedsDestroy = true;
+
+ return map();
+}
+
+bool LLPluginSharedMemory::destroy(void)
+{
+ if(mImpl->mAprSharedMemory)
+ {
+ apr_status_t status = apr_shm_destroy(mImpl->mAprSharedMemory);
+ if(ll_apr_warn_status(status))
+ {
+ // TODO: Is this a fatal error? I think not...
+ }
+ mImpl->mAprSharedMemory = NULL;
+ }
+
+ return true;
+}
+
+bool LLPluginSharedMemory::attach(const std::string &name, size_t size)
+{
+ mName = name;
+ mSize = size;
+
+ apr_status_t status = apr_shm_attach( &(mImpl->mAprSharedMemory), mName.c_str(), gAPRPoolp );
+
+ if(ll_apr_warn_status(status))
+ {
+ return false;
+ }
+
+ return map();
+}
+
+
+bool LLPluginSharedMemory::detach(void)
+{
+ if(mImpl->mAprSharedMemory)
+ {
+ apr_status_t status = apr_shm_detach(mImpl->mAprSharedMemory);
+ if(ll_apr_warn_status(status))
+ {
+ // TODO: Is this a fatal error? I think not...
+ }
+ mImpl->mAprSharedMemory = NULL;
+ }
+
+ return true;
+}
+
+
+#elif USE_SHM_OPEN_SHARED_MEMORY
+// MARK: shm_open/mmap implementation
+
+LLPluginSharedMemoryPlatformImpl::LLPluginSharedMemoryPlatformImpl()
+{
+ mSharedMemoryFD = -1;
+}
+
+LLPluginSharedMemoryPlatformImpl::~LLPluginSharedMemoryPlatformImpl()
+{
+}
+
+bool LLPluginSharedMemory::map(void)
+{
+ mMappedAddress = ::mmap(NULL, mSize, PROT_READ | PROT_WRITE, MAP_SHARED, mImpl->mSharedMemoryFD, 0);
+ if(mMappedAddress == NULL)
+ {
+ return false;
+ }
+
+ LL_DEBUGS("Plugin") << "memory mapped at " << mMappedAddress << LL_ENDL;
+
+ return true;
+}
+
+bool LLPluginSharedMemory::unmap(void)
+{
+ if(mMappedAddress != NULL)
+ {
+ LL_DEBUGS("Plugin") << "calling munmap(" << mMappedAddress << ", " << mSize << ")" << LL_ENDL;
+ if(::munmap(mMappedAddress, mSize) == -1)
+ {
+ // TODO: Is this a fatal error? I think not...
+ }
+
+ mMappedAddress = NULL;
+ }
+
+ return true;
+}
+
+bool LLPluginSharedMemory::close(void)
+{
+ if(mImpl->mSharedMemoryFD != -1)
+ {
+ LL_DEBUGS("Plugin") << "calling close(" << mImpl->mSharedMemoryFD << ")" << LL_ENDL;
+ if(::close(mImpl->mSharedMemoryFD) == -1)
+ {
+ // TODO: Is this a fatal error? I think not...
+ }
+
+ mImpl->mSharedMemoryFD = -1;
+ }
+ return true;
+}
+
+bool LLPluginSharedMemory::unlink(void)
+{
+ if(!mName.empty())
+ {
+ if(::shm_unlink(mName.c_str()) == -1)
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+
+bool LLPluginSharedMemory::create(size_t size)
+{
+ mName = SHM_OPEN_SHARED_MEMORY_PREFIX_STRING;
+ mName += createName();
+ mSize = size;
+
+ // Preemptive unlink, just in case something didn't get cleaned up.
+ unlink();
+
+ mImpl->mSharedMemoryFD = ::shm_open(mName.c_str(), O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
+ if(mImpl->mSharedMemoryFD == -1)
+ {
+ return false;
+ }
+
+ mNeedsDestroy = true;
+
+ if(::ftruncate(mImpl->mSharedMemoryFD, mSize) == -1)
+ {
+ return false;
+ }
+
+
+ return map();
+}
+
+bool LLPluginSharedMemory::destroy(void)
+{
+ unmap();
+ close();
+
+ return true;
+}
+
+
+bool LLPluginSharedMemory::attach(const std::string &name, size_t size)
+{
+ mName = name;
+ mSize = size;
+
+ mImpl->mSharedMemoryFD = ::shm_open(mName.c_str(), O_RDWR, S_IRUSR | S_IWUSR);
+ if(mImpl->mSharedMemoryFD == -1)
+ {
+ return false;
+ }
+
+ // unlink here so the segment will be cleaned up automatically after the last close.
+ unlink();
+
+ return map();
+}
+
+bool LLPluginSharedMemory::detach(void)
+{
+ unmap();
+ close();
+ return true;
+}
+
+#elif USE_WIN32_SHARED_MEMORY
+// MARK: Win32 CreateFileMapping-based implementation
+
+// Reference: http://msdn.microsoft.com/en-us/library/aa366551(VS.85).aspx
+
+LLPluginSharedMemoryPlatformImpl::LLPluginSharedMemoryPlatformImpl()
+{
+ mMapFile = NULL;
+}
+
+LLPluginSharedMemoryPlatformImpl::~LLPluginSharedMemoryPlatformImpl()
+{
+
+}
+
+bool LLPluginSharedMemory::map(void)
+{
+ mMappedAddress = MapViewOfFile(
+ mImpl->mMapFile, // handle to map object
+ FILE_MAP_ALL_ACCESS, // read/write permission
+ 0,
+ 0,
+ mSize);
+
+ if(mMappedAddress == NULL)
+ {
+ LL_WARNS("Plugin") << "MapViewOfFile failed: " << GetLastError() << LL_ENDL;
+ return false;
+ }
+
+ LL_DEBUGS("Plugin") << "memory mapped at " << mMappedAddress << LL_ENDL;
+
+ return true;
+}
+
+bool LLPluginSharedMemory::unmap(void)
+{
+ if(mMappedAddress != NULL)
+ {
+ UnmapViewOfFile(mMappedAddress);
+ mMappedAddress = NULL;
+ }
+
+ return true;
+}
+
+bool LLPluginSharedMemory::close(void)
+{
+ if(mImpl->mMapFile != NULL)
+ {
+ CloseHandle(mImpl->mMapFile);
+ mImpl->mMapFile = NULL;
+ }
+
+ return true;
+}
+
+bool LLPluginSharedMemory::unlink(void)
+{
+ // This is a no-op on Windows.
+ return true;
+}
+
+
+bool LLPluginSharedMemory::create(size_t size)
+{
+ mName = WIN32_SHARED_MEMORY_PREFIX_STRING;
+ mName += createName();
+ mSize = size;
+
+ mImpl->mMapFile = CreateFileMappingA(
+ INVALID_HANDLE_VALUE, // use paging file
+ NULL, // default security
+ PAGE_READWRITE, // read/write access
+ 0, // max. object size
+ mSize, // buffer size
+ mName.c_str()); // name of mapping object
+
+ if(mImpl->mMapFile == NULL)
+ {
+ LL_WARNS("Plugin") << "CreateFileMapping failed: " << GetLastError() << LL_ENDL;
+ return false;
+ }
+
+ mNeedsDestroy = true;
+
+ return map();
+}
+
+bool LLPluginSharedMemory::destroy(void)
+{
+ unmap();
+ close();
+ return true;
+}
+
+bool LLPluginSharedMemory::attach(const std::string &name, size_t size)
+{
+ mName = name;
+ mSize = size;
+
+ mImpl->mMapFile = OpenFileMappingA(
+ FILE_MAP_ALL_ACCESS, // read/write access
+ FALSE, // do not inherit the name
+ mName.c_str()); // name of mapping object
+
+ if(mImpl->mMapFile == NULL)
+ {
+ LL_WARNS("Plugin") << "OpenFileMapping failed: " << GetLastError() << LL_ENDL;
+ return false;
+ }
+
+ return map();
+}
+
+bool LLPluginSharedMemory::detach(void)
+{
+ unmap();
+ close();
+ return true;
+}
+
+
+
+#endif
diff --git a/linden/indra/llplugin/llpluginsharedmemory.h b/linden/indra/llplugin/llpluginsharedmemory.h
new file mode 100644
index 0000000..2dc550e
--- /dev/null
+++ b/linden/indra/llplugin/llpluginsharedmemory.h
@@ -0,0 +1,130 @@
+/**
+ * @file llpluginsharedmemory.h
+ * @brief LLPluginSharedMemory manages a shared memory segment for use by the LLPlugin API.
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPLUGINSHAREDMEMORY_H
+#define LL_LLPLUGINSHAREDMEMORY_H
+
+class LLPluginSharedMemoryPlatformImpl;
+
+/**
+ * @brief LLPluginSharedMemory manages a shared memory segment for use by the LLPlugin API.
+ *
+ */
+class LLPluginSharedMemory
+{
+ LOG_CLASS(LLPluginSharedMemory);
+public:
+ LLPluginSharedMemory();
+ ~LLPluginSharedMemory();
+
+ // Parent will use create/destroy, child will use attach/detach.
+ // Message transactions will ensure child attaches after parent creates and detaches before parent destroys.
+
+ /**
+ * Creates a shared memory segment, with a name which is guaranteed to be unique on the host at the current time. Used by parent.
+ * Message transactions will (? TODO:DOC - should? must?) ensure child attaches after parent creates and detaches before parent destroys.
+ *
+ * @param[in] size Shared memory size in TODO:DOC units = bytes?.
+ *
+ * @return False for failure, true for success.
+ */
+ bool create(size_t size);
+ /**
+ * Destroys a shared memory segment. Used by parent.
+ * Message transactions will (? TODO:DOC - should? must?) ensure child attaches after parent creates and detaches before parent destroys.
+ *
+ * @return True. TODO:DOC - always returns true. Is this the intended behavior?
+ */
+ bool destroy(void);
+
+ /**
+ * Creates and attaches a name to a shared memory segment. TODO:DOC what's the difference between attach() and create()?
+ *
+ * @param[in] name Name to attach to memory segment
+ * @param[in] size Size of memory segment TODO:DOC in bytes?
+ *
+ * @return False on failure, true otherwise.
+ */
+ bool attach(const std::string &name, size_t size);
+ /**
+ * Detaches shared memory segment.
+ *
+ * @return False on failure, true otherwise.
+ */
+ bool detach(void);
+
+ /**
+ * Checks if shared memory is mapped to a non-null address.
+ *
+ * @return True if memory address is non-null, false otherwise.
+ */
+ bool isMapped(void) const { return (mMappedAddress != NULL); };
+ /**
+ * Get pointer to shared memory.
+ *
+ * @return Pointer to shared memory.
+ */
+ void *getMappedAddress(void) const { return mMappedAddress; };
+ /**
+ * Get size of shared memory.
+ *
+ * @return Size of shared memory in bytes. TODO:DOC are bytes the correct unit?
+ */
+ size_t getSize(void) const { return mSize; };
+ /**
+ * Get name of shared memory.
+ *
+ * @return Name of shared memory.
+ */
+ std::string getName() const { return mName; };
+
+private:
+ bool map(void);
+ bool unmap(void);
+ bool close(void);
+ bool unlink(void);
+
+ std::string mName;
+ size_t mSize;
+ void *mMappedAddress;
+ bool mNeedsDestroy;
+
+ LLPluginSharedMemoryPlatformImpl *mImpl;
+
+ static int sSegmentNumber;
+ static std::string createName();
+
+};
+
+
+
+#endif // LL_LLPLUGINSHAREDMEMORY_H
diff --git a/linden/indra/llplugin/slplugin/CMakeLists.txt b/linden/indra/llplugin/slplugin/CMakeLists.txt
new file mode 100644
index 0000000..4a7d670
--- /dev/null
+++ b/linden/indra/llplugin/slplugin/CMakeLists.txt
@@ -0,0 +1,55 @@
+project(SLPlugin)
+
+include(00-Common)
+include(LLCommon)
+include(LLPlugin)
+include(Linking)
+include(PluginAPI)
+include(LLMessage)
+
+include_directories(
+ ${LLPLUGIN_INCLUDE_DIRS}
+ ${LLMESSAGE_INCLUDE_DIRS}
+ ${LLCOMMON_INCLUDE_DIRS}
+)
+
+if (DARWIN)
+ include(CMakeFindFrameworks)
+ find_library(CARBON_LIBRARY Carbon)
+endif (DARWIN)
+
+
+### SLPlugin
+
+set(SLPlugin_SOURCE_FILES
+ slplugin.cpp
+ )
+
+add_executable(SLPlugin
+ WIN32
+ ${SLPlugin_SOURCE_FILES}
+)
+
+target_link_libraries(SLPlugin
+ ${LLPLUGIN_LIBRARIES}
+ ${LLMESSAGE_LIBRARIES}
+ ${LLCOMMON_LIBRARIES}
+ ${PLUGIN_API_WINDOWS_LIBRARIES}
+)
+
+add_dependencies(SLPlugin
+ ${LLPLUGIN_LIBRARIES}
+ ${LLMESSAGE_LIBRARIES}
+ ${LLCOMMON_LIBRARIES}
+)
+
+if (DARWIN)
+ # Mac version needs to link against carbon, and also needs an embedded plist (to set LSBackgroundOnly)
+ target_link_libraries(SLPlugin ${CARBON_LIBRARY})
+ set_target_properties(
+ SLPlugin
+ PROPERTIES
+ LINK_FLAGS "-Wl,-sectcreate,__TEXT,__info_plist,${CMAKE_CURRENT_SOURCE_DIR}/slplugin_info.plist"
+ )
+endif (DARWIN)
+
diff --git a/linden/indra/llplugin/slplugin/slplugin.cpp b/linden/indra/llplugin/slplugin/slplugin.cpp
new file mode 100644
index 0000000..fa3924b
--- /dev/null
+++ b/linden/indra/llplugin/slplugin/slplugin.cpp
@@ -0,0 +1,288 @@
+/**
+ * @file slplugin.cpp
+ * @brief Loader shell for plugins, intended to be launched by the plugin host application, which directly loads a plugin dynamic library.
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+
+#include "linden_common.h"
+
+#include "llpluginprocesschild.h"
+#include "llpluginmessage.h"
+#include "llerrorcontrol.h"
+#include "llapr.h"
+#include "llstring.h"
+
+#if LL_DARWIN
+ #include
+#endif
+
+#if LL_DARWIN || LL_LINUX
+ #include
+#endif
+
+/*
+ On Mac OS, since we call WaitNextEvent, this process will show up in the dock unless we set the LSBackgroundOnly flag in the Info.plist.
+
+ Normally non-bundled binaries don't have an info.plist file, but it's possible to embed one in the binary by adding this to the linker flags:
+
+ -sectcreate __TEXT __info_plist /path/to/slplugin_info.plist
+
+ which means adding this to the gcc flags:
+
+ -Wl,-sectcreate,__TEXT,__info_plist,/path/to/slplugin_info.plist
+
+*/
+
+#if LL_DARWIN || LL_LINUX
+// Signal handlers to make crashes not show an OS dialog...
+static void crash_handler(int sig)
+{
+ // Just exit cleanly.
+ // TODO: add our own crash reporting
+ _exit(1);
+}
+#endif
+
+#if LL_WINDOWS
+#include
+////////////////////////////////////////////////////////////////////////////////
+// Our exception handler - will probably just exit and the host application
+// will miss the heartbeat and log the error in the usual fashion.
+LONG WINAPI myWin32ExceptionHandler( struct _EXCEPTION_POINTERS* exception_infop )
+{
+ //std::cerr << "This plugin (" << __FILE__ << ") - ";
+ //std::cerr << "intercepted an unhandled exception and will exit immediately." << std::endl;
+
+ // TODO: replace exception handler before we exit?
+ return EXCEPTION_EXECUTE_HANDLER;
+}
+
+// Taken from : http://blog.kalmbachnet.de/?postid=75
+// The MSVC 2005 CRT forces the call of the default-debugger (normally Dr.Watson)
+// even with the other exception handling code. This (terrifying) piece of code
+// patches things so that doesn't happen.
+LPTOP_LEVEL_EXCEPTION_FILTER WINAPI MyDummySetUnhandledExceptionFilter(
+ LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter )
+{
+ return NULL;
+}
+
+BOOL PreventSetUnhandledExceptionFilter()
+{
+// WARNING: This won't work on 64-bit Windows systems so we turn it off it.
+// It should work for any flavor of 32-bit Windows we care about.
+// If it's off, sometimes you will see an OS message when a plugin crashes
+#ifndef _WIN64
+ HMODULE hKernel32 = LoadLibraryA( "kernel32.dll" );
+ if ( NULL == hKernel32 )
+ return FALSE;
+
+ void *pOrgEntry = GetProcAddress( hKernel32, "SetUnhandledExceptionFilter" );
+ if( NULL == pOrgEntry )
+ return FALSE;
+
+ unsigned char newJump[ 100 ];
+ DWORD dwOrgEntryAddr = (DWORD)pOrgEntry;
+ dwOrgEntryAddr += 5; // add 5 for 5 op-codes for jmp far
+ void *pNewFunc = &MyDummySetUnhandledExceptionFilter;
+ DWORD dwNewEntryAddr = (DWORD) pNewFunc;
+ DWORD dwRelativeAddr = dwNewEntryAddr - dwOrgEntryAddr;
+
+ newJump[ 0 ] = 0xE9; // JMP absolute
+ memcpy( &newJump[ 1 ], &dwRelativeAddr, sizeof( pNewFunc ) );
+ SIZE_T bytesWritten;
+ BOOL bRet = WriteProcessMemory( GetCurrentProcess(), pOrgEntry, newJump, sizeof( pNewFunc ) + 1, &bytesWritten );
+ return bRet;
+#else
+ return FALSE;
+#endif
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Hook our exception handler and replace the system one
+void initExceptionHandler()
+{
+ LPTOP_LEVEL_EXCEPTION_FILTER prev_filter;
+
+ // save old exception handler in case we need to restore it at the end
+ prev_filter = SetUnhandledExceptionFilter( myWin32ExceptionHandler );
+ PreventSetUnhandledExceptionFilter();
+}
+
+bool checkExceptionHandler()
+{
+ bool ok = true;
+ LPTOP_LEVEL_EXCEPTION_FILTER prev_filter;
+ prev_filter = SetUnhandledExceptionFilter(myWin32ExceptionHandler);
+
+ PreventSetUnhandledExceptionFilter();
+
+ if (prev_filter != myWin32ExceptionHandler)
+ {
+ LL_WARNS("AppInit") << "Our exception handler (" << (void *)myWin32ExceptionHandler << ") replaced with " << prev_filter << "!" << LL_ENDL;
+ ok = false;
+ }
+
+ if (prev_filter == NULL)
+ {
+ ok = FALSE;
+ if (myWin32ExceptionHandler == NULL)
+ {
+ LL_WARNS("AppInit") << "Exception handler uninitialized." << LL_ENDL;
+ }
+ else
+ {
+ LL_WARNS("AppInit") << "Our exception handler (" << (void *)myWin32ExceptionHandler << ") replaced with NULL!" << LL_ENDL;
+ }
+ }
+
+ return ok;
+}
+#endif
+
+// If this application on Windows platform is a console application, a console is always
+// created which is bad. Making it a Windows "application" via CMake settings but not
+// adding any code to explicitly create windows does the right thing.
+#if LL_WINDOWS
+int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
+#else
+int main(int argc, char **argv)
+#endif
+{
+ ll_init_apr();
+
+ // Set up llerror logging
+ {
+ LLError::initForApplication(".");
+ LLError::setDefaultLevel(LLError::LEVEL_INFO);
+// LLError::setTagLevel("Plugin", LLError::LEVEL_DEBUG);
+// LLError::logToFile("slplugin.log");
+ }
+
+#if LL_WINDOWS
+ if( strlen( lpCmdLine ) == 0 )
+ {
+ LL_ERRS("slplugin") << "usage: " << "SLPlugin" << " launcher_port" << LL_ENDL;
+ };
+
+ U32 port = 0;
+ if(!LLStringUtil::convertToU32(lpCmdLine, port))
+ {
+ LL_ERRS("slplugin") << "port number must be numeric" << LL_ENDL;
+ };
+
+ // Insert our exception handler into the system so this plugin doesn't
+ // display a crash message if something bad happens. The host app will
+ // see the missing heartbeat and log appropriately.
+ initExceptionHandler();
+#elif LL_DARWIN || LL_LINUX
+ if(argc < 2)
+ {
+ LL_ERRS("slplugin") << "usage: " << argv[0] << " launcher_port" << LL_ENDL;
+ }
+
+ U32 port = 0;
+ if(!LLStringUtil::convertToU32(argv[1], port))
+ {
+ LL_ERRS("slplugin") << "port number must be numeric" << LL_ENDL;
+ }
+
+ // Catch signals that most kinds of crashes will generate, and exit cleanly so the system crash dialog isn't shown.
+ signal(SIGILL, &crash_handler); // illegal instruction
+# if LL_DARWIN
+ signal(SIGEMT, &crash_handler); // emulate instruction executed
+# endif // LL_DARWIN
+ signal(SIGFPE, &crash_handler); // floating-point exception
+ signal(SIGBUS, &crash_handler); // bus error
+ signal(SIGSEGV, &crash_handler); // segmentation violation
+ signal(SIGSYS, &crash_handler); // non-existent system call invoked
+#endif
+
+ LLPluginProcessChild *plugin = new LLPluginProcessChild();
+
+ plugin->init(port);
+
+ LLTimer timer;
+ timer.start();
+
+#if LL_WINDOWS
+ checkExceptionHandler();
+#endif
+
+ while(!plugin->isDone())
+ {
+ timer.reset();
+ plugin->idle();
+#if LL_DARWIN
+ {
+ // Some plugins (webkit at least) will want an event loop. This qualifies.
+ EventRecord evt;
+ WaitNextEvent(0, &evt, 0, NULL);
+ }
+#endif
+ F64 elapsed = timer.getElapsedTimeF64();
+ F64 remaining = plugin->getSleepTime() - elapsed;
+
+ if(remaining <= 0.0f)
+ {
+ // We've already used our full allotment.
+// LL_INFOS("slplugin") << "elapsed = " << elapsed * 1000.0f << " ms, remaining = " << remaining * 1000.0f << " ms, not sleeping" << LL_ENDL;
+
+ // Still need to service the network...
+ plugin->pump();
+ }
+ else
+ {
+
+// LL_INFOS("slplugin") << "elapsed = " << elapsed * 1000.0f << " ms, remaining = " << remaining * 1000.0f << " ms, sleeping for " << remaining * 1000.0f << " ms" << LL_ENDL;
+// timer.reset();
+
+ // This also services the network as needed.
+ plugin->sleep(remaining);
+
+// LL_INFOS("slplugin") << "slept for "<< timer.getElapsedTimeF64() * 1000.0f << " ms" << LL_ENDL;
+ }
+
+#if LL_WINDOWS
+ // More agressive checking of interfering exception handlers.
+ // Doesn't appear to be required so far - even for plugins
+ // that do crash with a single call to the intercept
+ // exception handler such as QuickTime.
+ //checkExceptionHandler();
+#endif
+ }
+
+ delete plugin;
+
+ ll_cleanup_apr();
+
+ return 0;
+}
+
diff --git a/linden/indra/llplugin/slplugin/slplugin_info.plist b/linden/indra/llplugin/slplugin/slplugin_info.plist
new file mode 100644
index 0000000..b1daf87
--- /dev/null
+++ b/linden/indra/llplugin/slplugin/slplugin_info.plist
@@ -0,0 +1,12 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ English
+ CFBundleInfoDictionaryVersion
+ 6.0
+ LSBackgroundOnly
+
+
+
diff --git a/linden/indra/llui/CMakeLists.txt b/linden/indra/llui/CMakeLists.txt
index a0f80b4..e6b3b63 100644
--- a/linden/indra/llui/CMakeLists.txt
+++ b/linden/indra/llui/CMakeLists.txt
@@ -3,11 +3,9 @@
project(llui)
include(00-Common)
-include(LLAudio)
include(LLCommon)
include(LLImage)
include(LLMath)
-include(LLMedia)
include(LLMessage)
include(LLRender)
include(LLWindow)
@@ -15,11 +13,9 @@ include(LLVFS)
include(LLXML)
include_directories(
- ${LLAUDIO_INCLUDE_DIRS}
${LLCOMMON_INCLUDE_DIRS}
${LLIMAGE_INCLUDE_DIRS}
${LLMATH_INCLUDE_DIRS}
- ${LLMEDIA_INCLUDE_DIRS}
${LLMESSAGE_INCLUDE_DIRS}
${LLRENDER_INCLUDE_DIRS}
${LLWINDOW_INCLUDE_DIRS}
@@ -141,3 +137,14 @@ set_source_files_properties(${llui_HEADER_FILES}
list(APPEND llui_SOURCE_FILES ${llui_HEADER_FILES})
add_library (llui ${llui_SOURCE_FILES})
+# Libraries on which this library depends, needed for Linux builds
+# Sort by high-level to low-level
+target_link_libraries(llui
+ llrender
+ llwindow
+ llimage
+ llvfs # ugh, just for LLDir
+ llxml
+ llcommon # must be after llimage, llwindow, llrender
+ llmath
+ )
diff --git a/linden/indra/llui/llbutton.cpp b/linden/indra/llui/llbutton.cpp
index 1a6c705..702e34e 100644
--- a/linden/indra/llui/llbutton.cpp
+++ b/linden/indra/llui/llbutton.cpp
@@ -840,6 +840,11 @@ void LLButton::setColor(const LLColor4& color)
setImageColor(color);
}
+void LLButton::setAlpha(F32 alpha)
+{
+ mImageColor.setAlpha(alpha);
+ mDisabledImageColor.setAlpha(alpha * 0.5f);
+}
void LLButton::setImageDisabled(LLPointer image)
{
diff --git a/linden/indra/llui/llbutton.h b/linden/indra/llui/llbutton.h
index 724b775..2174d95 100644
--- a/linden/indra/llui/llbutton.h
+++ b/linden/indra/llui/llbutton.h
@@ -136,7 +136,8 @@ public:
void setImageColor(const std::string& color_control);
void setImageColor(const LLColor4& c);
- virtual void setColor(const LLColor4& c);
+ /*virtual*/ void setColor(const LLColor4& c);
+ /*virtual*/ void setAlpha(F32 alpha);
void setImages(const std::string &image_name, const std::string &selected_name);
void setDisabledImages(const std::string &image_name, const std::string &selected_name);
diff --git a/linden/indra/llui/llfloater.cpp b/linden/indra/llui/llfloater.cpp
index f6451a1..bb42ca3 100644
--- a/linden/indra/llui/llfloater.cpp
+++ b/linden/indra/llui/llfloater.cpp
@@ -1459,9 +1459,9 @@ void LLFloater::draw()
{
if (hasFocus() && getDefaultButton()->getEnabled())
{
- LLUICtrl* focus_ctrl = gFocusMgr.getKeyboardFocus();
+ LLFocusableElement* focus_ctrl = gFocusMgr.getKeyboardFocus();
// is this button a direct descendent and not a nested widget (e.g. checkbox)?
- BOOL focus_is_child_button = dynamic_cast(focus_ctrl) != NULL && focus_ctrl->getParent() == this;
+ BOOL focus_is_child_button = dynamic_cast(focus_ctrl) != NULL && dynamic_cast(focus_ctrl)->getParent() == this;
// only enable default button when current focus is not a button
getDefaultButton()->setBorderEnabled(!focus_is_child_button);
}
@@ -1481,7 +1481,7 @@ void LLFloater::draw()
else
{
// draw children
- LLView* focused_child = gFocusMgr.getKeyboardFocus();
+ LLView* focused_child = dynamic_cast(gFocusMgr.getKeyboardFocus());
BOOL focused_child_visible = FALSE;
if (focused_child && focused_child->getParent() == this)
{
@@ -2239,7 +2239,7 @@ BOOL LLFloaterView::allChildrenClosed()
LLView* viewp = *it;
LLFloater* floaterp = (LLFloater*)viewp;
- if (floaterp->getVisible() && !floaterp->isDead() && floaterp->canClose())
+ if (floaterp->getVisible() && !floaterp->isDead() && floaterp->isCloseable())
{
return false;
}
diff --git a/linden/indra/llui/llfocusmgr.cpp b/linden/indra/llui/llfocusmgr.cpp
index 661ffdd..96b01b9 100644
--- a/linden/indra/llui/llfocusmgr.cpp
+++ b/linden/indra/llui/llfocusmgr.cpp
@@ -38,6 +38,68 @@
const F32 FOCUS_FADE_TIME = 0.3f;
+// NOTE: the LLFocusableElement implementation has been here from lluictrl.cpp.
+
+LLFocusableElement::LLFocusableElement()
+: mFocusLostCallback(NULL),
+ mFocusReceivedCallback(NULL),
+ mFocusChangedCallback(NULL),
+ mFocusCallbackUserData(NULL)
+{
+}
+
+// virtual
+BOOL LLFocusableElement::handleKey(KEY key, MASK mask, BOOL called_from_parent)
+{
+ return FALSE;
+}
+
+// virtual
+BOOL LLFocusableElement::handleUnicodeChar(llwchar uni_char, BOOL called_from_parent)
+{
+ return FALSE;
+}
+
+// virtual
+LLFocusableElement::~LLFocusableElement()
+{
+}
+
+void LLFocusableElement::onFocusReceived()
+{
+ if( mFocusReceivedCallback )
+ {
+ mFocusReceivedCallback( this, mFocusCallbackUserData );
+ }
+ if( mFocusChangedCallback )
+ {
+ mFocusChangedCallback( this, mFocusCallbackUserData );
+ }
+}
+
+void LLFocusableElement::onFocusLost()
+{
+ if( mFocusLostCallback )
+ {
+ mFocusLostCallback( this, mFocusCallbackUserData );
+ }
+
+ if( mFocusChangedCallback )
+ {
+ mFocusChangedCallback( this, mFocusCallbackUserData );
+ }
+}
+
+BOOL LLFocusableElement::hasFocus() const
+{
+ return gFocusMgr.getKeyboardFocus() == this;
+}
+
+void LLFocusableElement::setFocus(BOOL b)
+{
+}
+
+
LLFocusMgr gFocusMgr;
LLFocusMgr::LLFocusMgr()
@@ -87,11 +149,13 @@ void LLFocusMgr::releaseFocusIfNeeded( const LLView* view )
}
-void LLFocusMgr::setKeyboardFocus(LLUICtrl* new_focus, BOOL lock, BOOL keystrokes_only)
+void LLFocusMgr::setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock, BOOL keystrokes_only)
{
if (mLockedView &&
(new_focus == NULL ||
- (new_focus != mLockedView && !new_focus->hasAncestor(mLockedView))))
+ (new_focus != mLockedView
+ && dynamic_cast(new_focus)
+ && !dynamic_cast(new_focus)->hasAncestor(mLockedView))))
{
// don't allow focus to go to anything that is not the locked focus
// or one of its descendants
@@ -121,7 +185,8 @@ void LLFocusMgr::setKeyboardFocus(LLUICtrl* new_focus, BOOL lock, BOOL keystroke
mFocusTimer.reset();
#ifdef _DEBUG
- mKeyboardFocusName = new_focus ? new_focus->getName() : std::string("none");
+ LLUICtrl* focus_ctrl = dynamic_cast(new_focus);
+ mKeyboardFocusName = focus_ctrl ? focus_ctrl->getName() : std::string("none");
#endif
// If we've got a default keyboard focus, and the caller is
@@ -131,8 +196,8 @@ void LLFocusMgr::setKeyboardFocus(LLUICtrl* new_focus, BOOL lock, BOOL keystroke
mDefaultKeyboardFocus->setFocus(TRUE);
}
- LLView* focus_subtree = mKeyboardFocus;
- LLView* viewp = mKeyboardFocus;
+ LLView* focus_subtree = dynamic_cast(mKeyboardFocus);
+ LLView* viewp = dynamic_cast(mKeyboardFocus);
// find root-most focus root
while(viewp)
{
@@ -146,7 +211,8 @@ void LLFocusMgr::setKeyboardFocus(LLUICtrl* new_focus, BOOL lock, BOOL keystroke
if (focus_subtree)
{
- mFocusHistory[focus_subtree->getHandle()] = mKeyboardFocus ? mKeyboardFocus->getHandle() : LLHandle();
+ LLView* focused_view = dynamic_cast(mKeyboardFocus);
+ mFocusHistory[focus_subtree->getHandle()] = focused_view ? focused_view->getHandle() : LLHandle();
}
}
@@ -160,7 +226,7 @@ void LLFocusMgr::setKeyboardFocus(LLUICtrl* new_focus, BOOL lock, BOOL keystroke
// Returns TRUE is parent or any descedent of parent has keyboard focus.
BOOL LLFocusMgr::childHasKeyboardFocus(const LLView* parent ) const
{
- LLView* focus_view = mKeyboardFocus;
+ LLView* focus_view = dynamic_cast(mKeyboardFocus);
while( focus_view )
{
if( focus_view == parent )
@@ -190,7 +256,7 @@ BOOL LLFocusMgr::childHasMouseCapture( const LLView* parent ) const
return FALSE;
}
-void LLFocusMgr::removeKeyboardFocusWithoutCallback( const LLView* focus )
+void LLFocusMgr::removeKeyboardFocusWithoutCallback( const LLFocusableElement* focus )
{
// should be ok to unlock here, as you have to know the locked view
// in order to unlock it
@@ -313,7 +379,7 @@ void LLFocusMgr::removeTopCtrlWithoutCallback( const LLUICtrl* top_view )
void LLFocusMgr::lockFocus()
{
- mLockedView = mKeyboardFocus;
+ mLockedView = dynamic_cast(mKeyboardFocus);
}
void LLFocusMgr::unlockFocus()
diff --git a/linden/indra/llui/llfocusmgr.h b/linden/indra/llui/llfocusmgr.h
index aaeb25a..88ede1a 100644
--- a/linden/indra/llui/llfocusmgr.h
+++ b/linden/indra/llui/llfocusmgr.h
@@ -37,10 +37,39 @@
#include "llstring.h"
#include "llframetimer.h"
-#include "llview.h"
+#include "llui.h"
class LLUICtrl;
class LLMouseHandler;
+class LLView;
+
+class LLFocusableElement
+{
+ friend class LLFocusMgr; // allow access to focus change handlers
+public:
+ LLFocusableElement();
+ virtual ~LLFocusableElement();
+
+ virtual void setFocus( BOOL b );
+ virtual BOOL hasFocus() const;
+
+ void setFocusLostCallback(void (*cb)(LLFocusableElement* caller, void*), void* user_data = NULL) { mFocusLostCallback = cb; mFocusCallbackUserData = user_data; }
+ void setFocusReceivedCallback( void (*cb)(LLFocusableElement*, void*), void* user_data = NULL) { mFocusReceivedCallback = cb; mFocusCallbackUserData = user_data; }
+ void setFocusChangedCallback( void (*cb)(LLFocusableElement*, void*), void* user_data = NULL ) { mFocusChangedCallback = cb; mFocusCallbackUserData = user_data; }
+
+ // These were brought up the hierarchy from LLView so that we don't have to use dynamic_cast when dealing with keyboard focus.
+ virtual BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent);
+ virtual BOOL handleUnicodeChar(llwchar uni_char, BOOL called_from_parent);
+
+protected:
+ virtual void onFocusReceived();
+ virtual void onFocusLost();
+ void (*mFocusLostCallback)( LLFocusableElement* caller, void* userdata );
+ void (*mFocusReceivedCallback)( LLFocusableElement* ctrl, void* userdata );
+ void (*mFocusChangedCallback)( LLFocusableElement* ctrl, void* userdata );
+ void* mFocusCallbackUserData;
+};
+
class LLFocusMgr
{
@@ -55,11 +84,11 @@ public:
BOOL childHasMouseCapture( const LLView* parent ) const;
// Keyboard Focus
- void setKeyboardFocus(LLUICtrl* new_focus, BOOL lock = FALSE, BOOL keystrokes_only = FALSE); // new_focus = NULL to release the focus.
- LLUICtrl* getKeyboardFocus() const { return mKeyboardFocus; }
- LLUICtrl* getLastKeyboardFocus() const { return mLastKeyboardFocus; }
+ void setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock = FALSE, BOOL keystrokes_only = FALSE); // new_focus = NULL to release the focus.
+ LLFocusableElement* getKeyboardFocus() const { return mKeyboardFocus; }
+ LLFocusableElement* getLastKeyboardFocus() const { return mLastKeyboardFocus; }
BOOL childHasKeyboardFocus( const LLView* parent ) const;
- void removeKeyboardFocusWithoutCallback( const LLView* focus );
+ void removeKeyboardFocusWithoutCallback( const LLFocusableElement* focus );
BOOL getKeystrokesOnly() { return mKeystrokesOnly; }
void setKeystrokesOnly(BOOL keystrokes_only) { mKeystrokesOnly = keystrokes_only; }
@@ -75,8 +104,8 @@ public:
// If setKeyboardFocus(NULL) is called, and there is a non-NULL default
// keyboard focus view, focus goes there. JC
- void setDefaultKeyboardFocus(LLUICtrl* default_focus) { mDefaultKeyboardFocus = default_focus; }
- LLUICtrl* getDefaultKeyboardFocus() const { return mDefaultKeyboardFocus; }
+ void setDefaultKeyboardFocus(LLFocusableElement* default_focus) { mDefaultKeyboardFocus = default_focus; }
+ LLFocusableElement* getDefaultKeyboardFocus() const { return mDefaultKeyboardFocus; }
// Top View
@@ -98,9 +127,9 @@ private:
LLMouseHandler* mMouseCaptor; // Mouse events are premptively routed to this object
// Keyboard Focus
- LLUICtrl* mKeyboardFocus; // Keyboard events are preemptively routed to this object
- LLUICtrl* mLastKeyboardFocus; // who last had focus
- LLUICtrl* mDefaultKeyboardFocus;
+ LLFocusableElement* mKeyboardFocus; // Keyboard events are preemptively routed to this object
+ LLFocusableElement* mLastKeyboardFocus; // who last had focus
+ LLFocusableElement* mDefaultKeyboardFocus;
BOOL mKeystrokesOnly;
// Top View
diff --git a/linden/indra/llui/lliconctrl.cpp b/linden/indra/llui/lliconctrl.cpp
index e73c8fe..0df960e 100644
--- a/linden/indra/llui/lliconctrl.cpp
+++ b/linden/indra/llui/lliconctrl.cpp
@@ -112,6 +112,12 @@ void LLIconCtrl::draw()
LLUICtrl::draw();
}
+// virtual
+void LLIconCtrl::setAlpha(F32 alpha)
+{
+ mColor.setAlpha(alpha);
+}
+
// virtual
void LLIconCtrl::setValue(const LLSD& value )
{
diff --git a/linden/indra/llui/lliconctrl.h b/linden/indra/llui/lliconctrl.h
index 50778cf..2506fb2 100644
--- a/linden/indra/llui/lliconctrl.h
+++ b/linden/indra/llui/lliconctrl.h
@@ -65,6 +65,8 @@ public:
virtual void setValue(const LLSD& value );
virtual LLSD getValue() const;
+ /*virtual*/ void setAlpha(F32 alpha);
+
void setColor(const LLColor4& color) { mColor = color; }
virtual LLXMLNodePtr getXML(bool save_children = true) const;
diff --git a/linden/indra/llui/llmultisliderctrl.cpp b/linden/indra/llui/llmultisliderctrl.cpp
index b76c2f6..f9ec6d5 100644
--- a/linden/indra/llui/llmultisliderctrl.cpp
+++ b/linden/indra/llui/llmultisliderctrl.cpp
@@ -34,9 +34,6 @@
#include "llmultisliderctrl.h"
-#include "audioengine.h"
-#include "sound_ids.h"
-
#include "llmath.h"
#include "llfontgl.h"
#include "llgl.h"
diff --git a/linden/indra/llui/llpanel.cpp b/linden/indra/llui/llpanel.cpp
index 709342b..26137d7 100644
--- a/linden/indra/llui/llpanel.cpp
+++ b/linden/indra/llui/llpanel.cpp
@@ -203,6 +203,12 @@ void LLPanel::draw()
LLView::draw();
}
+/*virtual*/
+void LLPanel::setAlpha(F32 alpha)
+{
+ mBgColorOpaque.setAlpha(alpha);
+}
+
void LLPanel::updateDefaultBtn()
{
// This method does not call LLView::draw() so callers will need
@@ -213,8 +219,7 @@ void LLPanel::updateDefaultBtn()
{
if (gFocusMgr.childHasKeyboardFocus( this ) && mDefaultBtn->getEnabled())
{
- LLUICtrl* focus_ctrl = gFocusMgr.getKeyboardFocus();
- LLButton* buttonp = dynamic_cast(focus_ctrl);
+ LLButton* buttonp = dynamic_cast(gFocusMgr.getKeyboardFocus());
BOOL focus_is_child_button = buttonp && buttonp->getCommitOnReturn();
// only enable default button when current focus is not a return-capturing button
mDefaultBtn->setBorderEnabled(!focus_is_child_button);
@@ -276,7 +281,7 @@ BOOL LLPanel::handleKeyHere( KEY key, MASK mask )
{
BOOL handled = FALSE;
- LLUICtrl* cur_focus = gFocusMgr.getKeyboardFocus();
+ LLUICtrl* cur_focus = dynamic_cast(gFocusMgr.getKeyboardFocus());
// handle user hitting ESC to defocus
if (key == KEY_ESCAPE)
@@ -800,6 +805,14 @@ void LLPanel::childSetColor(const std::string& id, const LLColor4& color)
child->setColor(color);
}
}
+void LLPanel::childSetAlpha(const std::string& id, F32 alpha)
+{
+ LLUICtrl* child = getChild(id, true);
+ if (child)
+ {
+ child->setAlpha(alpha);
+ }
+}
LLCtrlSelectionInterface* LLPanel::childGetSelectionInterface(const std::string& id) const
{
diff --git a/linden/indra/llui/llpanel.h b/linden/indra/llui/llpanel.h
index 756d02e..378b357 100644
--- a/linden/indra/llui/llpanel.h
+++ b/linden/indra/llui/llpanel.h
@@ -82,6 +82,8 @@ public:
// From LLFocusableElement
/*virtual*/ void setFocus( BOOL b );
+ virtual void setAlpha(F32 alpha);
+
// New virtuals
virtual void refresh(); // called in setFocus()
@@ -174,6 +176,7 @@ public:
void childSetUserData(const std::string& id, void* userdata);
void childSetColor(const std::string& id, const LLColor4& color);
+ void childSetAlpha(const std::string& id, F32 alpha);
LLCtrlSelectionInterface* childGetSelectionInterface(const std::string& id) const;
LLCtrlListInterface* childGetListInterface(const std::string& id) const;
diff --git a/linden/indra/llui/llsliderctrl.cpp b/linden/indra/llui/llsliderctrl.cpp
index 8a13ed4..51d43fb 100644
--- a/linden/indra/llui/llsliderctrl.cpp
+++ b/linden/indra/llui/llsliderctrl.cpp
@@ -34,8 +34,6 @@
#include "llsliderctrl.h"
-#include "audioengine.h"
-
#include "llmath.h"
#include "llfontgl.h"
#include "llgl.h"
diff --git a/linden/indra/llui/llspinctrl.cpp b/linden/indra/llui/llspinctrl.cpp
index 7eccaca..e66b20e 100644
--- a/linden/indra/llui/llspinctrl.cpp
+++ b/linden/indra/llui/llspinctrl.cpp
@@ -45,7 +45,6 @@
#include "lltextbox.h"
#include "llkeyboard.h"
#include "llmath.h"
-#include "audioengine.h"
#include "llcontrol.h"
#include "llfocusmgr.h"
#include "llresmgr.h"
diff --git a/linden/indra/llui/lltextparser.cpp b/linden/indra/llui/lltextparser.cpp
index 925b118..707dd0a 100644
--- a/linden/indra/llui/lltextparser.cpp
+++ b/linden/indra/llui/lltextparser.cpp
@@ -1,6 +1,5 @@
/**
- * @file lltexteditor.cpp
- * @brief LLTextEditor base class
+ * @file lltextparser.cpp
*
* $LicenseInfo:firstyear=2001&license=viewergpl$
*
@@ -32,6 +31,8 @@
#include "linden_common.h"
+#include "lltextparser.h"
+
#include "llsd.h"
#include "llsdserialize.h"
#include "llerror.h"
@@ -40,23 +41,13 @@
#include "message.h"
#include "llmath.h"
#include "v4color.h"
-#include "audioengine.h"
-#include "llwindow.h"
#include "lldir.h"
-#include "lltextparser.h"
-//#include "lltexttospeech.h"
-
// Routines used for parsing text for TextParsers and html
LLTextParser* LLTextParser::sInstance = NULL;
//
-// Constants
-//
-const F32 SOUND_GAIN = 1.0f;
-
-//
// Member Functions
//
@@ -76,38 +67,7 @@ LLTextParser* LLTextParser::getInstance()
return sInstance;
}
-void LLTextParser::triggerAlerts(LLUUID agent_id, LLVector3d position, std::string text, LLWindow* viewer_window)
-{
-// bool spoken=FALSE;
- for (S32 i=0;i= 0 )
- {
- if(gAudiop)
- {
- if ((std::string)mHighlights[i]["sound_lluuid"] != LLUUID::null.asString())
- {
- gAudiop->triggerSound(mHighlights[i]["sound_lluuid"].asUUID(), agent_id, SOUND_GAIN, LLAudioEngine::AUDIO_TYPE_UI, position);
- }
-/*
- if (!spoken)
- {
- LLTextToSpeech* text_to_speech = NULL;
- text_to_speech = LLTextToSpeech::getInstance();
- spoken = text_to_speech->speak((LLString)mHighlights[i]["voice"],text);
- }
- */
- }
- if (mHighlights[i]["flash"])
- {
- if (viewer_window && viewer_window->getMinimized())
- {
- viewer_window->flashIcon(5.f);
- }
- }
- }
- }
-}
+// Moved triggerAlerts() to llfloaterchat.cpp to break llui/llaudio library dependency.
S32 LLTextParser::findPattern(const std::string &text, LLSD highlight)
{
diff --git a/linden/indra/llui/lltextparser.h b/linden/indra/llui/lltextparser.h
index d69e3a2..32343a2 100644
--- a/linden/indra/llui/lltextparser.h
+++ b/linden/indra/llui/lltextparser.h
@@ -34,12 +34,8 @@
#ifndef LL_LLTEXTPARSER_H
#define LL_LLTEXTPARSER_H
-#include
-#include "linden_common.h"
+#include "llsd.h"
-#include "lltextparser.h"
-
-class LLSD;
class LLUUID;
class LLVector3d;
class LLColor4;
@@ -59,7 +55,6 @@ public:
S32 findPattern(const std::string &text, LLSD highlight);
LLSD parsePartialLineHighlights(const std::string &text,const LLColor4 &color,S32 part=WHOLE, S32 index=0);
bool parseFullLineHighlights(const std::string &text, LLColor4 *color);
- void triggerAlerts(LLUUID agent_id, LLVector3d position, std::string text, LLWindow* viewer_window);
std::string getFileName();
LLSD loadFromDisk();
diff --git a/linden/indra/llui/llui.cpp b/linden/indra/llui/llui.cpp
index 57ce13c..75a4467 100644
--- a/linden/indra/llui/llui.cpp
+++ b/linden/indra/llui/llui.cpp
@@ -38,7 +38,6 @@
#include
// Linden library includes
-#include "audioengine.h"
#include "v2math.h"
#include "v4color.h"
#include "llrender.h"
diff --git a/linden/indra/llui/lluictrl.cpp b/linden/indra/llui/lluictrl.cpp
index 9d97312..3f4ab5e 100644
--- a/linden/indra/llui/lluictrl.cpp
+++ b/linden/indra/llui/lluictrl.cpp
@@ -39,54 +39,7 @@
static LLRegisterWidget r("ui_ctrl");
-LLFocusableElement::LLFocusableElement()
-: mFocusLostCallback(NULL),
- mFocusReceivedCallback(NULL),
- mFocusChangedCallback(NULL),
- mFocusCallbackUserData(NULL)
-{
-}
-
-//virtual
-LLFocusableElement::~LLFocusableElement()
-{
-}
-
-void LLFocusableElement::onFocusReceived()
-{
- if( mFocusReceivedCallback )
- {
- mFocusReceivedCallback( this, mFocusCallbackUserData );
- }
- if( mFocusChangedCallback )
- {
- mFocusChangedCallback( this, mFocusCallbackUserData );
- }
-}
-
-void LLFocusableElement::onFocusLost()
-{
- if( mFocusLostCallback )
- {
- mFocusLostCallback( this, mFocusCallbackUserData );
- }
-
- if( mFocusChangedCallback )
- {
- mFocusChangedCallback( this, mFocusCallbackUserData );
- }
-}
-
-BOOL LLFocusableElement::hasFocus() const
-{
- return FALSE;
-}
-
-void LLFocusableElement::setFocus(BOOL b)
-{
-}
-
-
+// NOTE: the LLFocusableElement implementation has been moved to llfocusmgr.cpp, to mirror the header where the class is defined.
LLUICtrl::LLUICtrl() :
mCommitCallback(NULL),
@@ -212,7 +165,7 @@ void LLUICtrl::onFocusReceived()
// find first view in hierarchy above new focus that is a LLUICtrl
LLView* viewp = getParent();
- LLUICtrl* last_focus = gFocusMgr.getLastKeyboardFocus();
+ LLUICtrl* last_focus = dynamic_cast(gFocusMgr.getLastKeyboardFocus());
while (viewp && !viewp->isCtrl())
{
@@ -590,6 +543,10 @@ void LLUICtrl::setDoubleClickCallback( void (*cb)(void*) )
// virtual
void LLUICtrl::setColor(const LLColor4& color)
{ }
+// virtual
+
+void LLUICtrl::setAlpha(F32 alpha)
+{ }
// virtual
void LLUICtrl::setMinValue(LLSD min_value)
diff --git a/linden/indra/llui/lluictrl.h b/linden/indra/llui/lluictrl.h
index db41af8..be8e863 100644
--- a/linden/indra/llui/lluictrl.h
+++ b/linden/indra/llui/lluictrl.h
@@ -39,31 +39,8 @@
#include "llsd.h"
-class LLFocusableElement
-{
- friend class LLFocusMgr; // allow access to focus change handlers
-public:
- LLFocusableElement();
- virtual ~LLFocusableElement();
-
- virtual void setFocus( BOOL b );
- virtual BOOL hasFocus() const;
-
- void setFocusLostCallback(void (*cb)(LLFocusableElement* caller, void*), void* user_data = NULL) { mFocusLostCallback = cb; mFocusCallbackUserData = user_data; }
- void setFocusReceivedCallback( void (*cb)(LLFocusableElement*, void*), void* user_data = NULL) { mFocusReceivedCallback = cb; mFocusCallbackUserData = user_data; }
- void setFocusChangedCallback( void (*cb)(LLFocusableElement*, void*), void* user_data = NULL ) { mFocusChangedCallback = cb; mFocusCallbackUserData = user_data; }
-
-protected:
- virtual void onFocusReceived();
- virtual void onFocusLost();
- void (*mFocusLostCallback)( LLFocusableElement* caller, void* userdata );
- void (*mFocusReceivedCallback)( LLFocusableElement* ctrl, void* userdata );
- void (*mFocusChangedCallback)( LLFocusableElement* ctrl, void* userdata );
- void* mFocusCallbackUserData;
-};
-
class LLUICtrl
-: public LLView, public LLFocusableElement
+: public LLView
{
public:
typedef void (*LLUICtrlCallback)(LLUICtrl* ctrl, void* userdata);
@@ -117,6 +94,7 @@ public:
virtual void clear();
virtual void setDoubleClickCallback( void (*cb)(void*) );
virtual void setColor(const LLColor4& color);
+ virtual void setAlpha(F32 alpha);
virtual void setMinValue(LLSD min_value);
virtual void setMaxValue(LLSD max_value);
diff --git a/linden/indra/llui/llview.cpp b/linden/indra/llui/llview.cpp
index 8de376f..1f76696 100644
--- a/linden/indra/llui/llview.cpp
+++ b/linden/indra/llui/llview.cpp
@@ -136,11 +136,6 @@ LLView::~LLView()
{
//llinfos << "Deleting view " << mName << ":" << (void*) this << llendl;
// llassert(LLView::sIsDrawing == FALSE);
- if( gFocusMgr.getKeyboardFocus() == this )
- {
- llwarns << "View holding keyboard focus deleted: " << getName() << ". Keyboard focus removed." << llendl;
- gFocusMgr.removeKeyboardFocusWithoutCallback( this );
- }
if( hasMouseCapture() )
{
@@ -1327,7 +1322,7 @@ void LLView::draw()
LLRect screenRect;
// draw focused control on top of everything else
- LLView* focus_view = gFocusMgr.getKeyboardFocus();
+ LLUICtrl* focus_view = dynamic_cast(gFocusMgr.getKeyboardFocus());
if (focus_view && focus_view->getParent() != this)
{
focus_view = NULL;
diff --git a/linden/indra/llui/llview.h b/linden/indra/llui/llview.h
index 7e09dfa..1c8ab31 100644
--- a/linden/indra/llui/llview.h
+++ b/linden/indra/llui/llview.h
@@ -53,6 +53,7 @@
#include "stdenums.h"
#include "lluistring.h"
#include "llcursortypes.h"
+#include "llfocusmgr.h"
const U32 FOLLOWS_NONE = 0x00;
const U32 FOLLOWS_LEFT = 0x01;
@@ -207,7 +208,7 @@ public:
}
};
-class LLView : public LLMouseHandler, public LLMortician
+class LLView : public LLMouseHandler, public LLMortician, public LLFocusableElement
{
public:
@@ -398,9 +399,11 @@ public:
virtual BOOL canSnapTo(const LLView* other_view);
virtual void snappedTo(const LLView* snap_view);
+
+ // inherited from LLFocusableElement
+ /* virtual */ BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent);
+ /* virtual */ BOOL handleUnicodeChar(llwchar uni_char, BOOL called_from_parent);
- virtual BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent);
- virtual BOOL handleUnicodeChar(llwchar uni_char, BOOL called_from_parent);
virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data,
@@ -421,8 +424,9 @@ public:
BOOL getSaveToXML() const { return mSaveToXML; }
void setSaveToXML(BOOL b) { mSaveToXML = b; }
- virtual void onFocusLost();
- virtual void onFocusReceived();
+ // inherited from LLFocusableElement
+ /* virtual */ void onFocusLost();
+ /* virtual */ void onFocusReceived();
typedef enum e_hit_test_type
{
diff --git a/linden/indra/llvfs/CMakeLists.txt b/linden/indra/llvfs/CMakeLists.txt
index cc0297e..d6a0bbc 100644
--- a/linden/indra/llvfs/CMakeLists.txt
+++ b/linden/indra/llvfs/CMakeLists.txt
@@ -4,7 +4,6 @@ project(llvfs)
include(00-Common)
include(LLCommon)
-include(UnixInstall)
include_directories(
${LLCOMMON_INCLUDE_DIRS}
@@ -58,6 +57,7 @@ set_source_files_properties(${llvfs_HEADER_FILES}
list(APPEND llvfs_SOURCE_FILES ${llvfs_HEADER_FILES})
add_library (llvfs ${llvfs_SOURCE_FILES})
+add_dependencies(llvfs prepare)
if (DARWIN)
include(CMakeFindFrameworks)
diff --git a/linden/indra/llvfs/lldir.cpp b/linden/indra/llvfs/lldir.cpp
index af55593..5567fdd 100644
--- a/linden/indra/llvfs/lldir.cpp
+++ b/linden/indra/llvfs/lldir.cpp
@@ -294,6 +294,10 @@ const std::string LLDir::getSkinBaseDir() const
return dir;
}
+const std::string &LLDir::getLLPluginDir() const
+{
+ return mLLPluginDir;
+}
std::string LLDir::getExpandedFilename(ELLPath location, const std::string& filename) const
{
@@ -465,6 +469,8 @@ std::string LLDir::getDirName(const std::string& filepath) const
std::string LLDir::getExtension(const std::string& filepath) const
{
+ if (filepath.empty())
+ return std::string();
std::string basename = getBaseFileName(filepath, false);
std::size_t offset = basename.find_last_of('.');
std::string exten = (offset == std::string::npos || offset == 0) ? "" : basename.substr(offset+1);
diff --git a/linden/indra/llvfs/lldir.h b/linden/indra/llvfs/lldir.h
index 21dcf5b..55574d6 100644
--- a/linden/indra/llvfs/lldir.h
+++ b/linden/indra/llvfs/lldir.h
@@ -80,6 +80,10 @@ class LLDir
virtual BOOL fileExists(const std::string &filename) const = 0;
const std::string findFile(const std::string &filename, const std::string searchPath1 = "", const std::string searchPath2 = "", const std::string searchPath3 = "") const;
+
+ virtual std::string getLLPluginLauncher() = 0; // full path and name for the plugin shell
+ virtual std::string getLLPluginFilename(std::string base_name) = 0; // full path and name to the plugin DSO for this base_name (i.e. 'FOO' -> '/bar/baz/libFOO.so')
+
const std::string &getExecutablePathAndName() const; // Full pathname of the executable
const std::string &getAppName() const; // install directory under progams/ ie "SecondLife"
const std::string &getExecutableDir() const; // Directory where the executable is located
@@ -100,6 +104,7 @@ class LLDir
const std::string &getUserSkinDir() const; // User-specified skin folder with user modifications. e.g. c:\documents and settings\username\application data\second life\skins\curskin
const std::string &getDefaultSkinDir() const; // folder for default skin. e.g. c:\program files\second life\skins\default
const std::string getSkinBaseDir() const; // folder that contains all installed skins (not user modifications). e.g. c:\program files\second life\skins
+ const std::string &getLLPluginDir() const; // Directory containing plugins and plugin shell
// Expanded filename
std::string getExpandedFilename(ELLPath location, const std::string &filename) const;
@@ -156,6 +161,7 @@ protected:
std::string mSkinDir; // Location for current skin info.
std::string mDefaultSkinDir; // Location for default skin info.
std::string mUserSkinDir; // Location for user-modified skin info.
+ std::string mLLPluginDir; // Location for plugins and plugin shell
};
void dir_exists_or_crash(const std::string &dir_name);
diff --git a/linden/indra/llvfs/lldir_linux.cpp b/linden/indra/llvfs/lldir_linux.cpp
index 8ff8c5d..ec0a4f4 100644
--- a/linden/indra/llvfs/lldir_linux.cpp
+++ b/linden/indra/llvfs/lldir_linux.cpp
@@ -94,11 +94,7 @@ LLDir_Linux::LLDir_Linux()
mExecutablePathAndName = "";
mExecutableDir = tmp_str;
mWorkingDir = tmp_str;
-#ifdef APP_RO_DATA_DIR
- mAppRODataDir = APP_RO_DATA_DIR;
-#else
mAppRODataDir = tmp_str;
-#endif
mOSUserDir = getCurrentUserHome(tmp_str);
mOSUserAppDir = "";
mLindenUserDir = tmp_str;
@@ -128,6 +124,33 @@ LLDir_Linux::LLDir_Linux()
}
}
+ mLLPluginDir = mExecutableDir + mDirDelimiter + "llplugin";
+
+#ifdef APP_RO_DATA_DIR
+ const char* appRODataDir = APP_RO_DATA_DIR;
+ if(appRODataDir[0] == '/')
+ {
+ // We have a full path to the data directory.
+ mAppRODataDir = appRODataDir;
+ }
+ else if(appRODataDir[0] != '\0')
+ {
+ // We have a relative path to the data directory. Search
+ // for it in each potential install prefix containing the
+ // executable.
+ for(std::string prefix = getDirName(mExecutableDir);
+ !prefix.empty(); prefix = getDirName(prefix))
+ {
+ std::string dir = prefix + "/" + appRODataDir;
+ if(fileExists(dir + "/app_settings"))
+ {
+ mAppRODataDir = dir;
+ break;
+ }
+ }
+ }
+#endif
+
// *TODO: don't use /tmp, use $HOME/.secondlife/tmp or something.
mTempDir = "/tmp";
}
@@ -370,3 +393,15 @@ BOOL LLDir_Linux::fileExists(const std::string &filename) const
}
}
+
+/*virtual*/ std::string LLDir_Linux::getLLPluginLauncher()
+{
+ return gDirUtilp->getExecutableDir() + gDirUtilp->getDirDelimiter() +
+ "SLPlugin";
+}
+
+/*virtual*/ std::string LLDir_Linux::getLLPluginFilename(std::string base_name)
+{
+ return gDirUtilp->getLLPluginDir() + gDirUtilp->getDirDelimiter() +
+ "lib" + base_name + ".so";
+}
diff --git a/linden/indra/llvfs/lldir_linux.h b/linden/indra/llvfs/lldir_linux.h
index 20b408f..8e94fb1 100644
--- a/linden/indra/llvfs/lldir_linux.h
+++ b/linden/indra/llvfs/lldir_linux.h
@@ -52,6 +52,9 @@ public:
virtual void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);
/*virtual*/ BOOL fileExists(const std::string &filename) const;
+ /*virtual*/ std::string getLLPluginLauncher();
+ /*virtual*/ std::string getLLPluginFilename(std::string base_name);
+
private:
DIR *mDirp;
int mCurrentDirIndex;
diff --git a/linden/indra/llvfs/lldir_mac.cpp b/linden/indra/llvfs/lldir_mac.cpp
index 6d5dcf3..a45c1ed 100644
--- a/linden/indra/llvfs/lldir_mac.cpp
+++ b/linden/indra/llvfs/lldir_mac.cpp
@@ -190,6 +190,8 @@ LLDir_Mac::LLDir_Mac()
}
mWorkingDir = getCurPath();
+
+ mLLPluginDir = mAppRODataDir + mDirDelimiter + "llplugin";
CFRelease(executableURLRef);
executableURLRef = NULL;
@@ -388,4 +390,17 @@ BOOL LLDir_Mac::fileExists(const std::string &filename) const
}
+/*virtual*/ std::string LLDir_Mac::getLLPluginLauncher()
+{
+ return gDirUtilp->getAppRODataDir() + gDirUtilp->getDirDelimiter() +
+ "SLPlugin";
+}
+
+/*virtual*/ std::string LLDir_Mac::getLLPluginFilename(std::string base_name)
+{
+ return gDirUtilp->getLLPluginDir() + gDirUtilp->getDirDelimiter() +
+ base_name + ".dylib";
+}
+
+
#endif // LL_DARWIN
diff --git a/linden/indra/llvfs/lldir_mac.h b/linden/indra/llvfs/lldir_mac.h
index 28d48a0..8be5d03 100644
--- a/linden/indra/llvfs/lldir_mac.h
+++ b/linden/indra/llvfs/lldir_mac.h
@@ -52,6 +52,9 @@ public:
virtual void getRandomFileInDir(const std::string &dirname, const std::string &ask, std::string &fname);
virtual BOOL fileExists(const std::string &filename) const;
+ /*virtual*/ std::string getLLPluginLauncher();
+ /*virtual*/ std::string getLLPluginFilename(std::string base_name);
+
private:
int mCurrentDirIndex;
int mCurrentDirCount;
diff --git a/linden/indra/llvfs/lldir_solaris.cpp b/linden/indra/llvfs/lldir_solaris.cpp
index 9553d92..c647e2b 100644
--- a/linden/indra/llvfs/lldir_solaris.cpp
+++ b/linden/indra/llvfs/lldir_solaris.cpp
@@ -161,6 +161,8 @@ LLDir_Solaris::LLDir_Solaris()
}
}
+ mLLPluginDir = mExecutableDir + mDirDelimiter + "llplugin";
+
// *TODO: don't use /tmp, use $HOME/.secondlife/tmp or something.
mTempDir = "/tmp";
}
diff --git a/linden/indra/llvfs/lldir_win32.cpp b/linden/indra/llvfs/lldir_win32.cpp
index 19b9bcc..9d4c5ec 100644
--- a/linden/indra/llvfs/lldir_win32.cpp
+++ b/linden/indra/llvfs/lldir_win32.cpp
@@ -143,6 +143,8 @@ LLDir_Win32::LLDir_Win32()
llwarns << "Couldn't create LL_PATH_CACHE dir " << mDefaultCacheDir << llendl;
}
}
+
+ mLLPluginDir = mExecutableDir + mDirDelimiter + "llplugin";
}
LLDir_Win32::~LLDir_Win32()
@@ -378,6 +380,19 @@ BOOL LLDir_Win32::fileExists(const std::string &filename) const
}
+/*virtual*/ std::string LLDir_Win32::getLLPluginLauncher()
+{
+ return gDirUtilp->getExecutableDir() + gDirUtilp->getDirDelimiter() +
+ "SLPlugin.exe";
+}
+
+/*virtual*/ std::string LLDir_Win32::getLLPluginFilename(std::string base_name)
+{
+ return gDirUtilp->getLLPluginDir() + gDirUtilp->getDirDelimiter() +
+ base_name + ".dll";
+}
+
+
#if 0
// Utility function to get version number of a DLL
diff --git a/linden/indra/llvfs/lldir_win32.h b/linden/indra/llvfs/lldir_win32.h
index 8710ca5..9ef4d30 100644
--- a/linden/indra/llvfs/lldir_win32.h
+++ b/linden/indra/llvfs/lldir_win32.h
@@ -49,6 +49,9 @@ public:
/*virtual*/ void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);
/*virtual*/ BOOL fileExists(const std::string &filename) const;
+ /*virtual*/ std::string getLLPluginLauncher();
+ /*virtual*/ std::string getLLPluginFilename(std::string base_name);
+
private:
BOOL LLDir_Win32::getNextFileInDir(const llutf16string &dirname, const std::string &mask, std::string &fname, BOOL wrap);
diff --git a/linden/indra/llwindow/CMakeLists.txt b/linden/indra/llwindow/CMakeLists.txt
index afce0c0..5224163 100644
--- a/linden/indra/llwindow/CMakeLists.txt
+++ b/linden/indra/llwindow/CMakeLists.txt
@@ -19,7 +19,6 @@ include(LLRender)
include(LLVFS)
include(LLWindow)
include(LLXML)
-include(Mozlib)
include(UI)
include_directories(
@@ -55,6 +54,13 @@ set(viewer_HEADER_FILES
llmousehandler.h
)
+# Libraries on which this library depends, needed for Linux builds
+# Sort by high-level to low-level
+set(llwindow_LINK_LIBRARIES
+ ${UI_LIBRARIES} # for GTK
+ ${SDL_LIBRARY}
+ )
+
if (DARWIN)
list(APPEND llwindow_SOURCE_FILES
llkeyboardmacosx.cpp
@@ -98,6 +104,9 @@ if (WINDOWS)
lldxhardware.h
llkeyboardwin32.h
)
+ list(APPEND llwindow_LINK_LIBRARIES
+ comdlg32 # Common Dialogs for ChooseColor
+ )
endif (WINDOWS)
if (SOLARIS)
@@ -134,6 +143,7 @@ if (SERVER AND NOT WINDOWS AND NOT DARWIN)
${server_SOURCE_FILES}
)
endif (SERVER AND NOT WINDOWS AND NOT DARWIN)
+ # *TODO: This should probably have target_link_libraries
if (llwindow_HEADER_FILES)
list(APPEND llwindow_SOURCE_FILES ${llwindow_HEADER_FILES})
@@ -145,4 +155,6 @@ if (VIEWER)
${llwindow_SOURCE_FILES}
${viewer_SOURCE_FILES}
)
+ target_link_libraries (llwindow ${llwindow_LINK_LIBRARIES})
endif (VIEWER)
+
diff --git a/linden/indra/media_plugins/CMakeLists.txt b/linden/indra/media_plugins/CMakeLists.txt
new file mode 100644
index 0000000..d35afd8
--- /dev/null
+++ b/linden/indra/media_plugins/CMakeLists.txt
@@ -0,0 +1,11 @@
+# -*- cmake -*-
+
+add_subdirectory(base)
+
+add_subdirectory(webkit)
+
+add_subdirectory(gstreamer010)
+
+if (WINDOWS OR DARWIN)
+ add_subdirectory(quicktime)
+endif (WINDOWS OR DARWIN)
diff --git a/linden/indra/media_plugins/base/CMakeLists.txt b/linden/indra/media_plugins/base/CMakeLists.txt
new file mode 100644
index 0000000..f8d2dab
--- /dev/null
+++ b/linden/indra/media_plugins/base/CMakeLists.txt
@@ -0,0 +1,41 @@
+# -*- cmake -*-
+
+project(media_plugin_base)
+
+include(00-Common)
+include(LLCommon)
+include(LLImage)
+include(LLPlugin)
+include(LLMath)
+include(LLRender)
+include(LLWindow)
+include(Linking)
+include(PluginAPI)
+include(FindOpenGL)
+
+include_directories(
+ ${LLPLUGIN_INCLUDE_DIRS}
+ ${LLCOMMON_INCLUDE_DIRS}
+ ${LLMATH_INCLUDE_DIRS}
+ ${LLIMAGE_INCLUDE_DIRS}
+ ${LLRENDER_INCLUDE_DIRS}
+ ${LLWINDOW_INCLUDE_DIRS}
+)
+
+
+### media_plugin_base
+
+set(media_plugin_base_SOURCE_FILES
+ media_plugin_base.cpp
+)
+
+set(media_plugin_base_HEADER_FILES
+ CMakeLists.txt
+
+ media_plugin_base.h
+)
+
+add_library(media_plugin_base
+ ${media_plugin_base_SOURCE_FILES}
+)
+
diff --git a/linden/indra/media_plugins/base/media_plugin_base.cpp b/linden/indra/media_plugins/base/media_plugin_base.cpp
new file mode 100644
index 0000000..1919419
--- /dev/null
+++ b/linden/indra/media_plugins/base/media_plugin_base.cpp
@@ -0,0 +1,155 @@
+/**
+ * @file media_plugin_base.cpp
+ * @brief Media plugin base class for LLMedia API plugin system
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+#include "media_plugin_base.h"
+
+
+// TODO: Make sure that the only symbol exported from this library is LLPluginInitEntryPoint
+////////////////////////////////////////////////////////////////////////////////
+//
+
+MediaPluginBase::MediaPluginBase(
+ LLPluginInstance::sendMessageFunction host_send_func,
+ void *host_user_data )
+{
+ mHostSendFunction = host_send_func;
+ mHostUserData = host_user_data;
+ mDeleteMe = false;
+ mPixels = 0;
+ mWidth = 0;
+ mHeight = 0;
+ mTextureWidth = 0;
+ mTextureHeight = 0;
+ mDepth = 0;
+ mStatus = STATUS_NONE;
+}
+
+std::string MediaPluginBase::statusString()
+{
+ std::string result;
+
+ switch(mStatus)
+ {
+ case STATUS_LOADING: result = "loading"; break;
+ case STATUS_LOADED: result = "loaded"; break;
+ case STATUS_ERROR: result = "error"; break;
+ case STATUS_PLAYING: result = "playing"; break;
+ case STATUS_PAUSED: result = "paused"; break;
+ default:
+ // keep the empty string
+ break;
+ }
+
+ return result;
+}
+
+void MediaPluginBase::setStatus(EStatus status)
+{
+ if(mStatus != status)
+ {
+ mStatus = status;
+ sendStatus();
+ }
+}
+
+
+void MediaPluginBase::staticReceiveMessage(const char *message_string, void **user_data)
+{
+ MediaPluginBase *self = (MediaPluginBase*)*user_data;
+
+ if(self != NULL)
+ {
+ self->receiveMessage(message_string);
+
+ // If the plugin has processed the delete message, delete it.
+ if(self->mDeleteMe)
+ {
+ delete self;
+ *user_data = NULL;
+ }
+ }
+}
+
+void MediaPluginBase::sendMessage(const LLPluginMessage &message)
+{
+ std::string output = message.generate();
+ mHostSendFunction(output.c_str(), &mHostUserData);
+}
+
+void MediaPluginBase::setDirty(int left, int top, int right, int bottom)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "updated");
+
+ message.setValueS32("left", left);
+ message.setValueS32("top", top);
+ message.setValueS32("right", right);
+ message.setValueS32("bottom", bottom);
+
+ sendMessage(message);
+}
+
+void MediaPluginBase::sendStatus()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "media_status");
+
+ message.setValue("status", statusString());
+
+ sendMessage(message);
+}
+
+
+#if LL_WINDOWS
+# define LLSYMEXPORT __declspec(dllexport)
+#elif LL_LINUX
+# define LLSYMEXPORT __attribute__ ((visibility("default")))
+#else
+# define LLSYMEXPORT /**/
+#endif
+
+extern "C"
+{
+ LLSYMEXPORT int LLPluginInitEntryPoint(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data);
+}
+
+LLSYMEXPORT int
+LLPluginInitEntryPoint(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data)
+{
+ return init_media_plugin(host_send_func, host_user_data, plugin_send_func, plugin_user_data);
+}
+
+#ifdef WIN32
+int WINAPI DllEntryPoint( HINSTANCE hInstance, unsigned long reason, void* params )
+{
+ return 1;
+}
+#endif
diff --git a/linden/indra/media_plugins/base/media_plugin_base.exp b/linden/indra/media_plugins/base/media_plugin_base.exp
new file mode 100644
index 0000000..1e27d1f
--- /dev/null
+++ b/linden/indra/media_plugins/base/media_plugin_base.exp
@@ -0,0 +1 @@
+_LLPluginInitEntryPoint
diff --git a/linden/indra/media_plugins/base/media_plugin_base.h b/linden/indra/media_plugins/base/media_plugin_base.h
new file mode 100644
index 0000000..4872706
--- /dev/null
+++ b/linden/indra/media_plugins/base/media_plugin_base.h
@@ -0,0 +1,112 @@
+/**
+ * @file media_plugin_base.h
+ * @brief Media plugin base class for LLMedia API plugin system
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "llplugininstance.h"
+#include "llpluginmessage.h"
+#include "llpluginmessageclasses.h"
+
+
+class MediaPluginBase
+{
+public:
+ MediaPluginBase(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data);
+ virtual ~MediaPluginBase() {}
+
+ virtual void receiveMessage(const char *message_string) = 0;
+
+ static void staticReceiveMessage(const char *message_string, void **user_data);
+
+protected:
+
+ typedef enum
+ {
+ STATUS_NONE,
+ STATUS_LOADING,
+ STATUS_LOADED,
+ STATUS_ERROR,
+ STATUS_PLAYING,
+ STATUS_PAUSED,
+ } EStatus;
+
+ class SharedSegmentInfo
+ {
+ public:
+ void *mAddress;
+ size_t mSize;
+ };
+
+ void sendMessage(const LLPluginMessage &message);
+ void sendStatus();
+ std::string statusString();
+ void setStatus(EStatus status);
+
+ // The quicktime plugin overrides this to add current time and duration to the message...
+ virtual void setDirty(int left, int top, int right, int bottom);
+
+ typedef std::map SharedSegmentMap;
+
+
+ LLPluginInstance::sendMessageFunction mHostSendFunction;
+ void *mHostUserData;
+ bool mDeleteMe;
+ unsigned char* mPixels;
+ std::string mTextureSegmentName;
+ int mWidth;
+ int mHeight;
+ int mTextureWidth;
+ int mTextureHeight;
+ int mDepth;
+ EStatus mStatus;
+ SharedSegmentMap mSharedSegments;
+
+};
+
+// The plugin must define this function to create its instance.
+int init_media_plugin(
+ LLPluginInstance::sendMessageFunction host_send_func,
+ void *host_user_data,
+ LLPluginInstance::sendMessageFunction *plugin_send_func,
+ void **plugin_user_data);
+
+// It should look something like this:
+/*
+{
+ MediaPluginFoo *self = new MediaPluginFoo(host_send_func, host_user_data);
+ *plugin_send_func = MediaPluginFoo::staticReceiveMessage;
+ *plugin_user_data = (void*)self;
+
+ return 0;
+}
+*/
+
diff --git a/linden/indra/media_plugins/example/CMakeLists.txt b/linden/indra/media_plugins/example/CMakeLists.txt
new file mode 100644
index 0000000..4d82f27
--- /dev/null
+++ b/linden/indra/media_plugins/example/CMakeLists.txt
@@ -0,0 +1,74 @@
+# -*- cmake -*-
+
+project(media_plugin_example)
+
+include(00-Common)
+include(LLCommon)
+include(LLImage)
+include(LLPlugin)
+include(LLMath)
+include(LLRender)
+include(LLWindow)
+include(Linking)
+include(PluginAPI)
+include(MediaPluginBase)
+include(FindOpenGL)
+
+include(ExamplePlugin)
+
+include_directories(
+ ${LLPLUGIN_INCLUDE_DIRS}
+ ${MEDIA_PLUGIN_BASE_INCLUDE_DIRS}
+ ${LLCOMMON_INCLUDE_DIRS}
+ ${LLMATH_INCLUDE_DIRS}
+ ${LLIMAGE_INCLUDE_DIRS}
+ ${LLRENDER_INCLUDE_DIRS}
+ ${LLWINDOW_INCLUDE_DIRS}
+)
+
+
+### media_plugin_example
+
+set(media_plugin_example_SOURCE_FILES
+ media_plugin_example.cpp
+ )
+
+add_library(media_plugin_example
+ SHARED
+ ${media_plugin_example_SOURCE_FILES}
+)
+
+target_link_libraries(media_plugin_example
+ ${LLPLUGIN_LIBRARIES}
+ ${MEDIA_PLUGIN_BASE_LIBRARIES}
+ ${LLCOMMON_LIBRARIES}
+ ${EXAMPLE_PLUGIN_LIBRARIES}
+ ${PLUGIN_API_WINDOWS_LIBRARIES}
+)
+
+add_dependencies(media_plugin_example
+ ${LLPLUGIN_LIBRARIES}
+ ${MEDIA_PLUGIN_BASE_LIBRARIES}
+ ${LLCOMMON_LIBRARIES}
+)
+
+if (WINDOWS)
+ set_target_properties(
+ media_plugin_example
+ PROPERTIES
+ LINK_FLAGS "/MANIFEST:NO"
+ )
+endif (WINDOWS)
+
+if (DARWIN)
+ # Don't prepend 'lib' to the executable name, and don't embed a full path in the library's install name
+ set_target_properties(
+ media_plugin_example
+ PROPERTIES
+ PREFIX ""
+ BUILD_WITH_INSTALL_RPATH 1
+ INSTALL_NAME_DIR "@executable_path"
+ LINK_FLAGS "-exported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/../base/media_plugin_base.exp"
+ )
+
+endif (DARWIN)
\ No newline at end of file
diff --git a/linden/indra/media_plugins/example/media_plugin_example.cpp b/linden/indra/media_plugins/example/media_plugin_example.cpp
new file mode 100644
index 0000000..99e0199
--- /dev/null
+++ b/linden/indra/media_plugins/example/media_plugin_example.cpp
@@ -0,0 +1,488 @@
+/**
+ * @file media_plugin_example.cpp
+ * @brief Example plugin for LLMedia API plugin system
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlife.com/developers/opensource/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "llgl.h"
+#include "llplugininstance.h"
+#include "llpluginmessage.h"
+#include "llpluginmessageclasses.h"
+#include "media_plugin_base.h"
+
+#include
+
+////////////////////////////////////////////////////////////////////////////////
+//
+class MediaPluginExample :
+ public MediaPluginBase
+{
+ public:
+ MediaPluginExample( LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data );
+ ~MediaPluginExample();
+
+ /*virtual*/ void receiveMessage( const char* message_string );
+
+ private:
+ bool init();
+ void update( F64 milliseconds );
+ void write_pixel( int x, int y, unsigned char r, unsigned char g, unsigned char b );
+ bool mFirstTime;
+
+ time_t mLastUpdateTime;
+ enum Constants { ENumObjects = 10 };
+ unsigned char* mBackgroundPixels;
+ int mColorR[ ENumObjects ];
+ int mColorG[ ENumObjects ];
+ int mColorB[ ENumObjects ];
+ int mXpos[ ENumObjects ];
+ int mYpos[ ENumObjects ];
+ int mXInc[ ENumObjects ];
+ int mYInc[ ENumObjects ];
+ int mBlockSize[ ENumObjects ];
+ bool mMouseButtonDown;
+ bool mStopAction;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+//
+MediaPluginExample::MediaPluginExample( LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data ) :
+ MediaPluginBase( host_send_func, host_user_data )
+{
+ mFirstTime = true;
+ mWidth = 0;
+ mHeight = 0;
+ mDepth = 4;
+ mPixels = 0;
+ mMouseButtonDown = false;
+ mStopAction = false;
+ mLastUpdateTime = 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+MediaPluginExample::~MediaPluginExample()
+{
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void MediaPluginExample::receiveMessage( const char* message_string )
+{
+ LLPluginMessage message_in;
+
+ if ( message_in.parse( message_string ) >= 0 )
+ {
+ std::string message_class = message_in.getClass();
+ std::string message_name = message_in.getName();
+
+ if ( message_class == LLPLUGIN_MESSAGE_CLASS_BASE )
+ {
+ if ( message_name == "init" )
+ {
+ LLPluginMessage message( "base", "init_response" );
+ LLSD versions = LLSD::emptyMap();
+ versions[ LLPLUGIN_MESSAGE_CLASS_BASE ] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION;
+ versions[ LLPLUGIN_MESSAGE_CLASS_MEDIA ] = LLPLUGIN_MESSAGE_CLASS_MEDIA_VERSION;
+ versions[ LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER ] = LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER_VERSION;
+ message.setValueLLSD( "versions", versions );
+
+ std::string plugin_version = "Example media plugin, Example Version 1.0.0.0";
+ message.setValue( "plugin_version", plugin_version );
+ sendMessage( message );
+
+ // Plugin gets to decide the texture parameters to use.
+ message.setMessage( LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params" );
+ message.setValueS32( "default_width", mWidth );
+ message.setValueS32( "default_height", mHeight );
+ message.setValueS32( "depth", mDepth );
+ message.setValueU32( "internalformat", GL_RGBA );
+ message.setValueU32( "format", GL_RGBA );
+ message.setValueU32( "type", GL_UNSIGNED_BYTE );
+ message.setValueBoolean( "coords_opengl", false );
+ sendMessage( message );
+ }
+ else
+ if ( message_name == "idle" )
+ {
+ // no response is necessary here.
+ F64 time = message_in.getValueReal( "time" );
+
+ // Convert time to milliseconds for update()
+ update( time );
+ }
+ else
+ if ( message_name == "cleanup" )
+ {
+ // clean up here
+ }
+ else
+ if ( message_name == "shm_added" )
+ {
+ SharedSegmentInfo info;
+ info.mAddress = message_in.getValuePointer( "address" );
+ info.mSize = ( size_t )message_in.getValueS32( "size" );
+ std::string name = message_in.getValue( "name" );
+
+ mSharedSegments.insert( SharedSegmentMap::value_type( name, info ) );
+
+ }
+ else
+ if ( message_name == "shm_remove" )
+ {
+ std::string name = message_in.getValue( "name" );
+
+ SharedSegmentMap::iterator iter = mSharedSegments.find( name );
+ if( iter != mSharedSegments.end() )
+ {
+ if ( mPixels == iter->second.mAddress )
+ {
+ // This is the currently active pixel buffer.
+ // Make sure we stop drawing to it.
+ mPixels = NULL;
+ mTextureSegmentName.clear();
+ };
+ mSharedSegments.erase( iter );
+ }
+ else
+ {
+ //std::cerr << "MediaPluginExample::receiveMessage: unknown shared memory region!" << std::endl;
+ };
+
+ // Send the response so it can be cleaned up.
+ LLPluginMessage message( "base", "shm_remove_response" );
+ message.setValue( "name", name );
+ sendMessage( message );
+ }
+ else
+ {
+ //std::cerr << "MediaPluginExample::receiveMessage: unknown base message: " << message_name << std::endl;
+ };
+ }
+ else
+ if ( message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA )
+ {
+ if ( message_name == "size_change" )
+ {
+ std::string name = message_in.getValue( "name" );
+ S32 width = message_in.getValueS32( "width" );
+ S32 height = message_in.getValueS32( "height" );
+ S32 texture_width = message_in.getValueS32( "texture_width" );
+ S32 texture_height = message_in.getValueS32( "texture_height" );
+
+ if ( ! name.empty() )
+ {
+ // Find the shared memory region with this name
+ SharedSegmentMap::iterator iter = mSharedSegments.find( name );
+ if ( iter != mSharedSegments.end() )
+ {
+ mPixels = ( unsigned char* )iter->second.mAddress;
+ mWidth = width;
+ mHeight = height;
+
+ mTextureWidth = texture_width;
+ mTextureHeight = texture_height;
+
+ init();
+ };
+ };
+
+ LLPluginMessage message( LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_response" );
+ message.setValue( "name", name );
+ message.setValueS32( "width", width );
+ message.setValueS32( "height", height );
+ message.setValueS32( "texture_width", texture_width );
+ message.setValueS32( "texture_height", texture_height );
+ sendMessage( message );
+ }
+ else
+ if ( message_name == "load_uri" )
+ {
+ std::string uri = message_in.getValue( "uri" );
+ if ( ! uri.empty() )
+ {
+ };
+ }
+ else
+ if ( message_name == "mouse_event" )
+ {
+ std::string event = message_in.getValue( "event" );
+ S32 button = message_in.getValueS32( "button" );
+
+ // left mouse button
+ if ( button == 0 )
+ {
+ int mouse_x = message_in.getValueS32( "x" );
+ int mouse_y = message_in.getValueS32( "y" );
+ std::string modifiers = message_in.getValue( "modifiers" );
+
+ if ( event == "move" )
+ {
+ if ( mMouseButtonDown )
+ write_pixel( mouse_x, mouse_y, rand() % 0x80 + 0x80, rand() % 0x80 + 0x80, rand() % 0x80 + 0x80 );
+ }
+ else
+ if ( event == "down" )
+ {
+ mMouseButtonDown = true;
+ }
+ else
+ if ( event == "up" )
+ {
+ mMouseButtonDown = false;
+ }
+ else
+ if ( event == "double_click" )
+ {
+ };
+ };
+ }
+ else
+ if ( message_name == "key_event" )
+ {
+ std::string event = message_in.getValue( "event" );
+ S32 key = message_in.getValueS32( "key" );
+ std::string modifiers = message_in.getValue( "modifiers" );
+
+ if ( event == "down" )
+ {
+ if ( key == ' ')
+ {
+ mLastUpdateTime = 0;
+ update( 0.0f );
+ };
+ };
+ }
+ else
+ {
+ //std::cerr << "MediaPluginExample::receiveMessage: unknown media message: " << message_string << std::endl;
+ };
+ }
+ else
+ if ( message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER )
+ {
+ if ( message_name == "browse_reload" )
+ {
+ mLastUpdateTime = 0;
+ mFirstTime = true;
+ mStopAction = false;
+ update( 0.0f );
+ }
+ else
+ if ( message_name == "browse_stop" )
+ {
+ for( int n = 0; n < ENumObjects; ++n )
+ mXInc[ n ] = mYInc[ n ] = 0;
+
+ mStopAction = true;
+ update( 0.0f );
+ }
+ else
+ {
+ //std::cerr << "MediaPluginExample::receiveMessage: unknown media_browser message: " << message_string << std::endl;
+ };
+ }
+ else
+ {
+ //std::cerr << "MediaPluginExample::receiveMessage: unknown message class: " << message_class << std::endl;
+ };
+ };
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void MediaPluginExample::write_pixel( int x, int y, unsigned char r, unsigned char g, unsigned char b )
+{
+ // make sure we don't write outside the buffer
+ if ( ( x < 0 ) || ( x >= mWidth ) || ( y < 0 ) || ( y >= mHeight ) )
+ return;
+
+ if ( mBackgroundPixels != NULL )
+ {
+ unsigned char *pixel = mBackgroundPixels;
+ pixel += y * mWidth * mDepth;
+ pixel += ( x * mDepth );
+ pixel[ 0 ] = b;
+ pixel[ 1 ] = g;
+ pixel[ 2 ] = r;
+
+ setDirty( x, y, x + 1, y + 1 );
+ };
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void MediaPluginExample::update( F64 milliseconds )
+{
+ if ( mWidth < 1 || mWidth > 2048 || mHeight < 1 || mHeight > 2048 )
+ return;
+
+ if ( mPixels == 0 )
+ return;
+
+ if ( mFirstTime )
+ {
+ for( int n = 0; n < ENumObjects; ++n )
+ {
+ mXpos[ n ] = ( mWidth / 2 ) + rand() % ( mWidth / 16 ) - ( mWidth / 32 );
+ mYpos[ n ] = ( mHeight / 2 ) + rand() % ( mHeight / 16 ) - ( mHeight / 32 );
+
+ mColorR[ n ] = rand() % 0x60 + 0x60;
+ mColorG[ n ] = rand() % 0x60 + 0x60;
+ mColorB[ n ] = rand() % 0x60 + 0x60;
+
+ mXInc[ n ] = 0;
+ while ( mXInc[ n ] == 0 )
+ mXInc[ n ] = rand() % 7 - 3;
+
+ mYInc[ n ] = 0;
+ while ( mYInc[ n ] == 0 )
+ mYInc[ n ] = rand() % 9 - 4;
+
+ mBlockSize[ n ] = rand() % 0x30 + 0x10;
+ };
+
+ delete [] mBackgroundPixels;
+
+ mBackgroundPixels = new unsigned char[ mWidth * mHeight * mDepth ];
+
+ mFirstTime = false;
+ };
+
+ if ( mStopAction )
+ return;
+
+ if ( time( NULL ) > mLastUpdateTime + 3 )
+ {
+ const int num_squares = rand() % 20 + 4;
+ int sqr1_r = rand() % 0x80 + 0x20;
+ int sqr1_g = rand() % 0x80 + 0x20;
+ int sqr1_b = rand() % 0x80 + 0x20;
+ int sqr2_r = rand() % 0x80 + 0x20;
+ int sqr2_g = rand() % 0x80 + 0x20;
+ int sqr2_b = rand() % 0x80 + 0x20;
+
+ for ( int y1 = 0; y1 < num_squares; ++y1 )
+ {
+ for ( int x1 = 0; x1 < num_squares; ++x1 )
+ {
+ int px_start = mWidth * x1 / num_squares;
+ int px_end = ( mWidth * ( x1 + 1 ) ) / num_squares;
+ int py_start = mHeight * y1 / num_squares;
+ int py_end = ( mHeight * ( y1 + 1 ) ) / num_squares;
+
+ for( int y2 = py_start; y2 < py_end; ++y2 )
+ {
+ for( int x2 = px_start; x2 < px_end; ++x2 )
+ {
+ int rowspan = mWidth * mDepth;
+
+ if ( ( y1 % 2 ) ^ ( x1 % 2 ) )
+ {
+ mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 0 ] = sqr1_r;
+ mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 1 ] = sqr1_g;
+ mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 2 ] = sqr1_b;
+ }
+ else
+ {
+ mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 0 ] = sqr2_r;
+ mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 1 ] = sqr2_g;
+ mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 2 ] = sqr2_b;
+ };
+ };
+ };
+ };
+ };
+
+ time( &mLastUpdateTime );
+ };
+
+ memcpy( mPixels, mBackgroundPixels, mWidth * mHeight * mDepth );
+
+ for( int n = 0; n < ENumObjects; ++n )
+ {
+ if ( rand() % 50 == 0 )
+ {
+ mXInc[ n ] = 0;
+ while ( mXInc[ n ] == 0 )
+ mXInc[ n ] = rand() % 7 - 3;
+
+ mYInc[ n ] = 0;
+ while ( mYInc[ n ] == 0 )
+ mYInc[ n ] = rand() % 9 - 4;
+ };
+
+ if ( mXpos[ n ] + mXInc[ n ] < 0 || mXpos[ n ] + mXInc[ n ] >= mWidth - mBlockSize[ n ] )
+ mXInc[ n ] =- mXInc[ n ];
+
+ if ( mYpos[ n ] + mYInc[ n ] < 0 || mYpos[ n ] + mYInc[ n ] >= mHeight - mBlockSize[ n ] )
+ mYInc[ n ] =- mYInc[ n ];
+
+ mXpos[ n ] += mXInc[ n ];
+ mYpos[ n ] += mYInc[ n ];
+
+ for( int y = 0; y < mBlockSize[ n ]; ++y )
+ {
+ for( int x = 0; x < mBlockSize[ n ]; ++x )
+ {
+ mPixels[ ( mXpos[ n ] + x ) * mDepth + ( mYpos[ n ] + y ) * mDepth * mWidth + 0 ] = mColorR[ n ];
+ mPixels[ ( mXpos[ n ] + x ) * mDepth + ( mYpos[ n ] + y ) * mDepth * mWidth + 1 ] = mColorG[ n ];
+ mPixels[ ( mXpos[ n ] + x ) * mDepth + ( mYpos[ n ] + y ) * mDepth * mWidth + 2 ] = mColorB[ n ];
+ };
+ };
+ };
+
+ setDirty( 0, 0, mWidth, mHeight );
+};
+
+////////////////////////////////////////////////////////////////////////////////
+//
+bool MediaPluginExample::init()
+{
+ LLPluginMessage message( LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text" );
+ message.setValue( "name", "Example Plugin" );
+ sendMessage( message );
+
+ return true;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+//
+int init_media_plugin( LLPluginInstance::sendMessageFunction host_send_func,
+ void* host_user_data,
+ LLPluginInstance::sendMessageFunction *plugin_send_func,
+ void **plugin_user_data )
+{
+ MediaPluginExample* self = new MediaPluginExample( host_send_func, host_user_data );
+ *plugin_send_func = MediaPluginExample::staticReceiveMessage;
+ *plugin_user_data = ( void* )self;
+
+ return 0;
+}
diff --git a/linden/indra/media_plugins/gstreamer010/CMakeLists.txt b/linden/indra/media_plugins/gstreamer010/CMakeLists.txt
new file mode 100644
index 0000000..a3a32d8
--- /dev/null
+++ b/linden/indra/media_plugins/gstreamer010/CMakeLists.txt
@@ -0,0 +1,71 @@
+# -*- cmake -*-
+
+project(media_plugin_gstreamer010)
+
+include(00-Common)
+include(LLCommon)
+include(LLImage)
+include(LLPlugin)
+include(LLMath)
+include(LLRender)
+include(LLWindow)
+include(Linking)
+include(PluginAPI)
+include(MediaPluginBase)
+include(FindOpenGL)
+
+include(GStreamer010Plugin)
+
+include_directories(
+ ${LLPLUGIN_INCLUDE_DIRS}
+ ${MEDIA_PLUGIN_BASE_INCLUDE_DIRS}
+ ${LLCOMMON_INCLUDE_DIRS}
+ ${LLMATH_INCLUDE_DIRS}
+ ${LLIMAGE_INCLUDE_DIRS}
+ ${LLRENDER_INCLUDE_DIRS}
+ ${LLWINDOW_INCLUDE_DIRS}
+ ${GSTREAMER010_INCLUDE_DIRS}
+ ${GSTREAMER010_PLUGINS_BASE_INCLUDE_DIRS}
+)
+
+### media_plugin_gstreamer010
+
+set(media_plugin_gstreamer010_SOURCE_FILES
+ media_plugin_gstreamer010.cpp
+ llmediaimplgstreamer_syms.cpp
+ llmediaimplgstreamervidplug.cpp
+ )
+
+set(media_plugin_gstreamer010_HEADER_FILES
+ llmediaimplgstreamervidplug.h
+ llmediaimplgstreamer_syms.h
+ llmediaimplgstreamertriviallogging.h
+ )
+
+#awfixme if (${CXX_VERSION_NUMBER} MATCHES "4[23].")
+ # Work around a bad interaction between broken gstreamer headers and
+ # g++ 4.3's increased strictness.
+ set_source_files_properties(llmediaimplgstreamervidplug.cpp PROPERTIES
+ COMPILE_FLAGS -Wno-write-strings)
+#awfixme endif (${CXX_VERSION_NUMBER} MATCHES "4[23].")
+
+add_library(media_plugin_gstreamer010
+ SHARED
+ ${media_plugin_gstreamer010_SOURCE_FILES}
+)
+
+target_link_libraries(media_plugin_gstreamer010
+ ${LLPLUGIN_LIBRARIES}
+ ${MEDIA_PLUGIN_BASE_LIBRARIES}
+ ${LLCOMMON_LIBRARIES}
+ ${PLUGIN_API_WINDOWS_LIBRARIES}
+ ${GSTREAMER010_LIBRARIES}
+)
+
+add_dependencies(media_plugin_gstreamer010
+ ${LLPLUGIN_LIBRARIES}
+ ${MEDIA_PLUGIN_BASE_LIBRARIES}
+ ${LLCOMMON_LIBRARIES}
+)
+
+
diff --git a/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h b/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h
new file mode 100644
index 0000000..ef41736
--- /dev/null
+++ b/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h
@@ -0,0 +1,57 @@
+/**
+ * @file llmediaimplgstreamer.h
+ * @author Tofu Linden
+ * @brief implementation that supports media playback via GStreamer.
+ *
+ * $LicenseInfo:firstyear=2007&license=viewergpl$
+ *
+ * Copyright (c) 2007-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+// header guard
+#ifndef llmediaimplgstreamer_h
+#define llmediaimplgstreamer_h
+
+#if LL_GSTREAMER010_ENABLED
+
+extern "C" {
+#include
+#include
+
+#include "apr_pools.h"
+#include "apr_dso.h"
+}
+
+
+extern "C" {
+gboolean llmediaimplgstreamer_bus_callback (GstBus *bus,
+ GstMessage *message,
+ gpointer data);
+}
+
+#endif // LL_GSTREAMER010_ENABLED
+
+#endif // llmediaimplgstreamer_h
diff --git a/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp b/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp
new file mode 100644
index 0000000..cc52232
--- /dev/null
+++ b/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp
@@ -0,0 +1,171 @@
+/**
+ * @file llmediaimplgstreamer_syms.cpp
+ * @brief dynamic GStreamer symbol-grabbing code
+ *
+ * $LicenseInfo:firstyear=2007&license=viewergpl$
+ *
+ * Copyright (c) 2007-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#if LL_GSTREAMER010_ENABLED
+
+#include
+
+extern "C" {
+#include
+
+#include "apr_pools.h"
+#include "apr_dso.h"
+}
+
+#include "llmediaimplgstreamertriviallogging.h"
+
+#define LL_GST_SYM(REQ, GSTSYM, RTN, ...) RTN (*ll##GSTSYM)(__VA_ARGS__) = NULL
+#include "llmediaimplgstreamer_syms_raw.inc"
+#include "llmediaimplgstreamer_syms_rawv.inc"
+#undef LL_GST_SYM
+
+// a couple of stubs for disgusting reasons
+GstDebugCategory*
+ll_gst_debug_category_new(gchar *name, guint color, gchar *description)
+{
+ static GstDebugCategory dummy;
+ return &dummy;
+}
+void ll_gst_debug_register_funcptr(GstDebugFuncPtr func, gchar* ptrname)
+{
+}
+
+static bool sSymsGrabbed = false;
+static apr_pool_t *sSymGSTDSOMemoryPool = NULL;
+static apr_dso_handle_t *sSymGSTDSOHandleG = NULL;
+static apr_dso_handle_t *sSymGSTDSOHandleV = NULL;
+
+
+bool grab_gst_syms(std::string gst_dso_name,
+ std::string gst_dso_name_vid)
+{
+ if (sSymsGrabbed)
+ {
+ // already have grabbed good syms
+ return TRUE;
+ }
+
+ bool sym_error = false;
+ bool rtn = false;
+ apr_status_t rv;
+ apr_dso_handle_t *sSymGSTDSOHandle = NULL;
+
+#define LL_GST_SYM(REQ, GSTSYM, RTN, ...) do{rv = apr_dso_sym((apr_dso_handle_sym_t*)&ll##GSTSYM, sSymGSTDSOHandle, #GSTSYM); if (rv != APR_SUCCESS) {INFOMSG("Failed to grab symbol: %s", #GSTSYM); if (REQ) sym_error = true;} else DEBUGMSG("grabbed symbol: %s from %p", #GSTSYM, (void*)ll##GSTSYM);}while(0)
+
+ //attempt to load the shared libraries
+ apr_pool_create(&sSymGSTDSOMemoryPool, NULL);
+
+ if ( APR_SUCCESS == (rv = apr_dso_load(&sSymGSTDSOHandle,
+ gst_dso_name.c_str(),
+ sSymGSTDSOMemoryPool) ))
+ {
+ INFOMSG("Found DSO: %s", gst_dso_name.c_str());
+#include "llmediaimplgstreamer_syms_raw.inc"
+
+ if ( sSymGSTDSOHandle )
+ {
+ sSymGSTDSOHandleG = sSymGSTDSOHandle;
+ sSymGSTDSOHandle = NULL;
+ }
+
+ if ( APR_SUCCESS ==
+ (rv = apr_dso_load(&sSymGSTDSOHandle,
+ gst_dso_name_vid.c_str(),
+ sSymGSTDSOMemoryPool) ))
+ {
+ INFOMSG("Found DSO: %s", gst_dso_name_vid.c_str());
+#include "llmediaimplgstreamer_syms_rawv.inc"
+ rtn = !sym_error;
+ }
+ else
+ {
+ INFOMSG("Couldn't load DSO: %s", gst_dso_name_vid.c_str());
+ rtn = false; // failure
+ }
+ }
+ else
+ {
+ INFOMSG("Couldn't load DSO: %s", gst_dso_name.c_str());
+ rtn = false; // failure
+ }
+
+ if (sym_error)
+ {
+ WARNMSG("Failed to find necessary symbols in GStreamer libraries.");
+ }
+
+ if ( sSymGSTDSOHandle )
+ {
+ sSymGSTDSOHandleV = sSymGSTDSOHandle;
+ sSymGSTDSOHandle = NULL;
+ }
+#undef LL_GST_SYM
+
+ sSymsGrabbed = !!rtn;
+ return rtn;
+}
+
+
+void ungrab_gst_syms()
+{
+ // should be safe to call regardless of whether we've
+ // actually grabbed syms.
+
+ if ( sSymGSTDSOHandleG )
+ {
+ apr_dso_unload(sSymGSTDSOHandleG);
+ sSymGSTDSOHandleG = NULL;
+ }
+
+ if ( sSymGSTDSOHandleV )
+ {
+ apr_dso_unload(sSymGSTDSOHandleV);
+ sSymGSTDSOHandleV = NULL;
+ }
+
+ if ( sSymGSTDSOMemoryPool )
+ {
+ apr_pool_destroy(sSymGSTDSOMemoryPool);
+ sSymGSTDSOMemoryPool = NULL;
+ }
+
+ // NULL-out all of the symbols we'd grabbed
+#define LL_GST_SYM(REQ, GSTSYM, RTN, ...) do{ll##GSTSYM = NULL;}while(0)
+#include "llmediaimplgstreamer_syms_raw.inc"
+#include "llmediaimplgstreamer_syms_rawv.inc"
+#undef LL_GST_SYM
+
+ sSymsGrabbed = false;
+}
+
+
+#endif // LL_GSTREAMER010_ENABLED
diff --git a/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.h b/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.h
new file mode 100644
index 0000000..ee7473d
--- /dev/null
+++ b/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.h
@@ -0,0 +1,78 @@
+/**
+ * @file llmediaimplgstreamer_syms.h
+ * @brief dynamic GStreamer symbol-grabbing code
+ *
+ * $LicenseInfo:firstyear=2007&license=viewergpl$
+ *
+ * Copyright (c) 2007-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#if LL_GSTREAMER010_ENABLED
+
+extern "C" {
+#include
+}
+
+bool grab_gst_syms(std::string gst_dso_name,
+ std::string gst_dso_name_vid);
+void ungrab_gst_syms();
+
+#define LL_GST_SYM(REQ, GSTSYM, RTN, ...) extern RTN (*ll##GSTSYM)(__VA_ARGS__)
+#include "llmediaimplgstreamer_syms_raw.inc"
+#include "llmediaimplgstreamer_syms_rawv.inc"
+#undef LL_GST_SYM
+
+// regrettable hacks to give us better runtime compatibility with older systems
+#define llg_return_if_fail(COND) do{if (!(COND)) return;}while(0)
+#define llg_return_val_if_fail(COND,V) do{if (!(COND)) return V;}while(0)
+
+// regrettable hacks because GStreamer was not designed for runtime loading
+#undef GST_TYPE_MESSAGE
+#define GST_TYPE_MESSAGE (llgst_message_get_type())
+#undef GST_TYPE_OBJECT
+#define GST_TYPE_OBJECT (llgst_object_get_type())
+#undef GST_TYPE_PIPELINE
+#define GST_TYPE_PIPELINE (llgst_pipeline_get_type())
+#undef GST_TYPE_ELEMENT
+#define GST_TYPE_ELEMENT (llgst_element_get_type())
+#undef GST_TYPE_VIDEO_SINK
+#define GST_TYPE_VIDEO_SINK (llgst_video_sink_get_type())
+// more regrettable hacks to stub-out these .h-exposed GStreamer internals
+void ll_gst_debug_register_funcptr(GstDebugFuncPtr func, gchar* ptrname);
+#undef _gst_debug_register_funcptr
+#define _gst_debug_register_funcptr ll_gst_debug_register_funcptr
+GstDebugCategory* ll_gst_debug_category_new(gchar *name, guint color, gchar *description);
+#undef _gst_debug_category_new
+#define _gst_debug_category_new ll_gst_debug_category_new
+#undef __gst_debug_enabled
+#define __gst_debug_enabled (0)
+
+// more hacks
+#define LLGST_MESSAGE_TYPE_NAME(M) (llgst_message_type_get_name(GST_MESSAGE_TYPE(M)))
+
+#endif // LL_GSTREAMER010_ENABLED
diff --git a/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms_raw.inc b/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms_raw.inc
new file mode 100644
index 0000000..b33e593
--- /dev/null
+++ b/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms_raw.inc
@@ -0,0 +1,51 @@
+
+// required symbols to grab
+LL_GST_SYM(true, gst_pad_peer_accept_caps, gboolean, GstPad *pad, GstCaps *caps);
+LL_GST_SYM(true, gst_buffer_new, GstBuffer*, void);
+LL_GST_SYM(true, gst_buffer_set_caps, void, GstBuffer*, GstCaps *);
+LL_GST_SYM(true, gst_structure_set_value, void, GstStructure *, const gchar *, const GValue*);
+LL_GST_SYM(true, gst_init_check, gboolean, int *argc, char **argv[], GError ** err);
+LL_GST_SYM(true, gst_message_get_type, GType, void);
+LL_GST_SYM(true, gst_message_type_get_name, const gchar*, GstMessageType type);
+LL_GST_SYM(true, gst_message_parse_error, void, GstMessage *message, GError **gerror, gchar **debug);
+LL_GST_SYM(true, gst_message_parse_warning, void, GstMessage *message, GError **gerror, gchar **debug);
+LL_GST_SYM(true, gst_message_parse_state_changed, void, GstMessage *message, GstState *oldstate, GstState *newstate, GstState *pending);
+LL_GST_SYM(true, gst_element_set_state, GstStateChangeReturn, GstElement *element, GstState state);
+LL_GST_SYM(true, gst_object_unref, void, gpointer object);
+LL_GST_SYM(true, gst_object_get_type, GType, void);
+LL_GST_SYM(true, gst_pipeline_get_type, GType, void);
+LL_GST_SYM(true, gst_pipeline_get_bus, GstBus*, GstPipeline *pipeline);
+LL_GST_SYM(true, gst_bus_add_watch, guint, GstBus * bus, GstBusFunc func, gpointer user_data);
+LL_GST_SYM(true, gst_element_factory_make, GstElement*, const gchar *factoryname, const gchar *name);
+LL_GST_SYM(true, gst_element_get_type, GType, void);
+LL_GST_SYM(true, gst_static_pad_template_get, GstPadTemplate*, GstStaticPadTemplate *pad_template);
+LL_GST_SYM(true, gst_element_class_add_pad_template, void, GstElementClass *klass, GstPadTemplate *temp);
+LL_GST_SYM(true, gst_element_class_set_details, void, GstElementClass *klass, const GstElementDetails *details);
+LL_GST_SYM(true, gst_caps_unref, void, GstCaps* caps);
+LL_GST_SYM(true, gst_caps_ref, GstCaps *, GstCaps* caps);
+//LL_GST_SYM(true, gst_caps_is_empty, gboolean, const GstCaps *caps);
+LL_GST_SYM(true, gst_caps_from_string, GstCaps *, const gchar *string);
+LL_GST_SYM(true, gst_caps_replace, void, GstCaps **caps, GstCaps *newcaps);
+LL_GST_SYM(true, gst_caps_get_structure, GstStructure *, const GstCaps *caps, guint index);
+LL_GST_SYM(true, gst_caps_copy, GstCaps *, const GstCaps * caps);
+//LL_GST_SYM(true, gst_caps_intersect, GstCaps *, const GstCaps *caps1, const GstCaps *caps2);
+LL_GST_SYM(true, gst_element_register, gboolean, GstPlugin *plugin, const gchar *name, guint rank, GType type);
+LL_GST_SYM(true, _gst_plugin_register_static, void, GstPluginDesc *desc);
+LL_GST_SYM(true, gst_structure_get_int, gboolean, const GstStructure *structure, const gchar *fieldname, gint *value);
+LL_GST_SYM(true, gst_structure_get_value, G_CONST_RETURN GValue *, const GstStructure *structure, const gchar *fieldname);
+LL_GST_SYM(true, gst_value_get_fraction_numerator, gint, const GValue *value);
+LL_GST_SYM(true, gst_value_get_fraction_denominator, gint, const GValue *value);
+LL_GST_SYM(true, gst_structure_get_name, G_CONST_RETURN gchar *, const GstStructure *structure);
+LL_GST_SYM(true, gst_element_seek, bool, GstElement *, gdouble, GstFormat, GstSeekFlags, GstSeekType, gint64, GstSeekType, gint64);
+
+// optional symbols to grab
+LL_GST_SYM(false, gst_registry_fork_set_enabled, void, gboolean enabled);
+LL_GST_SYM(false, gst_segtrap_set_enabled, void, gboolean enabled);
+LL_GST_SYM(false, gst_message_parse_buffering, void, GstMessage *message, gint *percent);
+LL_GST_SYM(false, gst_message_parse_info, void, GstMessage *message, GError **gerror, gchar **debug);
+LL_GST_SYM(false, gst_element_query_position, gboolean, GstElement *element, GstFormat *format, gint64 *cur);
+LL_GST_SYM(false, gst_version, void, guint *major, guint *minor, guint *micro, guint *nano);
+
+// GStreamer 'internal' symbols which may not be visible in some runtimes but are still used in expanded GStreamer header macros - yuck! We'll substitute our own stubs for these.
+//LL_GST_SYM(true, _gst_debug_register_funcptr, void, GstDebugFuncPtr func, gchar* ptrname);
+//LL_GST_SYM(true, _gst_debug_category_new, GstDebugCategory *, gchar *name, guint color, gchar *description);
diff --git a/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms_rawv.inc b/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms_rawv.inc
new file mode 100644
index 0000000..14fbcb4
--- /dev/null
+++ b/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms_rawv.inc
@@ -0,0 +1,5 @@
+
+// required symbols to grab
+LL_GST_SYM(true, gst_video_sink_get_type, GType, void);
+
+// optional symbols to grab
diff --git a/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h b/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h
new file mode 100644
index 0000000..e31d4a3
--- /dev/null
+++ b/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h
@@ -0,0 +1,53 @@
+/**
+ * @file llmediaimplgstreamertriviallogging.h
+ * @brief minimal logging utilities.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef __LLMEDIAIMPLGSTREAMERTRIVIALLOGGING_H__
+#define __LLMEDIAIMPLGSTREAMERTRIVIALLOGGING_H__
+
+#include
+
+/////////////////////////////////////////////////////////////////////////
+// Debug/Info/Warning macros.
+#define MSGMODULEFOO "(media plugin)"
+#define STDERRMSG(...) do{\
+ fprintf(stderr, MSGMODULEFOO " %s:%d: ", __FUNCTION__, __LINE__);\
+ fprintf(stderr, __VA_ARGS__);\
+ fputc('\n',stderr);\
+ }while(0)
+#define NULLMSG(...) do{}while(0)
+
+#define DEBUGMSG NULLMSG
+#define INFOMSG STDERRMSG
+#define WARNMSG STDERRMSG
+/////////////////////////////////////////////////////////////////////////
+
+#endif /* __LLMEDIAIMPLGSTREAMERTRIVIALLOGGING_H__ */
diff --git a/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp b/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp
new file mode 100644
index 0000000..25e96d4
--- /dev/null
+++ b/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp
@@ -0,0 +1,532 @@
+/**
+ * @file llmediaimplgstreamervidplug.cpp
+ * @brief Video-consuming static GStreamer plugin for gst-to-LLMediaImpl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewergpl$
+ *
+ * Copyright (c) 2007-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#if LL_GSTREAMER010_ENABLED
+
+#include "linden_common.h"
+
+#include
+#include
+#include
+
+#include "llmediaimplgstreamer_syms.h"
+#include "llmediaimplgstreamertriviallogging.h"
+
+#include "llmediaimplgstreamervidplug.h"
+
+
+GST_DEBUG_CATEGORY_STATIC (gst_slvideo_debug);
+#define GST_CAT_DEFAULT gst_slvideo_debug
+
+
+#define SLV_SIZECAPS ", width=(int)[1,2048], height=(int)[1,2048] "
+#define SLV_ALLCAPS GST_VIDEO_CAPS_RGBx SLV_SIZECAPS
+
+static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE (
+ (gchar*)"sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (SLV_ALLCAPS)
+ );
+
+GST_BOILERPLATE (GstSLVideo, gst_slvideo, GstVideoSink,
+ GST_TYPE_VIDEO_SINK);
+
+static void gst_slvideo_set_property (GObject * object, guint prop_id,
+ const GValue * value,
+ GParamSpec * pspec);
+static void gst_slvideo_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static void
+gst_slvideo_base_init (gpointer gclass)
+{
+ static GstElementDetails element_details = {
+ (gchar*)"PluginTemplate",
+ (gchar*)"Generic/PluginTemplate",
+ (gchar*)"Generic Template Element",
+ (gchar*)"Linden Lab"
+ };
+ GstElementClass *element_class = GST_ELEMENT_CLASS (gclass);
+
+ llgst_element_class_add_pad_template (element_class,
+ llgst_static_pad_template_get (&sink_factory));
+ llgst_element_class_set_details (element_class, &element_details);
+}
+
+
+static void
+gst_slvideo_finalize (GObject * object)
+{
+ GstSLVideo *slvideo;
+ slvideo = GST_SLVIDEO (object);
+ if (slvideo->caps)
+ {
+ llgst_caps_unref(slvideo->caps);
+ }
+
+ G_OBJECT_CLASS(parent_class)->finalize (object);
+}
+
+
+static GstFlowReturn
+gst_slvideo_show_frame (GstBaseSink * bsink, GstBuffer * buf)
+{
+ GstSLVideo *slvideo;
+ llg_return_val_if_fail (buf != NULL, GST_FLOW_ERROR);
+
+ slvideo = GST_SLVIDEO(bsink);
+
+#if 0
+ fprintf(stderr, "\n\ntransferring a frame of %dx%d <- %p (%d)\n\n",
+ slvideo->width, slvideo->height, GST_BUFFER_DATA(buf),
+ slvideo->format);
+#endif
+ if (GST_BUFFER_DATA(buf))
+ {
+ // copy frame and frame info into neutral territory
+ GST_OBJECT_LOCK(slvideo);
+ slvideo->retained_frame_ready = TRUE;
+ slvideo->retained_frame_width = slvideo->width;
+ slvideo->retained_frame_height = slvideo->height;
+ slvideo->retained_frame_format = slvideo->format;
+ int rowbytes =
+ SLVPixelFormatBytes[slvideo->retained_frame_format] *
+ slvideo->retained_frame_width;
+ int needbytes = rowbytes * slvideo->retained_frame_width;
+ // resize retained frame hunk only if necessary
+ if (needbytes != slvideo->retained_frame_allocbytes)
+ {
+ delete[] slvideo->retained_frame_data;
+ slvideo->retained_frame_data = new unsigned char[needbytes];
+ slvideo->retained_frame_allocbytes = needbytes;
+
+ }
+ // copy the actual frame data to neutral territory -
+ // flipped, for GL reasons
+ for (int ypos=0; yposheight; ++ypos)
+ {
+ memcpy(&slvideo->retained_frame_data[(slvideo->height-1-ypos)*rowbytes],
+ &(((unsigned char*)GST_BUFFER_DATA(buf))[ypos*rowbytes]),
+ rowbytes);
+ }
+ // done with the shared data
+ GST_OBJECT_UNLOCK(slvideo);
+ }
+
+ return GST_FLOW_OK;
+}
+
+
+static GstStateChangeReturn
+gst_slvideo_change_state(GstElement * element, GstStateChange transition)
+{
+ GstSLVideo *slvideo;
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+
+ slvideo = GST_SLVIDEO (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ break;
+ default:
+ break;
+ }
+
+ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ return ret;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ slvideo->fps_n = 0;
+ slvideo->fps_d = 1;
+ GST_VIDEO_SINK_WIDTH(slvideo) = 0;
+ GST_VIDEO_SINK_HEIGHT(slvideo) = 0;
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+
+static GstCaps *
+gst_slvideo_get_caps (GstBaseSink * bsink)
+{
+ GstSLVideo *slvideo;
+ slvideo = GST_SLVIDEO(bsink);
+
+ return llgst_caps_ref (slvideo->caps);
+}
+
+
+/* this function handles the link with other elements */
+static gboolean
+gst_slvideo_set_caps (GstBaseSink * bsink, GstCaps * caps)
+{
+ GstSLVideo *filter;
+ GstStructure *structure;
+
+ GST_DEBUG ("set caps with %" GST_PTR_FORMAT, caps);
+
+ filter = GST_SLVIDEO(bsink);
+
+ int width, height;
+ gboolean ret;
+ const GValue *fps;
+ const GValue *par;
+ structure = llgst_caps_get_structure (caps, 0);
+ ret = llgst_structure_get_int (structure, "width", &width);
+ ret = ret && llgst_structure_get_int (structure, "height", &height);
+ fps = llgst_structure_get_value (structure, "framerate");
+ ret = ret && (fps != NULL);
+ par = llgst_structure_get_value (structure, "pixel-aspect-ratio");
+ if (!ret)
+ return FALSE;
+
+ INFOMSG("** filter caps set with width=%d, height=%d", width, height);
+
+ GST_OBJECT_LOCK(filter);
+
+ filter->width = width;
+ filter->height = height;
+
+ filter->fps_n = llgst_value_get_fraction_numerator(fps);
+ filter->fps_d = llgst_value_get_fraction_denominator(fps);
+ if (par)
+ {
+ filter->par_n = llgst_value_get_fraction_numerator(par);
+ filter->par_d = llgst_value_get_fraction_denominator(par);
+ }
+ else
+ {
+ filter->par_n = 1;
+ filter->par_d = 1;
+ }
+ GST_VIDEO_SINK_WIDTH(filter) = width;
+ GST_VIDEO_SINK_HEIGHT(filter) = height;
+
+ // crufty lump - we *always* accept *only* RGBX now.
+ /*
+ filter->format = SLV_PF_UNKNOWN;
+ if (0 == strcmp(llgst_structure_get_name(structure),
+ "video/x-raw-rgb"))
+ {
+ int red_mask;
+ int green_mask;
+ int blue_mask;
+ llgst_structure_get_int(structure, "red_mask", &red_mask);
+ llgst_structure_get_int(structure, "green_mask", &green_mask);
+ llgst_structure_get_int(structure, "blue_mask", &blue_mask);
+ if ((unsigned int)red_mask == 0xFF000000 &&
+ (unsigned int)green_mask == 0x00FF0000 &&
+ (unsigned int)blue_mask == 0x0000FF00)
+ {
+ filter->format = SLV_PF_RGBX;
+ //fprintf(stderr, "\n\nPIXEL FORMAT RGB\n\n");
+ } else if ((unsigned int)red_mask == 0x0000FF00 &&
+ (unsigned int)green_mask == 0x00FF0000 &&
+ (unsigned int)blue_mask == 0xFF000000)
+ {
+ filter->format = SLV_PF_BGRX;
+ //fprintf(stderr, "\n\nPIXEL FORMAT BGR\n\n");
+ }
+ }*/
+
+ filter->format = SLV_PF_RGBX;
+
+ GST_OBJECT_UNLOCK(filter);
+
+ return TRUE;
+}
+
+
+static gboolean
+gst_slvideo_start (GstBaseSink * bsink)
+{
+ GstSLVideo *slvideo;
+ gboolean ret = TRUE;
+
+ slvideo = GST_SLVIDEO(bsink);
+
+ return ret;
+}
+
+static gboolean
+gst_slvideo_stop (GstBaseSink * bsink)
+{
+ GstSLVideo *slvideo;
+ slvideo = GST_SLVIDEO(bsink);
+
+ // free-up retained frame buffer
+ GST_OBJECT_LOCK(slvideo);
+ slvideo->retained_frame_ready = FALSE;
+ delete[] slvideo->retained_frame_data;
+ slvideo->retained_frame_data = NULL;
+ slvideo->retained_frame_allocbytes = 0;
+ GST_OBJECT_UNLOCK(slvideo);
+
+ return TRUE;
+}
+
+
+static GstFlowReturn
+gst_slvideo_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size,
+ GstCaps * caps, GstBuffer ** buf)
+{
+ gint width, height;
+ GstStructure *structure = NULL;
+ GstSLVideo *slvideo;
+ slvideo = GST_SLVIDEO(bsink);
+
+ // caps == requested caps
+ // we can ignore these and reverse-negotiate our preferred dimensions with
+ // the peer if we like - we need to do this to obey dynamic resize requests
+ // flowing in from the app.
+ structure = llgst_caps_get_structure (caps, 0);
+ if (!llgst_structure_get_int(structure, "width", &width) ||
+ !llgst_structure_get_int(structure, "height", &height))
+ {
+ GST_WARNING_OBJECT (slvideo, "no width/height in caps %" GST_PTR_FORMAT, caps);
+ return GST_FLOW_NOT_NEGOTIATED;
+ }
+
+ GstBuffer *newbuf = llgst_buffer_new();
+ bool made_bufferdata_ptr = false;
+#define MAXDEPTHHACK 4
+
+ GST_OBJECT_LOCK(slvideo);
+ if (slvideo->resize_forced)
+ {
+ gint slwantwidth, slwantheight;
+ slwantwidth = slvideo->resize_try_width;
+ slwantheight = slvideo->resize_try_height;
+
+ if (slwantwidth != width ||
+ slwantheight != height)
+ {
+ // don't like requested caps, we will issue our own suggestion - copy
+ // the requested caps but substitute our own width and height and see
+ // if our peer is happy with that.
+
+ GstCaps *desired_caps;
+ GstStructure *desired_struct;
+ desired_caps = llgst_caps_copy (caps);
+ desired_struct = llgst_caps_get_structure (desired_caps, 0);
+
+ GValue value = {0};
+ g_value_init(&value, G_TYPE_INT);
+ g_value_set_int(&value, slwantwidth);
+ llgst_structure_set_value (desired_struct, "width", &value);
+ g_value_unset(&value);
+ g_value_init(&value, G_TYPE_INT);
+ g_value_set_int(&value, slwantheight);
+ llgst_structure_set_value (desired_struct, "height", &value);
+
+ if (llgst_pad_peer_accept_caps (GST_VIDEO_SINK_PAD (slvideo),
+ desired_caps))
+ {
+ // todo: re-use buffers from a pool?
+ // todo: set MALLOCDATA to null, set DATA to point straight to shm?
+
+ // peer likes our cap suggestion
+ DEBUGMSG("peer loves us :)");
+ GST_BUFFER_SIZE(newbuf) = slwantwidth * slwantheight * MAXDEPTHHACK;
+ GST_BUFFER_MALLOCDATA(newbuf) = (guint8*)g_malloc(GST_BUFFER_SIZE(newbuf));
+ GST_BUFFER_DATA(newbuf) = GST_BUFFER_MALLOCDATA(newbuf);
+ llgst_buffer_set_caps (GST_BUFFER_CAST(newbuf), desired_caps);
+
+ made_bufferdata_ptr = true;
+ } else {
+ // peer hates our cap suggestion
+ INFOMSG("peer hates us :(");
+ llgst_caps_unref(desired_caps);
+ }
+ }
+ }
+
+ if (!made_bufferdata_ptr) // need to fallback to malloc at original size
+ {
+ GST_BUFFER_SIZE(newbuf) = width * height * MAXDEPTHHACK;
+ GST_BUFFER_MALLOCDATA(newbuf) = (guint8*)g_malloc(GST_BUFFER_SIZE(newbuf));
+ GST_BUFFER_DATA(newbuf) = GST_BUFFER_MALLOCDATA(newbuf);
+ llgst_buffer_set_caps (GST_BUFFER_CAST(newbuf), caps);
+ }
+
+ GST_OBJECT_UNLOCK(slvideo);
+
+ *buf = GST_BUFFER_CAST(newbuf);
+
+ return GST_FLOW_OK;
+}
+
+
+/* initialize the plugin's class */
+static void
+gst_slvideo_class_init (GstSLVideoClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+ GstBaseSinkClass *gstbasesink_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+ gstbasesink_class = (GstBaseSinkClass *) klass;
+
+ gobject_class->finalize = gst_slvideo_finalize;
+ gobject_class->set_property = gst_slvideo_set_property;
+ gobject_class->get_property = gst_slvideo_get_property;
+
+ gstelement_class->change_state = gst_slvideo_change_state;
+
+#define LLGST_DEBUG_FUNCPTR(p) (p)
+ gstbasesink_class->get_caps = LLGST_DEBUG_FUNCPTR (gst_slvideo_get_caps);
+ gstbasesink_class->set_caps = LLGST_DEBUG_FUNCPTR( gst_slvideo_set_caps);
+ gstbasesink_class->buffer_alloc=LLGST_DEBUG_FUNCPTR(gst_slvideo_buffer_alloc);
+ //gstbasesink_class->get_times = LLGST_DEBUG_FUNCPTR (gst_slvideo_get_times);
+ gstbasesink_class->preroll = LLGST_DEBUG_FUNCPTR (gst_slvideo_show_frame);
+ gstbasesink_class->render = LLGST_DEBUG_FUNCPTR (gst_slvideo_show_frame);
+
+ gstbasesink_class->start = LLGST_DEBUG_FUNCPTR (gst_slvideo_start);
+ gstbasesink_class->stop = LLGST_DEBUG_FUNCPTR (gst_slvideo_stop);
+
+ // gstbasesink_class->unlock = LLGST_DEBUG_FUNCPTR (gst_slvideo_unlock);
+#undef LLGST_DEBUG_FUNCPTR
+}
+
+
+/* initialize the new element
+ * instantiate pads and add them to element
+ * set functions
+ * initialize structure
+ */
+static void
+gst_slvideo_init (GstSLVideo * filter,
+ GstSLVideoClass * gclass)
+{
+ filter->caps = NULL;
+ filter->width = -1;
+ filter->height = -1;
+
+ // this is the info we share with the client app
+ GST_OBJECT_LOCK(filter);
+ filter->retained_frame_ready = FALSE;
+ filter->retained_frame_data = NULL;
+ filter->retained_frame_allocbytes = 0;
+ filter->retained_frame_width = filter->width;
+ filter->retained_frame_height = filter->height;
+ filter->retained_frame_format = SLV_PF_UNKNOWN;
+ GstCaps *caps = llgst_caps_from_string (SLV_ALLCAPS);
+ llgst_caps_replace (&filter->caps, caps);
+ filter->resize_forced = false;
+ filter->resize_try_width = -1;
+ filter->resize_try_height = -1;
+ GST_OBJECT_UNLOCK(filter);
+}
+
+static void
+gst_slvideo_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ llg_return_if_fail (GST_IS_SLVIDEO (object));
+
+ switch (prop_id) {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_slvideo_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ llg_return_if_fail (GST_IS_SLVIDEO (object));
+
+ switch (prop_id) {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+
+/* entry point to initialize the plug-in
+ * initialize the plug-in itself
+ * register the element factories and pad templates
+ * register the features
+ */
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ DEBUGMSG("\n\n\nPLUGIN INIT\n\n\n");
+
+ GST_DEBUG_CATEGORY_INIT (gst_slvideo_debug, (gchar*)"private-slvideo-plugin",
+ 0, (gchar*)"Second Life Video Sink");
+
+ return llgst_element_register (plugin, (gchar*)"private-slvideo",
+ GST_RANK_NONE, GST_TYPE_SLVIDEO);
+}
+
+/* this is the structure that gstreamer looks for to register plugins
+ */
+/* NOTE: Can't rely upon GST_PLUGIN_DEFINE_STATIC to self-register, since
+ some g++ versions buggily avoid __attribute__((constructor)) functions -
+ so we provide an explicit plugin init function.
+ */
+void gst_slvideo_init_class (void)
+{
+#define PACKAGE "packagehack"
+ // this macro quietly refers to PACKAGE internally
+ static GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ (gchar*)"private-slvideoplugin",
+ (gchar*)"SL Video sink plugin",
+ plugin_init, (gchar*)"0.1", (gchar*)GST_LICENSE_UNKNOWN,
+ (gchar*)"Second Life",
+ (gchar*)"http://www.secondlife.com/");
+#undef PACKAGE
+ ll_gst_plugin_register_static (&gst_plugin_desc);
+ DEBUGMSG(stderr, "\n\n\nCLASS INIT\n\n\n");
+}
+
+#endif // LL_GSTREAMER010_ENABLED
diff --git a/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h b/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h
new file mode 100644
index 0000000..f6d55b8
--- /dev/null
+++ b/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h
@@ -0,0 +1,109 @@
+/**
+ * @file llmediaimplgstreamervidplug.h
+ * @brief Video-consuming static GStreamer plugin for gst-to-LLMediaImpl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewergpl$
+ *
+ * Copyright (c) 2007-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef __GST_SLVIDEO_H__
+#define __GST_SLVIDEO_H__
+
+#if LL_GSTREAMER010_ENABLED
+
+extern "C" {
+#include
+#include
+#include
+}
+
+G_BEGIN_DECLS
+
+/* #defines don't like whitespacey bits */
+#define GST_TYPE_SLVIDEO \
+ (gst_slvideo_get_type())
+#define GST_SLVIDEO(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SLVIDEO,GstSLVideo))
+#define GST_SLVIDEO_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SLVIDEO,GstSLVideoClass))
+#define GST_IS_SLVIDEO(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SLVIDEO))
+#define GST_IS_SLVIDEO_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SLVIDEO))
+
+typedef struct _GstSLVideo GstSLVideo;
+typedef struct _GstSLVideoClass GstSLVideoClass;
+
+typedef enum {
+ SLV_PF_UNKNOWN = 0,
+ SLV_PF_RGBX = 1,
+ SLV_PF_BGRX = 2,
+ SLV__END = 3
+} SLVPixelFormat;
+const int SLVPixelFormatBytes[SLV__END] = {1, 4, 4};
+
+struct _GstSLVideo
+{
+ GstVideoSink video_sink;
+
+ GstCaps *caps;
+
+ int fps_n, fps_d;
+ int par_n, par_d;
+ int height, width;
+ SLVPixelFormat format;
+
+ // SHARED WITH APPLICATION:
+ // Access to the following should be protected by GST_OBJECT_LOCK() on
+ // the GstSLVideo object, and should be totally consistent upon UNLOCK
+ // (i.e. all written at once to reflect the current retained frame info
+ // when the retained frame is updated.)
+ bool retained_frame_ready; // new frame ready since flag last reset. (*TODO: could get the writer to wait on a semaphore instead of having the reader poll, potentially making dropped frames somewhat cheaper.)
+ unsigned char* retained_frame_data;
+ int retained_frame_allocbytes;
+ int retained_frame_width, retained_frame_height;
+ SLVPixelFormat retained_frame_format;
+ // sticky resize info
+ bool resize_forced;
+ int resize_try_width;
+ int resize_try_height;
+};
+
+struct _GstSLVideoClass
+{
+ GstVideoSinkClass parent_class;
+};
+
+GType gst_slvideo_get_type (void);
+
+void gst_slvideo_init_class (void);
+
+G_END_DECLS
+
+#endif // LL_GSTREAMER010_ENABLED
+
+#endif /* __GST_SLVIDEO_H__ */
diff --git a/linden/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp b/linden/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp
new file mode 100644
index 0000000..77b7c13
--- /dev/null
+++ b/linden/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp
@@ -0,0 +1,1202 @@
+/**
+ * @file media_plugin_gstreamer010.cpp
+ * @brief GStreamer-0.10 plugin for LLMedia API plugin system
+ *
+ * $LicenseInfo:firstyear=2007&license=viewergpl$
+ *
+ * Copyright (c) 2007-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "llgl.h"
+
+#include "llplugininstance.h"
+#include "llpluginmessage.h"
+#include "llpluginmessageclasses.h"
+#include "media_plugin_base.h"
+
+#if LL_GSTREAMER010_ENABLED
+
+extern "C" {
+#include
+}
+
+#include "llmediaimplgstreamer.h"
+#include "llmediaimplgstreamertriviallogging.h"
+
+#include "llmediaimplgstreamervidplug.h"
+
+#include "llmediaimplgstreamer_syms.h"
+
+//////////////////////////////////////////////////////////////////////////////
+//
+class MediaPluginGStreamer010 : public MediaPluginBase
+{
+public:
+ MediaPluginGStreamer010(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data);
+ ~MediaPluginGStreamer010();
+
+ /* virtual */ void receiveMessage(const char *message_string);
+
+ static bool startup();
+ static bool closedown();
+
+ gboolean processGSTEvents(GstBus *bus,
+ GstMessage *message);
+
+private:
+ std::string getVersion();
+ bool navigateTo( const std::string urlIn );
+ bool seek( double time_sec );
+ bool setVolume( float volume );
+
+ // misc
+ bool pause();
+ bool stop();
+ bool play(double rate);
+ bool getTimePos(double &sec_out);
+
+ static const double MIN_LOOP_SEC = 1.0F;
+
+ bool mIsLooping;
+
+ enum ECommand {
+ COMMAND_NONE,
+ COMMAND_STOP,
+ COMMAND_PLAY,
+ COMMAND_FAST_FORWARD,
+ COMMAND_FAST_REWIND,
+ COMMAND_PAUSE,
+ COMMAND_SEEK,
+ };
+ ECommand mCommand;
+
+private:
+ bool unload();
+ bool load();
+
+ bool update(int milliseconds);
+ void mouseDown( int x, int y );
+ void mouseUp( int x, int y );
+ void mouseMove( int x, int y );
+
+ bool sizeChanged();
+
+ static bool mDoneInit;
+
+ guint mBusWatchID;
+
+ float mVolume;
+
+ int mDepth;
+
+ // media natural size
+ int mNaturalWidth;
+ int mNaturalHeight;
+ int mNaturalRowbytes;
+ // previous media natural size so we can detect changes
+ int mPreviousNaturalWidth;
+ int mPreviousNaturalHeight;
+ // desired render size from host
+ int mWidth;
+ int mHeight;
+ // padded texture size we need to write into
+ int mTextureWidth;
+ int mTextureHeight;
+
+ int mTextureFormatPrimary;
+ int mTextureFormatType;
+
+ bool mSeekWanted;
+ double mSeekDestination;
+
+ // Very GStreamer-specific
+ GMainLoop *mPump; // event pump for this media
+ GstElement *mPlaybin;
+ GstSLVideo *mVideoSink;
+};
+
+//static
+bool MediaPluginGStreamer010::mDoneInit = false;
+
+MediaPluginGStreamer010::MediaPluginGStreamer010(
+ LLPluginInstance::sendMessageFunction host_send_func,
+ void *host_user_data ) :
+ MediaPluginBase(host_send_func, host_user_data),
+ mBusWatchID ( 0 ),
+ mNaturalRowbytes ( 4 ),
+ mTextureFormatPrimary ( GL_RGBA ),
+ mTextureFormatType ( GL_UNSIGNED_INT_8_8_8_8_REV ),
+ mSeekWanted(false),
+ mSeekDestination(0.0),
+ mPump ( NULL ),
+ mPlaybin ( NULL ),
+ mVideoSink ( NULL ),
+ mCommand ( COMMAND_NONE )
+{
+ std::ostringstream str;
+ INFOMSG("MediaPluginGStreamer010 constructor - my PID=%u", U32(getpid()));
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//#define LL_GST_REPORT_STATE_CHANGES
+#ifdef LL_GST_REPORT_STATE_CHANGES
+static char* get_gst_state_name(GstState state)
+{
+ switch (state) {
+ case GST_STATE_VOID_PENDING: return "VOID_PENDING";
+ case GST_STATE_NULL: return "NULL";
+ case GST_STATE_READY: return "READY";
+ case GST_STATE_PAUSED: return "PAUSED";
+ case GST_STATE_PLAYING: return "PLAYING";
+ }
+ return "(unknown)";
+}
+#endif // LL_GST_REPORT_STATE_CHANGES
+
+gboolean
+MediaPluginGStreamer010::processGSTEvents(GstBus *bus,
+ GstMessage *message)
+{
+ if (!message)
+ return TRUE; // shield against GStreamer bug
+
+ if (GST_MESSAGE_TYPE(message) != GST_MESSAGE_STATE_CHANGED &&
+ GST_MESSAGE_TYPE(message) != GST_MESSAGE_BUFFERING)
+ {
+ DEBUGMSG("Got GST message type: %s",
+ LLGST_MESSAGE_TYPE_NAME (message));
+ }
+ else
+ {
+ DEBUGMSG("Got GST message type: %s",
+ LLGST_MESSAGE_TYPE_NAME (message));
+ }
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_BUFFERING: {
+ // NEEDS GST 0.10.11+
+ if (llgst_message_parse_buffering)
+ {
+ gint percent = 0;
+ llgst_message_parse_buffering(message, &percent);
+ DEBUGMSG("GST buffering: %d%%", percent);
+ }
+ break;
+ }
+ case GST_MESSAGE_STATE_CHANGED: {
+ GstState old_state;
+ GstState new_state;
+ GstState pending_state;
+ llgst_message_parse_state_changed(message,
+ &old_state,
+ &new_state,
+ &pending_state);
+#ifdef LL_GST_REPORT_STATE_CHANGES
+ // not generally very useful, and rather spammy.
+ DEBUGMSG("state change (old,,pending): %s,<%s>,%s",
+ get_gst_state_name(old_state),
+ get_gst_state_name(new_state),
+ get_gst_state_name(pending_state));
+#endif // LL_GST_REPORT_STATE_CHANGES
+
+ switch (new_state) {
+ case GST_STATE_VOID_PENDING:
+ break;
+ case GST_STATE_NULL:
+ break;
+ case GST_STATE_READY:
+ setStatus(STATUS_LOADED);
+ break;
+ case GST_STATE_PAUSED:
+ setStatus(STATUS_PAUSED);
+ break;
+ case GST_STATE_PLAYING:
+ setStatus(STATUS_PLAYING);
+ break;
+ }
+ break;
+ }
+ case GST_MESSAGE_ERROR: {
+ GError *err = NULL;
+ gchar *debug = NULL;
+
+ llgst_message_parse_error (message, &err, &debug);
+ WARNMSG("GST error: %s", err?err->message:"(unknown)");
+ if (err)
+ g_error_free (err);
+ g_free (debug);
+
+ mCommand = COMMAND_STOP;
+
+ setStatus(STATUS_ERROR);
+
+ break;
+ }
+ case GST_MESSAGE_INFO: {
+ if (llgst_message_parse_info)
+ {
+ GError *err = NULL;
+ gchar *debug = NULL;
+
+ llgst_message_parse_info (message, &err, &debug);
+ INFOMSG("GST info: %s", err?err->message:"(unknown)");
+ if (err)
+ g_error_free (err);
+ g_free (debug);
+ }
+ break;
+ }
+ case GST_MESSAGE_WARNING: {
+ GError *err = NULL;
+ gchar *debug = NULL;
+
+ llgst_message_parse_warning (message, &err, &debug);
+ WARNMSG("GST warning: %s", err?err->message:"(unknown)");
+ if (err)
+ g_error_free (err);
+ g_free (debug);
+
+ break;
+ }
+ case GST_MESSAGE_EOS:
+ /* end-of-stream */
+ DEBUGMSG("GST end-of-stream.");
+ if (mIsLooping)
+ {
+ DEBUGMSG("looping media...");
+ double eos_pos_sec = 0.0F;
+ bool got_eos_position = getTimePos(eos_pos_sec);
+
+ if (got_eos_position && eos_pos_sec < MIN_LOOP_SEC)
+ {
+ // if we know that the movie is really short, don't
+ // loop it else it can easily become a time-hog
+ // because of GStreamer spin-up overhead
+ DEBUGMSG("really short movie (%0.3fsec) - not gonna loop this, pausing instead.", eos_pos_sec);
+ // inject a COMMAND_PAUSE
+ mCommand = COMMAND_PAUSE;
+ }
+ else
+ {
+#undef LLGST_LOOP_BY_SEEKING
+// loop with a stop-start instead of a seek, because it actually seems rather
+// faster than seeking on remote streams.
+#ifdef LLGST_LOOP_BY_SEEKING
+ // first, try looping by an explicit rewind
+ bool seeksuccess = seek(0.0);
+ if (seeksuccess)
+ {
+ play(1.0);
+ }
+ else
+#endif // LLGST_LOOP_BY_SEEKING
+ { // use clumsy stop-start to loop
+ DEBUGMSG("didn't loop by rewinding - stopping and starting instead...");
+ stop();
+ play(1.0);
+ }
+ }
+ }
+ else // not a looping media
+ {
+ // inject a COMMAND_STOP
+ mCommand = COMMAND_STOP;
+ }
+ break;
+ default:
+ /* unhandled message */
+ break;
+ }
+
+ /* we want to be notified again the next time there is a message
+ * on the bus, so return true (false means we want to stop watching
+ * for messages on the bus and our callback should not be called again)
+ */
+ return TRUE;
+}
+
+extern "C" {
+gboolean
+llmediaimplgstreamer_bus_callback (GstBus *bus,
+ GstMessage *message,
+ gpointer data)
+{
+ MediaPluginGStreamer010 *impl = (MediaPluginGStreamer010*)data;
+ return impl->processGSTEvents(bus, message);
+}
+} // extern "C"
+
+
+
+bool
+MediaPluginGStreamer010::navigateTo ( const std::string urlIn )
+{
+ if (!mDoneInit)
+ return false; // error
+
+ setStatus(STATUS_LOADING);
+
+ DEBUGMSG("Setting media URI: %s", urlIn.c_str());
+
+ mSeekWanted = false;
+
+ if (NULL == mPump ||
+ NULL == mPlaybin)
+ {
+ setStatus(STATUS_ERROR);
+ return false; // error
+ }
+
+ // set URI
+ g_object_set (G_OBJECT (mPlaybin), "uri", urlIn.c_str(), NULL);
+ //g_object_set (G_OBJECT (mPlaybin), "uri", "file:///tmp/movie", NULL);
+
+ // navigateTo implicitly plays, too.
+ play(1.0);
+
+ return true;
+}
+
+
+bool
+MediaPluginGStreamer010::update(int milliseconds)
+{
+ if (!mDoneInit)
+ return false; // error
+
+ DEBUGMSG("updating media...");
+
+ // sanity check
+ if (NULL == mPump ||
+ NULL == mPlaybin)
+ {
+ DEBUGMSG("dead media...");
+ return false;
+ }
+
+ // see if there's an outstanding seek wanted
+ if (mSeekWanted &&
+ // bleh, GST has to be happy that the movie is really truly playing
+ // or it may quietly ignore the seek (with rtsp:// at least).
+ (GST_STATE(mPlaybin) == GST_STATE_PLAYING))
+ {
+ seek(mSeekDestination);
+ mSeekWanted = false;
+ }
+
+ // *TODO: time-limit - but there isn't a lot we can do here, most
+ // time is spent in gstreamer's own opaque worker-threads. maybe
+ // we can do something sneaky like only unlock the video object
+ // for 'milliseconds' and otherwise hold the lock.
+ while (g_main_context_pending(g_main_loop_get_context(mPump)))
+ {
+ g_main_context_iteration(g_main_loop_get_context(mPump), FALSE);
+ }
+
+ // check for availability of a new frame
+
+ if (mVideoSink)
+ {
+ GST_OBJECT_LOCK(mVideoSink);
+ if (mVideoSink->retained_frame_ready)
+ {
+ DEBUGMSG("NEW FRAME READY");
+
+ if (mVideoSink->retained_frame_width != mNaturalWidth ||
+ mVideoSink->retained_frame_height != mNaturalHeight)
+ // *TODO: also check for change in format
+ {
+ // just resize container, don't consume frame
+ int neww = mVideoSink->retained_frame_width;
+ int newh = mVideoSink->retained_frame_height;
+
+ int newd = 4;
+ mTextureFormatPrimary = GL_RGBA;
+ mTextureFormatType = GL_UNSIGNED_INT_8_8_8_8_REV;
+
+ /*
+ int newd = SLVPixelFormatBytes[mVideoSink->retained_frame_format];
+ if (SLV_PF_BGRX == mVideoSink->retained_frame_format)
+ {
+ mTextureFormatPrimary = GL_BGRA;
+ mTextureFormatType = GL_UNSIGNED_INT_8_8_8_8_REV;
+ }
+ else
+ {
+ mTextureFormatPrimary = GL_RGBA;
+ mTextureFormatType = GL_UNSIGNED_INT_8_8_8_8_REV;
+ }
+ */
+
+ GST_OBJECT_UNLOCK(mVideoSink);
+
+ mNaturalRowbytes = neww * newd;
+ DEBUGMSG("video container resized to %dx%d",
+ neww, newh);
+
+ mDepth = newd;
+ mNaturalWidth = neww;
+ mNaturalHeight = newh;
+ sizeChanged();
+ return true;
+ }
+
+ if (mPixels &&
+ mNaturalHeight <= mHeight &&
+ mNaturalWidth <= mWidth &&
+ !mTextureSegmentName.empty())
+ {
+
+ // we're gonna totally consume this frame - reset 'ready' flag
+ mVideoSink->retained_frame_ready = FALSE;
+ int destination_rowbytes = mWidth * mDepth;
+ for (int row=0; rowretained_frame_data
+ [mNaturalRowbytes * row],
+ mNaturalRowbytes);
+ }
+
+ GST_OBJECT_UNLOCK(mVideoSink);
+ DEBUGMSG("NEW FRAME REALLY TRULY CONSUMED, TELLING HOST");
+
+ setDirty(0,0,mNaturalWidth,mNaturalHeight);
+ }
+ else
+ {
+ // new frame ready, but we're not ready to
+ // consume it.
+
+ GST_OBJECT_UNLOCK(mVideoSink);
+
+ DEBUGMSG("NEW FRAME not consumed, still waiting for a shm segment and/or shm resize");
+ }
+
+ return true;
+ }
+ else
+ {
+ // nothing to do yet.
+ GST_OBJECT_UNLOCK(mVideoSink);
+ return true;
+ }
+ }
+
+ return true;
+}
+
+
+void
+MediaPluginGStreamer010::mouseDown( int x, int y )
+{
+ // do nothing
+}
+
+void
+MediaPluginGStreamer010::mouseUp( int x, int y )
+{
+ // do nothing
+}
+
+void
+MediaPluginGStreamer010::mouseMove( int x, int y )
+{
+ // do nothing
+}
+
+
+bool
+MediaPluginGStreamer010::pause()
+{
+ DEBUGMSG("pausing media...");
+ // todo: error-check this?
+ llgst_element_set_state(mPlaybin, GST_STATE_PAUSED);
+ return true;
+}
+
+bool
+MediaPluginGStreamer010::stop()
+{
+ DEBUGMSG("stopping media...");
+ // todo: error-check this?
+ llgst_element_set_state(mPlaybin, GST_STATE_READY);
+ return true;
+}
+
+bool
+MediaPluginGStreamer010::play(double rate)
+{
+ // NOTE: we don't actually support non-natural rate.
+
+ DEBUGMSG("playing media... rate=%f", rate);
+ // todo: error-check this?
+ llgst_element_set_state(mPlaybin, GST_STATE_PLAYING);
+ return true;
+}
+
+bool
+MediaPluginGStreamer010::setVolume( float volume )
+{
+ // we try to only update volume as conservatively as
+ // possible, as many gst-plugins-base versions up to at least
+ // November 2008 have critical race-conditions in setting volume - sigh
+ if (mVolume == volume)
+ return true; // nothing to do, everything's fine
+
+ mVolume = volume;
+ if (mDoneInit && mPlaybin)
+ {
+ g_object_set(mPlaybin, "volume", mVolume, NULL);
+ return true;
+ }
+
+ return false;
+}
+
+bool
+MediaPluginGStreamer010::seek(double time_sec)
+{
+ bool success = false;
+ if (mDoneInit && mPlaybin)
+ {
+ success = llgst_element_seek(mPlaybin, 1.0F, GST_FORMAT_TIME,
+ GstSeekFlags(GST_SEEK_FLAG_FLUSH |
+ GST_SEEK_FLAG_KEY_UNIT),
+ GST_SEEK_TYPE_SET, gint64(time_sec*GST_SECOND),
+ GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
+ }
+ DEBUGMSG("MEDIA SEEK REQUEST to %fsec result was %d",
+ float(time_sec), int(success));
+ return success;
+}
+
+bool
+MediaPluginGStreamer010::getTimePos(double &sec_out)
+{
+ bool got_position = false;
+ if (mPlaybin)
+ {
+ gint64 pos;
+ GstFormat timefmt = GST_FORMAT_TIME;
+ got_position =
+ llgst_element_query_position &&
+ llgst_element_query_position(mPlaybin,
+ &timefmt,
+ &pos);
+ got_position = got_position
+ && (timefmt == GST_FORMAT_TIME);
+ // GStreamer may have other ideas, but we consider the current position
+ // undefined if not PLAYING or PAUSED
+ got_position = got_position &&
+ (GST_STATE(mPlaybin) == GST_STATE_PLAYING ||
+ GST_STATE(mPlaybin) == GST_STATE_PAUSED);
+ if (got_position && !GST_CLOCK_TIME_IS_VALID(pos))
+ {
+ if (GST_STATE(mPlaybin) == GST_STATE_PLAYING)
+ {
+ // if we're playing then we treat an invalid clock time
+ // as 0, for complicated reasons (insert reason here)
+ pos = 0;
+ }
+ else
+ {
+ got_position = false;
+ }
+
+ }
+ // If all the preconditions succeeded... we can trust the result.
+ if (got_position)
+ {
+ sec_out = double(pos) / double(GST_SECOND); // gst to sec
+ }
+ }
+ return got_position;
+}
+
+bool
+MediaPluginGStreamer010::load()
+{
+ if (!mDoneInit)
+ return false; // error
+
+ setStatus(STATUS_LOADING);
+
+ DEBUGMSG("setting up media...");
+
+ mIsLooping = false;
+ mVolume = 0.1234567; // minor hack to force an initial volume update
+
+ // Create a pumpable main-loop for this media
+ mPump = g_main_loop_new (NULL, FALSE);
+ if (!mPump)
+ {
+ setStatus(STATUS_ERROR);
+ return false; // error
+ }
+
+ // instantiate a playbin element to do the hard work
+ mPlaybin = llgst_element_factory_make ("playbin", "play");
+ if (!mPlaybin)
+ {
+ setStatus(STATUS_ERROR);
+ return false; // error
+ }
+
+ // get playbin's bus
+ GstBus *bus = llgst_pipeline_get_bus (GST_PIPELINE (mPlaybin));
+ if (!bus)
+ {
+ setStatus(STATUS_ERROR);
+ return false; // error
+ }
+ mBusWatchID = llgst_bus_add_watch (bus,
+ llmediaimplgstreamer_bus_callback,
+ this);
+ llgst_object_unref (bus);
+
+ if (NULL == getenv("LL_GSTREAMER_EXTERNAL")) {
+ // instantiate a custom video sink
+ mVideoSink =
+ GST_SLVIDEO(llgst_element_factory_make ("private-slvideo", "slvideo"));
+ if (!mVideoSink)
+ {
+ WARNMSG("Could not instantiate private-slvideo element.");
+ // todo: cleanup.
+ setStatus(STATUS_ERROR);
+ return false; // error
+ }
+
+ // connect the pieces
+ g_object_set(mPlaybin, "video-sink", mVideoSink, NULL);
+ }
+
+ return true;
+}
+
+bool
+MediaPluginGStreamer010::unload ()
+{
+ if (!mDoneInit)
+ return false; // error
+
+ DEBUGMSG("unloading media...");
+
+ // stop getting callbacks for this bus
+ g_source_remove(mBusWatchID);
+ mBusWatchID = 0;
+
+ if (mPlaybin)
+ {
+ llgst_element_set_state (mPlaybin, GST_STATE_NULL);
+ llgst_object_unref (GST_OBJECT (mPlaybin));
+ mPlaybin = NULL;
+ }
+
+ if (mPump)
+ {
+ g_main_loop_quit(mPump);
+ mPump = NULL;
+ }
+
+ mVideoSink = NULL;
+
+ setStatus(STATUS_NONE);
+
+ return true;
+}
+
+
+//static
+bool
+MediaPluginGStreamer010::startup()
+{
+ // first - check if GStreamer is explicitly disabled
+ if (NULL != getenv("LL_DISABLE_GSTREAMER"))
+ return false;
+
+ // only do global GStreamer initialization once.
+ if (!mDoneInit)
+ {
+ g_thread_init(NULL);
+
+ // Init the glib type system - we need it.
+ g_type_init();
+
+ // Get symbols!
+#if LL_DARWIN
+ if (! grab_gst_syms("libgstreamer-0.10.dylib",
+ "libgstvideo-0.10.dylib") )
+#elseif LL_WINDOWS
+ if (! grab_gst_syms("libgstreamer-0.10.dll",
+ "libgstvideo-0.10.dll") )
+#else // linux or other ELFy unixoid
+ if (! grab_gst_syms("libgstreamer-0.10.so.0",
+ "libgstvideo-0.10.so.0") )
+#endif
+ {
+ WARNMSG("Couldn't find suitable GStreamer 0.10 support on this system - video playback disabled.");
+ return false;
+ }
+
+ if (llgst_segtrap_set_enabled)
+ {
+ llgst_segtrap_set_enabled(FALSE);
+ }
+ else
+ {
+ WARNMSG("gst_segtrap_set_enabled() is not available; plugin crashes won't be caught.");
+ }
+
+#if LL_LINUX
+ // Gstreamer tries a fork during init, waitpid-ing on it,
+ // which conflicts with any installed SIGCHLD handler...
+ struct sigaction tmpact, oldact;
+ if (llgst_registry_fork_set_enabled) {
+ // if we can disable SIGCHLD-using forking behaviour,
+ // do it.
+ llgst_registry_fork_set_enabled(false);
+ }
+ else {
+ // else temporarily install default SIGCHLD handler
+ // while GStreamer initialises
+ tmpact.sa_handler = SIG_DFL;
+ sigemptyset( &tmpact.sa_mask );
+ tmpact.sa_flags = SA_SIGINFO;
+ sigaction(SIGCHLD, &tmpact, &oldact);
+ }
+#endif // LL_LINUX
+
+ // Protect against GStreamer resetting the locale, yuck.
+ static std::string saved_locale;
+ saved_locale = setlocale(LC_ALL, NULL);
+
+ // finally, try to initialize GStreamer!
+ GError *err = NULL;
+ gboolean init_gst_success = llgst_init_check(NULL, NULL, &err);
+
+ // restore old locale
+ setlocale(LC_ALL, saved_locale.c_str() );
+
+#if LL_LINUX
+ // restore old SIGCHLD handler
+ if (!llgst_registry_fork_set_enabled)
+ sigaction(SIGCHLD, &oldact, NULL);
+#endif // LL_LINUX
+
+ if (!init_gst_success) // fail
+ {
+ if (err)
+ {
+ WARNMSG("GST init failed: %s", err->message);
+ g_error_free(err);
+ }
+ else
+ {
+ WARNMSG("GST init failed for unspecified reason.");
+ }
+ return false;
+ }
+
+ // Init our custom plugins - only really need do this once.
+ gst_slvideo_init_class();
+
+ mDoneInit = true;
+ }
+
+ return true;
+}
+
+
+bool
+MediaPluginGStreamer010::sizeChanged()
+{
+ // the shared writing space has possibly changed size/location/whatever
+
+ // Check to see whether the movie's natural size has updated
+ if (mNaturalWidth != mPreviousNaturalWidth ||
+ mNaturalHeight != mPreviousNaturalHeight)
+ {
+ mPreviousNaturalWidth = mNaturalWidth;
+ mPreviousNaturalHeight = mNaturalHeight;
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_request");
+ message.setValue("name", mTextureSegmentName);
+ message.setValueS32("width", mNaturalWidth);
+ message.setValueS32("height", mNaturalHeight);
+ DEBUGMSG("<--- Sending size change request to application with name: '%s' - size is %d x %d", mTextureSegmentName.c_str(), mNaturalWidth, mNaturalHeight);
+ sendMessage(message);
+ }
+
+ return true;
+}
+
+
+
+//static
+bool
+MediaPluginGStreamer010::closedown()
+{
+ if (!mDoneInit)
+ return false; // error
+
+ ungrab_gst_syms();
+
+ mDoneInit = false;
+
+ return true;
+}
+
+MediaPluginGStreamer010::~MediaPluginGStreamer010()
+{
+ DEBUGMSG("MediaPluginGStreamer010 destructor");
+
+ closedown();
+
+ DEBUGMSG("GStreamer010 closing down");
+}
+
+
+std::string
+MediaPluginGStreamer010::getVersion()
+{
+ std::string plugin_version = "GStreamer010 media plugin, GStreamer version ";
+ if (mDoneInit &&
+ llgst_version)
+ {
+ guint major, minor, micro, nano;
+ llgst_version(&major, &minor, µ, &nano);
+ plugin_version += llformat("%u.%u.%u.%u (runtime), %u.%u.%u.%u (headers)", (unsigned int)major, (unsigned int)minor, (unsigned int)micro, (unsigned int)nano, (unsigned int)GST_VERSION_MAJOR, (unsigned int)GST_VERSION_MINOR, (unsigned int)GST_VERSION_MICRO, (unsigned int)GST_VERSION_NANO);
+ }
+ else
+ {
+ plugin_version += "(unknown)";
+ }
+ return plugin_version;
+}
+
+void MediaPluginGStreamer010::receiveMessage(const char *message_string)
+{
+ //std::cerr << "MediaPluginGStreamer010::receiveMessage: received message: \"" << message_string << "\"" << std::endl;
+
+ LLPluginMessage message_in;
+
+ if(message_in.parse(message_string) >= 0)
+ {
+ std::string message_class = message_in.getClass();
+ std::string message_name = message_in.getName();
+ if(message_class == LLPLUGIN_MESSAGE_CLASS_BASE)
+ {
+ if(message_name == "init")
+ {
+ LLPluginMessage message("base", "init_response");
+ LLSD versions = LLSD::emptyMap();
+ versions[LLPLUGIN_MESSAGE_CLASS_BASE] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION;
+ versions[LLPLUGIN_MESSAGE_CLASS_MEDIA] = LLPLUGIN_MESSAGE_CLASS_MEDIA_VERSION;
+ versions[LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME] = LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME_VERSION;
+ message.setValueLLSD("versions", versions);
+
+ if ( load() )
+ {
+ DEBUGMSG("GStreamer010 media instance set up");
+ }
+ else
+ {
+ WARNMSG("GStreamer010 media instance failed to set up");
+ }
+
+ message.setValue("plugin_version", getVersion());
+ sendMessage(message);
+
+ // Plugin gets to decide the texture parameters to use.
+ message.setMessage(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params");
+ // lame to have to decide this now, it depends on the movie. Oh well.
+ mDepth = 4;
+
+ mNaturalWidth = 1;
+ mNaturalHeight = 1;
+ mPreviousNaturalWidth = 1;
+ mPreviousNaturalHeight = 1;
+ mWidth = 1;
+ mHeight = 1;
+ mTextureWidth = 1;
+ mTextureHeight = 1;
+
+ message.setValueU32("format", GL_RGBA);
+ message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8_REV);
+
+ message.setValueS32("depth", mDepth);
+ message.setValueS32("default_width", mWidth);
+ message.setValueS32("default_height", mHeight);
+ message.setValueU32("internalformat", GL_RGBA8);
+ message.setValueBoolean("coords_opengl", true); // true == use OpenGL-style coordinates, false == (0,0) is upper left.
+ message.setValueBoolean("allow_downsample", true); // we respond with grace and performance if asked to downscale
+ sendMessage(message);
+ }
+ else if(message_name == "idle")
+ {
+ // no response is necessary here.
+ double time = message_in.getValueReal("time");
+
+ // Convert time to milliseconds for update()
+ update((int)(time * 1000.0f));
+ }
+ else if(message_name == "cleanup")
+ {
+ unload();
+ closedown();
+ }
+ else if(message_name == "shm_added")
+ {
+ SharedSegmentInfo info;
+ info.mAddress = message_in.getValuePointer("address");
+ info.mSize = (size_t)message_in.getValueS32("size");
+ std::string name = message_in.getValue("name");
+
+ std::ostringstream str;
+ INFOMSG("MediaPluginGStreamer010::receiveMessage: shared memory added, name: %s, size: %d, address: %p", name.c_str(), int(info.mSize), info.mAddress);
+
+ mSharedSegments.insert(SharedSegmentMap::value_type(name, info));
+
+ }
+ else if(message_name == "shm_remove")
+ {
+ std::string name = message_in.getValue("name");
+
+ DEBUGMSG("MediaPluginGStreamer010::receiveMessage: shared memory remove, name = %s", name.c_str());
+
+ SharedSegmentMap::iterator iter = mSharedSegments.find(name);
+ if(iter != mSharedSegments.end())
+ {
+ if(mPixels == iter->second.mAddress)
+ {
+ // This is the currently active pixel buffer. Make sure we stop drawing to it.
+ mPixels = NULL;
+ mTextureSegmentName.clear();
+
+ // Make sure the movie decoder is no longer pointed at the shared segment.
+ sizeChanged();
+ }
+ mSharedSegments.erase(iter);
+ }
+ else
+ {
+ WARNMSG("MediaPluginGStreamer010::receiveMessage: unknown shared memory region!");
+ }
+
+ // Send the response so it can be cleaned up.
+ LLPluginMessage message("base", "shm_remove_response");
+ message.setValue("name", name);
+ sendMessage(message);
+ }
+ else
+ {
+ std::ostringstream str;
+ INFOMSG("MediaPluginGStreamer010::receiveMessage: unknown base message: %s", message_name.c_str());
+ }
+ }
+ else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA)
+ {
+ if(message_name == "size_change")
+ {
+ std::string name = message_in.getValue("name");
+ S32 width = message_in.getValueS32("width");
+ S32 height = message_in.getValueS32("height");
+ S32 texture_width = message_in.getValueS32("texture_width");
+ S32 texture_height = message_in.getValueS32("texture_height");
+
+ std::ostringstream str;
+ INFOMSG("---->Got size change instruction from application with shm name: %s - size is %d x %d", name.c_str(), width, height);
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_response");
+ message.setValue("name", name);
+ message.setValueS32("width", width);
+ message.setValueS32("height", height);
+ message.setValueS32("texture_width", texture_width);
+ message.setValueS32("texture_height", texture_height);
+ sendMessage(message);
+
+ if(!name.empty())
+ {
+ // Find the shared memory region with this name
+ SharedSegmentMap::iterator iter = mSharedSegments.find(name);
+ if(iter != mSharedSegments.end())
+ {
+ INFOMSG("*** Got size change with matching shm, new size is %d x %d", width, height);
+ INFOMSG("*** Got size change with matching shm, texture size size is %d x %d", texture_width, texture_height);
+
+ mPixels = (unsigned char*)iter->second.mAddress;
+ mTextureSegmentName = name;
+ mWidth = width;
+ mHeight = height;
+
+ if (texture_width > 1 ||
+ texture_height > 1) // not a dummy size from the app, a real explicit forced size
+ {
+ INFOMSG("**** = REAL RESIZE REQUEST FROM APP");
+
+ GST_OBJECT_LOCK(mVideoSink);
+ mVideoSink->resize_forced = true;
+ mVideoSink->resize_try_width = texture_width;
+ mVideoSink->resize_try_height = texture_height;
+ GST_OBJECT_UNLOCK(mVideoSink);
+ }
+
+ mTextureWidth = texture_width;
+ mTextureHeight = texture_height;
+ }
+ }
+ }
+ else if(message_name == "load_uri")
+ {
+ std::string uri = message_in.getValue("uri");
+ navigateTo( uri );
+ sendStatus();
+ }
+ else if(message_name == "mouse_event")
+ {
+ std::string event = message_in.getValue("event");
+ S32 x = message_in.getValueS32("x");
+ S32 y = message_in.getValueS32("y");
+
+ if(event == "down")
+ {
+ mouseDown(x, y);
+ }
+ else if(event == "up")
+ {
+ mouseUp(x, y);
+ }
+ else if(event == "move")
+ {
+ mouseMove(x, y);
+ };
+ };
+ }
+ else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME)
+ {
+ if(message_name == "stop")
+ {
+ stop();
+ }
+ else if(message_name == "start")
+ {
+ double rate = 0.0;
+ if(message_in.hasValue("rate"))
+ {
+ rate = message_in.getValueReal("rate");
+ }
+ // NOTE: we don't actually support rate.
+ play(rate);
+ }
+ else if(message_name == "pause")
+ {
+ pause();
+ }
+ else if(message_name == "seek")
+ {
+ double time = message_in.getValueReal("time");
+ // defer the actual seek in case we haven't
+ // really truly started yet in which case there
+ // is nothing to seek upon
+ mSeekWanted = true;
+ mSeekDestination = time;
+ }
+ else if(message_name == "set_loop")
+ {
+ bool loop = message_in.getValueBoolean("loop");
+ mIsLooping = loop;
+ }
+ else if(message_name == "set_volume")
+ {
+ double volume = message_in.getValueReal("volume");
+ setVolume(volume);
+ }
+ }
+ else
+ {
+ INFOMSG("MediaPluginGStreamer010::receiveMessage: unknown message class: %s", message_class.c_str());
+ }
+ }
+}
+
+int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data)
+{
+ if (MediaPluginGStreamer010::startup())
+ {
+ MediaPluginGStreamer010 *self = new MediaPluginGStreamer010(host_send_func, host_user_data);
+ *plugin_send_func = MediaPluginGStreamer010::staticReceiveMessage;
+ *plugin_user_data = (void*)self;
+
+ return 0; // okay
+ }
+ else
+ {
+ return -1; // failed to init
+ }
+}
+
+#else // LL_GSTREAMER010_ENABLED
+
+// Stubbed-out class with constructor/destructor (necessary or windows linker
+// will just think its dead code and optimize it all out)
+class MediaPluginGStreamer010 : public MediaPluginBase
+{
+public:
+ MediaPluginGStreamer010(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data);
+ ~MediaPluginGStreamer010();
+ /* virtual */ void receiveMessage(const char *message_string);
+};
+
+MediaPluginGStreamer010::MediaPluginGStreamer010(
+ LLPluginInstance::sendMessageFunction host_send_func,
+ void *host_user_data ) :
+ MediaPluginBase(host_send_func, host_user_data)
+{
+ // no-op
+}
+
+MediaPluginGStreamer010::~MediaPluginGStreamer010()
+{
+ // no-op
+}
+
+void MediaPluginGStreamer010::receiveMessage(const char *message_string)
+{
+ // no-op
+}
+
+// We're building without GStreamer enabled. Just refuse to initialize.
+int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data)
+{
+ return -1;
+}
+
+#endif // LL_GSTREAMER010_ENABLED
diff --git a/linden/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp~ b/linden/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp~
new file mode 100755
index 0000000..7d34a1e
--- /dev/null
+++ b/linden/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp~
@@ -0,0 +1,1219 @@
+/**
+ * @file media_plugin_gstreamer010.cpp
+ * @brief GStreamer-0.10 plugin for LLMedia API plugin system
+ *
+ * @cond
+ * $LicenseInfo:firstyear=2007&license=viewergpl$
+ *
+ * Copyright (c) 2007-2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlife.com/developers/opensource/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ *
+ * @endcond
+ */
+
+#include "linden_common.h"
+
+#include "llgl.h"
+
+#include "llplugininstance.h"
+#include "llpluginmessage.h"
+#include "llpluginmessageclasses.h"
+#include "media_plugin_base.h"
+
+#if LL_GSTREAMER010_ENABLED
+
+extern "C" {
+#include
+}
+
+#include "llmediaimplgstreamer.h"
+#include "llmediaimplgstreamertriviallogging.h"
+
+#include "llmediaimplgstreamervidplug.h"
+
+#include "llmediaimplgstreamer_syms.h"
+
+//////////////////////////////////////////////////////////////////////////////
+//
+class MediaPluginGStreamer010 : public MediaPluginBase
+{
+public:
+ MediaPluginGStreamer010(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data);
+ ~MediaPluginGStreamer010();
+
+ /* virtual */ void receiveMessage(const char *message_string);
+
+ static bool startup();
+ static bool closedown();
+
+ gboolean processGSTEvents(GstBus *bus,
+ GstMessage *message);
+
+private:
+ std::string getVersion();
+ bool navigateTo( const std::string urlIn );
+ bool seek( double time_sec );
+ bool setVolume( float volume );
+
+ // misc
+ bool pause();
+ bool stop();
+ bool play(double rate);
+ bool getTimePos(double &sec_out);
+
+ static const double MIN_LOOP_SEC = 1.0F;
+
+ bool mIsLooping;
+
+ enum ECommand {
+ COMMAND_NONE,
+ COMMAND_STOP,
+ COMMAND_PLAY,
+ COMMAND_FAST_FORWARD,
+ COMMAND_FAST_REWIND,
+ COMMAND_PAUSE,
+ COMMAND_SEEK,
+ };
+ ECommand mCommand;
+
+private:
+ bool unload();
+ bool load();
+
+ bool update(int milliseconds);
+ void mouseDown( int x, int y );
+ void mouseUp( int x, int y );
+ void mouseMove( int x, int y );
+
+ void sizeChanged();
+
+ static bool mDoneInit;
+
+ guint mBusWatchID;
+
+ float mVolume;
+
+ int mDepth;
+
+ // media NATURAL size
+ int mNaturalWidth;
+ int mNaturalHeight;
+ // media current size
+ int mCurrentWidth;
+ int mCurrentHeight;
+ int mCurrentRowbytes;
+ // previous media size so we can detect changes
+ int mPreviousWidth;
+ int mPreviousHeight;
+ // desired render size from host
+ int mWidth;
+ int mHeight;
+ // padded texture size we need to write into
+ int mTextureWidth;
+ int mTextureHeight;
+
+ int mTextureFormatPrimary;
+ int mTextureFormatType;
+
+ bool mSeekWanted;
+ double mSeekDestination;
+
+ // Very GStreamer-specific
+ GMainLoop *mPump; // event pump for this media
+ GstElement *mPlaybin;
+ GstSLVideo *mVideoSink;
+};
+
+//static
+bool MediaPluginGStreamer010::mDoneInit = false;
+
+MediaPluginGStreamer010::MediaPluginGStreamer010(
+ LLPluginInstance::sendMessageFunction host_send_func,
+ void *host_user_data ) :
+ MediaPluginBase(host_send_func, host_user_data),
+ mBusWatchID ( 0 ),
+ mCurrentRowbytes ( 4 ),
+ mTextureFormatPrimary ( GL_RGBA ),
+ mTextureFormatType ( GL_UNSIGNED_INT_8_8_8_8_REV ),
+ mSeekWanted(false),
+ mSeekDestination(0.0),
+ mPump ( NULL ),
+ mPlaybin ( NULL ),
+ mVideoSink ( NULL ),
+ mCommand ( COMMAND_NONE )
+{
+ std::ostringstream str;
+ INFOMSG("MediaPluginGStreamer010 constructor - my PID=%u", U32(getpid()));
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//#define LL_GST_REPORT_STATE_CHANGES
+#ifdef LL_GST_REPORT_STATE_CHANGES
+static char* get_gst_state_name(GstState state)
+{
+ switch (state) {
+ case GST_STATE_VOID_PENDING: return "VOID_PENDING";
+ case GST_STATE_NULL: return "NULL";
+ case GST_STATE_READY: return "READY";
+ case GST_STATE_PAUSED: return "PAUSED";
+ case GST_STATE_PLAYING: return "PLAYING";
+ }
+ return "(unknown)";
+}
+#endif // LL_GST_REPORT_STATE_CHANGES
+
+gboolean
+MediaPluginGStreamer010::processGSTEvents(GstBus *bus,
+ GstMessage *message)
+{
+ if (!message)
+ return TRUE; // shield against GStreamer bug
+
+ if (GST_MESSAGE_TYPE(message) != GST_MESSAGE_STATE_CHANGED &&
+ GST_MESSAGE_TYPE(message) != GST_MESSAGE_BUFFERING)
+ {
+ DEBUGMSG("Got GST message type: %s",
+ LLGST_MESSAGE_TYPE_NAME (message));
+ }
+ else
+ {
+ // TODO: grok 'duration' message type
+ DEBUGMSG("Got GST message type: %s",
+ LLGST_MESSAGE_TYPE_NAME (message));
+ }
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_BUFFERING: {
+ // NEEDS GST 0.10.11+
+ if (llgst_message_parse_buffering)
+ {
+ gint percent = 0;
+ llgst_message_parse_buffering(message, &percent);
+ DEBUGMSG("GST buffering: %d%%", percent);
+ }
+ break;
+ }
+ case GST_MESSAGE_STATE_CHANGED: {
+ GstState old_state;
+ GstState new_state;
+ GstState pending_state;
+ llgst_message_parse_state_changed(message,
+ &old_state,
+ &new_state,
+ &pending_state);
+#ifdef LL_GST_REPORT_STATE_CHANGES
+ // not generally very useful, and rather spammy.
+ DEBUGMSG("state change (old,,pending): %s,<%s>,%s",
+ get_gst_state_name(old_state),
+ get_gst_state_name(new_state),
+ get_gst_state_name(pending_state));
+#endif // LL_GST_REPORT_STATE_CHANGES
+
+ switch (new_state) {
+ case GST_STATE_VOID_PENDING:
+ break;
+ case GST_STATE_NULL:
+ break;
+ case GST_STATE_READY:
+ setStatus(STATUS_LOADED);
+ break;
+ case GST_STATE_PAUSED:
+ setStatus(STATUS_PAUSED);
+ break;
+ case GST_STATE_PLAYING:
+ setStatus(STATUS_PLAYING);
+ break;
+ }
+ break;
+ }
+ case GST_MESSAGE_ERROR: {
+ GError *err = NULL;
+ gchar *debug = NULL;
+
+ llgst_message_parse_error (message, &err, &debug);
+ WARNMSG("GST error: %s", err?err->message:"(unknown)");
+ if (err)
+ g_error_free (err);
+ g_free (debug);
+
+ mCommand = COMMAND_STOP;
+
+ setStatus(STATUS_ERROR);
+
+ break;
+ }
+ case GST_MESSAGE_INFO: {
+ if (llgst_message_parse_info)
+ {
+ GError *err = NULL;
+ gchar *debug = NULL;
+
+ llgst_message_parse_info (message, &err, &debug);
+ INFOMSG("GST info: %s", err?err->message:"(unknown)");
+ if (err)
+ g_error_free (err);
+ g_free (debug);
+ }
+ break;
+ }
+ case GST_MESSAGE_WARNING: {
+ GError *err = NULL;
+ gchar *debug = NULL;
+
+ llgst_message_parse_warning (message, &err, &debug);
+ WARNMSG("GST warning: %s", err?err->message:"(unknown)");
+ if (err)
+ g_error_free (err);
+ g_free (debug);
+
+ break;
+ }
+ case GST_MESSAGE_EOS:
+ /* end-of-stream */
+ DEBUGMSG("GST end-of-stream.");
+ if (mIsLooping)
+ {
+ DEBUGMSG("looping media...");
+ double eos_pos_sec = 0.0F;
+ bool got_eos_position = getTimePos(eos_pos_sec);
+
+ if (got_eos_position && eos_pos_sec < MIN_LOOP_SEC)
+ {
+ // if we know that the movie is really short, don't
+ // loop it else it can easily become a time-hog
+ // because of GStreamer spin-up overhead
+ DEBUGMSG("really short movie (%0.3fsec) - not gonna loop this, pausing instead.", eos_pos_sec);
+ // inject a COMMAND_PAUSE
+ mCommand = COMMAND_PAUSE;
+ }
+ else
+ {
+#undef LLGST_LOOP_BY_SEEKING
+// loop with a stop-start instead of a seek, because it actually seems rather
+// faster than seeking on remote streams.
+#ifdef LLGST_LOOP_BY_SEEKING
+ // first, try looping by an explicit rewind
+ bool seeksuccess = seek(0.0);
+ if (seeksuccess)
+ {
+ play(1.0);
+ }
+ else
+#endif // LLGST_LOOP_BY_SEEKING
+ { // use clumsy stop-start to loop
+ DEBUGMSG("didn't loop by rewinding - stopping and starting instead...");
+ stop();
+ play(1.0);
+ }
+ }
+ }
+ else // not a looping media
+ {
+ // inject a COMMAND_STOP
+ mCommand = COMMAND_STOP;
+ }
+ break;
+ default:
+ /* unhandled message */
+ break;
+ }
+
+ /* we want to be notified again the next time there is a message
+ * on the bus, so return true (false means we want to stop watching
+ * for messages on the bus and our callback should not be called again)
+ */
+ return TRUE;
+}
+
+extern "C" {
+gboolean
+llmediaimplgstreamer_bus_callback (GstBus *bus,
+ GstMessage *message,
+ gpointer data)
+{
+ MediaPluginGStreamer010 *impl = (MediaPluginGStreamer010*)data;
+ return impl->processGSTEvents(bus, message);
+}
+} // extern "C"
+
+
+
+bool
+MediaPluginGStreamer010::navigateTo ( const std::string urlIn )
+{
+ if (!mDoneInit)
+ return false; // error
+
+ setStatus(STATUS_LOADING);
+
+ DEBUGMSG("Setting media URI: %s", urlIn.c_str());
+
+ mSeekWanted = false;
+
+ if (NULL == mPump ||
+ NULL == mPlaybin)
+ {
+ setStatus(STATUS_ERROR);
+ return false; // error
+ }
+
+ // set URI
+ g_object_set (G_OBJECT (mPlaybin), "uri", urlIn.c_str(), NULL);
+ //g_object_set (G_OBJECT (mPlaybin), "uri", "file:///tmp/movie", NULL);
+
+ // navigateTo implicitly plays, too.
+ play(1.0);
+
+ return true;
+}
+
+
+bool
+MediaPluginGStreamer010::update(int milliseconds)
+{
+ if (!mDoneInit)
+ return false; // error
+
+ DEBUGMSG("updating media...");
+
+ // sanity check
+ if (NULL == mPump ||
+ NULL == mPlaybin)
+ {
+ DEBUGMSG("dead media...");
+ return false;
+ }
+
+ // see if there's an outstanding seek wanted
+ if (mSeekWanted &&
+ // bleh, GST has to be happy that the movie is really truly playing
+ // or it may quietly ignore the seek (with rtsp:// at least).
+ (GST_STATE(mPlaybin) == GST_STATE_PLAYING))
+ {
+ seek(mSeekDestination);
+ mSeekWanted = false;
+ }
+
+ // *TODO: time-limit - but there isn't a lot we can do here, most
+ // time is spent in gstreamer's own opaque worker-threads. maybe
+ // we can do something sneaky like only unlock the video object
+ // for 'milliseconds' and otherwise hold the lock.
+ while (g_main_context_pending(g_main_loop_get_context(mPump)))
+ {
+ g_main_context_iteration(g_main_loop_get_context(mPump), FALSE);
+ }
+
+ // check for availability of a new frame
+
+ if (mVideoSink)
+ {
+ GST_OBJECT_LOCK(mVideoSink);
+ if (mVideoSink->retained_frame_ready)
+ {
+ DEBUGMSG("NEW FRAME READY");
+
+ if (mVideoSink->retained_frame_width != mCurrentWidth ||
+ mVideoSink->retained_frame_height != mCurrentHeight)
+ // *TODO: also check for change in format
+ {
+ // just resize container, don't consume frame
+ int neww = mVideoSink->retained_frame_width;
+ int newh = mVideoSink->retained_frame_height;
+
+ int newd = 4;
+ mTextureFormatPrimary = GL_RGBA;
+ mTextureFormatType = GL_UNSIGNED_INT_8_8_8_8_REV;
+
+ /*
+ int newd = SLVPixelFormatBytes[mVideoSink->retained_frame_format];
+ if (SLV_PF_BGRX == mVideoSink->retained_frame_format)
+ {
+ mTextureFormatPrimary = GL_BGRA;
+ mTextureFormatType = GL_UNSIGNED_INT_8_8_8_8_REV;
+ }
+ else
+ {
+ mTextureFormatPrimary = GL_RGBA;
+ mTextureFormatType = GL_UNSIGNED_INT_8_8_8_8_REV;
+ }
+ */
+
+ GST_OBJECT_UNLOCK(mVideoSink);
+
+ mCurrentRowbytes = neww * newd;
+ DEBUGMSG("video container resized to %dx%d",
+ neww, newh);
+
+ mDepth = newd;
+ mCurrentWidth = neww;
+ mCurrentHeight = newh;
+ sizeChanged();
+ return true;
+ }
+
+ if (mPixels &&
+ mCurrentHeight <= mHeight &&
+ mCurrentWidth <= mWidth &&
+ !mTextureSegmentName.empty())
+ {
+ // we're gonna totally consume this frame - reset 'ready' flag
+ mVideoSink->retained_frame_ready = FALSE;
+ int destination_rowbytes = mWidth * mDepth;
+ for (int row=0; rowretained_frame_data
+ [mCurrentRowbytes * row],
+ mCurrentRowbytes);
+ }
+
+ GST_OBJECT_UNLOCK(mVideoSink);
+ DEBUGMSG("NEW FRAME REALLY TRULY CONSUMED, TELLING HOST");
+
+ setDirty(0,0,mCurrentWidth,mCurrentHeight);
+ }
+ else
+ {
+ // new frame ready, but we're not ready to
+ // consume it.
+
+ GST_OBJECT_UNLOCK(mVideoSink);
+
+ DEBUGMSG("NEW FRAME not consumed, still waiting for a shm segment and/or shm resize");
+ }
+
+ return true;
+ }
+ else
+ {
+ // nothing to do yet.
+ GST_OBJECT_UNLOCK(mVideoSink);
+ return true;
+ }
+ }
+
+ return true;
+}
+
+
+void
+MediaPluginGStreamer010::mouseDown( int x, int y )
+{
+ // do nothing
+}
+
+void
+MediaPluginGStreamer010::mouseUp( int x, int y )
+{
+ // do nothing
+}
+
+void
+MediaPluginGStreamer010::mouseMove( int x, int y )
+{
+ // do nothing
+}
+
+
+bool
+MediaPluginGStreamer010::pause()
+{
+ DEBUGMSG("pausing media...");
+ // todo: error-check this?
+ llgst_element_set_state(mPlaybin, GST_STATE_PAUSED);
+ return true;
+}
+
+bool
+MediaPluginGStreamer010::stop()
+{
+ DEBUGMSG("stopping media...");
+ // todo: error-check this?
+ llgst_element_set_state(mPlaybin, GST_STATE_READY);
+ return true;
+}
+
+bool
+MediaPluginGStreamer010::play(double rate)
+{
+ // NOTE: we don't actually support non-natural rate.
+
+ DEBUGMSG("playing media... rate=%f", rate);
+ // todo: error-check this?
+ llgst_element_set_state(mPlaybin, GST_STATE_PLAYING);
+ return true;
+}
+
+bool
+MediaPluginGStreamer010::setVolume( float volume )
+{
+ // we try to only update volume as conservatively as
+ // possible, as many gst-plugins-base versions up to at least
+ // November 2008 have critical race-conditions in setting volume - sigh
+ if (mVolume == volume)
+ return true; // nothing to do, everything's fine
+
+ mVolume = volume;
+ if (mDoneInit && mPlaybin)
+ {
+ g_object_set(mPlaybin, "volume", mVolume, NULL);
+ return true;
+ }
+
+ return false;
+}
+
+bool
+MediaPluginGStreamer010::seek(double time_sec)
+{
+ bool success = false;
+ if (mDoneInit && mPlaybin)
+ {
+ success = llgst_element_seek(mPlaybin, 1.0F, GST_FORMAT_TIME,
+ GstSeekFlags(GST_SEEK_FLAG_FLUSH |
+ GST_SEEK_FLAG_KEY_UNIT),
+ GST_SEEK_TYPE_SET, gint64(time_sec*GST_SECOND),
+ GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
+ }
+ DEBUGMSG("MEDIA SEEK REQUEST to %fsec result was %d",
+ float(time_sec), int(success));
+ return success;
+}
+
+bool
+MediaPluginGStreamer010::getTimePos(double &sec_out)
+{
+ bool got_position = false;
+ if (mPlaybin)
+ {
+ gint64 pos;
+ GstFormat timefmt = GST_FORMAT_TIME;
+ got_position =
+ llgst_element_query_position &&
+ llgst_element_query_position(mPlaybin,
+ &timefmt,
+ &pos);
+ got_position = got_position
+ && (timefmt == GST_FORMAT_TIME);
+ // GStreamer may have other ideas, but we consider the current position
+ // undefined if not PLAYING or PAUSED
+ got_position = got_position &&
+ (GST_STATE(mPlaybin) == GST_STATE_PLAYING ||
+ GST_STATE(mPlaybin) == GST_STATE_PAUSED);
+ if (got_position && !GST_CLOCK_TIME_IS_VALID(pos))
+ {
+ if (GST_STATE(mPlaybin) == GST_STATE_PLAYING)
+ {
+ // if we're playing then we treat an invalid clock time
+ // as 0, for complicated reasons (insert reason here)
+ pos = 0;
+ }
+ else
+ {
+ got_position = false;
+ }
+
+ }
+ // If all the preconditions succeeded... we can trust the result.
+ if (got_position)
+ {
+ sec_out = double(pos) / double(GST_SECOND); // gst to sec
+ }
+ }
+ return got_position;
+}
+
+bool
+MediaPluginGStreamer010::load()
+{
+ if (!mDoneInit)
+ return false; // error
+
+ setStatus(STATUS_LOADING);
+
+ DEBUGMSG("setting up media...");
+
+ mIsLooping = false;
+ mVolume = 0.1234567; // minor hack to force an initial volume update
+
+ // Create a pumpable main-loop for this media
+ mPump = g_main_loop_new (NULL, FALSE);
+ if (!mPump)
+ {
+ setStatus(STATUS_ERROR);
+ return false; // error
+ }
+
+ // instantiate a playbin element to do the hard work
+ mPlaybin = llgst_element_factory_make ("playbin", "play");
+ if (!mPlaybin)
+ {
+ setStatus(STATUS_ERROR);
+ return false; // error
+ }
+
+ // get playbin's bus
+ GstBus *bus = llgst_pipeline_get_bus (GST_PIPELINE (mPlaybin));
+ if (!bus)
+ {
+ setStatus(STATUS_ERROR);
+ return false; // error
+ }
+ mBusWatchID = llgst_bus_add_watch (bus,
+ llmediaimplgstreamer_bus_callback,
+ this);
+ llgst_object_unref (bus);
+
+ if (NULL == getenv("LL_GSTREAMER_EXTERNAL")) {
+ // instantiate a custom video sink
+ mVideoSink =
+ GST_SLVIDEO(llgst_element_factory_make ("private-slvideo", "slvideo"));
+ if (!mVideoSink)
+ {
+ WARNMSG("Could not instantiate private-slvideo element.");
+ // todo: cleanup.
+ setStatus(STATUS_ERROR);
+ return false; // error
+ }
+
+ // connect the pieces
+ g_object_set(mPlaybin, "video-sink", mVideoSink, NULL);
+ }
+
+ return true;
+}
+
+bool
+MediaPluginGStreamer010::unload ()
+{
+ if (!mDoneInit)
+ return false; // error
+
+ DEBUGMSG("unloading media...");
+
+ // stop getting callbacks for this bus
+ g_source_remove(mBusWatchID);
+ mBusWatchID = 0;
+
+ if (mPlaybin)
+ {
+ llgst_element_set_state (mPlaybin, GST_STATE_NULL);
+ llgst_object_unref (GST_OBJECT (mPlaybin));
+ mPlaybin = NULL;
+ }
+
+ if (mPump)
+ {
+ g_main_loop_quit(mPump);
+ mPump = NULL;
+ }
+
+ mVideoSink = NULL;
+
+ setStatus(STATUS_NONE);
+
+ return true;
+}
+
+
+//static
+bool
+MediaPluginGStreamer010::startup()
+{
+ // first - check if GStreamer is explicitly disabled
+ if (NULL != getenv("LL_DISABLE_GSTREAMER"))
+ return false;
+
+ // only do global GStreamer initialization once.
+ if (!mDoneInit)
+ {
+ g_thread_init(NULL);
+
+ // Init the glib type system - we need it.
+ g_type_init();
+
+ // Get symbols!
+#if LL_DARWIN
+ if (! grab_gst_syms("libgstreamer-0.10.dylib",
+ "libgstvideo-0.10.dylib") )
+#elseif LL_WINDOWS
+ if (! grab_gst_syms("libgstreamer-0.10.dll",
+ "libgstvideo-0.10.dll") )
+#else // linux or other ELFy unixoid
+ if (! grab_gst_syms("libgstreamer-0.10.so.0",
+ "libgstvideo-0.10.so.0") )
+#endif
+ {
+ WARNMSG("Couldn't find suitable GStreamer 0.10 support on this system - video playback disabled.");
+ return false;
+ }
+
+ if (llgst_segtrap_set_enabled)
+ {
+ llgst_segtrap_set_enabled(FALSE);
+ }
+ else
+ {
+ WARNMSG("gst_segtrap_set_enabled() is not available; plugin crashes won't be caught.");
+ }
+
+#if LL_LINUX
+ // Gstreamer tries a fork during init, waitpid-ing on it,
+ // which conflicts with any installed SIGCHLD handler...
+ struct sigaction tmpact, oldact;
+ if (llgst_registry_fork_set_enabled) {
+ // if we can disable SIGCHLD-using forking behaviour,
+ // do it.
+ llgst_registry_fork_set_enabled(false);
+ }
+ else {
+ // else temporarily install default SIGCHLD handler
+ // while GStreamer initialises
+ tmpact.sa_handler = SIG_DFL;
+ sigemptyset( &tmpact.sa_mask );
+ tmpact.sa_flags = SA_SIGINFO;
+ sigaction(SIGCHLD, &tmpact, &oldact);
+ }
+#endif // LL_LINUX
+
+ // Protect against GStreamer resetting the locale, yuck.
+ static std::string saved_locale;
+ saved_locale = setlocale(LC_ALL, NULL);
+
+ // finally, try to initialize GStreamer!
+ GError *err = NULL;
+ gboolean init_gst_success = llgst_init_check(NULL, NULL, &err);
+
+ // restore old locale
+ setlocale(LC_ALL, saved_locale.c_str() );
+
+#if LL_LINUX
+ // restore old SIGCHLD handler
+ if (!llgst_registry_fork_set_enabled)
+ sigaction(SIGCHLD, &oldact, NULL);
+#endif // LL_LINUX
+
+ if (!init_gst_success) // fail
+ {
+ if (err)
+ {
+ WARNMSG("GST init failed: %s", err->message);
+ g_error_free(err);
+ }
+ else
+ {
+ WARNMSG("GST init failed for unspecified reason.");
+ }
+ return false;
+ }
+
+ // Init our custom plugins - only really need do this once.
+ gst_slvideo_init_class();
+
+ mDoneInit = true;
+ }
+
+ return true;
+}
+
+
+void
+MediaPluginGStreamer010::sizeChanged()
+{
+ // the shared writing space has possibly changed size/location/whatever
+
+ // Check to see whether the movie's NATURAL size has been set yet
+ if (1 == mNaturalWidth &&
+ 1 == mNaturalHeight)
+ {
+ mNaturalWidth = mCurrentWidth;
+ mNaturalHeight = mCurrentHeight;
+ DEBUGMSG("Media NATURAL size better detected as %dx%d",
+ mNaturalWidth, mNaturalHeight);
+ }
+
+ // if the size has changed then the shm has changed and the app needs telling
+ if (mCurrentWidth != mPreviousWidth ||
+ mCurrentHeight != mPreviousHeight)
+ {
+ mPreviousWidth = mCurrentWidth;
+ mPreviousHeight = mCurrentHeight;
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_request");
+ message.setValue("name", mTextureSegmentName);
+ message.setValueS32("width", mNaturalWidth);
+ message.setValueS32("height", mNaturalHeight);
+ DEBUGMSG("<--- Sending size change request to application with name: '%s' - natural size is %d x %d", mTextureSegmentName.c_str(), mNaturalWidth, mNaturalHeight);
+ sendMessage(message);
+ }
+}
+
+
+
+//static
+bool
+MediaPluginGStreamer010::closedown()
+{
+ if (!mDoneInit)
+ return false; // error
+
+ ungrab_gst_syms();
+
+ mDoneInit = false;
+
+ return true;
+}
+
+MediaPluginGStreamer010::~MediaPluginGStreamer010()
+{
+ DEBUGMSG("MediaPluginGStreamer010 destructor");
+
+ closedown();
+
+ DEBUGMSG("GStreamer010 closing down");
+}
+
+
+std::string
+MediaPluginGStreamer010::getVersion()
+{
+ std::string plugin_version = "GStreamer010 media plugin, GStreamer version ";
+ if (mDoneInit &&
+ llgst_version)
+ {
+ guint major, minor, micro, nano;
+ llgst_version(&major, &minor, µ, &nano);
+ plugin_version += llformat("%u.%u.%u.%u (runtime), %u.%u.%u.%u (headers)", (unsigned int)major, (unsigned int)minor, (unsigned int)micro, (unsigned int)nano, (unsigned int)GST_VERSION_MAJOR, (unsigned int)GST_VERSION_MINOR, (unsigned int)GST_VERSION_MICRO, (unsigned int)GST_VERSION_NANO);
+ }
+ else
+ {
+ plugin_version += "(unknown)";
+ }
+ return plugin_version;
+}
+
+void MediaPluginGStreamer010::receiveMessage(const char *message_string)
+{
+ //std::cerr << "MediaPluginGStreamer010::receiveMessage: received message: \"" << message_string << "\"" << std::endl;
+
+ LLPluginMessage message_in;
+
+ if(message_in.parse(message_string) >= 0)
+ {
+ std::string message_class = message_in.getClass();
+ std::string message_name = message_in.getName();
+ if(message_class == LLPLUGIN_MESSAGE_CLASS_BASE)
+ {
+ if(message_name == "init")
+ {
+ LLPluginMessage message("base", "init_response");
+ LLSD versions = LLSD::emptyMap();
+ versions[LLPLUGIN_MESSAGE_CLASS_BASE] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION;
+ versions[LLPLUGIN_MESSAGE_CLASS_MEDIA] = LLPLUGIN_MESSAGE_CLASS_MEDIA_VERSION;
+ versions[LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME] = LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME_VERSION;
+ message.setValueLLSD("versions", versions);
+
+ if ( load() )
+ {
+ DEBUGMSG("GStreamer010 media instance set up");
+ }
+ else
+ {
+ WARNMSG("GStreamer010 media instance failed to set up");
+ }
+
+ message.setValue("plugin_version", getVersion());
+ sendMessage(message);
+ }
+ else if(message_name == "idle")
+ {
+ // no response is necessary here.
+ double time = message_in.getValueReal("time");
+
+ // Convert time to milliseconds for update()
+ update((int)(time * 1000.0f));
+ }
+ else if(message_name == "cleanup")
+ {
+ unload();
+ closedown();
+ }
+ else if(message_name == "shm_added")
+ {
+ SharedSegmentInfo info;
+ info.mAddress = message_in.getValuePointer("address");
+ info.mSize = (size_t)message_in.getValueS32("size");
+ std::string name = message_in.getValue("name");
+
+ std::ostringstream str;
+ INFOMSG("MediaPluginGStreamer010::receiveMessage: shared memory added, name: %s, size: %d, address: %p", name.c_str(), int(info.mSize), info.mAddress);
+
+ mSharedSegments.insert(SharedSegmentMap::value_type(name, info));
+ }
+ else if(message_name == "shm_remove")
+ {
+ std::string name = message_in.getValue("name");
+
+ DEBUGMSG("MediaPluginGStreamer010::receiveMessage: shared memory remove, name = %s", name.c_str());
+
+ SharedSegmentMap::iterator iter = mSharedSegments.find(name);
+ if(iter != mSharedSegments.end())
+ {
+ if(mPixels == iter->second.mAddress)
+ {
+ // This is the currently active pixel buffer. Make sure we stop drawing to it.
+ mPixels = NULL;
+ mTextureSegmentName.clear();
+
+ // Make sure the movie decoder is no longer pointed at the shared segment.
+ sizeChanged();
+ }
+ mSharedSegments.erase(iter);
+ }
+ else
+ {
+ WARNMSG("MediaPluginGStreamer010::receiveMessage: unknown shared memory region!");
+ }
+
+ // Send the response so it can be cleaned up.
+ LLPluginMessage message("base", "shm_remove_response");
+ message.setValue("name", name);
+ sendMessage(message);
+ }
+ else
+ {
+ std::ostringstream str;
+ INFOMSG("MediaPluginGStreamer010::receiveMessage: unknown base message: %s", message_name.c_str());
+ }
+ }
+ else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA)
+ {
+ if(message_name == "init")
+ {
+ // Plugin gets to decide the texture parameters to use.
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params");
+ // lame to have to decide this now, it depends on the movie. Oh well.
+ mDepth = 4;
+
+ mCurrentWidth = 1;
+ mCurrentHeight = 1;
+ mPreviousWidth = 1;
+ mPreviousHeight = 1;
+ mNaturalWidth = 1;
+ mNaturalHeight = 1;
+ mWidth = 1;
+ mHeight = 1;
+ mTextureWidth = 1;
+ mTextureHeight = 1;
+
+ message.setValueU32("format", GL_RGBA);
+ message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8_REV);
+
+ message.setValueS32("depth", mDepth);
+ message.setValueS32("default_width", mWidth);
+ message.setValueS32("default_height", mHeight);
+ message.setValueU32("internalformat", GL_RGBA8);
+ message.setValueBoolean("coords_opengl", true); // true == use OpenGL-style coordinates, false == (0,0) is upper left.
+ message.setValueBoolean("allow_downsample", true); // we respond with grace and performance if asked to downscale
+ sendMessage(message);
+ }
+ else if(message_name == "size_change")
+ {
+ std::string name = message_in.getValue("name");
+ S32 width = message_in.getValueS32("width");
+ S32 height = message_in.getValueS32("height");
+ S32 texture_width = message_in.getValueS32("texture_width");
+ S32 texture_height = message_in.getValueS32("texture_height");
+
+ std::ostringstream str;
+ INFOMSG("---->Got size change instruction from application with shm name: %s - size is %d x %d", name.c_str(), width, height);
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_response");
+ message.setValue("name", name);
+ message.setValueS32("width", width);
+ message.setValueS32("height", height);
+ message.setValueS32("texture_width", texture_width);
+ message.setValueS32("texture_height", texture_height);
+ sendMessage(message);
+
+ if(!name.empty())
+ {
+ // Find the shared memory region with this name
+ SharedSegmentMap::iterator iter = mSharedSegments.find(name);
+ if(iter != mSharedSegments.end())
+ {
+ INFOMSG("*** Got size change with matching shm, new size is %d x %d", width, height);
+ INFOMSG("*** Got size change with matching shm, texture size size is %d x %d", texture_width, texture_height);
+
+ mPixels = (unsigned char*)iter->second.mAddress;
+ mTextureSegmentName = name;
+ mWidth = width;
+ mHeight = height;
+
+ if (texture_width > 1 ||
+ texture_height > 1) // not a dummy size from the app, a real explicit forced size
+ {
+ INFOMSG("**** = REAL RESIZE REQUEST FROM APP");
+
+ GST_OBJECT_LOCK(mVideoSink);
+ mVideoSink->resize_forced_always = true;
+ mVideoSink->resize_try_width = texture_width;
+ mVideoSink->resize_try_height = texture_height;
+ GST_OBJECT_UNLOCK(mVideoSink);
+ }
+
+ mTextureWidth = texture_width;
+ mTextureHeight = texture_height;
+ }
+ }
+ }
+ else if(message_name == "load_uri")
+ {
+ std::string uri = message_in.getValue("uri");
+ navigateTo( uri );
+ sendStatus();
+ }
+ else if(message_name == "mouse_event")
+ {
+ std::string event = message_in.getValue("event");
+ S32 x = message_in.getValueS32("x");
+ S32 y = message_in.getValueS32("y");
+
+ if(event == "down")
+ {
+ mouseDown(x, y);
+ }
+ else if(event == "up")
+ {
+ mouseUp(x, y);
+ }
+ else if(event == "move")
+ {
+ mouseMove(x, y);
+ };
+ };
+ }
+ else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME)
+ {
+ if(message_name == "stop")
+ {
+ stop();
+ }
+ else if(message_name == "start")
+ {
+ double rate = 0.0;
+ if(message_in.hasValue("rate"))
+ {
+ rate = message_in.getValueReal("rate");
+ }
+ // NOTE: we don't actually support rate.
+ play(rate);
+ }
+ else if(message_name == "pause")
+ {
+ pause();
+ }
+ else if(message_name == "seek")
+ {
+ double time = message_in.getValueReal("time");
+ // defer the actual seek in case we haven't
+ // really truly started yet in which case there
+ // is nothing to seek upon
+ mSeekWanted = true;
+ mSeekDestination = time;
+ }
+ else if(message_name == "set_loop")
+ {
+ bool loop = message_in.getValueBoolean("loop");
+ mIsLooping = loop;
+ }
+ else if(message_name == "set_volume")
+ {
+ double volume = message_in.getValueReal("volume");
+ setVolume(volume);
+ }
+ }
+ else
+ {
+ INFOMSG("MediaPluginGStreamer010::receiveMessage: unknown message class: %s", message_class.c_str());
+ }
+ }
+}
+
+int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data)
+{
+ if (MediaPluginGStreamer010::startup())
+ {
+ MediaPluginGStreamer010 *self = new MediaPluginGStreamer010(host_send_func, host_user_data);
+ *plugin_send_func = MediaPluginGStreamer010::staticReceiveMessage;
+ *plugin_user_data = (void*)self;
+
+ return 0; // okay
+ }
+ else
+ {
+ return -1; // failed to init
+ }
+}
+
+#else // LL_GSTREAMER010_ENABLED
+
+// Stubbed-out class with constructor/destructor (necessary or windows linker
+// will just think its dead code and optimize it all out)
+class MediaPluginGStreamer010 : public MediaPluginBase
+{
+public:
+ MediaPluginGStreamer010(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data);
+ ~MediaPluginGStreamer010();
+ /* virtual */ void receiveMessage(const char *message_string);
+};
+
+MediaPluginGStreamer010::MediaPluginGStreamer010(
+ LLPluginInstance::sendMessageFunction host_send_func,
+ void *host_user_data ) :
+ MediaPluginBase(host_send_func, host_user_data)
+{
+ // no-op
+}
+
+MediaPluginGStreamer010::~MediaPluginGStreamer010()
+{
+ // no-op
+}
+
+void MediaPluginGStreamer010::receiveMessage(const char *message_string)
+{
+ // no-op
+}
+
+// We're building without GStreamer enabled. Just refuse to initialize.
+int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data)
+{
+ return -1;
+}
+
+#endif // LL_GSTREAMER010_ENABLED
diff --git a/linden/indra/media_plugins/quicktime/CMakeLists.txt b/linden/indra/media_plugins/quicktime/CMakeLists.txt
new file mode 100644
index 0000000..db11c9a
--- /dev/null
+++ b/linden/indra/media_plugins/quicktime/CMakeLists.txt
@@ -0,0 +1,83 @@
+# -*- cmake -*-
+
+project(media_plugin_quicktime)
+
+include(00-Common)
+include(LLCommon)
+include(LLImage)
+include(LLPlugin)
+include(LLMath)
+include(LLRender)
+include(LLWindow)
+include(Linking)
+include(PluginAPI)
+include(MediaPluginBase)
+include(FindOpenGL)
+include(QuickTimePlugin)
+
+include_directories(
+ ${LLPLUGIN_INCLUDE_DIRS}
+ ${MEDIA_PLUGIN_BASE_INCLUDE_DIRS}
+ ${LLCOMMON_INCLUDE_DIRS}
+ ${LLMATH_INCLUDE_DIRS}
+ ${LLIMAGE_INCLUDE_DIRS}
+ ${LLRENDER_INCLUDE_DIRS}
+ ${LLWINDOW_INCLUDE_DIRS}
+)
+
+if (DARWIN)
+ include(CMakeFindFrameworks)
+ find_library(CARBON_LIBRARY Carbon)
+endif (DARWIN)
+
+
+### media_plugin_quicktime
+
+set(media_plugin_quicktime_SOURCE_FILES
+ media_plugin_quicktime.cpp
+ )
+
+add_library(media_plugin_quicktime
+ SHARED
+ ${media_plugin_quicktime_SOURCE_FILES}
+)
+
+target_link_libraries(media_plugin_quicktime
+ ${LLPLUGIN_LIBRARIES}
+ ${MEDIA_PLUGIN_BASE_LIBRARIES}
+ ${LLCOMMON_LIBRARIES}
+ ${QUICKTIME_LIBRARY}
+ ${PLUGIN_API_WINDOWS_LIBRARIES}
+)
+
+add_dependencies(media_plugin_quicktime
+ ${LLPLUGIN_LIBRARIES}
+ ${MEDIA_PLUGIN_BASE_LIBRARIES}
+ ${LLCOMMON_LIBRARIES}
+)
+
+if (QUICKTIME)
+
+ add_definitions(-DLL_QUICKTIME_ENABLED=1)
+
+ if (DARWIN)
+ # Don't prepend 'lib' to the executable name, and don't embed a full path in the library's install name
+ set_target_properties(
+ media_plugin_quicktime
+ PROPERTIES
+ PREFIX ""
+ BUILD_WITH_INSTALL_RPATH 1
+ INSTALL_NAME_DIR "@executable_path"
+ LINK_FLAGS "-exported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/../base/media_plugin_base.exp"
+ )
+
+# We use a bunch of deprecated system APIs.
+ set_source_files_properties(
+ media_plugin_quicktime.cpp PROPERTIES
+ COMPILE_FLAGS -Wno-deprecated-declarations
+ )
+ find_library(CARBON_LIBRARY Carbon)
+ target_link_libraries(media_plugin_quicktime ${CARBON_LIBRARY})
+ endif (DARWIN)
+endif (QUICKTIME)
+
diff --git a/linden/indra/media_plugins/quicktime/media_plugin_quicktime.cpp b/linden/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
new file mode 100644
index 0000000..51cc8dd
--- /dev/null
+++ b/linden/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
@@ -0,0 +1,985 @@
+/**
+ * @file media_plugin_quicktime.cpp
+ * @brief QuickTime plugin for LLMedia API plugin system
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "llgl.h"
+
+#include "llplugininstance.h"
+#include "llpluginmessage.h"
+#include "llpluginmessageclasses.h"
+#include "media_plugin_base.h"
+
+#if LL_QUICKTIME_ENABLED
+
+#if defined(LL_DARWIN)
+ #include
+#elif defined(LL_WINDOWS)
+ #include "MacTypes.h"
+ #include "QTML.h"
+ #include "Movies.h"
+ #include "QDoffscreen.h"
+ #include "FixMath.h"
+#endif
+
+// TODO: Make sure that the only symbol exported from this library is LLPluginInitEntryPoint
+////////////////////////////////////////////////////////////////////////////////
+//
+class MediaPluginQuickTime : public MediaPluginBase
+{
+public:
+ MediaPluginQuickTime(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data);
+ ~MediaPluginQuickTime();
+
+ /* virtual */ void receiveMessage(const char *message_string);
+
+private:
+
+ int mNaturalWidth;
+ int mNaturalHeight;
+ Movie mMovieHandle;
+ GWorldPtr mGWorldHandle;
+ ComponentInstance mMovieController;
+ int mCurVolume;
+ bool mMediaSizeChanging;
+ bool mIsLooping;
+ const int mMinWidth;
+ const int mMaxWidth;
+ const int mMinHeight;
+ const int mMaxHeight;
+ F64 mPlayRate;
+
+ enum ECommand {
+ COMMAND_NONE,
+ COMMAND_STOP,
+ COMMAND_PLAY,
+ COMMAND_FAST_FORWARD,
+ COMMAND_FAST_REWIND,
+ COMMAND_PAUSE,
+ COMMAND_SEEK,
+ };
+ ECommand mCommand;
+
+ // Override this to add current time and duration to the message
+ /*virtual*/ void setDirty(int left, int top, int right, int bottom)
+ {
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "updated");
+
+ message.setValueS32("left", left);
+ message.setValueS32("top", top);
+ message.setValueS32("right", right);
+ message.setValueS32("bottom", bottom);
+
+ if(mMovieHandle)
+ {
+ message.setValueReal("current_time", getCurrentTime());
+ message.setValueReal("duration", getDuration());
+ message.setValueReal("current_rate", Fix2X(GetMovieRate(mMovieHandle)));
+ }
+
+ sendMessage(message);
+ }
+
+
+ static Rect rectFromSize(int width, int height)
+ {
+ Rect result;
+
+
+ result.left = 0;
+ result.top = 0;
+ result.right = width;
+ result.bottom = height;
+
+ return result;
+ }
+
+ Fixed getPlayRate(void)
+ {
+ Fixed result;
+ if(mPlayRate == 0.0f)
+ {
+ // Default to the movie's preferred rate
+ result = GetMoviePreferredRate(mMovieHandle);
+ if(result == 0)
+ {
+ // Don't return a 0 play rate, ever.
+ std::cerr << "Movie's preferred rate is 0, forcing to 1.0." << std::endl;
+ result = X2Fix(1.0f);
+ }
+ }
+ else
+ {
+ result = X2Fix(mPlayRate);
+ }
+
+ return result;
+ }
+
+ void load( const std::string url )
+ {
+ if ( url.empty() )
+ return;
+
+ // Stop and unload any existing movie before starting another one.
+ unload();
+
+ setStatus(STATUS_LOADING);
+
+ //In case std::string::c_str() makes a copy of the url data,
+ //make sure there is memory to hold it before allocating memory for handle.
+ //if fails, NewHandleClear(...) should return NULL.
+ const char* url_string = url.c_str() ;
+ Handle handle = NewHandleClear( ( Size )( url.length() + 1 ) );
+ if ( NULL == handle || noErr != MemError() || NULL == *handle )
+ {
+ setStatus(STATUS_ERROR);
+ return;
+ }
+
+ BlockMove( url_string, *handle, ( Size )( url.length() + 1 ) );
+
+ OSErr err = NewMovieFromDataRef( &mMovieHandle, newMovieActive | newMovieDontInteractWithUser | newMovieAsyncOK | newMovieIdleImportOK, nil, handle, URLDataHandlerSubType );
+ DisposeHandle( handle );
+ if ( noErr != err )
+ {
+ setStatus(STATUS_ERROR);
+ return;
+ };
+
+ // do pre-roll actions (typically fired for streaming movies but not always)
+ PrePrerollMovie( mMovieHandle, 0, getPlayRate(), moviePrePrerollCompleteCallback, ( void * )this );
+
+ Rect movie_rect = rectFromSize(mWidth, mHeight);
+
+ // make a new movie controller
+ mMovieController = NewMovieController( mMovieHandle, &movie_rect, mcNotVisible | mcTopLeftMovie );
+
+ // movie controller
+ MCSetActionFilterWithRefCon( mMovieController, mcActionFilterCallBack, ( long )this );
+
+ SetMoviePlayHints( mMovieHandle, hintsAllowDynamicResize, hintsAllowDynamicResize );
+
+ // function that gets called when a frame is drawn
+ SetMovieDrawingCompleteProc( mMovieHandle, movieDrawingCallWhenChanged, movieDrawingCompleteCallback, ( long )this );
+
+ setStatus(STATUS_LOADED);
+
+ sizeChanged();
+ };
+
+ bool unload()
+ {
+ if ( mMovieHandle )
+ {
+ StopMovie( mMovieHandle );
+ if ( mMovieController )
+ {
+ MCMovieChanged( mMovieController, mMovieHandle );
+ };
+ };
+
+ if ( mMovieController )
+ {
+ MCSetActionFilterWithRefCon( mMovieController, NULL, (long)this );
+ DisposeMovieController( mMovieController );
+ mMovieController = NULL;
+ };
+
+ if ( mMovieHandle )
+ {
+ SetMovieDrawingCompleteProc( mMovieHandle, movieDrawingCallWhenChanged, nil, ( long )this );
+ DisposeMovie( mMovieHandle );
+ mMovieHandle = NULL;
+ };
+
+ if ( mGWorldHandle )
+ {
+ DisposeGWorld( mGWorldHandle );
+ mGWorldHandle = NULL;
+ };
+
+ setStatus(STATUS_NONE);
+
+ return true;
+ }
+
+ bool navigateTo( const std::string url )
+ {
+ unload();
+ load( url );
+
+ return true;
+ };
+
+ bool sizeChanged()
+ {
+ if ( ! mMovieHandle )
+ return false;
+
+ // Check to see whether the movie's natural size has updated
+ {
+ int width, height;
+ getMovieNaturalSize(&width, &height);
+ if((width != 0) && (height != 0) && ((width != mNaturalWidth) || (height != mNaturalHeight)))
+ {
+ mNaturalWidth = width;
+ mNaturalHeight = height;
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_request");
+ message.setValue("name", mTextureSegmentName);
+ message.setValueS32("width", width);
+ message.setValueS32("height", height);
+ sendMessage(message);
+ //std::cerr << "<--- Sending size change request to application with name: " << mTextureSegmentName << " - size is " << width << " x " << height << std::endl;
+ }
+ }
+
+ // sanitize destination size
+ Rect dest_rect = rectFromSize(mWidth, mHeight);
+
+ // media depth won't change
+ int depth_bits = mDepth * 8;
+ long rowbytes = mDepth * mTextureWidth;
+
+ GWorldPtr old_gworld_handle = mGWorldHandle;
+
+ if(mPixels != NULL)
+ {
+ // We have pixels. Set up a GWorld pointing at the texture.
+ OSErr result = NewGWorldFromPtr( &mGWorldHandle, depth_bits, &dest_rect, NULL, NULL, 0, (Ptr)mPixels, rowbytes);
+ if ( noErr != result )
+ {
+ // TODO: unrecoverable?? throw exception? return something?
+ return false;
+ }
+ }
+ else
+ {
+ // We don't have pixels. Create a fake GWorld we can point the movie at when it's not safe to render normally.
+ Rect tempRect = rectFromSize(1, 1);
+ OSErr result = NewGWorld( &mGWorldHandle, depth_bits, &tempRect, NULL, NULL, 0);
+ if ( noErr != result )
+ {
+ // TODO: unrecoverable?? throw exception? return something?
+ return false;
+ }
+ }
+
+ SetMovieGWorld( mMovieHandle, mGWorldHandle, GetGWorldDevice( mGWorldHandle ) );
+
+ // If the GWorld was already set up, delete it.
+ if(old_gworld_handle != NULL)
+ {
+ DisposeGWorld( old_gworld_handle );
+ }
+
+ // Set up the movie display matrix
+ {
+ // scale movie to fit rect and invert vertically to match opengl image format
+ MatrixRecord transform;
+ SetIdentityMatrix( &transform ); // transforms are additive so start from identify matrix
+ double scaleX = (double) mWidth / mNaturalWidth;
+ double scaleY = -1.0 * (double) mHeight / mNaturalHeight;
+ double centerX = mWidth / 2.0;
+ double centerY = mHeight / 2.0;
+ ScaleMatrix( &transform, X2Fix( scaleX ), X2Fix( scaleY ), X2Fix( centerX ), X2Fix( centerY ) );
+ SetMovieMatrix( mMovieHandle, &transform );
+ }
+
+ // update movie controller
+ if ( mMovieController )
+ {
+ MCSetControllerPort( mMovieController, mGWorldHandle );
+ MCPositionController( mMovieController, &dest_rect, &dest_rect,
+ mcTopLeftMovie | mcPositionDontInvalidate );
+ MCMovieChanged( mMovieController, mMovieHandle );
+ }
+
+
+ // Emit event with size change so the calling app knows about it too
+ // TODO:
+ //LLMediaEvent event( this );
+ //mEventEmitter.update( &LLMediaObserver::onMediaSizeChange, event );
+
+ return true;
+ }
+
+ static Boolean mcActionFilterCallBack( MovieController mc, short action, void *params, long ref )
+ {
+ Boolean result = false;
+
+ MediaPluginQuickTime* self = ( MediaPluginQuickTime* )ref;
+
+ switch( action )
+ {
+ // handle window resizing
+ case mcActionControllerSizeChanged:
+ // Ensure that the movie draws correctly at the new size
+ self->sizeChanged();
+ break;
+
+ // Block any movie controller actions that open URLs.
+ case mcActionLinkToURL:
+ case mcActionGetNextURL:
+ case mcActionLinkToURLExtended:
+ // Prevent the movie controller from handling the message
+ result = true;
+ break;
+
+ default:
+ break;
+ };
+
+ return result;
+ };
+
+ static OSErr movieDrawingCompleteCallback( Movie call_back_movie, long ref )
+ {
+ MediaPluginQuickTime* self = ( MediaPluginQuickTime* )ref;
+
+ // IMPORTANT: typically, a consumer who is observing this event will set a flag
+ // when this event is fired then render later. Be aware that the media stream
+ // can change during this period - dimensions, depth, format etc.
+ //LLMediaEvent event( self );
+// self->updateQuickTime();
+ // TODO ^^^
+
+ if ( self->mWidth > 0 && self->mHeight > 0 )
+ self->setDirty( 0, 0, self->mWidth, self->mHeight );
+
+ return noErr;
+ };
+
+ static void moviePrePrerollCompleteCallback( Movie movie, OSErr preroll_err, void *ref )
+ {
+ //MediaPluginQuickTime* self = ( MediaPluginQuickTime* )ref;
+
+ // TODO:
+ //LLMediaEvent event( self );
+ //self->mEventEmitter.update( &LLMediaObserver::onMediaPreroll, event );
+ };
+
+
+ void rewind()
+ {
+ GoToBeginningOfMovie( mMovieHandle );
+ MCMovieChanged( mMovieController, mMovieHandle );
+ };
+
+ bool processState()
+ {
+ if ( mCommand == COMMAND_PLAY )
+ {
+ if ( mStatus == STATUS_LOADED || mStatus == STATUS_PAUSED || mStatus == STATUS_PLAYING )
+ {
+ long state = GetMovieLoadState( mMovieHandle );
+
+ if ( state >= kMovieLoadStatePlaythroughOK )
+ {
+ // if the movie is at the end (generally because it reached it naturally)
+ // and we play is requested, jump back to the start of the movie.
+ // note: this is different from having loop flag set.
+ if ( IsMovieDone( mMovieHandle ) )
+ {
+ Fixed rate = X2Fix( 0.0 );
+ MCDoAction( mMovieController, mcActionPlay, (void*)rate );
+ rewind();
+ };
+
+ MCDoAction( mMovieController, mcActionPrerollAndPlay, (void*)getPlayRate() );
+ MCDoAction( mMovieController, mcActionSetVolume, (void*)mCurVolume );
+ setStatus(STATUS_PLAYING);
+ mCommand = COMMAND_NONE;
+ };
+ };
+ }
+ else
+ if ( mCommand == COMMAND_STOP )
+ {
+ if ( mStatus == STATUS_PLAYING || mStatus == STATUS_PAUSED )
+ {
+ if ( GetMovieLoadState( mMovieHandle ) >= kMovieLoadStatePlaythroughOK )
+ {
+ Fixed rate = X2Fix( 0.0 );
+ MCDoAction( mMovieController, mcActionPlay, (void*)rate );
+ rewind();
+
+ setStatus(STATUS_LOADED);
+ mCommand = COMMAND_NONE;
+ };
+ };
+ }
+ else
+ if ( mCommand == COMMAND_PAUSE )
+ {
+ if ( mStatus == STATUS_PLAYING )
+ {
+ if ( GetMovieLoadState( mMovieHandle ) >= kMovieLoadStatePlaythroughOK )
+ {
+ Fixed rate = X2Fix( 0.0 );
+ MCDoAction( mMovieController, mcActionPlay, (void*)rate );
+ setStatus(STATUS_PAUSED);
+ mCommand = COMMAND_NONE;
+ };
+ };
+ };
+
+ return true;
+ };
+
+ void play(F64 rate)
+ {
+ mPlayRate = rate;
+ mCommand = COMMAND_PLAY;
+ };
+
+ void stop()
+ {
+ mCommand = COMMAND_STOP;
+ };
+
+ void pause()
+ {
+ mCommand = COMMAND_PAUSE;
+ };
+
+ void getMovieNaturalSize(int *movie_width, int *movie_height)
+ {
+ Rect rect;
+
+ GetMovieNaturalBoundsRect( mMovieHandle, &rect );
+
+ int width = ( rect.right - rect.left );
+ int height = ( rect.bottom - rect.top );
+
+ // make sure width and height fall in valid range
+ if ( width < mMinWidth )
+ width = mMinWidth;
+
+ if ( width > mMaxWidth )
+ width = mMaxWidth;
+
+ if ( height < mMinHeight )
+ height = mMinHeight;
+
+ if ( height > mMaxHeight )
+ height = mMaxHeight;
+
+ // return the new rect
+ *movie_width = width;
+ *movie_height = height;
+ }
+
+ void updateQuickTime(int milliseconds)
+ {
+ if ( ! mMovieHandle )
+ return;
+
+ if ( ! mMovieController )
+ return;
+
+ // service QuickTime
+ // Calling it this way doesn't have good behavior on Windows...
+// MoviesTask( mMovieHandle, milliseconds );
+ // This was the original, but I think using both MoviesTask and MCIdle is redundant. Trying with only MCIdle.
+// MoviesTask( mMovieHandle, 0 );
+
+ MCIdle( mMovieController );
+
+ if ( ! mGWorldHandle )
+ return;
+
+ if ( mMediaSizeChanging )
+ return;
+
+ // update state machine
+ processState();
+
+ // special code for looping - need to rewind at the end of the movie
+ if ( mIsLooping )
+ {
+ // QT call to see if we are at the end - can't do with controller
+ if ( IsMovieDone( mMovieHandle ) )
+ {
+ // go back to start
+ rewind();
+
+ if ( mMovieController )
+ {
+ // kick off new play
+ MCDoAction( mMovieController, mcActionPrerollAndPlay, (void*)getPlayRate() );
+
+ // set the volume
+ MCDoAction( mMovieController, mcActionSetVolume, (void*)mCurVolume );
+ };
+ };
+ };
+ };
+
+ int getDataWidth() const
+ {
+ if ( mGWorldHandle )
+ {
+ int depth = mDepth;
+
+ if (depth < 1)
+ depth = 1;
+
+ // ALWAYS use the row bytes from the PixMap if we have a GWorld because
+ // sometimes it's not the same as mMediaDepth * mMediaWidth !
+ PixMapHandle pix_map_handle = GetGWorldPixMap( mGWorldHandle );
+ return QTGetPixMapHandleRowBytes( pix_map_handle ) / depth;
+ }
+ else
+ {
+ // TODO : return LLMediaImplCommon::getaDataWidth();
+ return 0;
+ }
+ };
+
+ void seek( F64 time )
+ {
+ if ( mMovieController )
+ {
+ TimeRecord when;
+ when.scale = GetMovieTimeScale( mMovieHandle );
+ when.base = 0;
+
+ // 'time' is in (floating point) seconds. The timebase time will be in 'units', where
+ // there are 'scale' units per second.
+ SInt64 raw_time = ( SInt64 )( time * (double)( when.scale ) );
+
+ when.value.hi = ( SInt32 )( raw_time >> 32 );
+ when.value.lo = ( SInt32 )( ( raw_time & 0x00000000FFFFFFFF ) );
+
+ MCDoAction( mMovieController, mcActionGoToTime, &when );
+ };
+ };
+
+ F64 getDuration()
+ {
+ TimeValue duration = GetMovieDuration( mMovieHandle );
+ TimeValue scale = GetMovieTimeScale( mMovieHandle );
+
+ return (F64)duration / (F64)scale;
+ };
+
+ F64 getCurrentTime()
+ {
+ TimeValue curr_time = GetMovieTime( mMovieHandle, 0 );
+ TimeValue scale = GetMovieTimeScale( mMovieHandle );
+
+ return (F64)curr_time / (F64)scale;
+ };
+
+ void setVolume( F64 volume )
+ {
+ mCurVolume = (short)(volume * ( double ) 0x100 );
+
+ if ( mMovieController )
+ {
+ MCDoAction( mMovieController, mcActionSetVolume, (void*)mCurVolume );
+ };
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ void update(int milliseconds = 0)
+ {
+ updateQuickTime(milliseconds);
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ void mouseDown( int x, int y )
+ {
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ void mouseUp( int x, int y )
+ {
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ void mouseMove( int x, int y )
+ {
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ void keyPress( unsigned char key )
+ {
+ };
+
+};
+
+MediaPluginQuickTime::MediaPluginQuickTime(
+ LLPluginInstance::sendMessageFunction host_send_func,
+ void *host_user_data ) :
+ MediaPluginBase(host_send_func, host_user_data),
+ mMinWidth( 0 ),
+ mMaxWidth( 2048 ),
+ mMinHeight( 0 ),
+ mMaxHeight( 2048 )
+{
+// std::cerr << "MediaPluginQuickTime constructor" << std::endl;
+
+ mNaturalWidth = -1;
+ mNaturalHeight = -1;
+ mMovieHandle = 0;
+ mGWorldHandle = 0;
+ mMovieController = 0;
+ mCurVolume = 0x99;
+ mMediaSizeChanging = false;
+ mIsLooping = false;
+ mCommand = COMMAND_NONE;
+ mPlayRate = 0.0f;
+ mStatus = STATUS_NONE;
+}
+
+MediaPluginQuickTime::~MediaPluginQuickTime()
+{
+// std::cerr << "MediaPluginQuickTime destructor" << std::endl;
+
+ ExitMovies();
+
+#ifdef LL_WINDOWS
+ TerminateQTML();
+// std::cerr << "QuickTime closing down" << std::endl;
+#endif
+}
+
+
+void MediaPluginQuickTime::receiveMessage(const char *message_string)
+{
+// std::cerr << "MediaPluginQuickTime::receiveMessage: received message: \"" << message_string << "\"" << std::endl;
+ LLPluginMessage message_in;
+
+ if(message_in.parse(message_string) >= 0)
+ {
+ std::string message_class = message_in.getClass();
+ std::string message_name = message_in.getName();
+ if(message_class == LLPLUGIN_MESSAGE_CLASS_BASE)
+ {
+ if(message_name == "init")
+ {
+ LLPluginMessage message("base", "init_response");
+ LLSD versions = LLSD::emptyMap();
+ versions[LLPLUGIN_MESSAGE_CLASS_BASE] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION;
+ versions[LLPLUGIN_MESSAGE_CLASS_MEDIA] = LLPLUGIN_MESSAGE_CLASS_MEDIA_VERSION;
+ // Normally a plugin would only specify one of these two subclasses, but this is a demo...
+// versions[LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER] = LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER_VERSION;
+ versions[LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME] = LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME_VERSION;
+ message.setValueLLSD("versions", versions);
+
+ #ifdef LL_WINDOWS
+ if ( InitializeQTML( 0L ) != noErr )
+ {
+ //TODO: If no QT on Windows, this fails - respond accordingly.
+ //return false;
+ }
+ else
+ {
+// std::cerr << "QuickTime initialized" << std::endl;
+ };
+ #endif
+
+ EnterMovies();
+
+ std::string plugin_version = "QuickTime media plugin, QuickTime version ";
+
+ long version = 0;
+ Gestalt( gestaltQuickTimeVersion, &version );
+ std::ostringstream codec( "" );
+ codec << std::hex << version << std::dec;
+ plugin_version += codec.str();
+ message.setValue("plugin_version", plugin_version);
+ sendMessage(message);
+
+ // Plugin gets to decide the texture parameters to use.
+ message.setMessage(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params");
+ #if defined(LL_WINDOWS)
+ // Values for Windows
+ mDepth = 3;
+ message.setValueU32("format", GL_RGB);
+ message.setValueU32("type", GL_UNSIGNED_BYTE);
+
+ // We really want to pad the texture width to a multiple of 32 bytes, but since we're using 3-byte pixels, it doesn't come out even.
+ // Padding to a multiple of 3*32 guarantees it'll divide out properly.
+ message.setValueU32("padding", 32 * 3);
+ #else
+ // Values for Mac
+ mDepth = 4;
+ message.setValueU32("format", GL_BGRA_EXT);
+ #ifdef __BIG_ENDIAN__
+ message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8_REV );
+ #else
+ message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8);
+ #endif
+
+ // Pad texture width to a multiple of 32 bytes, to line up with cache lines.
+ message.setValueU32("padding", 32);
+ #endif
+ message.setValueS32("depth", mDepth);
+ message.setValueU32("internalformat", GL_RGB);
+ message.setValueBoolean("coords_opengl", true); // true == use OpenGL-style coordinates, false == (0,0) is upper left.
+ message.setValueBoolean("allow_downsample", true);
+ sendMessage(message);
+ }
+ else if(message_name == "idle")
+ {
+ // no response is necessary here.
+ F64 time = message_in.getValueReal("time");
+
+ // Convert time to milliseconds for update()
+ update((int)(time * 1000.0f));
+ }
+ else if(message_name == "cleanup")
+ {
+ // TODO: clean up here
+ }
+ else if(message_name == "shm_added")
+ {
+ SharedSegmentInfo info;
+ U64 address_lo = message_in.getValueU32("address");
+ U64 address_hi = message_in.hasValue("address_1") ? message_in.getValueU32("address_1") : 0;
+ info.mAddress = (void*)((address_lo) |
+ (address_hi * (U64(1)<<31)));
+ info.mSize = (size_t)message_in.getValueS32("size");
+ std::string name = message_in.getValue("name");
+
+
+// std::cerr << "MediaPluginQuickTime::receiveMessage: shared memory added, name: " << name
+// << ", size: " << info.mSize
+// << ", address: " << info.mAddress
+// << std::endl;
+
+ mSharedSegments.insert(SharedSegmentMap::value_type(name, info));
+
+ }
+ else if(message_name == "shm_remove")
+ {
+ std::string name = message_in.getValue("name");
+
+// std::cerr << "MediaPluginQuickTime::receiveMessage: shared memory remove, name = " << name << std::endl;
+
+ SharedSegmentMap::iterator iter = mSharedSegments.find(name);
+ if(iter != mSharedSegments.end())
+ {
+ if(mPixels == iter->second.mAddress)
+ {
+ // This is the currently active pixel buffer. Make sure we stop drawing to it.
+ mPixels = NULL;
+ mTextureSegmentName.clear();
+
+ // Make sure the movie GWorld is no longer pointed at the shared segment.
+ sizeChanged();
+ }
+ mSharedSegments.erase(iter);
+ }
+ else
+ {
+// std::cerr << "MediaPluginQuickTime::receiveMessage: unknown shared memory region!" << std::endl;
+ }
+
+ // Send the response so it can be cleaned up.
+ LLPluginMessage message("base", "shm_remove_response");
+ message.setValue("name", name);
+ sendMessage(message);
+ }
+ else
+ {
+// std::cerr << "MediaPluginQuickTime::receiveMessage: unknown base message: " << message_name << std::endl;
+ }
+ }
+ else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA)
+ {
+ if(message_name == "size_change")
+ {
+ std::string name = message_in.getValue("name");
+ S32 width = message_in.getValueS32("width");
+ S32 height = message_in.getValueS32("height");
+ S32 texture_width = message_in.getValueS32("texture_width");
+ S32 texture_height = message_in.getValueS32("texture_height");
+
+ //std::cerr << "---->Got size change instruction from application with name: " << name << " - size is " << width << " x " << height << std::endl;
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_response");
+ message.setValue("name", name);
+ message.setValueS32("width", width);
+ message.setValueS32("height", height);
+ message.setValueS32("texture_width", texture_width);
+ message.setValueS32("texture_height", texture_height);
+ sendMessage(message);
+
+ if(!name.empty())
+ {
+ // Find the shared memory region with this name
+ SharedSegmentMap::iterator iter = mSharedSegments.find(name);
+ if(iter != mSharedSegments.end())
+ {
+// std::cerr << "%%% Got size change, new size is " << width << " by " << height << std::endl;
+// std::cerr << "%%%% texture size is " << texture_width << " by " << texture_height << std::endl;
+
+ mPixels = (unsigned char*)iter->second.mAddress;
+ mTextureSegmentName = name;
+ mWidth = width;
+ mHeight = height;
+
+ mTextureWidth = texture_width;
+ mTextureHeight = texture_height;
+
+ mMediaSizeChanging = false;
+
+ sizeChanged();
+
+ update();
+ };
+ };
+ }
+ else if(message_name == "load_uri")
+ {
+ std::string uri = message_in.getValue("uri");
+ load( uri );
+ sendStatus();
+ }
+ else if(message_name == "mouse_event")
+ {
+ std::string event = message_in.getValue("event");
+ S32 x = message_in.getValueS32("x");
+ S32 y = message_in.getValueS32("y");
+
+ if(event == "down")
+ {
+ mouseDown(x, y);
+ }
+ else if(event == "up")
+ {
+ mouseUp(x, y);
+ }
+ else if(event == "move")
+ {
+ mouseMove(x, y);
+ };
+ };
+ }
+ else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME)
+ {
+ if(message_name == "stop")
+ {
+ stop();
+ }
+ else if(message_name == "start")
+ {
+ F64 rate = 0.0;
+ if(message_in.hasValue("rate"))
+ {
+ rate = message_in.getValueReal("rate");
+ }
+ play(rate);
+ }
+ else if(message_name == "pause")
+ {
+ pause();
+ }
+ else if(message_name == "seek")
+ {
+ F64 time = message_in.getValueReal("time");
+ seek(time);
+ }
+ else if(message_name == "set_loop")
+ {
+ bool loop = message_in.getValueBoolean("loop");
+ mIsLooping = loop;
+ }
+ else if(message_name == "set_volume")
+ {
+ F64 volume = message_in.getValueReal("volume");
+ setVolume(volume);
+ }
+ }
+ else
+ {
+// std::cerr << "MediaPluginQuickTime::receiveMessage: unknown message class: " << message_class << std::endl;
+ };
+ };
+}
+
+int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data)
+{
+ MediaPluginQuickTime *self = new MediaPluginQuickTime(host_send_func, host_user_data);
+ *plugin_send_func = MediaPluginQuickTime::staticReceiveMessage;
+ *plugin_user_data = (void*)self;
+
+ return 0;
+}
+
+#else // LL_QUICKTIME_ENABLED
+
+// Stubbed-out class with constructor/destructor (necessary or windows linker
+// will just think its dead code and optimize it all out)
+class MediaPluginQuickTime : public MediaPluginBase
+{
+public:
+ MediaPluginQuickTime(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data);
+ ~MediaPluginQuickTime();
+ /* virtual */ void receiveMessage(const char *message_string);
+};
+
+MediaPluginQuickTime::MediaPluginQuickTime(
+ LLPluginInstance::sendMessageFunction host_send_func,
+ void *host_user_data ) :
+ MediaPluginBase(host_send_func, host_user_data)
+{
+ // no-op
+}
+
+MediaPluginQuickTime::~MediaPluginQuickTime()
+{
+ // no-op
+}
+
+void MediaPluginQuickTime::receiveMessage(const char *message_string)
+{
+ // no-op
+}
+
+// We're building without quicktime enabled. Just refuse to initialize.
+int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data)
+{
+ return -1;
+}
+
+#endif // LL_QUICKTIME_ENABLED
diff --git a/linden/indra/media_plugins/webkit/CMakeLists.txt b/linden/indra/media_plugins/webkit/CMakeLists.txt
new file mode 100644
index 0000000..5bccd58
--- /dev/null
+++ b/linden/indra/media_plugins/webkit/CMakeLists.txt
@@ -0,0 +1,82 @@
+# -*- cmake -*-
+
+project(media_plugin_webkit)
+
+include(00-Common)
+include(LLCommon)
+include(LLImage)
+include(LLPlugin)
+include(LLMath)
+include(LLRender)
+include(LLWindow)
+include(Linking)
+include(PluginAPI)
+include(MediaPluginBase)
+include(FindOpenGL)
+
+include(WebKitLibPlugin)
+
+include_directories(
+ ${LLPLUGIN_INCLUDE_DIRS}
+ ${MEDIA_PLUGIN_BASE_INCLUDE_DIRS}
+ ${LLCOMMON_INCLUDE_DIRS}
+ ${LLMATH_INCLUDE_DIRS}
+ ${LLIMAGE_INCLUDE_DIRS}
+ ${LLRENDER_INCLUDE_DIRS}
+ ${LLWINDOW_INCLUDE_DIRS}
+)
+
+
+### media_plugin_webkit
+
+set(media_plugin_webkit_SOURCE_FILES
+ media_plugin_webkit.cpp
+ )
+
+add_library(media_plugin_webkit
+ SHARED
+ ${media_plugin_webkit_SOURCE_FILES}
+)
+
+target_link_libraries(media_plugin_webkit
+ ${LLPLUGIN_LIBRARIES}
+ ${MEDIA_PLUGIN_BASE_LIBRARIES}
+ ${LLCOMMON_LIBRARIES}
+ ${WEBKIT_PLUGIN_LIBRARIES}
+ ${PLUGIN_API_WINDOWS_LIBRARIES}
+)
+
+add_dependencies(media_plugin_webkit
+ ${LLPLUGIN_LIBRARIES}
+ ${MEDIA_PLUGIN_BASE_LIBRARIES}
+ ${LLCOMMON_LIBRARIES}
+)
+
+if (WINDOWS)
+ set_target_properties(
+ media_plugin_webkit
+ PROPERTIES
+ LINK_FLAGS "/MANIFEST:NO"
+ )
+endif (WINDOWS)
+
+if (DARWIN)
+ # Don't prepend 'lib' to the executable name, and don't embed a full path in the library's install name
+ set_target_properties(
+ media_plugin_webkit
+ PROPERTIES
+ PREFIX ""
+ BUILD_WITH_INSTALL_RPATH 1
+ INSTALL_NAME_DIR "@executable_path"
+ LINK_FLAGS "-exported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/../base/media_plugin_base.exp"
+ )
+
+ # copy the webkit dylib to the build directory
+ add_custom_command(
+ TARGET media_plugin_webkit POST_BUILD
+# OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/libllqtwebkit.dylib
+ COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libllqtwebkit.dylib ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/
+ DEPENDS media_plugin_webkit ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libllqtwebkit.dylib
+ )
+
+endif (DARWIN)
\ No newline at end of file
diff --git a/linden/indra/media_plugins/webkit/media_plugin_webkit.cpp b/linden/indra/media_plugins/webkit/media_plugin_webkit.cpp
new file mode 100644
index 0000000..f115c28
--- /dev/null
+++ b/linden/indra/media_plugins/webkit/media_plugin_webkit.cpp
@@ -0,0 +1,932 @@
+/**
+ * @file media_plugin_webkit.cpp
+ * @brief Webkit plugin for LLMedia API plugin system
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llqtwebkit.h"
+
+#include "linden_common.h"
+#include "indra_constants.h" // for indra keyboard codes
+
+#include "llgl.h"
+
+#include "llplugininstance.h"
+#include "llpluginmessage.h"
+#include "llpluginmessageclasses.h"
+#include "media_plugin_base.h"
+
+#if LL_WINDOWS
+#include
+#else
+#include
+#include
+#endif
+
+#if LL_WINDOWS
+ // NOTE - This captures the module handle of the dll. This is used below
+ // to get the path to this dll for webkit initialization.
+ // I don't know how/if this can be done with apr...
+ namespace { HMODULE gModuleHandle;};
+ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
+ {
+ gModuleHandle = (HMODULE) hinstDLL;
+ return TRUE;
+ }
+#endif
+
+////////////////////////////////////////////////////////////////////////////////
+//
+class MediaPluginWebKit :
+ public MediaPluginBase,
+ public LLEmbeddedBrowserWindowObserver
+{
+public:
+ MediaPluginWebKit(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data);
+ ~MediaPluginWebKit();
+
+ /*virtual*/ void receiveMessage(const char *message_string);
+
+private:
+
+ enum
+ {
+ INIT_STATE_UNINITIALIZED, // Browser instance hasn't been set up yet
+ INIT_STATE_NAVIGATING, // Browser instance has been set up and initial navigate to about:blank has been issued
+ INIT_STATE_NAVIGATE_COMPLETE, // initial navigate to about:blank has completed
+ INIT_STATE_WAIT_REDRAW, // First real navigate begin has been received, waiting for page changed event to start handling redraws
+ INIT_STATE_RUNNING // All initialization gymnastics are complete.
+ };
+ int mBrowserWindowId;
+ int mInitState;
+ std::string mInitialNavigateURL;
+ bool mNeedsUpdate;
+
+ bool mCanCut;
+ bool mCanCopy;
+ bool mCanPaste;
+ int mLastMouseX;
+ int mLastMouseY;
+ bool mFirstFocus;
+
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ void update(int milliseconds)
+ {
+ LLQtWebKit::getInstance()->pump( milliseconds );
+
+ checkEditState();
+
+ if(mInitState == INIT_STATE_NAVIGATE_COMPLETE)
+ {
+ if(!mInitialNavigateURL.empty())
+ {
+ // We already have the initial navigate URL -- kick off the navigate.
+ LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, mInitialNavigateURL );
+ mInitialNavigateURL.clear();
+ }
+ }
+
+ if ( (mInitState == INIT_STATE_RUNNING) && mNeedsUpdate )
+ {
+ const unsigned char* browser_pixels = LLQtWebKit::getInstance()->grabBrowserWindow( mBrowserWindowId );
+
+ unsigned int buffer_size = LLQtWebKit::getInstance()->getBrowserRowSpan( mBrowserWindowId ) * LLQtWebKit::getInstance()->getBrowserHeight( mBrowserWindowId );
+
+// std::cerr << "webkit plugin: updating" << std::endl;
+
+ // TODO: should get rid of this memcpy if possible
+ if ( mPixels && browser_pixels )
+ {
+// std::cerr << " memcopy of " << buffer_size << " bytes" << std::endl;
+ memcpy( mPixels, browser_pixels, buffer_size );
+ }
+
+ if ( mWidth > 0 && mHeight > 0 )
+ {
+// std::cerr << "Setting dirty, " << mWidth << " x " << mHeight << std::endl;
+ setDirty( 0, 0, mWidth, mHeight );
+ }
+
+ mNeedsUpdate = false;
+ };
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ bool initBrowser()
+ {
+ // already initialized
+ if ( mInitState > INIT_STATE_UNINITIALIZED )
+ return true;
+
+ // not enough information to initialize the browser yet.
+ if ( mWidth < 0 || mHeight < 0 || mDepth < 0 ||
+ mTextureWidth < 0 || mTextureHeight < 0 )
+ {
+ return false;
+ };
+
+ // set up directories
+ char cwd[ FILENAME_MAX ]; // I *think* this is defined on all platforms we use
+ if (NULL == getcwd( cwd, FILENAME_MAX - 1 ))
+ {
+ llwarns << "Couldn't get cwd - probably too long - failing to init." << llendl;
+ return false;
+ }
+ std::string application_dir = std::string( cwd );
+
+#if LL_WINDOWS
+ // NOTE - On windows, at least, the component path is the
+ // location of this dll's image file.
+ std::string component_dir;
+ char dll_path[_MAX_PATH];
+ DWORD len = GetModuleFileNameA(gModuleHandle, (LPCH)&dll_path, _MAX_PATH);
+ while(len && dll_path[ len ] != ('\\') )
+ {
+ len--;
+ }
+ if(len >= 0)
+ {
+ dll_path[len] = 0;
+ component_dir = dll_path;
+ }
+ else
+ {
+ // NOTE - This case should be a rare exception.
+ // GetModuleFileNameA should always give you a full path.
+ component_dir = application_dir;
+ }
+#else
+ std::string component_dir = application_dir;
+#endif
+ std::string profileDir = application_dir + "/" + "browser_profile"; // cross platform?
+
+ // window handle - needed on Windows and must be app window.
+#if LL_WINDOWS
+ char window_title[ MAX_PATH ];
+ GetConsoleTitleA( window_title, MAX_PATH );
+ void* native_window_handle = (void*)FindWindowA( NULL, window_title );
+#else
+ void* native_window_handle = 0;
+#endif
+
+ // main browser initialization
+ bool result = LLQtWebKit::getInstance()->init( application_dir, component_dir, profileDir, native_window_handle );
+ if ( result )
+ {
+ // create single browser window
+ mBrowserWindowId = LLQtWebKit::getInstance()->createBrowserWindow( mWidth, mHeight );
+
+#if LL_WINDOWS
+ // Enable plugins
+ LLQtWebKit::getInstance()->enablePlugins(true);
+#elif LL_DARWIN
+ // Disable plugins
+ LLQtWebKit::getInstance()->enablePlugins(false);
+#elif LL_LINUX
+ // Disable plugins
+ LLQtWebKit::getInstance()->enablePlugins(false);
+#endif
+
+ // tell LLQtWebKit about the size of the browser window
+ LLQtWebKit::getInstance()->setSize( mBrowserWindowId, mWidth, mHeight );
+
+ // observer events that LLQtWebKit emits
+ LLQtWebKit::getInstance()->addObserver( mBrowserWindowId, this );
+
+ // append details to agent string
+ LLQtWebKit::getInstance()->setBrowserAgentId( "LLPluginMedia Web Browser" );
+
+ // don't flip bitmap
+ LLQtWebKit::getInstance()->flipWindow( mBrowserWindowId, true );
+
+ // Set the background color to black - mostly for initial login page
+ LLQtWebKit::getInstance()->setBackgroundColor( mBrowserWindowId, 0x00, 0x00, 0x00 );
+
+ // Set state _before_ starting the navigate, since onNavigateBegin might get called before this call returns.
+ mInitState = INIT_STATE_NAVIGATING;
+
+ // Don't do this here -- it causes the dreaded "white flash" when loading a browser instance.
+ // FIXME: Re-added this because navigating to a "page" initializes things correctly - especially
+ // for the HTTP AUTH dialog issues (DEV-41731). Will fix at a later date.
+ LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, "about:blank" );
+
+ return true;
+ };
+
+ return false;
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // virtual
+ void onCursorChanged(const EventType& event)
+ {
+ LLQtWebKit::ECursor llqt_cursor = (LLQtWebKit::ECursor)event.getIntValue();
+ std::string name;
+
+ switch(llqt_cursor)
+ {
+ case LLQtWebKit::C_ARROW:
+ name = "arrow";
+ break;
+ case LLQtWebKit::C_IBEAM:
+ name = "ibeam";
+ break;
+ case LLQtWebKit::C_SPLITV:
+ name = "splitv";
+ break;
+ case LLQtWebKit::C_SPLITH:
+ name = "splith";
+ break;
+ case LLQtWebKit::C_POINTINGHAND:
+ name = "hand";
+ break;
+
+ default:
+ llwarns << "Unknown cursor ID: " << (int)llqt_cursor << llendl;
+ break;
+ }
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "cursor_changed");
+ message.setValue("name", name);
+ sendMessage(message);
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // virtual
+ void onPageChanged( const EventType& event )
+ {
+ if(mInitState == INIT_STATE_WAIT_REDRAW)
+ {
+ mInitState = INIT_STATE_RUNNING;
+ }
+
+ // flag that an update is required
+ mNeedsUpdate = true;
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // virtual
+ void onNavigateBegin(const EventType& event)
+ {
+ if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
+ {
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_begin");
+ message.setValue("uri", event.getEventUri());
+ sendMessage(message);
+
+ setStatus(STATUS_LOADING);
+ }
+
+ if(mInitState == INIT_STATE_NAVIGATE_COMPLETE)
+ {
+ mInitState = INIT_STATE_WAIT_REDRAW;
+ }
+
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // virtual
+ void onNavigateComplete(const EventType& event)
+ {
+ if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
+ {
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_complete");
+ message.setValue("uri", event.getEventUri());
+ message.setValueS32("result_code", event.getIntValue());
+ message.setValue("result_string", event.getStringValue());
+ message.setValueBoolean("history_back_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_BACK));
+ message.setValueBoolean("history_forward_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_FORWARD));
+ sendMessage(message);
+
+ setStatus(STATUS_LOADED);
+ }
+ else if(mInitState == INIT_STATE_NAVIGATING)
+ {
+ mInitState = INIT_STATE_NAVIGATE_COMPLETE;
+ }
+
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // virtual
+ void onUpdateProgress(const EventType& event)
+ {
+ if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
+ {
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "progress");
+ message.setValueS32("percent", event.getIntValue());
+ sendMessage(message);
+ }
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // virtual
+ void onStatusTextChange(const EventType& event)
+ {
+ if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
+ {
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "status_text");
+ message.setValue("status", event.getStringValue());
+ sendMessage(message);
+ }
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // virtual
+ void onTitleChange(const EventType& event)
+ {
+ if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
+ {
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text");
+ message.setValue("name", event.getStringValue());
+ sendMessage(message);
+ }
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // virtual
+ void onLocationChange(const EventType& event)
+ {
+ if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
+ {
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "location_changed");
+ message.setValue("uri", event.getEventUri());
+ sendMessage(message);
+ }
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // virtual
+ void onClickLinkHref(const EventType& event)
+ {
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "click_href");
+ message.setValue("uri", event.getStringValue());
+ message.setValue("target", event.getStringValue2());
+ sendMessage(message);
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // virtual
+ void onClickLinkNoFollow(const EventType& event)
+ {
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "click_nofollow");
+ message.setValue("uri", event.getStringValue());
+ sendMessage(message);
+ }
+
+ LLQtWebKit::EKeyboardModifier decodeModifiers(std::string &modifiers)
+ {
+ int result = 0;
+
+ if(modifiers.find("shift") != std::string::npos)
+ result |= LLQtWebKit::KM_MODIFIER_SHIFT;
+
+ if(modifiers.find("alt") != std::string::npos)
+ result |= LLQtWebKit::KM_MODIFIER_ALT;
+
+ if(modifiers.find("control") != std::string::npos)
+ result |= LLQtWebKit::KM_MODIFIER_CONTROL;
+
+ if(modifiers.find("meta") != std::string::npos)
+ result |= LLQtWebKit::KM_MODIFIER_META;
+
+ return (LLQtWebKit::EKeyboardModifier)result;
+ }
+
+
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ void keyEvent(LLQtWebKit::EKeyEvent key_event, int key, LLQtWebKit::EKeyboardModifier modifiers)
+ {
+ int llqt_key;
+
+ // The incoming values for 'key' will be the ones from indra_constants.h
+ // the outgoing values are the ones from llqtwebkit.h
+
+ switch((KEY)key)
+ {
+ // This is the list that the llqtwebkit implementation actually maps into Qt keys.
+// case KEY_XXX: llqt_key = LL_DOM_VK_CANCEL; break;
+// case KEY_XXX: llqt_key = LL_DOM_VK_HELP; break;
+ case KEY_BACKSPACE: llqt_key = LL_DOM_VK_BACK_SPACE; break;
+ case KEY_TAB: llqt_key = LL_DOM_VK_TAB; break;
+// case KEY_XXX: llqt_key = LL_DOM_VK_CLEAR; break;
+ case KEY_RETURN: llqt_key = LL_DOM_VK_RETURN; break;
+ case KEY_PAD_RETURN: llqt_key = LL_DOM_VK_ENTER; break;
+ case KEY_SHIFT: llqt_key = LL_DOM_VK_SHIFT; break;
+ case KEY_CONTROL: llqt_key = LL_DOM_VK_CONTROL; break;
+ case KEY_ALT: llqt_key = LL_DOM_VK_ALT; break;
+// case KEY_XXX: llqt_key = LL_DOM_VK_PAUSE; break;
+ case KEY_CAPSLOCK: llqt_key = LL_DOM_VK_CAPS_LOCK; break;
+ case KEY_ESCAPE: llqt_key = LL_DOM_VK_ESCAPE; break;
+ case KEY_PAGE_UP: llqt_key = LL_DOM_VK_PAGE_UP; break;
+ case KEY_PAGE_DOWN: llqt_key = LL_DOM_VK_PAGE_DOWN; break;
+ case KEY_END: llqt_key = LL_DOM_VK_END; break;
+ case KEY_HOME: llqt_key = LL_DOM_VK_HOME; break;
+ case KEY_LEFT: llqt_key = LL_DOM_VK_LEFT; break;
+ case KEY_UP: llqt_key = LL_DOM_VK_UP; break;
+ case KEY_RIGHT: llqt_key = LL_DOM_VK_RIGHT; break;
+ case KEY_DOWN: llqt_key = LL_DOM_VK_DOWN; break;
+// case KEY_XXX: llqt_key = LL_DOM_VK_PRINTSCREEN; break;
+ case KEY_INSERT: llqt_key = LL_DOM_VK_INSERT; break;
+ case KEY_DELETE: llqt_key = LL_DOM_VK_DELETE; break;
+// case KEY_XXX: llqt_key = LL_DOM_VK_CONTEXT_MENU; break;
+
+ default:
+ if(key < KEY_SPECIAL)
+ {
+ // Pass the incoming key through -- it should be regular ASCII, which should be correct for webkit.
+ llqt_key = key;
+ }
+ else
+ {
+ // Don't pass through untranslated special keys -- they'll be all wrong.
+ llqt_key = 0;
+ }
+ break;
+ }
+
+// std::cerr << "keypress, original code = 0x" << std::hex << key << ", converted code = 0x" << std::hex << llqt_key << std::dec << std::endl;
+
+ if(llqt_key != 0)
+ {
+ LLQtWebKit::getInstance()->keyEvent( mBrowserWindowId, key_event, llqt_key, modifiers);
+ }
+
+ checkEditState();
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ void unicodeInput( const std::string &utf8str, LLQtWebKit::EKeyboardModifier modifiers)
+ {
+ LLWString wstr = utf8str_to_wstring(utf8str);
+
+ unsigned int i;
+ for(i=0; i < wstr.size(); i++)
+ {
+// std::cerr << "unicode input, code = 0x" << std::hex << (unsigned long)(wstr[i]) << std::dec << std::endl;
+
+ LLQtWebKit::getInstance()->unicodeInput(mBrowserWindowId, wstr[i], modifiers);
+ }
+
+ checkEditState();
+ };
+
+ void checkEditState(void)
+ {
+ bool can_cut = LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_EDIT_CUT);
+ bool can_copy = LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_EDIT_COPY);
+ bool can_paste = LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_EDIT_PASTE);
+
+ if((can_cut != mCanCut) || (can_copy != mCanCopy) || (can_paste != mCanPaste))
+ {
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_state");
+
+ if(can_cut != mCanCut)
+ {
+ mCanCut = can_cut;
+ message.setValueBoolean("cut", can_cut);
+ }
+
+ if(can_copy != mCanCopy)
+ {
+ mCanCopy = can_copy;
+ message.setValueBoolean("copy", can_copy);
+ }
+
+ if(can_paste != mCanPaste)
+ {
+ mCanPaste = can_paste;
+ message.setValueBoolean("paste", can_paste);
+ }
+
+ sendMessage(message);
+
+ }
+ }
+
+};
+
+MediaPluginWebKit::MediaPluginWebKit(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data) :
+ MediaPluginBase(host_send_func, host_user_data)
+{
+// std::cerr << "MediaPluginWebKit constructor" << std::endl;
+
+ mBrowserWindowId = 0;
+ mInitState = INIT_STATE_UNINITIALIZED;
+ mNeedsUpdate = true;
+ mCanCut = false;
+ mCanCopy = false;
+ mCanPaste = false;
+ mLastMouseX = 0;
+ mLastMouseY = 0;
+ mFirstFocus = true;
+}
+
+MediaPluginWebKit::~MediaPluginWebKit()
+{
+ // unhook observer
+ LLQtWebKit::getInstance()->remObserver( mBrowserWindowId, this );
+
+ // clean up
+ LLQtWebKit::getInstance()->reset();
+
+// std::cerr << "MediaPluginWebKit destructor" << std::endl;
+}
+
+void MediaPluginWebKit::receiveMessage(const char *message_string)
+{
+// std::cerr << "MediaPluginWebKit::receiveMessage: received message: \"" << message_string << "\"" << std::endl;
+ LLPluginMessage message_in;
+
+ if(message_in.parse(message_string) >= 0)
+ {
+ std::string message_class = message_in.getClass();
+ std::string message_name = message_in.getName();
+ if(message_class == LLPLUGIN_MESSAGE_CLASS_BASE)
+ {
+ if(message_name == "init")
+ {
+ LLPluginMessage message("base", "init_response");
+ LLSD versions = LLSD::emptyMap();
+ versions[LLPLUGIN_MESSAGE_CLASS_BASE] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION;
+ versions[LLPLUGIN_MESSAGE_CLASS_MEDIA] = LLPLUGIN_MESSAGE_CLASS_MEDIA_VERSION;
+ versions[LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER] = LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER_VERSION;
+ message.setValueLLSD("versions", versions);
+
+ std::string plugin_version = "Webkit media plugin, Webkit version ";
+ plugin_version += LLQtWebKit::getInstance()->getVersion();
+ message.setValue("plugin_version", plugin_version);
+ sendMessage(message);
+
+ // Plugin gets to decide the texture parameters to use.
+ mDepth = 4;
+
+ message.setMessage(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params");
+ message.setValueS32("default_width", 1024);
+ message.setValueS32("default_height", 1024);
+ message.setValueS32("depth", mDepth);
+ message.setValueU32("internalformat", GL_RGBA);
+ message.setValueU32("format", GL_RGBA);
+ message.setValueU32("type", GL_UNSIGNED_BYTE);
+ message.setValueBoolean("coords_opengl", true);
+ sendMessage(message);
+ }
+ else if(message_name == "idle")
+ {
+ // no response is necessary here.
+ F64 time = message_in.getValueReal("time");
+
+ // Convert time to milliseconds for update()
+ update((int)(time * 1000.0f));
+ }
+ else if(message_name == "cleanup")
+ {
+ // TODO: clean up here
+ }
+ else if(message_name == "shm_added")
+ {
+ SharedSegmentInfo info;
+ info.mAddress = message_in.getValuePointer("address");
+ info.mSize = (size_t)message_in.getValueS32("size");
+ std::string name = message_in.getValue("name");
+
+
+// std::cerr << "MediaPluginWebKit::receiveMessage: shared memory added, name: " << name
+// << ", size: " << info.mSize
+// << ", address: " << info.mAddress
+// << std::endl;
+
+ mSharedSegments.insert(SharedSegmentMap::value_type(name, info));
+
+ }
+ else if(message_name == "shm_remove")
+ {
+ std::string name = message_in.getValue("name");
+
+// std::cerr << "MediaPluginWebKit::receiveMessage: shared memory remove, name = " << name << std::endl;
+
+ SharedSegmentMap::iterator iter = mSharedSegments.find(name);
+ if(iter != mSharedSegments.end())
+ {
+ if(mPixels == iter->second.mAddress)
+ {
+ // This is the currently active pixel buffer. Make sure we stop drawing to it.
+ mPixels = NULL;
+ mTextureSegmentName.clear();
+ }
+ mSharedSegments.erase(iter);
+ }
+ else
+ {
+// std::cerr << "MediaPluginWebKit::receiveMessage: unknown shared memory region!" << std::endl;
+ }
+
+ // Send the response so it can be cleaned up.
+ LLPluginMessage message("base", "shm_remove_response");
+ message.setValue("name", name);
+ sendMessage(message);
+ }
+ else
+ {
+// std::cerr << "MediaPluginWebKit::receiveMessage: unknown base message: " << message_name << std::endl;
+ }
+ }
+ else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA)
+ {
+ if(message_name == "size_change")
+ {
+ std::string name = message_in.getValue("name");
+ S32 width = message_in.getValueS32("width");
+ S32 height = message_in.getValueS32("height");
+ S32 texture_width = message_in.getValueS32("texture_width");
+ S32 texture_height = message_in.getValueS32("texture_height");
+
+ if(!name.empty())
+ {
+ // Find the shared memory region with this name
+ SharedSegmentMap::iterator iter = mSharedSegments.find(name);
+ if(iter != mSharedSegments.end())
+ {
+ mPixels = (unsigned char*)iter->second.mAddress;
+ mWidth = width;
+ mHeight = height;
+
+ // initialize (only gets called once)
+ initBrowser();
+
+ // size changed so tell the browser
+ LLQtWebKit::getInstance()->setSize( mBrowserWindowId, mWidth, mHeight );
+
+// std::cerr << "webkit plugin: set size to " << mWidth << " x " << mHeight
+// << ", rowspan is " << LLQtWebKit::getInstance()->getBrowserRowSpan(mBrowserWindowId) << std::endl;
+
+ S32 real_width = LLQtWebKit::getInstance()->getBrowserRowSpan(mBrowserWindowId) / LLQtWebKit::getInstance()->getBrowserDepth(mBrowserWindowId);
+
+ // The actual width the browser will be drawing to is probably smaller... let the host know by modifying texture_width in the response.
+ if(real_width <= texture_width)
+ {
+ texture_width = real_width;
+ }
+ else
+ {
+ // This won't work -- it'll be bigger than the allocated memory. This is a fatal error.
+// std::cerr << "Fatal error: browser rowbytes greater than texture width" << std::endl;
+ mDeleteMe = true;
+ return;
+ }
+
+ mTextureWidth = texture_width;
+ mTextureHeight = texture_height;
+
+ };
+ };
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_response");
+ message.setValue("name", name);
+ message.setValueS32("width", width);
+ message.setValueS32("height", height);
+ message.setValueS32("texture_width", texture_width);
+ message.setValueS32("texture_height", texture_height);
+ sendMessage(message);
+
+ }
+ else if(message_name == "load_uri")
+ {
+ std::string uri = message_in.getValue("uri");
+
+// std::cout << "loading URI: " << uri << std::endl;
+
+ if(!uri.empty())
+ {
+ if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
+ {
+ LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, uri );
+ }
+ else
+ {
+ mInitialNavigateURL = uri;
+ }
+ }
+ }
+ else if(message_name == "mouse_event")
+ {
+ std::string event = message_in.getValue("event");
+ S32 button = message_in.getValueS32("button");
+ mLastMouseX = message_in.getValueS32("x");
+ mLastMouseY = message_in.getValueS32("y");
+ std::string modifiers = message_in.getValue("modifiers");
+
+ // Treat unknown mouse events as mouse-moves.
+ LLQtWebKit::EMouseEvent mouse_event = LLQtWebKit::ME_MOUSE_MOVE;
+ if(event == "down")
+ {
+ mouse_event = LLQtWebKit::ME_MOUSE_DOWN;
+ }
+ else if(event == "up")
+ {
+ mouse_event = LLQtWebKit::ME_MOUSE_UP;
+ }
+ else if(event == "double_click")
+ {
+ mouse_event = LLQtWebKit::ME_MOUSE_DOUBLE_CLICK;
+ }
+
+ LLQtWebKit::getInstance()->mouseEvent( mBrowserWindowId, mouse_event, button, mLastMouseX, mLastMouseY, decodeModifiers(modifiers));
+ checkEditState();
+ }
+ else if(message_name == "scroll_event")
+ {
+ S32 x = message_in.getValueS32("x");
+ S32 y = message_in.getValueS32("y");
+ std::string modifiers = message_in.getValue("modifiers");
+
+ // Incoming scroll events are adjusted so that 1 detent is approximately 1 unit.
+ // Qt expects 1 detent to be 120 units.
+ // It also seems that our y scroll direction is inverted vs. what Qt expects.
+
+ x *= 120;
+ y *= -120;
+
+ LLQtWebKit::getInstance()->scrollWheelEvent(mBrowserWindowId, mLastMouseX, mLastMouseY, x, y, decodeModifiers(modifiers));
+ }
+ else if(message_name == "key_event")
+ {
+ std::string event = message_in.getValue("event");
+ S32 key = message_in.getValueS32("key");
+ std::string modifiers = message_in.getValue("modifiers");
+
+ // Treat unknown events as key-up for safety.
+ LLQtWebKit::EKeyEvent key_event = LLQtWebKit::KE_KEY_UP;
+ if(event == "down")
+ {
+ key_event = LLQtWebKit::KE_KEY_DOWN;
+ }
+ else if(event == "repeat")
+ {
+ key_event = LLQtWebKit::KE_KEY_REPEAT;
+ }
+
+ keyEvent(key_event, key, decodeModifiers(modifiers));
+ }
+ else if(message_name == "text_event")
+ {
+ std::string text = message_in.getValue("text");
+ std::string modifiers = message_in.getValue("modifiers");
+
+ unicodeInput(text, decodeModifiers(modifiers));
+ }
+ if(message_name == "edit_cut")
+ {
+ LLQtWebKit::getInstance()->userAction( mBrowserWindowId, LLQtWebKit::UA_EDIT_CUT );
+ checkEditState();
+ }
+ if(message_name == "edit_copy")
+ {
+ LLQtWebKit::getInstance()->userAction( mBrowserWindowId, LLQtWebKit::UA_EDIT_COPY );
+ checkEditState();
+ }
+ if(message_name == "edit_paste")
+ {
+ LLQtWebKit::getInstance()->userAction( mBrowserWindowId, LLQtWebKit::UA_EDIT_PASTE );
+ checkEditState();
+ }
+ else
+ {
+// std::cerr << "MediaPluginWebKit::receiveMessage: unknown media message: " << message_string << std::endl;
+ };
+ }
+ else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER)
+ {
+ if(message_name == "focus")
+ {
+ bool val = message_in.getValueBoolean("focused");
+ LLQtWebKit::getInstance()->focusBrowser( mBrowserWindowId, val );
+
+ if(mFirstFocus && val)
+ {
+ // On the first focus, post a tab key event. This fixes a problem with initial focus.
+ std::string empty;
+ keyEvent(LLQtWebKit::KE_KEY_DOWN, KEY_TAB, decodeModifiers(empty));
+ keyEvent(LLQtWebKit::KE_KEY_UP, KEY_TAB, decodeModifiers(empty));
+ mFirstFocus = false;
+ }
+ }
+ else if(message_name == "clear_cache")
+ {
+ LLQtWebKit::getInstance()->clearCache();
+ }
+ else if(message_name == "clear_cookies")
+ {
+ LLQtWebKit::getInstance()->clearAllCookies();
+ }
+ else if(message_name == "enable_cookies")
+ {
+ bool val = message_in.getValueBoolean("enable");
+ LLQtWebKit::getInstance()->enableCookies( val );
+ }
+ else if(message_name == "proxy_setup")
+ {
+ bool val = message_in.getValueBoolean("enable");
+ std::string host = message_in.getValue("host");
+ int port = message_in.getValueS32("port");
+ LLQtWebKit::getInstance()->enableProxy( val, host, port );
+ }
+ else if(message_name == "browse_stop")
+ {
+ LLQtWebKit::getInstance()->userAction( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_STOP );
+ }
+ else if(message_name == "browse_reload")
+ {
+ // foo = message_in.getValueBoolean("ignore_cache");
+ LLQtWebKit::getInstance()->userAction( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_RELOAD );
+ }
+ else if(message_name == "browse_forward")
+ {
+ LLQtWebKit::getInstance()->userAction( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_FORWARD );
+ }
+ else if(message_name == "browse_back")
+ {
+ LLQtWebKit::getInstance()->userAction( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_BACK );
+ }
+ else if(message_name == "set_status_redirect")
+ {
+ int code = message_in.getValueS32("code");
+ std::string url = message_in.getValue("url");
+ if ( 404 == code ) // browser lib only supports 404 right now
+ {
+ LLQtWebKit::getInstance()->set404RedirectUrl( mBrowserWindowId, url );
+ };
+ }
+ else if(message_name == "set_user_agent")
+ {
+ std::string user_agent = message_in.getValue("user_agent");
+ LLQtWebKit::getInstance()->setBrowserAgentId( user_agent );
+ }
+ else if(message_name == "init_history")
+ {
+ // Initialize browser history
+ LLSD history = message_in.getValueLLSD("history");
+ // First, clear the URL history
+ LLQtWebKit::getInstance()->clearHistory(mBrowserWindowId);
+ // Then, add the history items in order
+ LLSD::array_iterator iter_history = history.beginArray();
+ LLSD::array_iterator end_history = history.endArray();
+ for(; iter_history != end_history; ++iter_history)
+ {
+ std::string url = (*iter_history).asString();
+ if(! url.empty()) {
+ LLQtWebKit::getInstance()->prependHistoryUrl(mBrowserWindowId, url);
+ }
+ }
+ }
+ else
+ {
+// std::cerr << "MediaPluginWebKit::receiveMessage: unknown media_browser message: " << message_string << std::endl;
+ };
+ }
+ else
+ {
+// std::cerr << "MediaPluginWebKit::receiveMessage: unknown message class: " << message_class << std::endl;
+ };
+ }
+}
+
+int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data)
+{
+ MediaPluginWebKit *self = new MediaPluginWebKit(host_send_func, host_user_data);
+ *plugin_send_func = MediaPluginWebKit::staticReceiveMessage;
+ *plugin_user_data = (void*)self;
+
+ return 0;
+}
+
diff --git a/linden/indra/newview/CMakeLists.txt b/linden/indra/newview/CMakeLists.txt
index 1691095..15561d0 100644
--- a/linden/indra/newview/CMakeLists.txt
+++ b/linden/indra/newview/CMakeLists.txt
@@ -21,8 +21,8 @@ include(LLImage)
include(LLImageJ2COJ)
include(LLInventory)
include(LLMath)
-include(LLMedia)
include(LLMessage)
+include(LLPlugin)
include(LLPrimitive)
include(LLRender)
include(LLUI)
@@ -31,7 +31,6 @@ include(LLWindow)
include(LLXML)
include(LScript)
include(Linking)
-include(Mozlib)
include(NDOF)
include(GooglePerfTools)
include(TemplateCheck)
@@ -55,8 +54,8 @@ include_directories(
${LLIMAGE_INCLUDE_DIRS}
${LLINVENTORY_INCLUDE_DIRS}
${LLMATH_INCLUDE_DIRS}
- ${LLMEDIA_INCLUDE_DIRS}
${LLMESSAGE_INCLUDE_DIRS}
+ ${LLPLUGIN_INCLUDE_DIRS}
${LLPRIMITIVE_INCLUDE_DIRS}
${LLRENDER_INCLUDE_DIRS}
${LLUI_INCLUDE_DIRS}
@@ -65,7 +64,6 @@ include_directories(
${LLXML_INCLUDE_DIRS}
${LSCRIPT_INCLUDE_DIRS}
${LSCRIPT_INCLUDE_DIRS}/lscript_compile
- ${GSTREAMER_INCLUDE_DIRS}
)
set(viewer_SOURCE_FILES
@@ -185,9 +183,8 @@ set(viewer_SOURCE_FILES
llfloatergroups.cpp
llfloaterhandler.cpp
llfloaterhardwaresettings.cpp
- llfloaterhtml.cpp
llfloaterhtmlcurrency.cpp
- llfloaterhtmlhelp.cpp
+ llfloatermediabrowser.cpp
llfloaterhtmlsimple.cpp
llfloaterhud.cpp
llfloaterimagepreview.cpp
@@ -312,10 +309,12 @@ set(viewer_SOURCE_FILES
llpanelinput.cpp
llpanelinventory.cpp
llpanelland.cpp
+ llpanellandaudio.cpp
llpanellandmedia.cpp
llpanellandobjects.cpp
llpanellandoptions.cpp
llpanellogin.cpp
+ llpanelmediahud.cpp
llpanelmsgs.cpp
llpanelnetwork.cpp
llpanelobject.cpp
@@ -421,6 +420,8 @@ set(viewer_SOURCE_FILES
llviewerkeyboard.cpp
llviewerlayer.cpp
llviewermedia.cpp
+ llviewermediafocus.cpp
+ llviewermedia_streamingaudio.cpp
llviewermenu.cpp
llviewermenufile.cpp
llviewermessage.cpp
@@ -467,7 +468,7 @@ set(viewer_SOURCE_FILES
llwearable.cpp
llwearablelist.cpp
llweb.cpp
- llwebbrowserctrl.cpp
+ llmediactrl.cpp
llwindlightremotectrl.cpp
llwind.cpp
llwlanimator.cpp
@@ -630,9 +631,8 @@ set(viewer_HEADER_FILES
llfloatergroups.h
llfloaterhandler.h
llfloaterhardwaresettings.h
- llfloaterhtml.h
llfloaterhtmlcurrency.h
- llfloaterhtmlhelp.h
+ llfloatermediabrowser.h
llfloaterhtmlsimple.h
llfloaterhud.h
llfloaterimagepreview.h
@@ -756,11 +756,13 @@ set(viewer_HEADER_FILES
llpanelinput.h
llpanelinventory.h
llpanelland.h
+ llpanellandaudio.h
llpanellandmedia.h
llpanellandobjects.h
llpanellandoptions.h
llpanelLCD.h
llpanellogin.h
+ llpanelmediahud.h
llpanelmsgs.h
llpanelnetwork.h
llpanelobject.h
@@ -867,6 +869,8 @@ set(viewer_HEADER_FILES
llviewerkeyboard.h
llviewerlayer.h
llviewermedia.h
+ llviewermediaobserver.h
+ llviewermediafocus.h
llviewermenu.h
llviewermenufile.h
llviewermessage.h
@@ -915,7 +919,7 @@ set(viewer_HEADER_FILES
llwearable.h
llwearablelist.h
llweb.h
- llwebbrowserctrl.h
+ llmediactrl.h
llwind.h
llwindebug.h
llwindlightremotectrl.h
@@ -1118,6 +1122,7 @@ if (WINDOWS)
if (INTEL_MEMOPS_LIBRARY)
list(APPEND viewer_LIBRARIES ${INTEL_MEMOPS_LIBRARY})
endif (INTEL_MEMOPS_LIBRARY)
+ use_prebuilt_binary(dbghelp)
endif (WINDOWS)
# Add the xui files. This is handy for searching for xui elements
@@ -1134,6 +1139,8 @@ set(viewer_XUI_FILES
)
+list(APPEND viewer_XUI_FILES ${viewer_XUI_FILE_GLOB_LIST})
+list(SORT viewer_XUI_FILES)
list(APPEND viewer_XUI_FILES ${viewer_XUI_FILE_GLOB_LIST})
list(SORT viewer_XUI_FILES)
@@ -1169,6 +1176,7 @@ set(viewer_APPSETTINGS_FILES
${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg
)
+
source_group("App Settings" FILES ${viewer_APPSETTINGS_FILES})
set_source_files_properties(${viewer_APPSETTINGS_FILES}
@@ -1326,6 +1334,9 @@ if (WINDOWS)
--touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/touched.bat
DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
)
+
+ add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit)
+
if (PACKAGE)
add_custom_target(package ALL DEPENDS ${CMAKE_CFG_INTDIR}/touched.bat)
add_dependencies(package windows-updater windows-crash-logger)
@@ -1338,8 +1349,8 @@ target_link_libraries(${VIEWER_BINARY_NAME}
${LLIMAGE_LIBRARIES}
${LLIMAGEJ2COJ_LIBRARIES}
${LLINVENTORY_LIBRARIES}
- ${LLMEDIA_LIBRARIES}
${LLMESSAGE_LIBRARIES}
+ ${LLPLUGIN_LIBRARIES}
${LLPRIMITIVE_LIBRARIES}
${LLRENDER_LIBRARIES}
${FREETYPE_LIBRARIES}
@@ -1361,7 +1372,6 @@ target_link_libraries(${VIEWER_BINARY_NAME}
${OPENGL_LIBRARIES}
${FMODWRAPPER_LIBRARY}
${OPENGL_LIBRARIES}
- ${MOZLIB_LIBRARIES}
${JSONCPP_LIBRARIES}
${SDL_LIBRARY}
${SMARTHEAP_LIBRARY}
@@ -1443,6 +1453,8 @@ if (DARWIN)
DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
)
+ add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_gstreamer010 media_plugin_webkit)
+
if (PACKAGE)
add_custom_target(package ALL DEPENDS ${VIEWER_BINARY_NAME})
add_dependencies(package mac-updater mac-crash-logger)
@@ -1461,6 +1473,8 @@ if (DARWIN)
--build=${CMAKE_CURRENT_BINARY_DIR}
--dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app
--touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched
+
+ add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit)
DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
)
@@ -1492,3 +1506,65 @@ if (INSTALL)
endif (INSTALL)
ADD_VIEWER_BUILD_TEST(llagentaccess viewer)
+
+# Don't do these for DARWIN or LINUX here -- they're taken care of by viewer_manifest.py
+if (WINDOWS)
+ get_target_property(BUILT_SLPLUGIN SLPlugin LOCATION)
+ add_custom_command(
+ TARGET ${VIEWER_BINARY_NAME} POST_BUILD
+ COMMAND ${CMAKE_COMMAND}
+ ARGS
+ -E
+ copy_if_different
+ ${BUILT_SLPLUGIN}
+ ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
+ COMMENT "Copying SLPlugin executable to the runtime folder."
+ )
+
+ get_target_property(BUILT_WEBKIT_PLUGIN media_plugin_webkit LOCATION)
+ add_custom_command(
+ TARGET ${VIEWER_BINARY_NAME} POST_BUILD
+ COMMAND ${CMAKE_COMMAND}
+ ARGS
+ -E
+ copy_if_different
+ ${BUILT_WEBKIT_PLUGIN}
+ ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin
+ COMMENT "Copying WebKit Plugin to the runtime folder."
+ )
+
+ get_target_property(BUILT_QUICKTIME_PLUGIN media_plugin_quicktime LOCATION)
+ add_custom_command(
+ TARGET ${VIEWER_BINARY_NAME} POST_BUILD
+ COMMAND ${CMAKE_COMMAND}
+ ARGS
+ -E
+ copy_if_different
+ ${BUILT_QUICKTIME_PLUGIN}
+ ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin
+ COMMENT "Copying Quicktime Plugin to the runtime folder."
+ )
+
+ # Copying the mime_types.xml file to app_settings
+ set(mime_types_source "${CMAKE_SOURCE_DIR}/newview/skins/default/xui/en-us")
+ set(mime_types_dest "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings")
+ add_custom_command(
+ TARGET ${VIEWER_BINARY_NAME} POST_BUILD
+ COMMAND ${CMAKE_COMMAND}
+ ARGS
+ -E
+ copy_if_different
+ ${mime_types_source}/mime_types_windows.xml
+ ${mime_types_dest}/mime_types.xml
+ COMMENT "Copying mime_types_windows.xml to mime_types.xml."
+ )
+
+endif (WINDOWS)
+
+if (DARWIN)
+# Don't do this here -- it's taken care of by viewer_manifest.py
+# add_custom_command(TARGET ${VIEWER_BINARY_NAME} POST_BUILD
+# COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libllqtwebkit.dylib ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin/
+# DEPENDS ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libllqtwebkit.dylib
+# )
+endif (DARWIN)
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index 0a27aa2..4d80845 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -7624,7 +7624,40 @@
Value
0
- MemoryLogFrequency
+ MediaControlFadeTime
+
+ Comment
+ Amount of time (in seconds) that the media control fades
+ Persist
+ 1
+ Type
+ F32
+ Value
+ 1.5
+
+ MediaControlTimeout
+
+ Comment
+ Amount of time (in seconds) for media controls to fade with no mouse activity
+ Persist
+ 1
+ Type
+ F32
+ Value
+ 3.0
+
+ MediaOnAPrimUI
+
+ Comment
+ Whether or not to show the "link sharing" UI
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 0
+
+ MemoryLogFrequency
Comment
Seconds between display of Memory in log (0 for never)
diff --git a/linden/indra/newview/chatbar_as_cmdline.cpp b/linden/indra/newview/chatbar_as_cmdline.cpp
index 59804c0..d90bcd8 100644
--- a/linden/indra/newview/chatbar_as_cmdline.cpp
+++ b/linden/indra/newview/chatbar_as_cmdline.cpp
@@ -16,7 +16,7 @@
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
- * THIS SOFTWARE IS PROVIDED BY MODULAR SYSTEMS AND CONTRIBUTORS “AS IS”
+ * THIS SOFTWARE IS PROVIDED BY MODULAR SYSTEMS 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 MODULAR SYSTEMS OR CONTRIBUTORS
@@ -69,7 +69,7 @@
#include "llviewerparcelmgr.h"
#include "llviewerparcelmedia.h"
#include "llparcel.h"
-#include "audioengine.h"
+#include "llaudioengine.h"
#include "llviewerparcelmediaautoplay.h"
#include "lloverlaybar.h"
#include "lggautocorrectfloater.h"
diff --git a/linden/indra/newview/floatervoicelicense.cpp b/linden/indra/newview/floatervoicelicense.cpp
index 4004290..74d16c3 100644
--- a/linden/indra/newview/floatervoicelicense.cpp
+++ b/linden/indra/newview/floatervoicelicense.cpp
@@ -27,7 +27,7 @@
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
-
+/*
#include "llviewerprecompiledheaders.h"
#include "floatervoicelicense.h"
@@ -234,4 +234,4 @@ void FloaterVoiceLicense::onNavigateComplete( const EventType& eventIn )
LLCheckBoxCtrl * license_agreement = getChild("agree_chk");
license_agreement->setEnabled( true );
}
-}
+}*/
diff --git a/linden/indra/newview/floatervoicelicense.h b/linden/indra/newview/floatervoicelicense.h
index 4130d22..9d2012d 100644
--- a/linden/indra/newview/floatervoicelicense.h
+++ b/linden/indra/newview/floatervoicelicense.h
@@ -35,8 +35,8 @@
#include "llmodaldialog.h"
#include "llassetstorage.h"
-#include "llwebbrowserctrl.h"
-
+//imprudence fixme: removed for media plugins #include "llwebbrowserctrl.h"
+/*
class LLButton;
class LLRadioGroup;
class LLVFS;
@@ -45,7 +45,7 @@ class LLUUID;
class FloaterVoiceLicense :
public LLModalDialog,
- public LLWebBrowserCtrlObserver,
+ public LLViewerMediaObserver
public LLFloaterSingleton
{
public:
@@ -67,6 +67,6 @@ public:
private:
int mWebBrowserWindowId;
int mLoadCompleteCount;
-};
+};*/
#endif // FLOATERVOICELICENSE_H
diff --git a/linden/indra/newview/llagent.cpp b/linden/indra/newview/llagent.cpp
index 51b6c53..5bcffdb 100644
--- a/linden/indra/newview/llagent.cpp
+++ b/linden/indra/newview/llagent.cpp
@@ -77,6 +77,7 @@
#include "llfloaterdirectory.h"
#include "llfloatergroupinfo.h"
#include "llfloatergroups.h"
+#include "llfloaterland.h"
#include "llfloatermap.h"
#include "llfloatermute.h"
#include "llfloatersnapshot.h"
@@ -113,6 +114,7 @@
#include "llurldispatcher.h"
#include "llviewercamera.h"
#include "llviewerinventory.h"
+#include "llviewermediafocus.h"
#include "llviewermenu.h"
#include "llviewernetwork.h"
#include "llviewerobjectlist.h"
@@ -6061,7 +6063,11 @@ bool LLAgent::teleportCore(bool is_local)
LLFloaterWorldMap::hide(NULL);
LLFloaterDirectory::hide(NULL);
+ // hide land floater too - it'll be out of date
+ LLFloaterLand::hideInstance();
+
LLViewerParcelMgr::getInstance()->deselectLand();
+ LLViewerMediaFocus::getInstance()->setFocusFace(false, NULL, 0, NULL);
// Close all pie menus, deselect land, etc.
// Don't change the camera until we know teleport succeeded. JC
diff --git a/linden/indra/newview/llappviewer.cpp b/linden/indra/newview/llappviewer.cpp
index b3f3e59..86c83b9 100644
--- a/linden/indra/newview/llappviewer.cpp
+++ b/linden/indra/newview/llappviewer.cpp
@@ -61,8 +61,8 @@
#include "llviewerwindow.h"
#include "llviewerdisplay.h"
#include "llviewermedia.h"
-
-
+#include "llviewerparcelmedia.h"
+#include "llviewermediafocus.h"
#include "llviewermessage.h"
#include "llviewerobjectlist.h"
#include "llworldmap.h"
@@ -103,7 +103,8 @@
#include "llassetstorage.h"
#include "llpolymesh.h"
#include "llcachename.h"
-#include "audioengine.h"
+#include "llaudioengine.h"
+#include "llstreamingaudio.h"
#include "llviewermenu.h"
#include "llselectmgr.h"
#include "lltrans.h"
@@ -1257,6 +1258,14 @@ bool LLAppViewer::cleanup()
if (gAudiop)
{
+ // shut down the streaming audio sub-subsystem first, in case it relies on not outliving the general audio subsystem.
+
+ LLStreamingAudioInterface *sai = gAudiop->getStreamingAudioImpl();
+ delete sai;
+ gAudiop->setStreamingAudioImpl(NULL);
+
+ // shut down the audio subsystem
+
bool want_longname = false;
if (gAudiop->getDriverName(want_longname) == "FMOD")
{
@@ -1483,7 +1492,9 @@ bool LLAppViewer::cleanup()
//Note:
//LLViewerMedia::cleanupClass() has to be put before gImageList.shutdown()
//because some new image might be generated during cleaning up media. --bao
+ LLViewerMediaFocus::cleanupClass();
LLViewerMedia::cleanupClass();
+ LLViewerParcelMedia::cleanupClass();
gImageList.shutdown(); // shutdown again in case a callback added something
LLUIImageList::getInstance()->cleanUp();
@@ -3671,6 +3682,9 @@ void LLAppViewer::idle()
gAgent.updateCamera();
}
+ // update media focus
+ LLViewerMediaFocus::getInstance()->update();
+
// objects and camera should be in sync, do LOD calculations now
{
LLFastTimer t(LLFastTimer::FTM_LOD_UPDATE);
diff --git a/linden/indra/newview/llappviewerlinux.cpp b/linden/indra/newview/llappviewerlinux.cpp
index bfad899..307f925 100644
--- a/linden/indra/newview/llappviewerlinux.cpp
+++ b/linden/indra/newview/llappviewerlinux.cpp
@@ -437,7 +437,7 @@ gboolean viewer_app_api_GoSLURL(ViewerAppAPI *obj, gchar *slurl, gboolean **succ
llinfos << "Was asked to go to slurl: " << slurl << llendl;
std::string url = slurl;
- LLWebBrowserCtrl* web = NULL;
+ LLMediaCtrl* web = NULL;
const bool trusted_browser = false;
if (LLURLDispatcher::dispatch(url, web, trusted_browser))
{
diff --git a/linden/indra/newview/llappviewermacosx.cpp b/linden/indra/newview/llappviewermacosx.cpp
index 3cd0836..3a993eb 100644
--- a/linden/indra/newview/llappviewermacosx.cpp
+++ b/linden/indra/newview/llappviewermacosx.cpp
@@ -1,6 +1,6 @@
/**
* @file llappviewermacosx.cpp
- * @brief The LLAppViewerWin32 class definitions
+ * @brief The LLAppViewerMacOSX class definitions
*
* $LicenseInfo:firstyear=2007&license=viewergpl$
*
@@ -476,7 +476,7 @@ OSErr AEGURLHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn)
url.replace(0, prefix.length(), "secondlife:///app/");
}
- LLWebBrowserCtrl* web = NULL;
+ LLMediaCtrl* web = NULL;
const bool trusted_browser = false;
LLURLDispatcher::dispatch(url, web, trusted_browser);
}
diff --git a/linden/indra/newview/llassetuploadresponders.cpp b/linden/indra/newview/llassetuploadresponders.cpp
index aff1fb8..b9ec9a0 100644
--- a/linden/indra/newview/llassetuploadresponders.cpp
+++ b/linden/indra/newview/llassetuploadresponders.cpp
@@ -287,7 +287,8 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)
LLInventoryView* view = LLInventoryView::getActiveInventory();
if(view)
{
- LLUICtrl* focus_ctrl = gFocusMgr.getKeyboardFocus();
+ LLFocusableElement* focus = gFocusMgr.getKeyboardFocus();
+
view->getPanel()->setSelection(content["new_inventory_item"].asUUID(), TAKE_FOCUS_NO);
if((LLAssetType::AT_TEXTURE == asset_type || LLAssetType::AT_SOUND == asset_type)
&& LLFilePicker::instance().getFileCount() <= FILE_COUNT_DISPLAY_THRESHOLD)
@@ -296,7 +297,7 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)
}
//LLInventoryView::dumpSelectionInformation((void*)view);
// restore keyboard focus
- gFocusMgr.setKeyboardFocus(focus_ctrl);
+ gFocusMgr.setKeyboardFocus(focus);
}
}
else
diff --git a/linden/indra/newview/llaudiosourcevo.h b/linden/indra/newview/llaudiosourcevo.h
index e7bb283..4b70f8b 100644
--- a/linden/indra/newview/llaudiosourcevo.h
+++ b/linden/indra/newview/llaudiosourcevo.h
@@ -34,7 +34,7 @@
#ifndef LL_LLAUDIOSOURCEVO_H
#define LL_LLAUDIOSOURCEVO_H
-#include "audioengine.h"
+#include "llaudioengine.h"
#include "llviewerobject.h"
class LLViewerObject;
diff --git a/linden/indra/newview/llchatbar.cpp b/linden/indra/newview/llchatbar.cpp
index 0a4ca34..99a2a22 100644
--- a/linden/indra/newview/llchatbar.cpp
+++ b/linden/indra/newview/llchatbar.cpp
@@ -955,7 +955,7 @@ public:
// Your code here
bool handle(const LLSD& tokens, const LLSD& query_map,
- LLWebBrowserCtrl* web)
+ LLMediaCtrl* web)
{
if (tokens.size() < 2) return false;
S32 channel = tokens[0].asInteger();
diff --git a/linden/indra/newview/llcommandhandler.cpp b/linden/indra/newview/llcommandhandler.cpp
index 422c94a..a04182a 100644
--- a/linden/indra/newview/llcommandhandler.cpp
+++ b/linden/indra/newview/llcommandhandler.cpp
@@ -55,7 +55,7 @@ public:
bool dispatch(const std::string& cmd,
const LLSD& params,
const LLSD& query_map,
- LLWebBrowserCtrl* web,
+ LLMediaCtrl* web,
bool trusted_browser);
private:
@@ -84,7 +84,7 @@ void LLCommandHandlerRegistry::add(const char* cmd, bool require_trusted_browser
bool LLCommandHandlerRegistry::dispatch(const std::string& cmd,
const LLSD& params,
const LLSD& query_map,
- LLWebBrowserCtrl* web,
+ LLMediaCtrl* web,
bool trusted_browser)
{
std::map::iterator it = mMap.find(cmd);
@@ -126,7 +126,7 @@ LLCommandHandler::~LLCommandHandler()
bool LLCommandDispatcher::dispatch(const std::string& cmd,
const LLSD& params,
const LLSD& query_map,
- LLWebBrowserCtrl* web,
+ LLMediaCtrl* web,
bool trusted_browser)
{
return LLCommandHandlerRegistry::instance().dispatch(
diff --git a/linden/indra/newview/llcommandhandler.h b/linden/indra/newview/llcommandhandler.h
index ab4c2cc..5cb3ee7 100644
--- a/linden/indra/newview/llcommandhandler.h
+++ b/linden/indra/newview/llcommandhandler.h
@@ -47,7 +47,7 @@ public:
// Your code here
bool handle(const LLSD& tokens, const LLSD& query_map,
- LLWebBrowserCtrl* web)
+ LLMediaCtrl* web)
{
if (tokens.size() < 1) return false;
LLUUID id( tokens[0] );
@@ -60,7 +60,7 @@ LLFooHandler gFooHandler;
*/
-class LLWebBrowserCtrl;
+class LLMediaCtrl;
class LLCommandHandler
{
@@ -68,14 +68,14 @@ public:
LLCommandHandler(const char* command, bool allow_from_untrusted_browser);
// Automatically registers object to get called when
// command is executed. All commands can be processed
- // in links from LLWebBrowserCtrl, but some (like teleport)
+ // in links from LLMediaCtrl, but some (like teleport)
// should not be allowed from outside the app.
virtual ~LLCommandHandler();
virtual bool handle(const LLSD& params,
const LLSD& query_map,
- LLWebBrowserCtrl* web) = 0;
+ LLMediaCtrl* web) = 0;
// For URL secondlife:///app/foo/bar/baz?cat=1&dog=2
// @params - array of "bar", "baz", possibly empty
// @query_map - map of "cat" -> 1, "dog" -> 2, possibly empty
@@ -91,7 +91,7 @@ public:
static bool dispatch(const std::string& cmd,
const LLSD& params,
const LLSD& query_map,
- LLWebBrowserCtrl* web,
+ LLMediaCtrl* web,
bool trusted_browser);
// Execute a command registered via the above mechanism,
// passing string parameters.
diff --git a/linden/indra/newview/llfirstuse.cpp b/linden/indra/newview/llfirstuse.cpp
index e82aa96..ca8614c 100644
--- a/linden/indra/newview/llfirstuse.cpp
+++ b/linden/indra/newview/llfirstuse.cpp
@@ -397,8 +397,8 @@ void LLFirstUse::voiceLicenseAgreement()
{
gSavedSettings.setWarning("FirstVoiceLicense", FALSE);
- FloaterVoiceLicense::getInstance()->open();
- FloaterVoiceLicense::getInstance()->center();
+// imprudence fixme FloaterVoiceLicense::getInstance()->open();
+// FloaterVoiceLicense::getInstance()->center();
}
else // currently in STATE_LOGIN_VOICE_LICENSE when arriving here
{
diff --git a/linden/indra/newview/llfloaterabout.cpp b/linden/indra/newview/llfloaterabout.cpp
index 1945df4..d2d1250 100644
--- a/linden/indra/newview/llfloaterabout.cpp
+++ b/linden/indra/newview/llfloaterabout.cpp
@@ -42,7 +42,7 @@
#include "llcurl.h"
#include "llimagej2c.h"
-#include "audioengine.h"
+#include "llaudioengine.h"
#include "hippoGridManager.h"
#include "llviewertexteditor.h"
@@ -57,7 +57,6 @@
#include "lltrans.h"
#include "llappviewer.h"
#include "llglheaders.h"
-#include "llmediamanager.h"
#include "llwindow.h"
#include "viewerversion.h"
@@ -244,26 +243,10 @@ LLFloaterAbout::LLFloaterAbout()
support.append("\n");
- LLMediaManager *mgr = LLMediaManager::getInstance();
- if (mgr)
- {
- LLMediaBase *gstreamer = mgr->createSourceFromMimeType("http", "audio/mpeg");
- if (gstreamer)
- {
- support.append("GStreamer Version: ");
- support.append( gstreamer->getVersion() );
- support.append("\n");
- }
-
- LLMediaBase *media_source = mgr->createSourceFromMimeType("http", "text/html");
- if (media_source)
- {
- support.append("LLMozLib Version: ");
- support.append(media_source->getVersion());
- support.append("\n");
- mgr->destroySource(media_source);
- }
- }
+ // TODO: Implement media plugin version query
+
+ support.append("Qt Webkit Version: 4.5.2 ");
+ support.append("\n");
if (gPacketsIn > 0)
{
diff --git a/linden/indra/newview/llfloateravatarinfo.cpp b/linden/indra/newview/llfloateravatarinfo.cpp
index 21f160e..0618875 100644
--- a/linden/indra/newview/llfloateravatarinfo.cpp
+++ b/linden/indra/newview/llfloateravatarinfo.cpp
@@ -63,7 +63,7 @@ public:
LLAgentHandler() : LLCommandHandler("agent", true) { }
bool handle(const LLSD& params, const LLSD& query_map,
- LLWebBrowserCtrl* web)
+ LLMediaCtrl* web)
{
if (params.size() < 2) return false;
LLUUID agent_id;
diff --git a/linden/indra/newview/llfloaterchat.cpp b/linden/indra/newview/llfloaterchat.cpp
index 59f4d70..2daa5aa 100644
--- a/linden/indra/newview/llfloaterchat.cpp
+++ b/linden/indra/newview/llfloaterchat.cpp
@@ -190,6 +190,15 @@ void LLFloaterChat::setMinimized(BOOL minimized)
updateConsoleVisibility();
}
+// linden library includes
+#include "llaudioengine.h"
+#include "llchat.h"
+#include "llfontgl.h"
+#include "llrect.h"
+#include "llerror.h"
+#include "llstring.h"
+#include "llwindow.h"
+#include "message.h"
void LLFloaterChat::updateConsoleVisibility()
{
@@ -583,13 +592,54 @@ void LLFloaterChat::addChat(const LLChat& chat,
if(from_instant_message && gSavedSettings.getBOOL("IMInChatHistory"))
addChatHistory(chat,false);
- LLTextParser* highlight = LLTextParser::getInstance();
- highlight->triggerAlerts(gAgent.getID(), gAgent.getPositionGlobal(), chat.mText, gViewerWindow->getWindow());
+ triggerAlerts(chat.mText);
if(!from_instant_message)
addChatHistory(chat);
}
+// Moved from lltextparser.cpp to break llui/llaudio library dependency.
+//static
+void LLFloaterChat::triggerAlerts(const std::string& text)
+{
+ LLTextParser* parser = LLTextParser::getInstance();
+// bool spoken=FALSE;
+ for (S32 i=0;imHighlights.size();i++)
+ {
+ LLSD& highlight = parser->mHighlights[i];
+ if (parser->findPattern(text,highlight) >= 0 )
+ {
+ if(gAudiop)
+ {
+ if ((std::string)highlight["sound_lluuid"] != LLUUID::null.asString())
+ {
+ gAudiop->triggerSound(highlight["sound_lluuid"].asUUID(),
+ gAgent.getID(),
+ 1.f,
+ LLAudioEngine::AUDIO_TYPE_UI,
+ gAgent.getPositionGlobal() );
+ }
+/*
+ if (!spoken)
+ {
+ LLTextToSpeech* text_to_speech = NULL;
+ text_to_speech = LLTextToSpeech::getInstance();
+ spoken = text_to_speech->speak((LLString)highlight["voice"],text);
+ }
+ */
+ }
+ if (highlight["flash"])
+ {
+ LLWindow* viewer_window = gViewerWindow->getWindow();
+ if (viewer_window && viewer_window->getMinimized())
+ {
+ viewer_window->flashIcon(5.f);
+ }
+ }
+ }
+ }
+}
+
LLColor4 get_text_color(const LLChat& chat)
{
LLColor4 text_color;
diff --git a/linden/indra/newview/llfloaterchat.h b/linden/indra/newview/llfloaterchat.h
index 5a26567..f8683b9 100644
--- a/linden/indra/newview/llfloaterchat.h
+++ b/linden/indra/newview/llfloaterchat.h
@@ -78,6 +78,8 @@ public:
// Add chat to history alone.
static void addChatHistory(const LLChat& chat, bool log_to_file = true);
+ static void triggerAlerts(const std::string& text);
+
static void onClickMute(void *data);
static void onClickToggleShowMute(LLUICtrl* caller, void *data);
static void onClickToggleTranslateChat(LLUICtrl* caller, void *data);
diff --git a/linden/indra/newview/llfloaterclassified.cpp b/linden/indra/newview/llfloaterclassified.cpp
index d426e04..0760303 100644
--- a/linden/indra/newview/llfloaterclassified.cpp
+++ b/linden/indra/newview/llfloaterclassified.cpp
@@ -57,7 +57,7 @@ public:
// requires trusted browser to trigger
LLClassifiedHandler() : LLCommandHandler("classified", true) { }
bool handle(const LLSD& tokens, const LLSD& query_map,
- LLWebBrowserCtrl* web)
+ LLMediaCtrl* web)
{
if (tokens.size() < 2)
{
diff --git a/linden/indra/newview/llfloaterevent.cpp b/linden/indra/newview/llfloaterevent.cpp
index 485c13c..0ec2a76 100644
--- a/linden/indra/newview/llfloaterevent.cpp
+++ b/linden/indra/newview/llfloaterevent.cpp
@@ -58,7 +58,7 @@ public:
// requires trusted browser to trigger
LLEventHandler() : LLCommandHandler("event", true) { }
bool handle(const LLSD& tokens, const LLSD& query_map,
- LLWebBrowserCtrl* web)
+ LLMediaCtrl* web)
{
if (tokens.size() < 2)
{
diff --git a/linden/indra/newview/llfloatergroupinfo.cpp b/linden/indra/newview/llfloatergroupinfo.cpp
index 6fbd5e1..3ae7d5a 100644
--- a/linden/indra/newview/llfloatergroupinfo.cpp
+++ b/linden/indra/newview/llfloatergroupinfo.cpp
@@ -60,7 +60,7 @@ public:
// requires trusted browser to trigger
LLGroupHandler() : LLCommandHandler("group", true) { }
bool handle(const LLSD& tokens, const LLSD& query_map,
- LLWebBrowserCtrl* web)
+ LLMediaCtrl* web)
{
if (tokens.size() < 1)
{
diff --git a/linden/indra/newview/llfloaterhandler.cpp b/linden/indra/newview/llfloaterhandler.cpp
index f4c7e43..7cf7156 100644
--- a/linden/indra/newview/llfloaterhandler.cpp
+++ b/linden/indra/newview/llfloaterhandler.cpp
@@ -31,7 +31,7 @@
#include "llfloaterhandler.h"
#include "llfloater.h"
-#include "llwebbrowserctrl.h"
+#include "llmediactrl.h"
// register with dispatch via global object
LLFloaterHandler gFloaterHandler;
@@ -54,7 +54,7 @@ LLFloater* get_parent_floater(LLView* view)
}
-bool LLFloaterHandler::handle(const LLSD ¶ms, const LLSD &query_map, LLWebBrowserCtrl *web)
+bool LLFloaterHandler::handle(const LLSD ¶ms, const LLSD &query_map, LLMediaCtrl *web)
{
if (params.size() < 2) return false;
LLFloater* floater = NULL;
diff --git a/linden/indra/newview/llfloaterhandler.h b/linden/indra/newview/llfloaterhandler.h
index b08f1f3..31ea80c 100644
--- a/linden/indra/newview/llfloaterhandler.h
+++ b/linden/indra/newview/llfloaterhandler.h
@@ -39,7 +39,7 @@ class LLFloaterHandler
{
public:
LLFloaterHandler() : LLCommandHandler("floater", true) { }
- bool handle(const LLSD& params, const LLSD& query_map, LLWebBrowserCtrl* web);
+ bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web);
};
#endif
diff --git a/linden/indra/newview/llfloaterhtmlhelp.h b/linden/indra/newview/llfloaterhtmlhelp.h
deleted file mode 100644
index 83f15cd..0000000
--- a/linden/indra/newview/llfloaterhtmlhelp.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
- * @file llfloaterhtmlhelp.h
- * @brief HTML Help floater - uses embedded web browser control
- *
- * $LicenseInfo:firstyear=2006&license=viewergpl$
- *
- * Copyright (c) 2006-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLFLOATERHTMLHELP_H
-#define LL_LLFLOATERHTMLHELP_H
-
-#include "llhtmlhelp.h"
-#include "llfloater.h"
-#include "llwebbrowserctrl.h"
-
-class LLViewerHtmlHelp : public LLHtmlHelp
-{
-public:
- LLViewerHtmlHelp();
- virtual ~LLViewerHtmlHelp();
-
- /*virtual*/ void show();
- /*virtual*/ void show(std::string start_url);
-};
-
-class LLComboBox;
-class LLWebBrowserCtrl;
-
-class LLFloaterMediaBrowser : public LLFloater, public LLFloaterSingleton, public LLWebBrowserCtrlObserver
-{
-public:
- LLFloaterMediaBrowser(const LLSD& media_data);
-
- /*virtual*/ BOOL postBuild();
- /*virtual*/ void onClose(bool app_quitting);
- /*virtual*/ void onLocationChange( const EventType& eventIn );
-
- /*virtual*/ void draw();
-
- void openMedia(const std::string& media_url);
- void buildURLHistory();
-
- static void helpF1();
-
-private:
- static void onEnterAddress(LLUICtrl* ctrl, void* user_data);
- static void onClickRefresh(void* user_data);
- static void onClickBack(void* user_data);
- static void onClickForward(void* user_data);
- static void onClickGo(void* user_data);
- static void onClickClose(void* user_data);
- static void onClickOpenWebBrowser(void* user_data);
- static void onClickAssign(void* user_data);
- static void onClickHome(void* user_data);
- static void onClickSetHome(void* user_data);
- static bool onClickF1HelpLoadURL(const LLSD& notification, const LLSD& response);
-
- LLWebBrowserCtrl* mBrowser;
- LLComboBox* mAddressCombo;
- std::string mCurrentURL;
-};
-
-extern LLViewerHtmlHelp gViewerHtmlHelp;
-
-#endif // LL_LLFLOATERHTMLHELP_H
-
diff --git a/linden/indra/newview/llfloaterhtmlsimple.cpp b/linden/indra/newview/llfloaterhtmlsimple.cpp
index 7dfc4f6..8091c1e 100644
--- a/linden/indra/newview/llfloaterhtmlsimple.cpp
+++ b/linden/indra/newview/llfloaterhtmlsimple.cpp
@@ -35,7 +35,7 @@
#include "llfloaterhtmlsimple.h"
#include "lluictrlfactory.h"
-#include "llwebbrowserctrl.h"
+#include "llmediactrl.h"
LLFloaterHtmlSimple::LLFloaterHtmlSimple(const LLSD &initial_url)
@@ -56,12 +56,12 @@ LLFloaterHtmlSimple::~LLFloaterHtmlSimple()
void LLFloaterHtmlSimple::navigateTo(const std::string &url)
{
- LLWebBrowserCtrl* web = getChild("browser");
+ LLMediaCtrl* web = getChild("browser");
web->navigateTo(url);
}
void LLFloaterHtmlSimple::setTrusted(bool trusted)
{
- LLWebBrowserCtrl* web = getChild("browser");
+ LLMediaCtrl* web = getChild("browser");
web->setTrusted(trusted);
}
diff --git a/linden/indra/newview/llfloaterhud.cpp b/linden/indra/newview/llfloaterhud.cpp
index 9810bf1..6324b56 100644
--- a/linden/indra/newview/llfloaterhud.cpp
+++ b/linden/indra/newview/llfloaterhud.cpp
@@ -36,7 +36,7 @@
// Viewer libs
#include "llviewercontrol.h"
-#include "llwebbrowserctrl.h"
+#include "llmediactrl.h"
#include "llalertdialog.h"
// Linden libs
@@ -74,7 +74,7 @@ LLFloaterHUD::LLFloaterHUD()
reshape(saved_position_rect.getWidth(), saved_position_rect.getHeight(), FALSE);
setRect(saved_position_rect);
- mWebBrowser = getChild("floater_hud_browser" );
+ mWebBrowser = getChild("floater_hud_browser" );
if (mWebBrowser)
{
// Open links in internal browser
diff --git a/linden/indra/newview/llfloaterhud.h b/linden/indra/newview/llfloaterhud.h
index 2d58685..919ffef 100644
--- a/linden/indra/newview/llfloaterhud.h
+++ b/linden/indra/newview/llfloaterhud.h
@@ -35,7 +35,7 @@
#include "llfloater.h"
-class LLWebBrowserCtrl;
+class LLMediaCtrl;
class LLFloaterHUD : public LLFloater
{
@@ -53,7 +53,7 @@ private:
/*virtual*/ ~LLFloaterHUD();
private:
- LLWebBrowserCtrl* mWebBrowser; ///< the actual web browser control
+ LLMediaCtrl* mWebBrowser; ///< the actual web browser control
static LLFloaterHUD* sInstance;
};
diff --git a/linden/indra/newview/llfloaterland.cpp b/linden/indra/newview/llfloaterland.cpp
index 066b739..39de55f 100644
--- a/linden/indra/newview/llfloaterland.cpp
+++ b/linden/indra/newview/llfloaterland.cpp
@@ -56,6 +56,7 @@
#include "lllineeditor.h"
#include "llnamelistctrl.h"
#include "llnotify.h"
+#include "llpanellandaudio.h"
#include "llpanellandmedia.h"
#include "llradiogroup.h"
#include "llscrolllistctrl.h"
@@ -204,6 +205,7 @@ LLFloaterLand::LLFloaterLand(const LLSD& seed)
factory_map["land_covenant_panel"] = LLCallbackMap(createPanelLandCovenant, this);
factory_map["land_objects_panel"] = LLCallbackMap(createPanelLandObjects, this);
factory_map["land_options_panel"] = LLCallbackMap(createPanelLandOptions, this);
+// factory_map["land_audio_panel"] = LLCallbackMap(createPanelLandAudio, this);
factory_map["land_media_panel"] = LLCallbackMap(createPanelLandMedia, this);
factory_map["land_access_panel"] = LLCallbackMap(createPanelLandAccess, this);
@@ -239,6 +241,7 @@ void LLFloaterLand::refresh()
mPanelGeneral->refresh();
mPanelObjects->refresh();
mPanelOptions->refresh();
+// mPanelAudio->refresh();
mPanelMedia->refresh();
mPanelAccess->refresh();
}
@@ -277,6 +280,15 @@ void* LLFloaterLand::createPanelLandOptions(void* data)
return self->mPanelOptions;
}
+/*
+// static
+void* LLFloaterLand::createPanelLandAudio(void* data)
+{
+ LLFloaterLand* self = (LLFloaterLand*)data;
+ self->mPanelAudio = new LLPanelLandAudio(self->mParcel);
+ return self->mPanelAudio;
+}
+*/
// static
void* LLFloaterLand::createPanelLandMedia(void* data)
{
diff --git a/linden/indra/newview/llfloaterland.h b/linden/indra/newview/llfloaterland.h
index 113b679..4105f44 100644
--- a/linden/indra/newview/llfloaterland.h
+++ b/linden/indra/newview/llfloaterland.h
@@ -64,6 +64,7 @@ class LLParcelSelection;
class LLPanelLandGeneral;
class LLPanelLandObjects;
class LLPanelLandOptions;
+class LLPanelLandAudio;
class LLPanelLandMedia;
class LLPanelLandAccess;
class LLPanelLandBan;
@@ -102,6 +103,7 @@ protected:
static void* createPanelLandCovenant(void* data);
static void* createPanelLandObjects(void* data);
static void* createPanelLandOptions(void* data);
+ static void* createPanelLandAudio(void* data);
static void* createPanelLandMedia(void* data);
static void* createPanelLandAccess(void* data);
static void* createPanelLandBan(void* data);
@@ -115,6 +117,7 @@ protected:
LLPanelLandGeneral* mPanelGeneral;
LLPanelLandObjects* mPanelObjects;
LLPanelLandOptions* mPanelOptions;
+// LLPanelLandAudio* mPanelAudio;
LLPanelLandMedia* mPanelMedia;
LLPanelLandAccess* mPanelAccess;
LLPanelLandCovenant* mPanelCovenant;
diff --git a/linden/indra/newview/llfloatermediabrowser.cpp b/linden/indra/newview/llfloatermediabrowser.cpp
new file mode 100644
index 0000000..def0159
--- /dev/null
+++ b/linden/indra/newview/llfloatermediabrowser.cpp
@@ -0,0 +1,398 @@
+/**
+ * @file llfloaterhtmlhelp.cpp
+ * @brief HTML Help floater - uses embedded web browser control
+ *
+ * $LicenseInfo:firstyear=2006&license=viewergpl$
+ *
+ * Copyright (c) 2006-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloatermediabrowser.h"
+#include "llfloaterhtml.h"
+
+#include "llparcel.h"
+#include "llpluginclassmedia.h"
+#include "lluictrlfactory.h"
+#include "llmediactrl.h"
+#include "llviewerwindow.h"
+#include "llviewercontrol.h"
+#include "llviewerparcelmgr.h"
+#include "llweb.h"
+#include "llui.h"
+#include "roles_constants.h"
+
+#include "llurlhistory.h"
+#include "llmediactrl.h"
+#include "llviewermedia.h"
+#include "llviewerparcelmedia.h"
+#include "llcombobox.h"
+
+
+// TEMP
+#include "llsdutil.h"
+
+LLFloaterMediaBrowser::LLFloaterMediaBrowser(const LLSD& media_data)
+{
+ LLUICtrlFactory::getInstance()->buildFloater(this, "floater_media_browser.xml");
+
+}
+
+void LLFloaterMediaBrowser::draw()
+{
+ childSetEnabled("go", !mAddressCombo->getValue().asString().empty());
+ LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+ if(parcel)
+ {
+ childSetVisible("parcel_owner_controls", LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_CHANGE_MEDIA));
+ childSetEnabled("assign", !mAddressCombo->getValue().asString().empty());
+ }
+ bool show_time_controls = false;
+ bool media_playing = false;
+ if(mBrowser)
+ {
+ LLPluginClassMedia* media_plugin = mBrowser->getMediaPlugin();
+ if(media_plugin)
+ {
+ show_time_controls = media_plugin->pluginSupportsMediaTime();
+ media_playing = media_plugin->getStatus() == LLPluginClassMediaOwner::MEDIA_PLAYING;
+ }
+ }
+ childSetVisible("rewind", show_time_controls);
+ childSetVisible("play", show_time_controls && ! media_playing);
+ childSetVisible("pause", show_time_controls && media_playing);
+ childSetVisible("stop", show_time_controls);
+ childSetVisible("seek", show_time_controls);
+
+ childSetEnabled("play", ! media_playing);
+ childSetEnabled("stop", media_playing);
+
+ childSetEnabled("back", mBrowser->canNavigateBack());
+ childSetEnabled("forward", mBrowser->canNavigateForward());
+
+ LLFloater::draw();
+}
+
+BOOL LLFloaterMediaBrowser::postBuild()
+{
+ mBrowser = getChild("browser");
+ mBrowser->addObserver(this);
+
+ mAddressCombo = getChild("address");
+ mAddressCombo->setCommitCallback(onEnterAddress);
+ mAddressCombo->setCallbackUserData(this);
+
+ childSetAction("back", onClickBack, this);
+ childSetAction("forward", onClickForward, this);
+ childSetAction("reload", onClickRefresh, this);
+ childSetAction("rewind", onClickRewind, this);
+ childSetAction("play", onClickPlay, this);
+ childSetAction("stop", onClickStop, this);
+ childSetAction("pause", onClickPlay, this);
+ childSetAction("seek", onClickSeek, this);
+ childSetAction("go", onClickGo, this);
+ childSetAction("close", onClickClose, this);
+ childSetAction("open_browser", onClickOpenWebBrowser, this);
+ childSetAction("assign", onClickAssign, this);
+
+ buildURLHistory();
+ return TRUE;
+}
+
+void LLFloaterMediaBrowser::buildURLHistory()
+{
+ LLCtrlListInterface* url_list = childGetListInterface("address");
+ if (url_list)
+ {
+ url_list->operateOnAll(LLCtrlListInterface::OP_DELETE);
+ }
+
+ // Get all of the entries in the "browser" collection
+ LLSD browser_history = LLURLHistory::getURLHistory("browser");
+
+ LLSD::array_iterator iter_history =
+ browser_history.beginArray();
+ LLSD::array_iterator end_history =
+ browser_history.endArray();
+ for(; iter_history != end_history; ++iter_history)
+ {
+ std::string url = (*iter_history).asString();
+ if(! url.empty())
+ url_list->addSimpleElement(url);
+ }
+
+ // initialize URL history in the plugin
+ mBrowser->getMediaPlugin()->initializeUrlHistory(browser_history);
+}
+
+std::string LLFloaterMediaBrowser::getSupportURL()
+{
+ return getString("support_page_url");
+}
+void LLFloaterMediaBrowser::onClose(bool app_quitting)
+{
+ //setVisible(FALSE);
+ destroy();
+}
+
+void LLFloaterMediaBrowser::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
+{
+ if(event == MEDIA_EVENT_LOCATION_CHANGED)
+ {
+ setCurrentURL(self->getLocation());
+ }
+ else if(event == MEDIA_EVENT_NAVIGATE_COMPLETE)
+ {
+ // This is the event these flags are sent with.
+ childSetEnabled("back", self->getHistoryBackAvailable());
+ childSetEnabled("forward", self->getHistoryForwardAvailable());
+ }
+}
+void LLFloaterMediaBrowser::setCurrentURL(const std::string& url)
+{
+ mCurrentURL = url;
+
+ // redirects will navigate momentarily to about:blank, don't add to history
+ if (mCurrentURL != "about:blank")
+ {
+ mAddressCombo->remove(mCurrentURL);
+ mAddressCombo->add(mCurrentURL, ADD_SORTED);
+ mAddressCombo->selectByValue(mCurrentURL);
+
+ // Serialize url history
+ LLURLHistory::removeURL("browser", mCurrentURL);
+ LLURLHistory::addURL("browser", mCurrentURL);
+ }
+ childSetEnabled("back", mBrowser->canNavigateBack());
+ childSetEnabled("forward", mBrowser->canNavigateForward());
+ childSetEnabled("reload", TRUE);
+}
+
+LLFloaterMediaBrowser* LLFloaterMediaBrowser::showInstance(const LLSD& media_url)
+{
+ LLFloaterMediaBrowser* floaterp = LLUISingleton >::showInstance(media_url);
+
+ floaterp->openMedia(media_url.asString());
+ return floaterp;
+}
+
+//static
+void LLFloaterMediaBrowser::onEnterAddress(LLUICtrl* ctrl, void* user_data)
+{
+ LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
+ self->mBrowser->navigateTo(self->mAddressCombo->getValue().asString());
+}
+
+//static
+void LLFloaterMediaBrowser::onClickRefresh(void* user_data)
+{
+ LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
+
+ self->mAddressCombo->remove(0);
+ self->mBrowser->navigateTo(self->mCurrentURL);
+}
+
+//static
+void LLFloaterMediaBrowser::onClickForward(void* user_data)
+{
+ LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
+
+ self->mBrowser->navigateForward();
+}
+
+//static
+void LLFloaterMediaBrowser::onClickBack(void* user_data)
+{
+ LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
+
+ self->mBrowser->navigateBack();
+}
+
+//static
+void LLFloaterMediaBrowser::onClickGo(void* user_data)
+{
+ LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
+
+ self->mBrowser->navigateTo(self->mAddressCombo->getValue().asString());
+}
+
+//static
+void LLFloaterMediaBrowser::onClickClose(void* user_data)
+{
+ LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
+
+ self->close();
+}
+
+//static
+void LLFloaterMediaBrowser::onClickOpenWebBrowser(void* user_data)
+{
+ LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
+
+ std::string url = self->mCurrentURL.empty() ?
+ self->mBrowser->getHomePageUrl() :
+ self->mCurrentURL;
+ LLWeb::loadURLExternal(url);
+}
+
+void LLFloaterMediaBrowser::onClickAssign(void* user_data)
+{
+ LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
+
+ LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+ if (!parcel)
+ {
+ return;
+ }
+ std::string media_url = self->mAddressCombo->getValue().asString();
+ LLStringUtil::trim(media_url);
+
+ if(parcel->getMediaType() != "text/html")
+ {
+ parcel->setMediaURL(media_url);
+ parcel->setMediaCurrentURL(media_url);
+ parcel->setMediaType(std::string("text/html"));
+ LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel, true );
+ LLViewerParcelMedia::sendMediaNavigateMessage(media_url);
+ LLViewerParcelMedia::stop();
+ // LLViewerParcelMedia::update( parcel );
+ }
+ LLViewerParcelMedia::sendMediaNavigateMessage(media_url);
+}
+//static
+void LLFloaterMediaBrowser::onClickRewind(void* user_data)
+{
+ LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
+
+ if(self->mBrowser->getMediaPlugin())
+ self->mBrowser->getMediaPlugin()->start(-2.0f);
+}
+//static
+void LLFloaterMediaBrowser::onClickPlay(void* user_data)
+{
+ LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
+
+ LLPluginClassMedia* plugin = self->mBrowser->getMediaPlugin();
+ if(plugin)
+ {
+ if(plugin->getStatus() == LLPluginClassMediaOwner::MEDIA_PLAYING)
+ {
+ plugin->pause();
+ }
+ else
+ {
+ plugin->start();
+ }
+ }
+}
+//static
+void LLFloaterMediaBrowser::onClickStop(void* user_data)
+{
+ LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
+
+ if(self->mBrowser->getMediaPlugin())
+ self->mBrowser->getMediaPlugin()->stop();
+}
+//static
+void LLFloaterMediaBrowser::onClickSeek(void* user_data)
+{
+ LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
+
+ if(self->mBrowser->getMediaPlugin())
+ self->mBrowser->getMediaPlugin()->start(2.0f);
+}
+void LLFloaterMediaBrowser::openMedia(const std::string& media_url)
+{
+ mBrowser->setHomePageUrl(media_url);
+ mBrowser->navigateTo(media_url);
+ setCurrentURL(media_url);
+}
+////////////////////////////////////////////////////////////////////////////////
+//
+
+LLViewerHtmlHelp gViewerHtmlHelp;
+
+
+////////////////////////////////////////////////////////////////////////////////
+//
+LLViewerHtmlHelp::LLViewerHtmlHelp()
+{
+
+ LLUI::setHtmlHelp(this);
+}
+
+LLViewerHtmlHelp::~LLViewerHtmlHelp()
+{
+
+ LLUI::setHtmlHelp(NULL);
+}
+
+void LLViewerHtmlHelp::show()
+{
+ show("");
+}
+
+void LLViewerHtmlHelp::show(std::string url)
+{
+ LLFloaterMediaBrowser* floater_html = LLFloaterMediaBrowser::getInstance();
+ floater_html->setVisible(FALSE);
+
+ if (url.empty())
+ {
+ url = floater_html->getSupportURL();
+ }
+
+ if (gSavedSettings.getBOOL("UseExternalBrowser"))
+ {
+ LLSD notificationData;
+ notificationData["url"] = url;
+
+ LLNotifications::instance().add("ClickOpenF1Help", notificationData, LLSD(), onClickF1HelpLoadURL);
+ floater_html->close();
+ }
+ else
+ {
+ // don't wait, just do it
+ floater_html->setVisible(TRUE);
+ floater_html->openMedia(url);
+ }
+}
+// static
+bool LLViewerHtmlHelp::onClickF1HelpLoadURL(const LLSD& notification, const LLSD& response)
+{
+ LLFloaterMediaBrowser* floater_html = LLFloaterMediaBrowser::getInstance();
+ floater_html->setVisible(FALSE);
+ std::string url = floater_html->getSupportURL();
+ S32 option = LLNotification::getSelectedOption(notification, response);
+ if (option == 0)
+ {
+ LLWeb::loadURL(url);
+ }
+ floater_html->close();
+ return false;
+}
+
diff --git a/linden/indra/newview/llfloatermediabrowser.h b/linden/indra/newview/llfloatermediabrowser.h
new file mode 100644
index 0000000..8a78df8
--- /dev/null
+++ b/linden/indra/newview/llfloatermediabrowser.h
@@ -0,0 +1,102 @@
+/**
+ * @file llfloaterhtmlhelp.h
+ * @brief HTML Help floater - uses embedded web browser control
+ *
+ * $LicenseInfo:firstyear=2006&license=viewergpl$
+ *
+ * Copyright (c) 2006-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERHTMLHELP_H
+#define LL_LLFLOATERHTMLHELP_H
+
+#include "llhtmlhelp.h"
+#include "llfloater.h"
+#include "llmediactrl.h"
+
+class LLViewerHtmlHelp : public LLHtmlHelp
+{
+public:
+ LLViewerHtmlHelp();
+ virtual ~LLViewerHtmlHelp();
+
+ /*virtual*/ void show();
+ /*virtual*/ void show(std::string start_url);
+ void show(std::string start_url, std::string title);
+
+ static bool onClickF1HelpLoadURL(const LLSD& notification, const LLSD& response);
+
+};
+
+class LLComboBox;
+class LLMediaCtrl;
+
+class LLFloaterMediaBrowser :
+ public LLFloater,
+ public LLUISingleton >,
+ public LLViewerMediaObserver
+{
+public:
+ LLFloaterMediaBrowser(const LLSD& media_data);
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onClose(bool app_quitting);
+ /*virtual*/ void draw();
+
+ // inherited from LLViewerMediaObserver
+ /*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);
+
+ void openMedia(const std::string& media_url);
+ void buildURLHistory();
+ std::string getSupportURL();
+ void setCurrentURL(const std::string& url);
+
+
+ static LLFloaterMediaBrowser* showInstance(const LLSD& id);
+ static void onEnterAddress(LLUICtrl* ctrl, void* user_data);
+ static void onClickRefresh(void* user_data);
+ static void onClickBack(void* user_data);
+ static void onClickForward(void* user_data);
+ static void onClickGo(void* user_data);
+ static void onClickClose(void* user_data);
+ static void onClickOpenWebBrowser(void* user_data);
+ static void onClickAssign(void* user_data);
+ static void onClickRewind(void* user_data);
+ static void onClickPlay(void* user_data);
+ static void onClickStop(void* user_data);
+ static void onClickSeek(void* user_data);
+
+private:
+ LLMediaCtrl* mBrowser;
+ LLComboBox* mAddressCombo;
+ std::string mCurrentURL;
+};
+
+extern LLViewerHtmlHelp gViewerHtmlHelp;
+
+#endif // LL_LLFLOATERHTMLHELP_H
+
diff --git a/linden/indra/newview/llfloaterobjectiminfo.cpp b/linden/indra/newview/llfloaterobjectiminfo.cpp
index fa7964c..f933a85 100644
--- a/linden/indra/newview/llfloaterobjectiminfo.cpp
+++ b/linden/indra/newview/llfloaterobjectiminfo.cpp
@@ -137,7 +137,7 @@ void LLFloaterObjectIMInfo::onClickMap(void* data)
std::ostringstream link;
link << "secondlife://" << self->mSlurl;
- class LLWebBrowserCtrl* web = NULL;
+ class LLMediaCtrl* web = NULL;
LLURLDispatcher::dispatch(link.str(), web, true);
}
@@ -213,14 +213,14 @@ public:
LLObjectIMInfoHandler() : LLCommandHandler("objectim", true) { }
bool handle(const LLSD& tokens, const LLSD& query_map,
- LLWebBrowserCtrl* web);
+ LLMediaCtrl* web);
};
// Creating the object registers with the dispatcher.
LLObjectIMInfoHandler gObjectIMHandler;
// ex. secondlife:///app/objectim/9426adfc-9c17-8765-5f09-fdf19957d003?owner=a112d245-9095-4e9c-ace4-ffa31717f934&groupowned=true&slurl=ahern/123/123/123&name=Object
-bool LLObjectIMInfoHandler::handle(const LLSD &tokens, const LLSD &query_map, LLWebBrowserCtrl* web)
+bool LLObjectIMInfoHandler::handle(const LLSD &tokens, const LLSD &query_map, LLMediaCtrl* web)
{
LLUUID task_id = tokens[0].asUUID();
std::string name = query_map["name"].asString();
diff --git a/linden/indra/newview/llfloaterparcel.cpp b/linden/indra/newview/llfloaterparcel.cpp
index 4213150..a61f3b9 100644
--- a/linden/indra/newview/llfloaterparcel.cpp
+++ b/linden/indra/newview/llfloaterparcel.cpp
@@ -55,7 +55,7 @@ public:
// requires trusted browser to trigger
LLParcelHandler() : LLCommandHandler("parcel", true) { }
bool handle(const LLSD& params, const LLSD& query_map,
- LLWebBrowserCtrl* web)
+ LLMediaCtrl* web)
{
if (params.size() < 2)
{
diff --git a/linden/indra/newview/llfloaterpreference.cpp b/linden/indra/newview/llfloaterpreference.cpp
index 09336cb..a94f7cf 100644
--- a/linden/indra/newview/llfloaterpreference.cpp
+++ b/linden/indra/newview/llfloaterpreference.cpp
@@ -94,7 +94,7 @@ public:
// requires trusted browser
LLPreferencesHandler() : LLCommandHandler("preferences", true) { }
bool handle(const LLSD& tokens, const LLSD& query_map,
- LLWebBrowserCtrl* web)
+ LLMediaCtrl* web)
{
LLFloaterPreference::show(NULL);
return true;
@@ -445,7 +445,7 @@ void LLFloaterPreference::onBtnOK( void* userdata )
// commit any outstanding text entry
if (fp->hasFocus())
{
- LLUICtrl* cur_focus = gFocusMgr.getKeyboardFocus();
+ LLUICtrl* cur_focus = dynamic_cast(gFocusMgr.getKeyboardFocus());
if (cur_focus->acceptsTextInput())
{
cur_focus->onCommit();
@@ -479,7 +479,7 @@ void LLFloaterPreference::onBtnApply( void* userdata )
LLFloaterPreference *fp =(LLFloaterPreference *)userdata;
if (fp->hasFocus())
{
- LLUICtrl* cur_focus = gFocusMgr.getKeyboardFocus();
+ LLUICtrl* cur_focus = dynamic_cast(gFocusMgr.getKeyboardFocus());
if (cur_focus->acceptsTextInput())
{
cur_focus->onCommit();
@@ -505,7 +505,7 @@ void LLFloaterPreference::onBtnCancel( void* userdata )
LLFloaterPreference *fp =(LLFloaterPreference *)userdata;
if (fp->hasFocus())
{
- LLUICtrl* cur_focus = gFocusMgr.getKeyboardFocus();
+ LLUICtrl* cur_focus = dynamic_cast(gFocusMgr.getKeyboardFocus());
if (cur_focus->acceptsTextInput())
{
cur_focus->onCommit();
diff --git a/linden/indra/newview/llfloatertos.cpp b/linden/indra/newview/llfloatertos.cpp
index 6a392e0..2dedc79 100644
--- a/linden/indra/newview/llfloatertos.cpp
+++ b/linden/indra/newview/llfloatertos.cpp
@@ -161,12 +161,10 @@ BOOL LLFloaterTOS::postBuild()
LLTextEditor *editor = getChild("tos_text");
editor->setVisible( FALSE );
- LLWebBrowserCtrl* web_browser = getChild("tos_html");
+ LLMediaCtrl* web_browser = getChild("tos_html");
if ( web_browser )
{
- // start to observe it so we see navigate complete events
- web_browser->addObserver( this );
-
+ web_browser->addObserver(this);
gResponsePtr = LLIamHere::build( this );
LLHTTPClient::get( getString( "real_url" ), gResponsePtr );
}
@@ -179,7 +177,7 @@ void LLFloaterTOS::setSiteIsAlive( bool alive )
// only do this for TOS pages
if ( mType == TOS_TOS )
{
- LLWebBrowserCtrl* web_browser = getChild("tos_html");
+ LLMediaCtrl* web_browser = getChild("tos_html");
// if the contents of the site was retrieved
if ( alive )
{
@@ -201,12 +199,6 @@ void LLFloaterTOS::setSiteIsAlive( bool alive )
LLFloaterTOS::~LLFloaterTOS()
{
- // stop obsaerving events
- LLWebBrowserCtrl* web_browser = getChild("tos_html");
- if ( web_browser )
- {
- web_browser->remObserver( this );
- };
// tell the responder we're not here anymore
if ( gResponsePtr )
@@ -269,14 +261,17 @@ void LLFloaterTOS::onCancel( void* userdata )
}
//virtual
-void LLFloaterTOS::onNavigateComplete( const EventType& eventIn )
+void LLFloaterTOS::handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent event)
{
- // skip past the loading screen navigate complete
- if ( ++mLoadCompleteCount == 2 )
+ if(event == MEDIA_EVENT_NAVIGATE_COMPLETE)
{
- llinfos << "NAVIGATE COMPLETE" << llendl;
- // enable Agree to TOS radio button now that page has loaded
- LLCheckBoxCtrl * tos_agreement = getChild("agree_chk");
- tos_agreement->setEnabled( true );
- };
+ // skip past the loading screen navigate complete
+ if ( ++mLoadCompleteCount == 2 )
+ {
+ llinfos << "NAVIGATE COMPLETE" << llendl;
+ // enable Agree to TOS radio button now that page has loaded
+ LLCheckBoxCtrl * tos_agreement = getChild("agree_chk");
+ tos_agreement->setEnabled( true );
+ }
+ }
}
diff --git a/linden/indra/newview/llfloatertos.h b/linden/indra/newview/llfloatertos.h
index dbec3ff..c5d5878 100644
--- a/linden/indra/newview/llfloatertos.h
+++ b/linden/indra/newview/llfloatertos.h
@@ -35,7 +35,7 @@
#include "llmodaldialog.h"
#include "llassetstorage.h"
-#include "llwebbrowserctrl.h"
+#include "llmediactrl.h"
class LLButton;
class LLRadioGroup;
@@ -45,7 +45,7 @@ class LLUUID;
class LLFloaterTOS :
public LLModalDialog,
- public LLWebBrowserCtrlObserver
+ public LLViewerMediaObserver
{
public:
virtual ~LLFloaterTOS();
@@ -70,7 +70,8 @@ public:
void setSiteIsAlive( bool alive );
- virtual void onNavigateComplete( const EventType& eventIn );
+ // inherited from LLViewerMediaObserver
+ /*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);
private:
// Asset_id is overwritten with LLUUID::null when agree is clicked.
diff --git a/linden/indra/newview/llfloaterurlentry.cpp b/linden/indra/newview/llfloaterurlentry.cpp
index 9d91aa9..8d483e5 100644
--- a/linden/indra/newview/llfloaterurlentry.cpp
+++ b/linden/indra/newview/llfloaterurlentry.cpp
@@ -227,7 +227,7 @@ void LLFloaterURLEntry::onBtnOK( void* userdata )
}
// Discover the MIME type only for "http" scheme.
- if(scheme == "http")
+ if(scheme == "http" || scheme == "https")
{
LLHTTPClient::getHeaderOnly( media_url,
new LLMediaTypeResponder(self->getHandle()));
diff --git a/linden/indra/newview/llhoverview.cpp b/linden/indra/newview/llhoverview.cpp
index 6367380..109eece 100644
--- a/linden/indra/newview/llhoverview.cpp
+++ b/linden/indra/newview/llhoverview.cpp
@@ -154,12 +154,13 @@ void LLHoverView::updateHover(LLTool* current_tool)
void LLHoverView::pickCallback(const LLPickInfo& pick_info)
{
+ gHoverView->mLastPickInfo = pick_info;
LLViewerObject* hit_obj = pick_info.getObject();
if (hit_obj)
{
gHoverView->setHoverActive(TRUE);
- LLSelectMgr::getInstance()->setHoverObject(hit_obj);
+ LLSelectMgr::getInstance()->setHoverObject(hit_obj, pick_info.mObjectFace);
gHoverView->mLastHoverObject = hit_obj;
gHoverView->mHoverOffset = pick_info.mObjectOffset;
}
diff --git a/linden/indra/newview/llhoverview.h b/linden/indra/newview/llhoverview.h
index 0891118..d0bb28d 100644
--- a/linden/indra/newview/llhoverview.h
+++ b/linden/indra/newview/llhoverview.h
@@ -42,6 +42,7 @@
#include "v3dmath.h"
#include "lldarray.h"
+#include "llviewerwindow.h"
#include "llviewerobject.h"
class LLTool;
@@ -79,6 +80,7 @@ public:
BOOL isHoveringLand() const;
LLViewerObject* getLastHoverObject() const;
+ LLPickInfo getPickInfo() { return mLastPickInfo; }
static void pickCallback(const LLPickInfo& info);
@@ -103,6 +105,7 @@ protected:
// If not null and not dead, we're over an object.
LLPointer mLastHoverObject;
+ LLPickInfo mLastPickInfo;
// If not LLVector3d::ZERO, we're over land.
LLVector3d mHoverLandGlobal;
diff --git a/linden/indra/newview/llhudview.cpp b/linden/indra/newview/llhudview.cpp
index 198514c..afcdd73 100644
--- a/linden/indra/newview/llhudview.cpp
+++ b/linden/indra/newview/llhudview.cpp
@@ -48,14 +48,19 @@
#include "lltracker.h"
#include "llviewercamera.h"
#include "llui.h"
+#include "lluictrlfactory.h"
LLHUDView *gHUDView = NULL;
const S32 HUD_ARROW_SIZE = 32;
-LLHUDView::LLHUDView()
-: LLPanel()
-{ }
+
+
+LLHUDView::LLHUDView(const LLRect& r)
+{
+ LLUICtrlFactory::getInstance()->buildPanel(this, "panel_hud.xml");
+ userSetShape(r);
+}
LLHUDView::~LLHUDView()
{ }
@@ -64,6 +69,7 @@ LLHUDView::~LLHUDView()
void LLHUDView::draw()
{
LLTracker::drawHUDArrow();
+ LLView::draw();
}
@@ -89,4 +95,3 @@ BOOL LLHUDView::handleMouseDown(S32 x, S32 y, MASK mask)
}
return LLView::handleMouseDown(x, y, mask);
}
-
diff --git a/linden/indra/newview/llhudview.h b/linden/indra/newview/llhudview.h
index 7859e7f..05ff9c8 100644
--- a/linden/indra/newview/llhudview.h
+++ b/linden/indra/newview/llhudview.h
@@ -42,7 +42,7 @@ class LLHUDView
: public LLPanel
{
public:
- LLHUDView();
+ LLHUDView(const LLRect& rect);
virtual ~LLHUDView();
virtual void draw();
diff --git a/linden/indra/newview/llimpanel.cpp b/linden/indra/newview/llimpanel.cpp
index 808a2c9..cc7a35d 100644
--- a/linden/indra/newview/llimpanel.cpp
+++ b/linden/indra/newview/llimpanel.cpp
@@ -2198,8 +2198,8 @@ void LLFloaterIMPanel::sendMsg()
LLViewerStats::getInstance()->incStat(LLViewerStats::ST_IM_COUNT);
+ mInputEditor->setText(LLStringUtil::null);
}
- mInputEditor->setText(LLStringUtil::null);
// Don't need to actually send the typing stop message, the other
// client will infer it from receiving the message.
diff --git a/linden/indra/newview/llloginhandler.cpp b/linden/indra/newview/llloginhandler.cpp
index 6366398..30b05ef 100644
--- a/linden/indra/newview/llloginhandler.cpp
+++ b/linden/indra/newview/llloginhandler.cpp
@@ -111,7 +111,7 @@ void LLLoginHandler::parse(const LLSD& queryMap)
bool LLLoginHandler::handle(const LLSD& tokens,
const LLSD& query_map,
- LLWebBrowserCtrl* web)
+ LLMediaCtrl* web)
{
parse(query_map);
diff --git a/linden/indra/newview/llloginhandler.h b/linden/indra/newview/llloginhandler.h
index c76d7e8..0844b80 100644
--- a/linden/indra/newview/llloginhandler.h
+++ b/linden/indra/newview/llloginhandler.h
@@ -40,7 +40,7 @@ class LLLoginHandler : public LLCommandHandler
public:
// allow from external browsers
LLLoginHandler() : LLCommandHandler("login", false) { }
- /*virtual*/ bool handle(const LLSD& tokens, const LLSD& query_map, LLWebBrowserCtrl* web);
+ /*virtual*/ bool handle(const LLSD& tokens, const LLSD& query_map, LLMediaCtrl* web);
// Fill in our internal fields from a SLURL like
// secondlife:///app/login?first=Bob&last=Dobbs
diff --git a/linden/indra/newview/llmediactrl.cpp b/linden/indra/newview/llmediactrl.cpp
new file mode 100644
index 0000000..1530598
--- /dev/null
+++ b/linden/indra/newview/llmediactrl.cpp
@@ -0,0 +1,1201 @@
+/**
+ * @file LLMediaCtrl.cpp
+ * @brief Web browser UI control
+ *
+ * $LicenseInfo:firstyear=2006&license=viewergpl$
+ *
+ * Copyright (c) 2006-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+
+#include "llmediactrl.h"
+
+// viewer includes
+#include "llfloaterhtml.h"
+#include "llfloaterworldmap.h"
+#include "lluictrlfactory.h"
+#include "llurldispatcher.h"
+#include "llurlsimstring.h"
+#include "llviewborder.h"
+#include "llviewercontrol.h"
+#include "llviewermedia.h"
+#include "llviewerwindow.h"
+#include "llnotifications.h"
+#include "llweb.h"
+#include "llrender.h"
+#include "llpluginclassmedia.h"
+
+// linden library includes
+#include "llfocusmgr.h"
+
+extern BOOL gRestoreGL;
+
+// Setting the mozilla buffer width to 2048 exactly doesn't work, since it pads its rowbytes a bit, pushing the texture width over 2048.
+// 2000 should give enough headroom for any amount of padding it cares to add.
+const S32 MAX_DIMENSION = 2000;
+const S32 MAX_TEXTURE_DIMENSION = 2048;
+
+static LLRegisterWidget r("web_browser");
+
+LLMediaCtrl::LLMediaCtrl( const std::string& name, const LLRect& rect ) :
+ LLUICtrl( name, rect, FALSE, NULL, NULL ),
+ mTextureDepthBytes( 4 ),
+ mWebBrowserImage( 0 ),
+ mBorder(NULL),
+ mFrequentUpdates( true ),
+ mForceUpdate( false ),
+ mOpenLinksInExternalBrowser( false ),
+ mOpenLinksInInternalBrowser( false ),
+ mTrusted( false ),
+ mHomePageUrl( "" ),
+ mIgnoreUIScale( true ),
+ mAlwaysRefresh( false ),
+ mExternalUrl( "" ),
+ mMediaSource( 0 ),
+ mTakeFocusOnClick( true ),
+ mCurrentNavUrl( "about:blank" ),
+ mLastSetCursor( UI_CURSOR_ARROW ),
+ mStretchToFill( true ),
+ mMaintainAspectRatio ( true ),
+ mHideLoading (false)
+{
+ S32 screen_width = mIgnoreUIScale ?
+ llround((F32)getRect().getWidth() * LLUI::sGLScaleFactor.mV[VX]) : getRect().getWidth();
+ S32 screen_height = mIgnoreUIScale ?
+ llround((F32)getRect().getHeight() * LLUI::sGLScaleFactor.mV[VY]) : getRect().getHeight();
+
+ mMediaSource = LLViewerMedia::newMediaImpl(mHomePageUrl, LLUUID::null, screen_width, screen_height, false, false, "text/html");
+ if ( !mMediaSource )
+ {
+ llwarns << "media source create failed " << llendl;
+ // return;
+ }
+ else
+ {
+ // create a new texture (based on LLDynamic texture) that will be used to display the output
+ mWebBrowserImage = new LLWebBrowserTexture( screen_width, screen_height, this, mMediaSource );
+ }
+
+ mMediaSource->setVisible( getVisible() );
+
+ mMediaSource->addObserver( this );
+
+ LLRect border_rect( 0, getRect().getHeight() + 2, getRect().getWidth() + 2, 0 );
+ mBorder = new LLViewBorder( std::string("web control border"), border_rect, LLViewBorder::BEVEL_IN );
+ addChild( mBorder );
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// note: this is now a singleton and destruction happens via initClass() now
+LLMediaCtrl::~LLMediaCtrl()
+{
+
+ if (mMediaSource)
+ {
+ mMediaSource->remObserver( this );
+ mMediaSource = NULL;
+ }
+
+ if ( mWebBrowserImage )
+ {
+ delete mWebBrowserImage;
+ mWebBrowserImage = NULL;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLMediaCtrl::setBorderVisible( BOOL border_visible )
+{
+ if ( mBorder )
+ {
+ mBorder->setVisible( border_visible );
+ };
+};
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLMediaCtrl::setTakeFocusOnClick( bool take_focus )
+{
+ mTakeFocusOnClick = take_focus;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// set flag that forces the embedded browser to open links in the external system browser
+void LLMediaCtrl::setOpenInExternalBrowser( bool valIn )
+{
+ mOpenLinksInExternalBrowser = valIn;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+// set flag that forces the embedded browser to open links in the internal browser floater
+void LLMediaCtrl::setOpenInInternalBrowser( bool valIn )
+{
+ mOpenLinksInInternalBrowser = valIn;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+void LLMediaCtrl::setTrusted( bool valIn )
+{
+ mTrusted = valIn;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+BOOL LLMediaCtrl::handleHover( S32 x, S32 y, MASK mask )
+{
+ convertInputCoords(x, y);
+
+ if (mMediaSource)
+ mMediaSource->mouseMove(x, y);
+
+ gViewerWindow->setCursor(mLastSetCursor);
+
+ return TRUE;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+BOOL LLMediaCtrl::handleScrollWheel( S32 x, S32 y, S32 clicks )
+{
+ if (mMediaSource && mMediaSource->hasMedia())
+ mMediaSource->getMediaPlugin()->scrollEvent(0, clicks, MASK_NONE);
+
+ return TRUE;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+BOOL LLMediaCtrl::handleMouseUp( S32 x, S32 y, MASK mask )
+{
+ convertInputCoords(x, y);
+
+ if (mMediaSource)
+ {
+ mMediaSource->mouseUp(x, y);
+
+ // *HACK: LLMediaImplLLMozLib automatically takes focus on mouseup,
+ // in addition to the onFocusReceived() call below. Undo this. JC
+ if (!mTakeFocusOnClick)
+ {
+ mMediaSource->focus(false);
+ gViewerWindow->focusClient();
+ }
+ }
+
+ gFocusMgr.setMouseCapture( NULL );
+
+ return TRUE;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+BOOL LLMediaCtrl::handleMouseDown( S32 x, S32 y, MASK mask )
+{
+ convertInputCoords(x, y);
+
+ if (mMediaSource)
+ mMediaSource->mouseDown(x, y);
+
+ gFocusMgr.setMouseCapture( this );
+
+ if (mTakeFocusOnClick)
+ {
+ setFocus( TRUE );
+ }
+
+ return TRUE;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+BOOL LLMediaCtrl::handleDoubleClick( S32 x, S32 y, MASK mask )
+{
+ convertInputCoords(x, y);
+
+ if (mMediaSource)
+ mMediaSource->mouseLeftDoubleClick( x, y );
+
+ gFocusMgr.setMouseCapture( this );
+
+ if (mTakeFocusOnClick)
+ {
+ setFocus( TRUE );
+ }
+
+ return TRUE;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLMediaCtrl::onFocusReceived()
+{
+ if (mMediaSource)
+ {
+ mMediaSource->focus(true);
+
+ // Set focus for edit menu items
+ LLEditMenuHandler::gEditMenuHandler = mMediaSource;
+ }
+
+ LLUICtrl::onFocusReceived();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLMediaCtrl::onFocusLost()
+{
+ if (mMediaSource)
+ {
+ mMediaSource->focus(false);
+
+ if( LLEditMenuHandler::gEditMenuHandler == mMediaSource )
+ {
+ // Clear focus for edit menu items
+ LLEditMenuHandler::gEditMenuHandler = NULL;
+ }
+ }
+
+ gViewerWindow->focusClient();
+
+ LLUICtrl::onFocusLost();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+BOOL LLMediaCtrl::handleKeyHere( KEY key, MASK mask )
+{
+ BOOL result = FALSE;
+
+ // FIXME: THIS IS SO WRONG.
+ // Menu keys should be handled by the menu system and not passed to UI elements, but this is how LLTextEditor and LLLineEditor do it...
+
+ if (mMediaSource)
+ {
+ if( MASK_CONTROL & mask )
+ {
+ if( 'C' == key )
+ {
+ mMediaSource->copy();
+ result = TRUE;
+ }
+ else
+ if( 'V' == key )
+ {
+ mMediaSource->paste();
+ result = TRUE;
+ }
+ else
+ if( 'X' == key )
+ {
+ mMediaSource->cut();
+ result = TRUE;
+ }
+ }
+
+ if(!result)
+ {
+ result = mMediaSource->handleKeyHere(key, mask);
+ }
+ }
+
+ return result;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLMediaCtrl::handleVisibilityChange ( BOOL new_visibility )
+{
+ llinfos << "visibility changed to " << (new_visibility?"true":"false") << llendl;
+ if(mMediaSource)
+ {
+ mMediaSource->setVisible( new_visibility );
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+BOOL LLMediaCtrl::handleUnicodeCharHere(llwchar uni_char)
+{
+ BOOL result = FALSE;
+
+ // only accept 'printable' characters, sigh...
+ if (uni_char >= 32 // discard 'control' characters
+ && uni_char != 127) // SDL thinks this is 'delete' - yuck.
+ {
+ if (mMediaSource)
+ result = mMediaSource->handleUnicodeCharHere(uni_char);
+ }
+
+ return result;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLMediaCtrl::onVisibilityChange ( BOOL new_visibility )
+{
+ // set state of frequent updates automatically if visibility changes
+ if ( new_visibility )
+ {
+ mFrequentUpdates = true;
+ }
+ else
+ {
+ mFrequentUpdates = false;
+ }
+ LLUICtrl::onVisibilityChange(new_visibility);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLMediaCtrl::reshape( S32 width, S32 height, BOOL called_from_parent )
+{
+ S32 screen_width = mIgnoreUIScale ? llround((F32)width * LLUI::sGLScaleFactor.mV[VX]) : width;
+ S32 screen_height = mIgnoreUIScale ? llround((F32)height * LLUI::sGLScaleFactor.mV[VY]) : height;
+
+// llinfos << "reshape called with width = " << width << ", height = " << height << llendl;
+
+ // when floater is minimized, these sizes are negative
+ if ( mWebBrowserImage && screen_height > 0 && screen_width > 0 )
+ {
+ mWebBrowserImage->resize( screen_width, screen_height );
+ mForceUpdate = true;
+ }
+
+ LLUICtrl::reshape( width, height, called_from_parent );
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLMediaCtrl::navigateBack()
+{
+ if (mMediaSource && mMediaSource->hasMedia())
+ {
+ mMediaSource->getMediaPlugin()->browse_back();
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLMediaCtrl::navigateForward()
+{
+ if (mMediaSource && mMediaSource->hasMedia())
+ {
+ mMediaSource->getMediaPlugin()->browse_forward();
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+bool LLMediaCtrl::canNavigateBack()
+{
+ if (mMediaSource)
+ return mMediaSource->canNavigateBack();
+ else
+ return false;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+bool LLMediaCtrl::canNavigateForward()
+{
+ if (mMediaSource)
+ return mMediaSource->canNavigateForward();
+ else
+ return false;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLMediaCtrl::set404RedirectUrl( std::string redirect_url )
+{
+ if(mMediaSource && mMediaSource->hasMedia())
+ mMediaSource->getMediaPlugin()->set_status_redirect( 404, redirect_url );
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLMediaCtrl::clr404RedirectUrl()
+{
+ if(mMediaSource && mMediaSource->hasMedia())
+ mMediaSource->getMediaPlugin()->set_status_redirect(404, "");
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLMediaCtrl::navigateTo( std::string url_in, std::string mime_type)
+{
+ // don't browse to anything that starts with secondlife:// or sl://
+ const std::string protocol1 = "secondlife://";
+ const std::string protocol2 = "sl://";
+ if ((LLStringUtil::compareInsensitive(url_in.substr(0, protocol1.length()), protocol1) == 0) ||
+ (LLStringUtil::compareInsensitive(url_in.substr(0, protocol2.length()), protocol2) == 0))
+ {
+ // TODO: Print out/log this attempt?
+ // llinfos << "Rejecting attempt to load restricted website :" << urlIn << llendl;
+ return;
+ }
+
+ if (mMediaSource)
+ {
+ mCurrentNavUrl = url_in;
+ mMediaSource->navigateTo(url_in, mime_type, mime_type.empty());
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLMediaCtrl::navigateToLocalPage( const std::string& subdir, const std::string& filename_in )
+{
+ std::string language = LLUI::getLanguage();
+ std::string delim = gDirUtilp->getDirDelimiter();
+ std::string filename;
+
+ filename += subdir;
+ filename += delim;
+ filename += filename_in;
+
+ std::string expanded_filename = gDirUtilp->findSkinnedFilename("html", language, filename);
+
+ if (! gDirUtilp->fileExists(expanded_filename))
+ {
+ if (language != "en-us")
+ {
+ expanded_filename = gDirUtilp->findSkinnedFilename("html", "en-us", filename);
+ if (! gDirUtilp->fileExists(expanded_filename))
+ {
+ llwarns << "File " << subdir << delim << filename_in << "not found" << llendl;
+ return;
+ }
+ }
+ else
+ {
+ llwarns << "File " << subdir << delim << filename_in << "not found" << llendl;
+ return;
+ }
+ }
+ if (mMediaSource)
+ {
+ mCurrentNavUrl = expanded_filename;
+ mMediaSource->navigateTo(expanded_filename, "text/html", false);
+ }
+
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLMediaCtrl::navigateHome()
+{
+ if( mHomePageUrl.length() )
+ {
+ if (mMediaSource)
+ mMediaSource->navigateTo(mHomePageUrl);
+ };
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLMediaCtrl::setHomePageUrl( const std::string urlIn )
+{
+ mHomePageUrl = urlIn;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+bool LLMediaCtrl::setCaretColor(unsigned int red, unsigned int green, unsigned int blue)
+{
+ //NOOP
+ return false;
+}
+////////////////////////////////////////////////////////////////////////////////
+//
+std::string LLMediaCtrl::getHomePageUrl()
+{
+ return mHomePageUrl;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+LLPluginClassMedia* LLMediaCtrl::getMediaPlugin()
+{
+ return mMediaSource.isNull() ? NULL : mMediaSource->getMediaPlugin();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLMediaCtrl::draw()
+{
+ if ( ! mWebBrowserImage )
+ return;
+
+ if ( gRestoreGL == 1 )
+ {
+ LLRect r = getRect();
+ reshape( r.getWidth(), r.getHeight(), FALSE );
+ return;
+ };
+
+ // NOTE: optimization needed here - probably only need to do this once
+ // unless tearoffs change the parent which they probably do.
+ const LLUICtrl* ptr = findRootMostFocusRoot();
+ if ( ptr && ptr->hasFocus() )
+ {
+ setFrequentUpdates( true );
+ }
+ else
+ {
+ setFrequentUpdates( false );
+ };
+
+ // alpha off for this
+ LLGLSUIDefault gls_ui;
+ LLGLDisable gls_alphaTest( GL_ALPHA_TEST );
+
+ gGL.pushMatrix();
+ {
+ if (mIgnoreUIScale)
+ {
+ glLoadIdentity();
+ // font system stores true screen origin, need to scale this by UI scale factor
+ // to get render origin for this view (with unit scale)
+ gGL.translatef(floorf(LLFontGL::sCurOrigin.mX * LLUI::sGLScaleFactor.mV[VX]),
+ floorf(LLFontGL::sCurOrigin.mY * LLUI::sGLScaleFactor.mV[VY]),
+ LLFontGL::sCurOrigin.mZ);
+ }
+
+ // scale texture to fit the space using texture coords
+ gGL.getTexUnit(0)->bind(mWebBrowserImage->getTexture());
+ gGL.color4fv( LLColor4::white.mV );
+ F32 max_u = ( F32 )mWebBrowserImage->getMediaWidth() / ( F32 )mWebBrowserImage->getWidth();
+ F32 max_v = ( F32 )mWebBrowserImage->getMediaHeight() / ( F32 )mWebBrowserImage->getHeight();
+
+ LLRect r = getRect();
+ S32 width, height;
+ S32 x_offset = 0;
+ S32 y_offset = 0;
+
+ if(mStretchToFill)
+ {
+ if(mMaintainAspectRatio)
+ {
+ F32 media_aspect = (F32)(mWebBrowserImage->getMediaWidth()) / (F32)(mWebBrowserImage->getMediaHeight());
+ F32 view_aspect = (F32)(r.getWidth()) / (F32)(r.getHeight());
+ if(media_aspect > view_aspect)
+ {
+ // max width, adjusted height
+ width = r.getWidth();
+ height = llmin(llmax(S32(width / media_aspect), 0), r.getHeight());
+ }
+ else
+ {
+ // max height, adjusted width
+ height = r.getHeight();
+ width = llmin(llmax(S32(height * media_aspect), 0), r.getWidth());
+ }
+ }
+ else
+ {
+ width = r.getWidth();
+ height = r.getHeight();
+ }
+ }
+ else
+ {
+ width = llmin(mWebBrowserImage->getMediaWidth(), r.getWidth());
+ height = llmin(mWebBrowserImage->getMediaHeight(), r.getHeight());
+ }
+
+ x_offset = (r.getWidth() - width) / 2;
+ y_offset = (r.getHeight() - height) / 2;
+
+ if (mIgnoreUIScale)
+ {
+ width = llround((F32)width * LLUI::sGLScaleFactor.mV[VX]);
+ height = llround((F32)height * LLUI::sGLScaleFactor.mV[VY]);
+ x_offset = llround((F32)x_offset * LLUI::sGLScaleFactor.mV[VX]);
+ y_offset = llround((F32)y_offset * LLUI::sGLScaleFactor.mV[VY]);
+ }
+
+ // draw the browser
+ gGL.setSceneBlendType(LLRender::BT_REPLACE);
+ gGL.begin( LLRender::QUADS );
+ if (! mWebBrowserImage->getTextureCoordsOpenGL())
+ {
+ // render using web browser reported width and height, instead of trying to invert GL scale
+ gGL.texCoord2f( max_u, 0.f );
+ gGL.vertex2i( x_offset + width, y_offset + height );
+
+ gGL.texCoord2f( 0.f, 0.f );
+ gGL.vertex2i( x_offset, y_offset + height );
+
+ gGL.texCoord2f( 0.f, max_v );
+ gGL.vertex2i( x_offset, y_offset );
+
+ gGL.texCoord2f( max_u, max_v );
+ gGL.vertex2i( x_offset + width, y_offset );
+ }
+ else
+ {
+ // render using web browser reported width and height, instead of trying to invert GL scale
+ gGL.texCoord2f( max_u, max_v );
+ gGL.vertex2i( x_offset + width, y_offset + height );
+
+ gGL.texCoord2f( 0.f, max_v );
+ gGL.vertex2i( x_offset, y_offset + height );
+
+ gGL.texCoord2f( 0.f, 0.f );
+ gGL.vertex2i( x_offset, y_offset );
+
+ gGL.texCoord2f( max_u, 0.f );
+ gGL.vertex2i( x_offset + width, y_offset );
+ }
+ gGL.end();
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
+ }
+ gGL.popMatrix();
+
+ // highlight if keyboard focus here. (TODO: this needs some work)
+ if ( mBorder->getVisible() )
+ mBorder->setKeyboardFocusHighlight( gFocusMgr.childHasKeyboardFocus( this ) );
+
+
+ LLUICtrl::draw();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLMediaCtrl::convertInputCoords(S32& x, S32& y)
+{
+ x = mIgnoreUIScale ? llround((F32)x * LLUI::sGLScaleFactor.mV[VX]) : x;
+ if ( ! mWebBrowserImage->getTextureCoordsOpenGL() )
+ {
+ y = mIgnoreUIScale ? llround((F32)(y) * LLUI::sGLScaleFactor.mV[VY]) : y;
+ }
+ else
+ {
+ y = mIgnoreUIScale ? llround((F32)(getRect().getHeight() - y) * LLUI::sGLScaleFactor.mV[VY]) : getRect().getHeight() - y;
+ };
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// static
+bool LLMediaCtrl::onClickLinkExternalTarget(const LLSD& notification, const LLSD& response )
+{
+ S32 option = LLNotification::getSelectedOption(notification, response);
+ if ( 0 == option )
+ {
+ // open in external browser because we don't support
+ // creation of our own secondary browser windows
+ LLWeb::loadURLExternal( notification["payload"]["external_url"].asString() );
+ }
+ return false;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// inherited from LLViewerMediaObserver
+//virtual
+void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
+{
+ switch(event)
+ {
+ case MEDIA_EVENT_CONTENT_UPDATED:
+ {
+ // LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CONTENT_UPDATED " << LL_ENDL;
+ };
+ break;
+
+ case MEDIA_EVENT_TIME_DURATION_UPDATED:
+ {
+ // LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_TIME_DURATION_UPDATED, time is " << self->getCurrentTime() << " of " << self->getDuration() << LL_ENDL;
+ };
+ break;
+
+ case MEDIA_EVENT_SIZE_CHANGED:
+ {
+ LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_SIZE_CHANGED " << LL_ENDL;
+ LLRect r = getRect();
+ reshape( r.getWidth(), r.getHeight(), FALSE );
+ };
+ break;
+
+ case MEDIA_EVENT_CURSOR_CHANGED:
+ {
+ LL_INFOS("Media") << "Media event: MEDIA_EVENT_CURSOR_CHANGED, new cursor is " << self->getCursorName() << LL_ENDL;
+
+ std::string cursor = self->getCursorName();
+
+ if(cursor == "arrow")
+ mLastSetCursor = UI_CURSOR_ARROW;
+ else if(cursor == "ibeam")
+ mLastSetCursor = UI_CURSOR_IBEAM;
+ else if(cursor == "splith")
+ mLastSetCursor = UI_CURSOR_SIZEWE;
+ else if(cursor == "splitv")
+ mLastSetCursor = UI_CURSOR_SIZENS;
+ else if(cursor == "hand")
+ mLastSetCursor = UI_CURSOR_HAND;
+ else // for anything else, default to the arrow
+ mLastSetCursor = UI_CURSOR_ARROW;
+ };
+ break;
+
+ case MEDIA_EVENT_NAVIGATE_BEGIN:
+ {
+ LL_INFOS("Media") << "Media event: MEDIA_EVENT_NAVIGATE_BEGIN, url is " << self->getNavigateURI() << LL_ENDL;
+ if(mMediaSource && mHideLoading)
+ {
+ mMediaSource->suspendUpdates(true);
+ }
+ };
+ break;
+
+ case MEDIA_EVENT_NAVIGATE_COMPLETE:
+ {
+ LL_INFOS("Media") << "Media event: MEDIA_EVENT_NAVIGATE_COMPLETE, result string is: " << self->getNavigateResultString() << LL_ENDL;
+ if(mMediaSource && mHideLoading)
+ {
+ mMediaSource->suspendUpdates(false);
+ }
+ };
+ break;
+
+ case MEDIA_EVENT_PROGRESS_UPDATED:
+ {
+ LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_PROGRESS_UPDATED, loading at " << self->getProgressPercent() << "%" << LL_ENDL;
+ };
+ break;
+
+ case MEDIA_EVENT_STATUS_TEXT_CHANGED:
+ {
+ LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_STATUS_TEXT_CHANGED, new status text is: " << self->getStatusText() << LL_ENDL;
+ };
+ break;
+
+ case MEDIA_EVENT_LOCATION_CHANGED:
+ {
+ LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_LOCATION_CHANGED, new uri is: " << self->getLocation() << LL_ENDL;
+ };
+ break;
+
+ case MEDIA_EVENT_CLICK_LINK_HREF:
+ {
+ LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, target is \"" << self->getClickTarget() << "\", uri is " << self->getClickURL() << LL_ENDL;
+ onClickLinkHref(self);
+ };
+ break;
+
+ case MEDIA_EVENT_CLICK_LINK_NOFOLLOW:
+ {
+ LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CLICK_LINK_NOFOLLOW, uri is " << self->getClickURL() << LL_ENDL;
+ onClickLinkNoFollow(self);
+ };
+ break;
+
+ case MEDIA_EVENT_PLUGIN_FAILED:
+ {
+ LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_PLUGIN_FAILED" << LL_ENDL;
+ };
+ break;
+
+ case MEDIA_EVENT_PLUGIN_FAILED_LAUNCH:
+ {
+ LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_PLUGIN_FAILED_LAUNCH" << LL_ENDL;
+ };
+ break;
+
+ case MEDIA_EVENT_NAME_CHANGED:
+ {
+ LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_NAME_CHANGED" << LL_ENDL;
+ };
+ break;
+ };
+
+ // chain all events to any potential observers of this object.
+ emitEvent(self, event);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLMediaCtrl::onClickLinkHref( LLPluginClassMedia* self )
+{
+ // retrieve the event parameters
+ std::string target = self->getClickTarget();
+ std::string url = self->getClickURL();
+
+ // if there is a value for the target
+ if ( !target.empty() )
+ {
+ if ( target == "_external" )
+ {
+ mExternalUrl = url;
+ LLSD payload;
+ payload["external_url"] = mExternalUrl;
+ LLNotifications::instance().add( "WebLaunchExternalTarget", LLSD(), payload, onClickLinkExternalTarget);
+ return;
+ }
+ }
+
+ const std::string protocol1( "http://" );
+ const std::string protocol2( "https://" );
+ if( mOpenLinksInExternalBrowser )
+ {
+ if ( !url.empty() )
+ {
+ if ( LLStringUtil::compareInsensitive( url.substr( 0, protocol1.length() ), protocol1 ) == 0 ||
+ LLStringUtil::compareInsensitive( url.substr( 0, protocol2.length() ), protocol2 ) == 0 )
+ {
+ LLWeb::loadURLExternal( url );
+ }
+ }
+ }
+ else
+ if( mOpenLinksInInternalBrowser )
+ {
+ if ( !url.empty() )
+ {
+ if ( LLStringUtil::compareInsensitive( url.substr( 0, protocol1.length() ), protocol1 ) == 0 ||
+ LLStringUtil::compareInsensitive( url.substr( 0, protocol2.length() ), protocol2 ) == 0 )
+ {
+ // If we spawn a new LLFloaterHTML, assume we want it to
+ // follow this LLMediaCtrl's trust for whether or
+ // not to open secondlife:///app/ links. JC.
+// const bool open_links_externally = false;
+// LLFloaterHtml::getInstance()->show(
+// event_in.mStringPayload,
+// "Second Life Browser",
+// open_links_externally,
+// mTrusted);
+ }
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLMediaCtrl::onClickLinkNoFollow( LLPluginClassMedia* self )
+{
+ std::string url = self->getClickURL();
+ if (LLURLDispatcher::isSLURLCommand(url)
+ && !mTrusted)
+ {
+ // block handling of this secondlife:///app/ URL
+ LLNotifications::instance().add("UnableToOpenCommandURL");
+ return;
+ }
+
+ LLURLDispatcher::dispatch(url, this, mTrusted);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+LLWebBrowserTexture::LLWebBrowserTexture( S32 width, S32 height, LLMediaCtrl* browserCtrl, viewer_media_t media_source ) :
+ LLDynamicTexture( 512, 512, 4, ORDER_FIRST, TRUE ),
+ mNeedsUpdate( true ),
+ mNeedsResize( false ),
+ mTextureCoordsOpenGL( true ),
+ mWebBrowserCtrl( browserCtrl ),
+ mMediaSource(media_source)
+{
+ mElapsedTime.start();
+
+ resize( width, height );
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+LLWebBrowserTexture::~LLWebBrowserTexture()
+{
+ mElapsedTime.stop();
+ mMediaSource = NULL;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+BOOL LLWebBrowserTexture::needsRender()
+{
+ bool texture_dirty = false;
+
+ if ( mWebBrowserCtrl->getFrequentUpdates() ||
+ mWebBrowserCtrl->getAlwaysRefresh() ||
+ mWebBrowserCtrl->getForceUpdate() )
+ {
+ // All of these force an update
+ return TRUE;
+ }
+
+ // If the texture needs updating, render needs to be called.
+ if (mMediaSource && mMediaSource->hasMedia())
+ {
+ LLPluginClassMedia* media = mMediaSource->getMediaPlugin();
+
+ if(media->textureValid() && media->getDirty())
+ {
+ texture_dirty = true;
+ }
+ }
+
+
+ return texture_dirty;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+BOOL LLWebBrowserTexture::render()
+{
+ if(updateBrowserTexture())
+ {
+ // updateBrowserTexture already verified that the media plugin is there and the texture is valid.
+ LLPluginClassMedia* media_plugin = mMediaSource->getMediaPlugin();
+ LLRect dirty_rect;
+
+ if(mNeedsUpdate)
+ {
+ // If we need an update, use the whole rect instead of the dirty rect.
+ dirty_rect.mLeft = 0;
+ dirty_rect.mBottom = 0;
+ dirty_rect.mRight = media_plugin->getWidth();
+ dirty_rect.mTop = media_plugin->getHeight();
+ }
+ else
+ {
+ mNeedsUpdate = media_plugin->getDirty(&dirty_rect);
+ }
+
+ if ( mNeedsUpdate )
+ {
+ mNeedsUpdate = false;
+ mWebBrowserCtrl->setForceUpdate(false);
+
+ // Constrain the dirty rect to be inside the texture
+ S32 x_pos = llmax(dirty_rect.mLeft, 0);
+ S32 y_pos = llmax(dirty_rect.mBottom, 0);
+ S32 width = llmin(dirty_rect.mRight, getWidth()) - x_pos;
+ S32 height = llmin(dirty_rect.mTop, getHeight()) - y_pos;
+
+ if(width > 0 && height > 0)
+ {
+ U8* data = media_plugin->getBitsData();
+
+ // Offset the pixels pointer to match x_pos and y_pos
+ data += ( x_pos * media_plugin->getTextureDepth() * media_plugin->getBitsWidth() );
+ data += ( y_pos * media_plugin->getTextureDepth() );
+
+ mTexture->setSubImage(
+ data,
+ media_plugin->getBitsWidth(),
+ media_plugin->getBitsHeight(),
+ x_pos,
+ y_pos,
+ width,
+ height,
+ TRUE); // force a fast update (i.e. don't call analyzeAlpha, etc.)
+ }
+
+ media_plugin->resetDirty();
+
+ return TRUE;
+ };
+ };
+
+ return FALSE;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+S32 LLWebBrowserTexture::getMediaWidth()
+{
+ return mMediaWidth;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+S32 LLWebBrowserTexture::getMediaHeight()
+{
+ return mMediaHeight;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLWebBrowserTexture::setNeedsUpdate()
+{
+ mNeedsUpdate = true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+bool LLWebBrowserTexture::getNeedsUpdate()
+{
+ return mNeedsUpdate;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+bool LLWebBrowserTexture::getTextureCoordsOpenGL()
+{
+ return mTextureCoordsOpenGL;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLWebBrowserTexture::resize( S32 new_width, S32 new_height )
+{
+ F32 scale_ratio = 1.f;
+ if (new_width > MAX_DIMENSION)
+ {
+ scale_ratio = (F32)MAX_DIMENSION / (F32)new_width;
+ }
+ if (new_height > MAX_DIMENSION)
+ {
+ scale_ratio = llmin(scale_ratio, (F32)MAX_DIMENSION / (F32)new_height);
+ }
+
+ mMediaWidth = llround(scale_ratio * (F32)new_width);
+ mMediaHeight = llround(scale_ratio * (F32)new_height);
+
+ adjustSize();
+}
+
+bool LLWebBrowserTexture::adjustSize()
+{
+ if (mMediaSource && mMediaSource->hasMedia())
+ {
+ int natural_width = mMediaSource->getMediaPlugin()->getNaturalWidth();
+ int natural_height = mMediaSource->getMediaPlugin()->getNaturalHeight();
+
+ if(natural_width != 0)
+ {
+ // If the media has a "natural size", use it.
+ mMediaWidth = natural_width;
+ mMediaHeight = natural_height;
+ }
+
+ mMediaSource->setSize(mMediaWidth, mMediaHeight);
+ mNeedsResize = false;
+
+ return true;
+ }
+ else
+ {
+ // The media isn't fully initialized yet, delay the resize until later.
+ mNeedsResize = true;
+ }
+
+ return false;
+}
+
+bool LLWebBrowserTexture::updateBrowserTexture()
+{
+ if (!adjustSize())
+ return false;
+
+ LLPluginClassMedia* media = mMediaSource->getMediaPlugin();
+
+ if(!media->textureValid())
+ return false;
+
+ if(mMediaSource->mNeedsNewTexture
+ || media->getTextureWidth() != mWidth
+ || media->getTextureHeight() != mHeight )
+ {
+ releaseGLTexture();
+
+ mWidth = media->getTextureWidth();
+ mHeight = media->getTextureHeight();
+ mTextureCoordsOpenGL = media->getTextureCoordsOpenGL();
+
+ // will create mWidth * mHeight sized texture, using the texture params specified by the media.
+ LLDynamicTexture::generateGLTexture(
+ media->getTextureFormatInternal(),
+ media->getTextureFormatPrimary(),
+ media->getTextureFormatType(),
+ media->getTextureFormatSwapBytes());
+
+
+ mMediaSource->mNeedsNewTexture = false;
+ }
+
+ return true;
+}
+// virtual
+LLXMLNodePtr LLMediaCtrl::getXML(bool save_children) const
+{
+ LLXMLNodePtr node = LLUICtrl::getXML();
+
+ node->setName(LL_WEB_BROWSER_CTRL_TAG);
+
+ return node;
+}
+
+LLView* LLMediaCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *factory)
+{
+ std::string name("web_browser");
+ node->getAttributeString("name", name);
+
+ std::string start_url("");
+ node->getAttributeString("start_url", start_url );
+
+ BOOL border_visible = true;
+ node->getAttributeBOOL("border_visible", border_visible);
+
+ LLRect rect;
+ createRect(node, rect, parent, LLRect());
+
+ LLMediaCtrl* web_browser = new LLMediaCtrl( name, rect );
+
+ if(node->hasAttribute("caret_color"))
+ {
+ LLColor4 color;
+ LLUICtrlFactory::getAttributeColor(node, "caret_color", color);
+ LLColor4U colorU = LLColor4U(color);
+ web_browser->setCaretColor( colorU.mV[0], colorU.mV[1], colorU.mV[2] );
+ }
+
+ BOOL ignore_ui_scale = web_browser->getIgnoreUIScale();
+ node->getAttributeBOOL("ignore_ui_scale", ignore_ui_scale);
+ web_browser->setIgnoreUIScale((bool)ignore_ui_scale);
+
+ web_browser->initFromXML(node, parent);
+
+ web_browser->setHomePageUrl( start_url );
+
+ web_browser->setBorderVisible( border_visible );
+
+ if(! start_url.empty())
+ {
+ web_browser->navigateHome();
+ }
+
+ return web_browser;
+}
+
+std::string LLMediaCtrl::getCurrentNavUrl()
+{
+ return mCurrentNavUrl;
+}
+
diff --git a/linden/indra/newview/llmediactrl.h b/linden/indra/newview/llmediactrl.h
new file mode 100644
index 0000000..77f59c7
--- /dev/null
+++ b/linden/indra/newview/llmediactrl.h
@@ -0,0 +1,201 @@
+/**
+ * @file llmediactrl.h
+ * @brief Web browser UI control
+ *
+ * $LicenseInfo:firstyear=2006&license=viewergpl$
+ *
+ * Copyright (c) 2006-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLMediaCtrl_H
+#define LL_LLMediaCtrl_H
+
+#include "llviewermedia.h"
+
+#include "lluictrl.h"
+#include "llframetimer.h"
+#include "lldynamictexture.h"
+
+class LLViewBorder;
+class LLWebBrowserTexture;
+class LLUICtrlFactory;
+
+////////////////////////////////////////////////////////////////////////////////
+//
+class LLMediaCtrl :
+ public LLUICtrl,
+ public LLViewerMediaObserver,
+ public LLViewerMediaEventEmitter
+{
+ public:
+ LLMediaCtrl( const std::string& name, const LLRect& rect );
+ virtual ~LLMediaCtrl();
+
+ void setBorderVisible( BOOL border_visible );
+
+ // For the tutorial window, we don't want to take focus on clicks,
+ // as the examples include how to move around with the arrow
+ // keys. Thus we keep focus on the app by setting this false.
+ // Defaults to true.
+ void setTakeFocusOnClick( bool take_focus );
+
+ virtual LLXMLNodePtr getXML(bool save_children = true) const;
+ static LLView* fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *factory);
+
+ // handle mouse related methods
+ virtual BOOL handleHover( S32 x, S32 y, MASK mask );
+ virtual BOOL handleMouseUp( S32 x, S32 y, MASK mask );
+ virtual BOOL handleMouseDown( S32 x, S32 y, MASK mask );
+ virtual BOOL handleDoubleClick( S32 x, S32 y, MASK mask );
+ virtual BOOL handleScrollWheel( S32 x, S32 y, S32 clicks );
+
+ // navigation
+ void navigateTo( std::string url_in, std::string mime_type = "");
+ void navigateBack();
+ void navigateHome();
+ void navigateForward();
+ void navigateToLocalPage( const std::string& subdir, const std::string& filename_in );
+ bool canNavigateBack();
+ bool canNavigateForward();
+ void setOpenInExternalBrowser( bool valIn );
+ void setOpenInInternalBrowser( bool valIn );
+ std::string getCurrentNavUrl();
+
+ // By default, we do not handle "secondlife:///app/" SLURLs, because
+ // those can cause teleports, open windows, etc. We cannot be sure
+ // that each "click" is actually due to a user action, versus
+ // Javascript or some other mechanism. However, we need the search
+ // floater and login page to handle these URLs. Those are safe
+ // because we control the page content. See DEV-9530. JC.
+ void setTrusted( bool valIn );
+
+ void setHomePageUrl( const std::string urlIn );
+ std::string getHomePageUrl();
+
+ // set/clear URL to visit when a 404 page is reached
+ void set404RedirectUrl( std::string redirect_url );
+ void clr404RedirectUrl();
+
+ // accessor/mutator for flag that indicates if frequent updates to texture happen
+ bool getFrequentUpdates() { return mFrequentUpdates; };
+ void setFrequentUpdates( bool frequentUpdatesIn ) { mFrequentUpdates = frequentUpdatesIn; };
+
+ void setIgnoreUIScale(bool ignore) { mIgnoreUIScale = ignore; }
+ bool getIgnoreUIScale() { return mIgnoreUIScale; }
+
+ void setAlwaysRefresh(bool refresh) { mAlwaysRefresh = refresh; }
+ bool getAlwaysRefresh() { return mAlwaysRefresh; }
+
+ void setForceUpdate(bool force_update) { mForceUpdate = force_update; }
+ bool getForceUpdate() { return mForceUpdate; }
+
+ LLPluginClassMedia* getMediaPlugin();
+
+ bool setCaretColor( unsigned int red, unsigned int green, unsigned int blue );
+
+
+ // over-rides
+ virtual BOOL handleKeyHere( KEY key, MASK mask);
+ virtual void handleVisibilityChange ( BOOL new_visibility );
+ virtual BOOL handleUnicodeCharHere(llwchar uni_char);
+ virtual void reshape( S32 width, S32 height, BOOL called_from_parent = TRUE);
+ virtual void draw();
+ virtual void onVisibilityChange ( BOOL curVisibilityIn );
+
+ // focus overrides
+ void onFocusLost();
+ void onFocusReceived();
+
+ // Incoming media event dispatcher
+ virtual void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);
+
+ // handlers for individual events (could be done inside the switch in handleMediaEvent, they're just individual functions for clarity)
+ void onClickLinkHref( LLPluginClassMedia* self );
+ void onClickLinkNoFollow( LLPluginClassMedia* self );
+
+ protected:
+ void convertInputCoords(S32& x, S32& y);
+
+ private:
+ static bool onClickLinkExternalTarget( const LLSD&, const LLSD& );
+
+ const S32 mTextureDepthBytes;
+ LLWebBrowserTexture* mWebBrowserImage;
+ LLViewBorder* mBorder;
+ bool mFrequentUpdates;
+ bool mForceUpdate;
+ bool mOpenLinksInExternalBrowser;
+ bool mOpenLinksInInternalBrowser;
+ bool mTrusted;
+ std::string mHomePageUrl;
+ std::string mExternalUrl;
+ std::string mCurrentNavUrl;
+ bool mIgnoreUIScale;
+ bool mAlwaysRefresh;
+ viewer_media_t mMediaSource;
+ bool mTakeFocusOnClick;
+ ECursorType mLastSetCursor;
+ bool mStretchToFill;
+ bool mMaintainAspectRatio;
+ bool mHideLoading;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+//
+class LLWebBrowserTexture : public LLDynamicTexture
+{
+LOG_CLASS(LLWebBrowserTexture);
+ public:
+ LLWebBrowserTexture( S32 width, S32 height, LLMediaCtrl* browserCtrl, viewer_media_t media_source );
+ virtual ~LLWebBrowserTexture();
+
+ virtual BOOL needsRender();
+ virtual void preRender( BOOL clear_depth = TRUE ) {};
+ virtual void postRender( BOOL success ) {};
+ virtual BOOL render();
+
+ bool adjustSize();
+ S32 getMediaWidth();
+ S32 getMediaHeight();
+ bool getNeedsUpdate();
+ void setNeedsUpdate();
+ bool getTextureCoordsOpenGL();
+
+ void resize( S32 new_width, S32 new_height );
+ bool updateBrowserTexture();
+
+ protected:
+ S32 mMediaWidth;
+ S32 mMediaHeight;
+ bool mNeedsUpdate;
+ bool mNeedsResize;
+ bool mTextureCoordsOpenGL;
+ LLFrameTimer mElapsedTime;
+ LLMediaCtrl* mWebBrowserCtrl;
+ viewer_media_t mMediaSource;
+};
+
+#endif // LL_LLMediaCtrl_H
diff --git a/linden/indra/newview/llmediaremotectrl.cpp b/linden/indra/newview/llmediaremotectrl.cpp
index f2ec414..a62973a 100644
--- a/linden/indra/newview/llmediaremotectrl.cpp
+++ b/linden/indra/newview/llmediaremotectrl.cpp
@@ -34,7 +34,7 @@
#include "llmediaremotectrl.h"
-#include "audioengine.h"
+#include "llaudioengine.h"
#include "lliconctrl.h"
#include "llmimetypes.h"
#include "lloverlaybar.h"
@@ -86,6 +86,7 @@ BOOL LLMediaRemoteCtrl::postBuild()
childSetAction("media_stop",LLOverlayBar::mediaStop,this);
childSetAction("music_stop",LLOverlayBar::toggleMusicPlay,this);
childSetAction("media_pause",LLOverlayBar::toggleMediaPlay,this);
+ childSetAction("music_pause",LLOverlayBar::toggleMusicPlay,this);
childSetAction("expand", onClickExpandBtn, this);
return TRUE;
@@ -135,9 +136,11 @@ void* LLMediaRemoteCtrl::createVolumePanel(void* data)
// Virtual
void LLMediaRemoteCtrl::setToolTip(const std::string& msg)
{
- std::string mime_type = LLMIMETypes::translate(LLViewerMedia::getMimeType());
- std::string tool_tip = LLMIMETypes::findToolTip(LLViewerMedia::getMimeType());
- std::string play_tip = LLMIMETypes::findPlayTip(LLViewerMedia::getMimeType());
+ // TODO: this gets removed for Media on a Prim
+
+ const std::string mime_type = LLViewerParcelMedia::getMimeType();
+ std::string tool_tip = LLMIMETypes::findToolTip(mime_type);
+ std::string play_tip = LLMIMETypes::findPlayTip(mime_type);
// childSetToolTip("media_stop", mControls->getString("stop_label") + "\n" + tool_tip);
childSetToolTip("media_icon", tool_tip);
childSetToolTip("media_play", play_tip);
@@ -150,6 +153,7 @@ void LLMediaRemoteCtrl::enableMediaButtons()
bool stop_media_enabled = false;
bool play_music_enabled = false;
bool stop_music_enabled = false;
+ bool music_show_pause = false;
bool media_show_pause = false;
LLColor4 music_icon_color = LLUI::sColorsGroup->getColor( "IconDisabledColor" );
LLColor4 media_icon_color = LLUI::sColorsGroup->getColor( "IconDisabledColor" );
@@ -161,7 +165,7 @@ void LLMediaRemoteCtrl::enableMediaButtons()
if (gSavedSettings.getBOOL("AudioStreamingVideo"))
{
- if ( parcel && parcel->getMediaURL()[0])
+ if ( parcel && !parcel->getMediaURL().empty())
{
// Set the tooltip
// Put this text into xui file
@@ -171,23 +175,22 @@ void LLMediaRemoteCtrl::enableMediaButtons()
play_media_enabled = true;
media_icon_color = LLUI::sColorsGroup->getColor( "IconEnabledColor" );
- LLMediaBase::EStatus status = LLViewerParcelMedia::getStatus();
+ LLViewerMediaImpl::EMediaStatus status = LLViewerParcelMedia::getStatus();
switch(status)
{
- case LLMediaBase::STATUS_STOPPED:
- case LLMediaBase::STATUS_UNKNOWN:
+ case LLViewerMediaImpl::MEDIA_NONE:
media_show_pause = false;
stop_media_enabled = false;
break;
- case LLMediaBase::STATUS_STARTED:
- case LLMediaBase::STATUS_NAVIGATING:
- case LLMediaBase::STATUS_RESETTING:
+ case LLViewerMediaImpl::MEDIA_LOADING:
+ case LLViewerMediaImpl::MEDIA_LOADED:
+ case LLViewerMediaImpl::MEDIA_PLAYING:
// HACK: only show the pause button for movie types
media_show_pause = LLMIMETypes::widgetType(parcel->getMediaType()) == "movie" ? true : false;
stop_media_enabled = true;
play_media_enabled = false;
break;
- case LLMediaBase::STATUS_PAUSED:
+ case LLViewerMediaImpl::MEDIA_PAUSED:
media_show_pause = false;
stop_media_enabled = true;
break;
@@ -197,46 +200,42 @@ void LLMediaRemoteCtrl::enableMediaButtons()
}
}
}
+
if (gSavedSettings.getBOOL("AudioStreamingMusic") && gAudiop)
{
-
- if ( parcel && parcel->getMusicURL()[0])
+ if ( parcel && !parcel->getMusicURL().empty())
{
+ play_music_enabled = true;
music_icon_color = LLUI::sColorsGroup->getColor( "IconEnabledColor" );
if (gOverlayBar->musicPlaying())
{
- play_music_enabled = false;
+ music_show_pause = true;
stop_music_enabled = true;
}
else
{
- play_music_enabled = true;
+ music_show_pause = false;
stop_music_enabled = false;
}
}
- // if no mime type has been set disable play
- if( LLViewerMedia::getMimeType().empty()
- || LLViewerMedia::getMimeType() == "none/none")
- {
- play_media_enabled = false;
- stop_media_enabled = false;
- }
+ // Don't test the mime-type: this is not updated in a consistent basis. The existence of a valid gAudiop is enough guarantee.
}
const std::string media_icon_name = LLMIMETypes::findIcon(media_type);
-
LLButton* music_play_btn = getChild("music_play");
LLButton* music_stop_btn = getChild("music_stop");
-
- music_play_btn->setEnabled(play_music_enabled);
- music_stop_btn->setEnabled(stop_music_enabled);
- childSetColor("music_icon", music_icon_color);
-
+ LLButton* music_pause_btn = getChild("music_pause");
LLButton* media_play_btn = getChild("media_play");
LLButton* media_stop_btn = getChild