llviewerwindowlistener.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:5k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /**
  2.  * @file   llviewerwindowlistener.cpp
  3.  * @author Nat Goodspeed
  4.  * @date   2009-06-30
  5.  * @brief  Implementation for llviewerwindowlistener.
  6.  * 
  7.  * $LicenseInfo:firstyear=2009&license=viewergpl$
  8.  * 
  9.  * Copyright (c) 2009-2010, Linden Research, Inc.
  10.  * 
  11.  * Second Life Viewer Source Code
  12.  * The source code in this file ("Source Code") is provided by Linden Lab
  13.  * to you under the terms of the GNU General Public License, version 2.0
  14.  * ("GPL"), unless you have obtained a separate licensing agreement
  15.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  16.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  17.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  18.  * 
  19.  * There are special exceptions to the terms and conditions of the GPL as
  20.  * it is applied to this Source Code. View the full text of the exception
  21.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  22.  * online at
  23.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  24.  * 
  25.  * By copying, modifying or distributing this software, you acknowledge
  26.  * that you have read and understood your obligations described above,
  27.  * and agree to abide by those obligations.
  28.  * 
  29.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  30.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  31.  * COMPLETENESS OR PERFORMANCE.
  32.  * $/LicenseInfo$
  33.  */
  34. // Precompiled header
  35. #include "llviewerprecompiledheaders.h"
  36. // associated header
  37. #include "llviewerwindowlistener.h"
  38. // STL headers
  39. #include <map>
  40. // std headers
  41. // external library headers
  42. // other Linden headers
  43. #include "llviewerwindow.h"
  44. LLViewerWindowListener::LLViewerWindowListener(LLViewerWindow* llviewerwindow):
  45.     LLEventAPI("LLViewerWindow",
  46.                "LLViewerWindow listener to (e.g.) save a screenshot"),
  47.     mViewerWindow(llviewerwindow)
  48. {
  49.     // add() every method we want to be able to invoke via this event API.
  50.     LLSD saveSnapshotArgs;
  51.     saveSnapshotArgs["filename"] = LLSD::String();
  52.     saveSnapshotArgs["reply"] = LLSD::String();
  53.     // The following are optional, so don't build them into required prototype.
  54. //  saveSnapshotArgs["width"] = LLSD::Integer();
  55. //  saveSnapshotArgs["height"] = LLSD::Integer();
  56. //  saveSnapshotArgs["showui"] = LLSD::Boolean();
  57. //  saveSnapshotArgs["rebuild"] = LLSD::Boolean();
  58. //  saveSnapshotArgs["type"] = LLSD::String();
  59.     add("saveSnapshot",
  60.         "Save screenshot: ["filename"], ["width"], ["height"], ["showui"], ["rebuild"], ["type"]n"
  61.         "type: "COLOR", "DEPTH", "OBJECT_ID"n"
  62.         "Post on ["reply"] an event containing ["ok"]",
  63.         &LLViewerWindowListener::saveSnapshot,
  64.         saveSnapshotArgs);
  65.     add("requestReshape",
  66.         "Resize the window: ["w"], ["h"]",
  67.         &LLViewerWindowListener::requestReshape);
  68. }
  69. void LLViewerWindowListener::saveSnapshot(const LLSD& event) const
  70. {
  71.     LLReqID reqid(event);
  72.     typedef std::map<LLSD::String, LLViewerWindow::ESnapshotType> TypeMap;
  73.     TypeMap types;
  74. #define tp(name) types[#name] = LLViewerWindow::SNAPSHOT_TYPE_##name
  75.     tp(COLOR);
  76.     tp(DEPTH);
  77.     tp(OBJECT_ID);
  78. #undef  tp
  79.     // Our add() call should ensure that the incoming LLSD does in fact
  80.     // contain our required arguments. Deal with the optional ones.
  81.     S32 width (mViewerWindow->getWindowWidthRaw());
  82.     S32 height(mViewerWindow->getWindowHeightRaw());
  83.     if (event.has("width"))
  84.         width = event["width"].asInteger();
  85.     if (event.has("height"))
  86.         height = event["height"].asInteger();
  87.     // showui defaults to true, requiring special treatment
  88.     bool showui = true;
  89.     if (event.has("showui"))
  90.         showui = event["showui"].asBoolean();
  91.     bool rebuild(event["rebuild"]); // defaults to false
  92.     LLViewerWindow::ESnapshotType type(LLViewerWindow::SNAPSHOT_TYPE_COLOR);
  93.     if (event.has("type"))
  94.     {
  95.         TypeMap::const_iterator found = types.find(event["type"]);
  96.         if (found == types.end())
  97.         {
  98.             LL_ERRS("LLViewerWindowListener") << "LLViewerWindowListener::saveSnapshot(): "
  99.                                               << "unrecognized type " << event["type"] << LL_ENDL;
  100.     return;
  101.         }
  102.         type = found->second;
  103.     }
  104.     bool ok = mViewerWindow->saveSnapshot(event["filename"], width, height, showui, rebuild, type);
  105.     LLSD response(reqid.makeResponse());
  106.     response["ok"] = ok;
  107.     LLEventPumps::instance().obtain(event["reply"]).post(response);
  108. }
  109. void LLViewerWindowListener::requestReshape(LLSD const & event_data) const
  110. {
  111. if(event_data.has("w") && event_data.has("h"))
  112. {
  113. mViewerWindow->reshape(event_data["w"].asInteger(), event_data["h"].asInteger());
  114. }
  115. }