Automated merge with http://hg.secondlife.com/viewer-development
commit
960e8c05cb
4982
autobuild.xml
4982
autobuild.xml
File diff suppressed because it is too large
Load Diff
|
|
@ -102,7 +102,7 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
|||
# To support a different SDK update these Xcode settings:
|
||||
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.5)
|
||||
set(CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX10.5.sdk)
|
||||
set(CMAKE_XCODE_ATTRIBUTE_GCC_VERSION "4.2")
|
||||
set(CMAKE_XCODE_ATTRIBUTE_GCC_VERSION "4.0")
|
||||
set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT dwarf-with-dsym)
|
||||
|
||||
# NOTE: To attempt an i386/PPC Universal build, add this on the configure line:
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ void set_default_colour_weights(kdu_params *siz);
|
|||
|
||||
const char* engineInfoLLImageJ2CKDU()
|
||||
{
|
||||
std::string version = llformat("KDU %s", KDU_CORE_VERSION);
|
||||
static std::string version = llformat("KDU %s", KDU_CORE_VERSION);
|
||||
return version.c_str();
|
||||
}
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,416 +1,426 @@
|
|||
/**
|
||||
* @file llpluginclassmedia.h
|
||||
* @brief LLPluginClassMedia handles interaction with a plugin which knows about the "media" message class.
|
||||
*
|
||||
* @cond
|
||||
* $LicenseInfo:firstyear=2008&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
* @endcond
|
||||
*/
|
||||
|
||||
#ifndef LL_LLPLUGINCLASSMEDIA_H
|
||||
#define LL_LLPLUGINCLASSMEDIA_H
|
||||
|
||||
#include "llgltypes.h"
|
||||
#include "llpluginprocessparent.h"
|
||||
#include "llrect.h"
|
||||
#include "llpluginclassmediaowner.h"
|
||||
#include <queue>
|
||||
#include "v4color.h"
|
||||
|
||||
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_dir,
|
||||
const std::string &plugin_filename,
|
||||
bool debug);
|
||||
|
||||
// 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);
|
||||
|
||||
void setBackgroundColor(LLColor4 color) { mBackgroundColor = color; };
|
||||
|
||||
void setOwner(LLPluginClassMediaOwner *owner) { mOwner = owner; };
|
||||
|
||||
// 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, LLSD native_key_data);
|
||||
|
||||
void scrollEvent(int x, int y, MASK modifiers);
|
||||
|
||||
// Text may be unicode (utf8 encoded)
|
||||
bool textInput(const std::string &text, MASK modifiers, LLSD native_key_data);
|
||||
|
||||
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();
|
||||
|
||||
void sendPickFileResponse(const std::string &file);
|
||||
|
||||
void sendAuthResponse(bool ok, const std::string &username, const std::string &password);
|
||||
|
||||
// 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; };
|
||||
|
||||
// These can be called before init(), and they will be queued and sent before the media init message.
|
||||
void setUserDataPath(const std::string &user_data_path);
|
||||
void setLanguageCode(const std::string &language_code);
|
||||
void setPluginsEnabled(const bool enabled);
|
||||
void setJavascriptEnabled(const bool enabled);
|
||||
void setTarget(const std::string &target);
|
||||
|
||||
///////////////////////////////////
|
||||
// media browser class functions
|
||||
bool pluginSupportsMediaBrowser(void);
|
||||
|
||||
void focus(bool focused);
|
||||
void clear_cache();
|
||||
void clear_cookies();
|
||||
void set_cookies(const std::string &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 setBrowserUserAgent(const std::string& user_agent);
|
||||
void proxyWindowOpened(const std::string &target, const std::string &uuid);
|
||||
void proxyWindowClosed(const std::string &uuid);
|
||||
void ignore_ssl_cert_errors(bool ignore);
|
||||
void addCertificateFilePath(const std::string& path);
|
||||
|
||||
// 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_NOFOLLOW
|
||||
std::string getClickNavType() const { return mClickNavType; };
|
||||
|
||||
// This is valid after MEDIA_EVENT_CLICK_LINK_HREF
|
||||
std::string getClickTarget() const { return mClickTarget; };
|
||||
|
||||
// This is valid during MEDIA_EVENT_CLICK_LINK_HREF and MEDIA_EVENT_GEOMETRY_CHANGE
|
||||
std::string getClickUUID() const { return mClickUUID; };
|
||||
|
||||
// This is valid after MEDIA_EVENT_NAVIGATE_ERROR_PAGE
|
||||
S32 getStatusCode() const { return mStatusCode; };
|
||||
|
||||
// These are valid during MEDIA_EVENT_GEOMETRY_CHANGE
|
||||
S32 getGeometryX() const { return mGeometryX; };
|
||||
S32 getGeometryY() const { return mGeometryY; };
|
||||
S32 getGeometryWidth() const { return mGeometryWidth; };
|
||||
S32 getGeometryHeight() const { return mGeometryHeight; };
|
||||
|
||||
// These are valid during MEDIA_EVENT_AUTH_REQUEST
|
||||
std::string getAuthURL() const { return mAuthURL; };
|
||||
std::string getAuthRealm() const { return mAuthRealm; };
|
||||
|
||||
// These are valid during MEDIA_EVENT_LINK_HOVERED
|
||||
std::string getHoverText() const { return mHoverText; };
|
||||
std::string getHoverLink() const { return mHoverLink; };
|
||||
|
||||
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<LLPluginMessage> 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;
|
||||
|
||||
LLColor4 mBackgroundColor;
|
||||
|
||||
std::string mTarget;
|
||||
|
||||
/////////////////////////////////////////
|
||||
// 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 mClickNavType;
|
||||
std::string mClickTarget;
|
||||
std::string mClickUUID;
|
||||
S32 mGeometryX;
|
||||
S32 mGeometryY;
|
||||
S32 mGeometryWidth;
|
||||
S32 mGeometryHeight;
|
||||
S32 mStatusCode;
|
||||
std::string mAuthURL;
|
||||
std::string mAuthRealm;
|
||||
std::string mHoverText;
|
||||
std::string mHoverLink;
|
||||
|
||||
/////////////////////////////////////////
|
||||
// media_time class
|
||||
F64 mCurrentTime;
|
||||
F64 mDuration;
|
||||
F64 mCurrentRate;
|
||||
F64 mLoadedDuration;
|
||||
|
||||
//--------------------------------------
|
||||
//debug use only
|
||||
//
|
||||
private:
|
||||
bool mDeleteOK ;
|
||||
public:
|
||||
void setDeleteOK(bool flag) { mDeleteOK = flag ;}
|
||||
//--------------------------------------
|
||||
};
|
||||
|
||||
#endif // LL_LLPLUGINCLASSMEDIA_H
|
||||
/**
|
||||
* @file llpluginclassmedia.h
|
||||
* @brief LLPluginClassMedia handles interaction with a plugin which knows about the "media" message class.
|
||||
*
|
||||
* @cond
|
||||
* $LicenseInfo:firstyear=2008&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
* @endcond
|
||||
*/
|
||||
|
||||
#ifndef LL_LLPLUGINCLASSMEDIA_H
|
||||
#define LL_LLPLUGINCLASSMEDIA_H
|
||||
|
||||
#include "llgltypes.h"
|
||||
#include "llpluginprocessparent.h"
|
||||
#include "llrect.h"
|
||||
#include "llpluginclassmediaowner.h"
|
||||
#include <queue>
|
||||
#include "v4color.h"
|
||||
|
||||
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_dir,
|
||||
const std::string &plugin_filename,
|
||||
bool debug);
|
||||
|
||||
// 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);
|
||||
|
||||
void setBackgroundColor(LLColor4 color) { mBackgroundColor = color; };
|
||||
|
||||
void setOwner(LLPluginClassMediaOwner *owner) { mOwner = owner; };
|
||||
|
||||
// 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, LLSD native_key_data);
|
||||
|
||||
void scrollEvent(int x, int y, MASK modifiers);
|
||||
|
||||
// Javascript <-> viewer events
|
||||
void jsExposeObjectEvent( bool expose );
|
||||
void jsValuesValidEvent( bool valid );
|
||||
void jsAgentLocationEvent( double x, double y, double z );
|
||||
void jsAgentGlobalLocationEvent( double x, double y, double z );
|
||||
void jsAgentOrientationEvent( double angle );
|
||||
void jsAgentLanguageEvent( const std::string& language );
|
||||
void jsAgentRegionEvent( const std::string& region_name );
|
||||
void jsAgentMaturityEvent( const std::string& maturity );
|
||||
|
||||
// Text may be unicode (utf8 encoded)
|
||||
bool textInput(const std::string &text, MASK modifiers, LLSD native_key_data);
|
||||
|
||||
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();
|
||||
|
||||
void sendPickFileResponse(const std::string &file);
|
||||
|
||||
void sendAuthResponse(bool ok, const std::string &username, const std::string &password);
|
||||
|
||||
// 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; };
|
||||
|
||||
// These can be called before init(), and they will be queued and sent before the media init message.
|
||||
void setUserDataPath(const std::string &user_data_path);
|
||||
void setLanguageCode(const std::string &language_code);
|
||||
void setPluginsEnabled(const bool enabled);
|
||||
void setJavascriptEnabled(const bool enabled);
|
||||
void setTarget(const std::string &target);
|
||||
|
||||
///////////////////////////////////
|
||||
// media browser class functions
|
||||
bool pluginSupportsMediaBrowser(void);
|
||||
|
||||
void focus(bool focused);
|
||||
void clear_cache();
|
||||
void clear_cookies();
|
||||
void set_cookies(const std::string &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 setBrowserUserAgent(const std::string& user_agent);
|
||||
void proxyWindowOpened(const std::string &target, const std::string &uuid);
|
||||
void proxyWindowClosed(const std::string &uuid);
|
||||
void ignore_ssl_cert_errors(bool ignore);
|
||||
void addCertificateFilePath(const std::string& path);
|
||||
|
||||
// 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_NOFOLLOW
|
||||
std::string getClickNavType() const { return mClickNavType; };
|
||||
|
||||
// This is valid after MEDIA_EVENT_CLICK_LINK_HREF
|
||||
std::string getClickTarget() const { return mClickTarget; };
|
||||
|
||||
// This is valid during MEDIA_EVENT_CLICK_LINK_HREF and MEDIA_EVENT_GEOMETRY_CHANGE
|
||||
std::string getClickUUID() const { return mClickUUID; };
|
||||
|
||||
// This is valid after MEDIA_EVENT_NAVIGATE_ERROR_PAGE
|
||||
S32 getStatusCode() const { return mStatusCode; };
|
||||
|
||||
// These are valid during MEDIA_EVENT_GEOMETRY_CHANGE
|
||||
S32 getGeometryX() const { return mGeometryX; };
|
||||
S32 getGeometryY() const { return mGeometryY; };
|
||||
S32 getGeometryWidth() const { return mGeometryWidth; };
|
||||
S32 getGeometryHeight() const { return mGeometryHeight; };
|
||||
|
||||
// These are valid during MEDIA_EVENT_AUTH_REQUEST
|
||||
std::string getAuthURL() const { return mAuthURL; };
|
||||
std::string getAuthRealm() const { return mAuthRealm; };
|
||||
|
||||
// These are valid during MEDIA_EVENT_LINK_HOVERED
|
||||
std::string getHoverText() const { return mHoverText; };
|
||||
std::string getHoverLink() const { return mHoverLink; };
|
||||
|
||||
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<LLPluginMessage> 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;
|
||||
|
||||
LLColor4 mBackgroundColor;
|
||||
|
||||
std::string mTarget;
|
||||
|
||||
/////////////////////////////////////////
|
||||
// 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 mClickNavType;
|
||||
std::string mClickTarget;
|
||||
std::string mClickUUID;
|
||||
S32 mGeometryX;
|
||||
S32 mGeometryY;
|
||||
S32 mGeometryWidth;
|
||||
S32 mGeometryHeight;
|
||||
S32 mStatusCode;
|
||||
std::string mAuthURL;
|
||||
std::string mAuthRealm;
|
||||
std::string mHoverText;
|
||||
std::string mHoverLink;
|
||||
|
||||
/////////////////////////////////////////
|
||||
// media_time class
|
||||
F64 mCurrentTime;
|
||||
F64 mDuration;
|
||||
F64 mCurrentRate;
|
||||
F64 mLoadedDuration;
|
||||
|
||||
//--------------------------------------
|
||||
//debug use only
|
||||
//
|
||||
private:
|
||||
bool mDeleteOK ;
|
||||
public:
|
||||
void setDeleteOK(bool flag) { mDeleteOK = flag ;}
|
||||
//--------------------------------------
|
||||
};
|
||||
|
||||
#endif // LL_LLPLUGINCLASSMEDIA_H
|
||||
|
|
|
|||
|
|
@ -554,7 +554,7 @@ S32 LLFontGL::maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_ch
|
|||
BOOL in_word = FALSE;
|
||||
|
||||
// avoid S32 overflow when max_pixels == S32_MAX by staying in floating point
|
||||
F32 scaled_max_pixels = ceil(max_pixels * sScaleX);
|
||||
F32 scaled_max_pixels = max_pixels * sScaleX;
|
||||
F32 width_padding = 0.f;
|
||||
|
||||
LLFontGlyphInfo* next_glyph = NULL;
|
||||
|
|
|
|||
|
|
@ -280,7 +280,7 @@ bool LLTextBase::truncate()
|
|||
if (getLength() >= S32(mMaxTextByteLength / 4))
|
||||
{
|
||||
// Have to check actual byte size
|
||||
LLWString text(getWText());
|
||||
LLWString text(getWText());
|
||||
S32 utf8_byte_size = wstring_utf8_length(text);
|
||||
if ( utf8_byte_size > mMaxTextByteLength )
|
||||
{
|
||||
|
|
@ -547,8 +547,7 @@ void LLTextBase::drawText()
|
|||
}
|
||||
|
||||
LLRect text_rect(line.mRect);
|
||||
text_rect.mRight = llmin(mDocumentView->getRect().getWidth(), text_rect.mRight); // clamp right edge to document extents
|
||||
text_rect.translate(mVisibleTextRect.mLeft, mVisibleTextRect.mBottom); // translate into display region of text widget
|
||||
text_rect.mRight = mDocumentView->getRect().getWidth(); // clamp right edge to document extents
|
||||
text_rect.translate(mDocumentView->getRect().mLeft, mDocumentView->getRect().mBottom); // adjust by scroll position
|
||||
|
||||
// draw a single line of text
|
||||
|
|
@ -655,7 +654,7 @@ S32 LLTextBase::insertStringNoUndo(S32 pos, const LLWString &wstr, LLTextBase::s
|
|||
}
|
||||
|
||||
text.insert(pos, wstr);
|
||||
getViewModel()->setDisplay(text);
|
||||
getViewModel()->setDisplay(text);
|
||||
|
||||
if ( truncate() )
|
||||
{
|
||||
|
|
@ -670,7 +669,7 @@ S32 LLTextBase::insertStringNoUndo(S32 pos, const LLWString &wstr, LLTextBase::s
|
|||
|
||||
S32 LLTextBase::removeStringNoUndo(S32 pos, S32 length)
|
||||
{
|
||||
LLWString text(getWText());
|
||||
LLWString text(getWText());
|
||||
segment_set_t::iterator seg_iter = getSegIterContaining(pos);
|
||||
while(seg_iter != mSegments.end())
|
||||
{
|
||||
|
|
@ -717,7 +716,7 @@ S32 LLTextBase::removeStringNoUndo(S32 pos, S32 length)
|
|||
}
|
||||
|
||||
text.erase(pos, length);
|
||||
getViewModel()->setDisplay(text);
|
||||
getViewModel()->setDisplay(text);
|
||||
|
||||
// recreate default segment in case we erased everything
|
||||
createDefaultSegment();
|
||||
|
|
@ -734,9 +733,9 @@ S32 LLTextBase::overwriteCharNoUndo(S32 pos, llwchar wc)
|
|||
{
|
||||
return 0;
|
||||
}
|
||||
LLWString text(getWText());
|
||||
LLWString text(getWText());
|
||||
text[pos] = wc;
|
||||
getViewModel()->setDisplay(text);
|
||||
getViewModel()->setDisplay(text);
|
||||
|
||||
onValueChange(pos, pos + 1);
|
||||
needsReflow(pos);
|
||||
|
|
@ -857,7 +856,7 @@ BOOL LLTextBase::handleMouseUp(S32 x, S32 y, MASK mask)
|
|||
// Did we just click on a link?
|
||||
if (mURLClickSignal
|
||||
&& cur_segment->getStyle()
|
||||
&& cur_segment->getStyle()->isLink())
|
||||
&& cur_segment->getStyle()->isLink())
|
||||
{
|
||||
// *TODO: send URL here?
|
||||
(*mURLClickSignal)(this, LLSD() );
|
||||
|
|
@ -1035,27 +1034,27 @@ void LLTextBase::draw()
|
|||
gl_rect_2d(text_rect, bg_color % alpha, TRUE);
|
||||
}
|
||||
|
||||
bool should_clip = mClip || mScroller != NULL;
|
||||
{ LLLocalClipRect clip(text_rect, should_clip);
|
||||
bool should_clip = mClip || mScroller != NULL;
|
||||
{ LLLocalClipRect clip(text_rect, should_clip);
|
||||
|
||||
// draw document view
|
||||
if (mScroller)
|
||||
// draw document view
|
||||
if (mScroller)
|
||||
{
|
||||
drawChild(mScroller);
|
||||
}
|
||||
else
|
||||
{
|
||||
drawChild(mDocumentView);
|
||||
}
|
||||
drawChild(mScroller);
|
||||
}
|
||||
else
|
||||
{
|
||||
drawChild(mDocumentView);
|
||||
}
|
||||
|
||||
drawSelectionBackground();
|
||||
drawText();
|
||||
drawCursor();
|
||||
}
|
||||
|
||||
mDocumentView->setVisible(FALSE);
|
||||
LLUICtrl::draw();
|
||||
mDocumentView->setVisible(TRUE);
|
||||
mDocumentView->setVisible(FALSE);
|
||||
LLUICtrl::draw();
|
||||
mDocumentView->setVisible(TRUE);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1119,8 +1118,7 @@ void LLTextBase::updateScrollFromCursor()
|
|||
|
||||
// scroll so that the cursor is at the top of the page
|
||||
LLRect scroller_doc_window = getVisibleDocumentRect();
|
||||
LLRect cursor_rect_doc = getLocalRectFromDocIndex(mCursorPos);
|
||||
cursor_rect_doc.translate(scroller_doc_window.mLeft, scroller_doc_window.mBottom);
|
||||
LLRect cursor_rect_doc = getDocRectFromDocIndex(mCursorPos);
|
||||
mScroller->scrollToShowRect(cursor_rect_doc, LLRect(0, scroller_doc_window.getHeight() - 5, scroller_doc_window.getWidth(), 5));
|
||||
}
|
||||
|
||||
|
|
@ -1366,9 +1364,9 @@ S32 LLTextBase::getLineStart( S32 line ) const
|
|||
{
|
||||
S32 num_lines = getLineCount();
|
||||
if (num_lines == 0)
|
||||
{
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
line = llclamp(line, 0, num_lines-1);
|
||||
return mLineInfoList[line].mDocIndexStart;
|
||||
|
|
@ -1378,9 +1376,9 @@ S32 LLTextBase::getLineEnd( S32 line ) const
|
|||
{
|
||||
S32 num_lines = getLineCount();
|
||||
if (num_lines == 0)
|
||||
{
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
line = llclamp(line, 0, num_lines-1);
|
||||
return mLineInfoList[line].mDocIndexEnd;
|
||||
|
|
@ -1656,7 +1654,7 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para
|
|||
LLUrlMatch match;
|
||||
std::string text = new_text;
|
||||
while ( LLUrlRegistry::instance().findUrl(text, match,
|
||||
boost::bind(&LLTextBase::replaceUrl, this, _1, _2, _3)) )
|
||||
boost::bind(&LLTextBase::replaceUrl, this, _1, _2, _3)) )
|
||||
{
|
||||
|
||||
LLTextUtil::processUrlMatch(&match,this);
|
||||
|
|
@ -1949,7 +1947,7 @@ void LLTextBase::setWText(const LLWString& text)
|
|||
|
||||
const LLWString& LLTextBase::getWText() const
|
||||
{
|
||||
return getViewModel()->getDisplay();
|
||||
return getViewModel()->getDisplay();
|
||||
}
|
||||
|
||||
// If round is true, if the position is on the right half of a character, the cursor
|
||||
|
|
@ -1960,9 +1958,12 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round,
|
|||
{
|
||||
// Figure out which line we're nearest to.
|
||||
LLRect visible_region = getVisibleDocumentRect();
|
||||
LLRect doc_rect = mDocumentView->getRect();
|
||||
|
||||
S32 doc_y = local_y - doc_rect.mBottom;
|
||||
|
||||
// binary search for line that starts before local_y
|
||||
line_list_t::const_iterator line_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), local_y - mVisibleTextRect.mBottom + visible_region.mBottom, compare_bottom());
|
||||
line_list_t::const_iterator line_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), doc_y, compare_bottom());
|
||||
|
||||
if (line_iter == mLineInfoList.end())
|
||||
{
|
||||
|
|
@ -1970,7 +1971,7 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round,
|
|||
}
|
||||
|
||||
S32 pos = getLength();
|
||||
S32 start_x = mVisibleTextRect.mLeft + line_iter->mRect.mLeft - visible_region.mLeft;
|
||||
S32 start_x = line_iter->mRect.mLeft + doc_rect.mLeft;
|
||||
|
||||
segment_set_t::iterator line_seg_iter;
|
||||
S32 line_seg_offset;
|
||||
|
|
@ -1992,7 +1993,7 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round,
|
|||
}
|
||||
|
||||
// if we've reached a line of text *below* the mouse cursor, doc index is first character on that line
|
||||
if (hit_past_end_of_line && local_y - mVisibleTextRect.mBottom + visible_region.mBottom > line_iter->mRect.mTop)
|
||||
if (hit_past_end_of_line && doc_y > line_iter->mRect.mTop)
|
||||
{
|
||||
pos = segment_line_start;
|
||||
break;
|
||||
|
|
@ -2461,7 +2462,7 @@ LLRect LLTextBase::getVisibleDocumentRect() const
|
|||
LLRect doc_rect = mDocumentView->getLocalRect();
|
||||
doc_rect.mLeft -= mDocumentView->getRect().mLeft;
|
||||
// adjust for height of text above widget baseline
|
||||
doc_rect.mBottom = llmin(0, doc_rect.getHeight() - mVisibleTextRect.getHeight());
|
||||
doc_rect.mBottom = doc_rect.getHeight() - mVisibleTextRect.getHeight();
|
||||
return doc_rect;
|
||||
}
|
||||
}
|
||||
|
|
@ -2575,21 +2576,21 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
|
|||
|
||||
LLColor4 color = (mEditor.getReadOnly() ? mStyle->getReadOnlyColor() : mStyle->getColor()) % alpha;
|
||||
|
||||
if( selection_start > seg_start )
|
||||
if( selection_start > seg_start )
|
||||
{
|
||||
// Draw normally
|
||||
S32 start = seg_start;
|
||||
S32 end = llmin( selection_start, seg_end );
|
||||
S32 length = end - start;
|
||||
font->render(text, start,
|
||||
rect,
|
||||
color,
|
||||
LLFontGL::LEFT, mEditor.mVAlign,
|
||||
LLFontGL::NORMAL,
|
||||
mStyle->getShadowType(),
|
||||
length,
|
||||
&right_x,
|
||||
mEditor.getUseEllipses());
|
||||
rect,
|
||||
color,
|
||||
LLFontGL::LEFT, mEditor.mVAlign,
|
||||
LLFontGL::NORMAL,
|
||||
mStyle->getShadowType(),
|
||||
length,
|
||||
&right_x,
|
||||
mEditor.getUseEllipses());
|
||||
}
|
||||
rect.mLeft = (S32)ceil(right_x);
|
||||
|
||||
|
|
@ -2601,14 +2602,14 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
|
|||
S32 length = end - start;
|
||||
|
||||
font->render(text, start,
|
||||
rect,
|
||||
mStyle->getSelectedColor().get(),
|
||||
LLFontGL::LEFT, mEditor.mVAlign,
|
||||
LLFontGL::NORMAL,
|
||||
LLFontGL::NO_SHADOW,
|
||||
length,
|
||||
&right_x,
|
||||
mEditor.getUseEllipses());
|
||||
rect,
|
||||
mStyle->getSelectedColor().get(),
|
||||
LLFontGL::LEFT, mEditor.mVAlign,
|
||||
LLFontGL::NORMAL,
|
||||
LLFontGL::NO_SHADOW,
|
||||
length,
|
||||
&right_x,
|
||||
mEditor.getUseEllipses());
|
||||
}
|
||||
rect.mLeft = (S32)ceil(right_x);
|
||||
if( selection_end < seg_end )
|
||||
|
|
@ -2618,14 +2619,14 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
|
|||
S32 end = seg_end;
|
||||
S32 length = end - start;
|
||||
font->render(text, start,
|
||||
rect,
|
||||
color,
|
||||
LLFontGL::LEFT, mEditor.mVAlign,
|
||||
LLFontGL::NORMAL,
|
||||
mStyle->getShadowType(),
|
||||
length,
|
||||
&right_x,
|
||||
mEditor.getUseEllipses());
|
||||
rect,
|
||||
color,
|
||||
LLFontGL::LEFT, mEditor.mVAlign,
|
||||
LLFontGL::NORMAL,
|
||||
mStyle->getShadowType(),
|
||||
length,
|
||||
&right_x,
|
||||
mEditor.getUseEllipses());
|
||||
}
|
||||
return right_x;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1168,6 +1168,66 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
|
|||
authResponse(message_in);
|
||||
}
|
||||
else
|
||||
if(message_name == "js_expose_object")
|
||||
{
|
||||
#if LLQTWEBKIT_API_VERSION >= 9
|
||||
bool expose_object = message_in.getValueBoolean( "expose" );
|
||||
LLQtWebKit::getInstance()->setExposeObject( expose_object );
|
||||
#endif
|
||||
}
|
||||
else
|
||||
if(message_name == "js_values_valid")
|
||||
{
|
||||
#if LLQTWEBKIT_API_VERSION >= 9
|
||||
bool valid = message_in.getValueBoolean( "valid" );
|
||||
LLQtWebKit::getInstance()->setValuesValid( valid );
|
||||
#endif
|
||||
}
|
||||
else
|
||||
if(message_name == "js_agent_location")
|
||||
{
|
||||
#if LLQTWEBKIT_API_VERSION >= 9
|
||||
F32 x = message_in.getValueReal("x");
|
||||
F32 y = message_in.getValueReal("y");
|
||||
F32 z = message_in.getValueReal("z");
|
||||
LLQtWebKit::getInstance()->setAgentLocation( x, y, z );
|
||||
#endif
|
||||
}
|
||||
else
|
||||
if(message_name == "js_agent_global_location")
|
||||
{
|
||||
#if LLQTWEBKIT_API_VERSION >= 9
|
||||
F32 x = message_in.getValueReal("x");
|
||||
F32 y = message_in.getValueReal("y");
|
||||
F32 z = message_in.getValueReal("z");
|
||||
LLQtWebKit::getInstance()->setAgentGlobalLocation( x, y, z );
|
||||
#endif
|
||||
}
|
||||
else
|
||||
if(message_name == "js_agent_orientation")
|
||||
{
|
||||
#if LLQTWEBKIT_API_VERSION >= 9
|
||||
F32 angle = message_in.getValueReal("angle");
|
||||
LLQtWebKit::getInstance()->setAgentOrientation( angle );
|
||||
#endif
|
||||
}
|
||||
else
|
||||
if(message_name == "js_agent_region")
|
||||
{
|
||||
#if LLQTWEBKIT_API_VERSION >= 9
|
||||
const std::string& region = message_in.getValue("region");
|
||||
LLQtWebKit::getInstance()->setAgentRegion( region );
|
||||
#endif
|
||||
}
|
||||
else
|
||||
if(message_name == "js_agent_maturity")
|
||||
{
|
||||
#if LLQTWEBKIT_API_VERSION >= 9
|
||||
const std::string& maturity = message_in.getValue("maturity");
|
||||
LLQtWebKit::getInstance()->setAgentMaturity( maturity );
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
// std::cerr << "MediaPluginWebKit::receiveMessage: unknown media message: " << message_string << std::endl;
|
||||
}
|
||||
|
|
@ -1324,4 +1384,3 @@ int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -708,6 +708,17 @@
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>BrowserEnableJSObject</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable or disable the viewer to Javascript bridge object.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>BlockAvatarAppearanceMessages</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -68,6 +68,9 @@ BOOL LLFloaterSoundDevices::postBuild()
|
|||
if (panel)
|
||||
{
|
||||
panel->setUseTuningMode(false);
|
||||
getChild<LLUICtrl>("voice_input_device")->setCommitCallback(boost::bind(&LLPanelVoiceDeviceSettings::apply, panel));
|
||||
getChild<LLUICtrl>("voice_output_device")->setCommitCallback(boost::bind(&LLPanelVoiceDeviceSettings::apply, panel));
|
||||
getChild<LLUICtrl>("mic_volume_slider")->setCommitCallback(boost::bind(&LLPanelVoiceDeviceSettings::apply, panel));
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -191,7 +191,21 @@ void LLPanelVoiceDeviceSettings::refresh()
|
|||
mCtrlInputDevices = getChild<LLComboBox>("voice_input_device");
|
||||
mCtrlOutputDevices = getChild<LLComboBox>("voice_output_device");
|
||||
|
||||
if(!LLVoiceClient::getInstance()->deviceSettingsAvailable())
|
||||
bool device_settings_available = LLVoiceClient::getInstance()->deviceSettingsAvailable();
|
||||
|
||||
if (mCtrlInputDevices)
|
||||
{
|
||||
mCtrlInputDevices->setEnabled(device_settings_available);
|
||||
}
|
||||
|
||||
if (mCtrlOutputDevices)
|
||||
{
|
||||
mCtrlOutputDevices->setEnabled(device_settings_available);
|
||||
}
|
||||
|
||||
getChild<LLSlider>("mic_volume_slider")->setEnabled(device_settings_available);
|
||||
|
||||
if(!device_settings_available)
|
||||
{
|
||||
// The combo boxes are disabled, since we can't get the device settings from the daemon just now.
|
||||
// Put the currently set default (ONLY) in the box, and select it.
|
||||
|
|
@ -207,6 +221,7 @@ void LLPanelVoiceDeviceSettings::refresh()
|
|||
mCtrlOutputDevices->add( mOutputDevice, ADD_BOTTOM );
|
||||
mCtrlOutputDevices->setSimple(mOutputDevice);
|
||||
}
|
||||
mDevicesUpdated = FALSE;
|
||||
}
|
||||
else if (!mDevicesUpdated)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -62,6 +62,7 @@
|
|||
#include "llmutelist.h"
|
||||
#include "llpanelprofile.h"
|
||||
#include "llappviewer.h"
|
||||
#include "lllogininstance.h"
|
||||
//#include "llfirstuse.h"
|
||||
#include "llwindow.h"
|
||||
|
||||
|
|
@ -2342,6 +2343,65 @@ BOOL LLViewerMediaImpl::handleMouseUp(S32 x, S32 y, MASK mask)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
void LLViewerMediaImpl::updateJavascriptObject()
|
||||
{
|
||||
if ( mMediaSource )
|
||||
{
|
||||
// flag to expose this information to internal browser or not.
|
||||
bool expose_javascript_object = gSavedSettings.getBOOL("BrowserEnableJSObject");
|
||||
mMediaSource->jsExposeObjectEvent( expose_javascript_object );
|
||||
|
||||
// indicate if the values we have are valid (currently do this blanket-fashion for
|
||||
// everything depending on whether you are logged in or not - this may require a
|
||||
// more granular approach once variables are added that ARE valid before login
|
||||
bool logged_in = LLLoginInstance::getInstance()->authSuccess();
|
||||
mMediaSource->jsValuesValidEvent( logged_in );
|
||||
|
||||
// current location within a region
|
||||
LLVector3 agent_pos = gAgent.getPositionAgent();
|
||||
double x = agent_pos.mV[ VX ];
|
||||
double y = agent_pos.mV[ VY ];
|
||||
double z = agent_pos.mV[ VZ ];
|
||||
mMediaSource->jsAgentLocationEvent( x, y, z );
|
||||
|
||||
// current location within the grid
|
||||
LLVector3d agent_pos_global = gAgent.getLastPositionGlobal();
|
||||
double global_x = agent_pos_global.mdV[ VX ];
|
||||
double global_y = agent_pos_global.mdV[ VY ];
|
||||
double global_z = agent_pos_global.mdV[ VZ ];
|
||||
mMediaSource->jsAgentGlobalLocationEvent( global_x, global_y, global_z );
|
||||
|
||||
// current agent orientation
|
||||
double rotation = atan2( gAgent.getAtAxis().mV[VX], gAgent.getAtAxis().mV[VY] );
|
||||
double angle = rotation * RAD_TO_DEG;
|
||||
if ( angle < 0.0f ) angle = 360.0f + angle; // TODO: has to be a better way to get orientation!
|
||||
mMediaSource->jsAgentOrientationEvent( angle );
|
||||
|
||||
// current region agent is in
|
||||
std::string region_name("");
|
||||
LLViewerRegion* region = gAgent.getRegion();
|
||||
if ( region )
|
||||
{
|
||||
region_name = region->getName();
|
||||
};
|
||||
mMediaSource->jsAgentRegionEvent( region_name );
|
||||
|
||||
// language code the viewer is set to
|
||||
mMediaSource->jsAgentLanguageEvent( LLUI::getLanguage() );
|
||||
|
||||
// maturity setting the agent has selected
|
||||
if ( gAgent.prefersAdult() )
|
||||
mMediaSource->jsAgentMaturityEvent( "GMA" ); // Adult means see adult, mature and general content
|
||||
else
|
||||
if ( gAgent.prefersMature() )
|
||||
mMediaSource->jsAgentMaturityEvent( "GM" ); // Mature means see mature and general content
|
||||
else
|
||||
if ( gAgent.prefersPG() )
|
||||
mMediaSource->jsAgentMaturityEvent( "G" ); // PG means only see General content
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
std::string LLViewerMediaImpl::getName() const
|
||||
{
|
||||
|
|
@ -2640,6 +2700,9 @@ void LLViewerMediaImpl::update()
|
|||
{
|
||||
updateVolume();
|
||||
|
||||
// TODO: this is updated every frame - is this bad?
|
||||
updateJavascriptObject();
|
||||
|
||||
// If we didn't just create the impl, it may need to get cookie updates.
|
||||
if(!sUpdatedCookies.empty())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -339,7 +339,10 @@ public:
|
|||
LLVOVolume *getSomeObject();
|
||||
void setUpdated(BOOL updated) ;
|
||||
BOOL isUpdated() ;
|
||||
|
||||
|
||||
// updates the javascript object in the embedded browser with viewer values
|
||||
void updateJavascriptObject();
|
||||
|
||||
// Updates the "interest" value in this object
|
||||
void calculateInterest();
|
||||
F64 getInterest() const { return mInterest; };
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
<!-- Locale Information -->
|
||||
<string name="MicrosoftLocale">danish</string>
|
||||
<string name="MacLocale">da_DK.UTF-8</string>
|
||||
<string name="DarwinLocale">da_DK.UTF-8</string>
|
||||
<string name="LinuxLocale">da_DK.UTF-8</string>
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
<!-- Locale Information -->
|
||||
<string name="MicrosoftLocale">german</string>
|
||||
<string name="MacLocale">de_DE.UTF-8</string>
|
||||
<string name="DarwinLocale">de_DE.UTF-8</string>
|
||||
<string name="LinuxLocale">de_DE.UTF-8</string>
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
<!-- Locale Information -->
|
||||
<string name="MicrosoftLocale">english</string>
|
||||
<string name="MacLocale">C</string>
|
||||
<string name="DarwinLocale">C</string>
|
||||
<string name="LinuxLocale">C</string>
|
||||
|
||||
|
|
|
|||
|
|
@ -183,11 +183,11 @@
|
|||
parameter="http://join.secondlife.com/"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Web Content Floater Test"
|
||||
name="Web Content Floater Test">
|
||||
label="Web Content Floater Debug Test"
|
||||
name="Web Content Floater Debug Test">
|
||||
<menu_item_call.on_click
|
||||
function="Advanced.WebContentTest"
|
||||
parameter="http://www.google.com"/>
|
||||
parameter="http://google.com"/>
|
||||
</menu_item_call>
|
||||
<menu_item_check
|
||||
label="Show Grid Picker"
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
<!-- Locale Information -->
|
||||
<string name="MicrosoftLocale">spanish</string>
|
||||
<string name="MacLocale">es_ES.UTF-8</string>
|
||||
<string name="DarwinLocale">es_ES.UTF-8</string>
|
||||
<string name="LinuxLocale">es_ES.UTF-8</string>
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
<!-- Locale Information -->
|
||||
<string name="MicrosoftLocale">french</string>
|
||||
<string name="MacLocale">fr_FR.UTF-8</string>
|
||||
<string name="DarwinLocale">fr_FR.UTF-8</string>
|
||||
<string name="LinuxLocale">fr_FR.UTF-8</string>
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
<!-- Locale Information -->
|
||||
<string name="MicrosoftLocale">italian</string>
|
||||
<string name="MacLocale">it_IT.UTF-8</string>
|
||||
<string name="DarwinLocale">it_IT.UTF-8</string>
|
||||
<string name="LinuxLocale">it_IT.UTF-8</string>
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
<!-- Locale Information -->
|
||||
<string name="MicrosoftLocale">japanese</string>
|
||||
<string name="MacLocale">ja_JP.UTF-8</string>
|
||||
<string name="DarwinLocale">ja_JP.UTF-8</string>
|
||||
<string name="LinuxLocale">ja_JP.UTF-8</string>
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
<!-- Locale Information -->
|
||||
<string name="MicrosoftLocale">dutch</string>
|
||||
<string name="MacLocale">nl_NL.UTF-8</string>
|
||||
<string name="DarwinLocale">nl_NL.UTF-8</string>
|
||||
<string name="LinuxLocale">nl_NL.UTF-8</string>
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
<!-- Locale Information -->
|
||||
<string name="MicrosoftLocale">polish</string>
|
||||
<string name="MacLocale">pl_PL.UTF-8</string>
|
||||
<string name="DarwinLocale">pl_PL.UTF-8</string>
|
||||
<string name="LinuxLocale">pl_PL.UTF-8</string>
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
<!-- Locale Information -->
|
||||
<string name="MicrosoftLocale">portuguese</string>
|
||||
<string name="MacLocale">pt_PT.UTF-8</string>
|
||||
<string name="DarwinLocale">pt_PT.UTF-8</string>
|
||||
<string name="LinuxLocale">pt_PT.UTF-8</string>
|
||||
|
||||
|
|
|
|||
1851
install.xml
1851
install.xml
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue