Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef GNASH_MOVIECLIP_H
00023 #define GNASH_MOVIECLIP_H
00024
00025 #ifdef HAVE_CONFIG_H
00026 #include "gnashconfig.h"
00027 #endif
00028
00029 #include <vector>
00030 #include <list>
00031 #include <map>
00032 #include <string>
00033 #include <boost/ptr_container/ptr_list.hpp>
00034 #include <boost/intrusive_ptr.hpp>
00035
00036 #include "ControlTag.h"
00037 #include "movie_definition.h"
00038 #include "DisplayList.h"
00039 #include "DisplayObjectContainer.h"
00040 #include "as_environment.h"
00041 #include "DynamicShape.h"
00042 #include "dsodefs.h"
00043
00044
00045 namespace gnash {
00046 class Movie;
00047 class swf_event;
00048 class drag_state;
00049 class LoadVariablesThread;
00050 class GradientRecord;
00051 class TextField;
00052 class BitmapData_as;
00053 class CachedBitmap;
00054 namespace SWF {
00055 class PlaceObject2Tag;
00056 }
00057 }
00058
00059 namespace gnash {
00060
00062
00064
00067
00073
00079
00084 class MovieClip : public DisplayObjectContainer
00085 {
00086 public:
00087
00088 typedef std::vector<TextField*> TextFields;
00089
00091 typedef std::map<ObjectURI, TextFields, ObjectURI::LessThan>
00092 TextFieldIndex;
00093
00094 typedef std::map<std::string, std::string> MovieVariables;
00095
00096 typedef movie_definition::PlayList PlayList;
00097
00098 enum PlayState
00099 {
00100 PLAYSTATE_PLAY,
00101 PLAYSTATE_STOP
00102 };
00103
00105
00122 MovieClip(as_object* object, const movie_definition* def,
00123 Movie* root, DisplayObject* parent);
00124
00125 virtual ~MovieClip();
00126
00127
00128 virtual Movie* get_root() const;
00129
00130 virtual bool trackAsMenu();
00131
00133
00136 void queueEvent(const event_id& id, int lvl);
00137
00138 void queueLoad();
00139
00141
00144 virtual MovieClip* getAsRoot();
00145
00147 virtual SWFRect getBounds() const;
00148
00149
00150 virtual bool pointInShape(boost::int32_t x, boost::int32_t y) const;
00151
00152
00153 virtual bool pointInVisibleShape(boost::int32_t x, boost::int32_t y) const;
00154
00159 virtual bool pointInHitableShape(boost::int32_t x, boost::int32_t y) const;
00160
00162 size_t get_current_frame() const
00163 {
00164 return _currentFrame;
00165 }
00166
00167 size_t get_frame_count() const
00168 {
00169 return _def ? _def->get_frame_count() : 1;
00170 }
00171
00173
00177 size_t get_loaded_frames() const
00178 {
00179 return _def ? _def->get_loading_frame() : 1;
00180 }
00181
00184 size_t get_bytes_total() const
00185 {
00186 return isDynamic() ? 0 : _def->get_bytes_total();
00187 }
00188
00191 size_t get_bytes_loaded() const
00192 {
00193 return isDynamic() ? 0 : _def->get_bytes_loaded();
00194 }
00195
00196 const SWFRect& get_frame_size() const
00197 {
00198 static const SWFRect r;
00199 return _def ? _def->get_frame_size() : r;
00200 }
00201
00203
00207 DSOEXPORT void setPlayState(PlayState s);
00208
00209 PlayState getPlayState() const { return _playState; }
00210
00211
00212 void set_background_color(const rgba& color);
00213
00215
00218 virtual bool mouseEnabled() const;
00219
00224 virtual InteractiveObject* topmostMouseEntity(boost::int32_t x,
00225 boost::int32_t y);
00226
00227
00228 const DisplayObject* findDropTarget(boost::int32_t x, boost::int32_t y,
00229 DisplayObject* dragging) const;
00230
00231 void setDropTarget(const std::string& tgt) {
00232 _droptarget = tgt;
00233 }
00234
00235 const std::string& getDropTarget() const {
00236 return _droptarget;
00237 }
00238
00240
00242 virtual void advance();
00243
00245
00249 DSOEXPORT void goto_frame(size_t target_frame_number);
00250
00252
00267 bool get_frame_number(const as_value& frame_spec, size_t& frameno) const;
00268
00270 bool goto_labeled_frame(const std::string& label);
00271
00273 virtual void display(Renderer& renderer, const Transform& xform);
00274
00276
00279 void draw(Renderer& renderer, const Transform& xform);
00280
00281 void omit_display();
00282
00284
00286 void swapDepths(DisplayObject* ch1, int newdepth)
00287 {
00288 _displayList.swapDepths(ch1, newdepth);
00289 }
00290
00292
00294 DisplayObject* getDisplayObjectAtDepth(int depth);
00295
00297 DisplayObject* addDisplayListObject(DisplayObject* obj, int depth);
00298
00300
00319 DisplayObject* add_display_object(const SWF::PlaceObject2Tag* tag,
00320 DisplayList& dlist);
00321
00323 void move_display_object(const SWF::PlaceObject2Tag* tag,
00324 DisplayList& dlist);
00325
00327 void replace_display_object(const SWF::PlaceObject2Tag* tag,
00328 DisplayList& dlist);
00329
00331 void remove_display_object(const SWF::PlaceObject2Tag* tag,
00332 DisplayList& dlist);
00333
00336
00343 void remove_display_object(int depth, int );
00344
00345 void unloadMovie();
00346
00348
00351 void attachCharacter(DisplayObject& newch, int depth, as_object* initObject);
00352
00354
00363
00367 virtual void construct(as_object* initObj = 0);
00368
00370
00384 void destroy();
00385
00389 void add_action_buffer(const action_buffer* a)
00390 {
00391 if (!_callingFrameActions) queueAction(*a);
00392 else execute_action(*a);
00393 }
00394
00395
00399
00409 void execute_init_action_buffer(const action_buffer& a, int cid);
00410
00412 void execute_action(const action_buffer& ab);
00413
00414 MovieClip* to_movie () { return this; }
00415
00417
00419 enum VariablesMethod
00420 {
00421 METHOD_NONE = 0,
00422 METHOD_GET,
00423 METHOD_POST
00424 };
00425
00426
00427 virtual void getLoadedMovie(Movie* newMovie);
00428
00432
00444 void loadVariables(const std::string& urlstr,
00445 VariablesMethod sendVarsMethod);
00446
00448
00451 bool getTextFieldVariables(const ObjectURI& uri, as_value& val);
00452
00453
00454
00456 bool setTextFieldVariables(const ObjectURI& uri, const as_value& val);
00457
00459
00463
00467 DisplayObject* getDisplayListObject(const ObjectURI& uri);
00468
00470 as_object* pathElement(const ObjectURI& uri);
00471
00473
00475 virtual void call_frame_actions(const as_value& frame_spec);
00476
00478
00495 MovieClip* duplicateMovieClip(const std::string& newname,
00496 int newdepth, as_object* init_object = 0);
00497
00499 virtual void mouseEvent(const event_id& id) {
00500 notifyEvent(id);
00501 }
00502
00504
00507 void notifyEvent(const event_id& id);
00508
00509
00510 virtual as_environment& get_environment() {
00511 return _environment;
00512 }
00513
00516
00519 void set_textfield_variable(const ObjectURI& name, TextField* ch);
00520
00521 void add_invalidated_bounds(InvalidatedRanges& ranges, bool force);
00522
00523 const DisplayList& getDisplayList() const {
00524 return _displayList;
00525 }
00526
00528
00532 int getNextHighestDepth() const {
00533 return _displayList.getNextHighestDepth();
00534 }
00535
00537
00538
00539 void setStreamSoundId(int id);
00540
00542
00562 void removeMovieClip();
00563
00565 DynamicShape& graphics() {
00566 set_invalidated();
00567 return _drawable;
00568 }
00569
00571
00573 virtual bool handleFocus();
00574
00576
00578 DSOEXPORT void setVariables(const MovieVariables& vars);
00579
00581
00583 virtual void visitNonProperties(KeyVisitor& v) const;
00584
00587 void cleanupDisplayList();
00588
00590
00594 void queueAction(const action_buffer& buf);
00595
00597
00602 void constructAsScriptObject();
00603
00606 bool getLockRoot() const { return _lockroot; }
00607
00610 void setLockRoot(bool lr) { _lockroot=lr; }
00611
00613 virtual int getDefinitionVersion() const;
00614
00615 protected:
00616
00618
00620 virtual bool unloadChildren();
00621
00623
00632 virtual void markOwnResources() const;
00633
00634
00635 void placeDisplayObject(DisplayObject* ch, int depth) {
00636 _displayList.placeDisplayObject(ch, depth);
00637 }
00638
00639 private:
00640
00642 void processCompletedLoadVariableRequests();
00643
00645 void processCompletedLoadVariableRequest(LoadVariablesThread& request);
00646
00647
00649
00658 void executeFrameTags(size_t frame, DisplayList& dlist,
00659 int typeflags = SWF::ControlTag::TAG_DLIST |
00660 SWF::ControlTag::TAG_ACTION);
00661
00662 void stopStreamSound();
00663
00665
00667
00670 bool isEnabled() const;
00671
00673
00677 bool hitTestDrawable(boost::int32_t x, boost::int32_t y) const;
00678
00680
00702
00709
00717 void restoreDisplayList(size_t targetFrame);
00718
00720 void increment_frame_and_check_for_loop();
00721
00723 void cleanup_textfield_variables();
00724
00727 const boost::intrusive_ptr<const movie_definition> _def;
00728
00730 typedef boost::ptr_list<LoadVariablesThread> LoadVariablesThreads;
00731
00733
00737 LoadVariablesThreads _loadVariableRequests;
00738
00740 Movie* _swf;
00741
00743 DynamicShape _drawable;
00744
00745 PlayState _playState;
00746
00748 as_environment _environment;
00749
00753 std::auto_ptr<TextFieldIndex> _text_variables;
00754
00755 std::string _droptarget;
00756
00757
00758 size_t _currentFrame;
00759
00761 int m_sound_stream_id;
00762
00763
00764 bool _hasLooped;
00765
00766
00767
00768 bool _flushedOrphanedTags;
00769
00770
00771 bool _callingFrameActions;
00772
00773 bool _lockroot;
00774
00775 bool _onLoadCalled;
00776 };
00777
00778 }
00779
00780 #endif // GNASH_SPRITE_INSTANCE_H