Пример #1
0
static const char* lookup_content_type(const char* file_extension)
// Given a file extension, determine the HTTP content type to return.
{
	static stringi_hash<const char*> s_types;
	static bool s_inited = false;
	if (!s_inited) {
		s_inited = true;

		// A small table of well-known content types.
		struct type_pair {
			const char* extension;
			const char* type;
		} types[] = {
			{ "txt", "text/plain" },
			{ "html", "text/html" },
			{ "htm", "text/html" },
			{ "jpg", "image/jpeg" },
			{ "jpeg", "image/jpeg" },
			{ "gif", "image/gif" },
			{ "png", "image/png" },
			{ "js", "text/javascript" },
			// etc.
		};

		// Register the types.
		for (int i = 0, n = TU_ARRAYSIZE(types); i < n; i++) {
			s_types.add(tu_stringi(types[i].extension), types[i].type);
		}
	}

	const char* type = NULL;
	if (s_types.get(tu_stringi(file_extension), &type)) {
		return type;
	}

	// No known type for this file extension.
	return "application/octet-stream";
}
Пример #2
0
	as_transform_member	get_transform_member(const tu_stringi& name)
	{
		if (s_transform_member_map.size() == 0)
		{
			s_transform_member_map.set_capacity(int(AS_TRANSFORM_MEMBER_COUNT));
			s_transform_member_map.add("colorTransform", colorTransform);
			s_transform_member_map.add("concatenatedColorTransform", concatenatedColorTransform);
			s_transform_member_map.add("matrix", matrix);
			s_transform_member_map.add("concatenatedMatrix", concatenatedMatrix);
			s_transform_member_map.add("pixelBounds", pixelBounds);
		}

		as_transform_member	result = invalidMember;
		s_transform_member_map.get(name, &result);

		return result;
	}
Пример #3
0
namespace gameswf
{

	enum as_transform_member
	{
		colorTransform = 1, 
		concatenatedColorTransform, 
		matrix,
		concatenatedMatrix,
		pixelBounds,
		invalidMember,
		AS_TRANSFORM_MEMBER_COUNT,
	};

	static stringi_hash<as_transform_member>	s_transform_member_map;
	static as_transform_member   get_transform_member(const tu_stringi& name);

	// Transform( mc:MovieClip )
	void	as_global_transform_ctor(const fn_call& fn)
	{
		if (fn.nargs == 1)
		{
			gc_ptr<as_transform>	obj;
			if (character* movie = cast_to<character>(fn.arg(0).to_object()))
			{
				obj = new as_transform(fn.get_player(), movie);
			}
			fn.result->set_as_object(obj.get_ptr());
		}
	}

	as_transform::as_transform(player* player, character* movie_clip) :
		as_object(player),
		m_movie(movie_clip)
	{
	}

	bool	as_transform::set_member(const tu_stringi& name, const as_value& val)
	{
		as_transform_member	member = get_transform_member( name );

		switch (member)
		{
			case colorTransform:
			{
				m_color_transform = cast_to<as_color_transform>( val.to_object() );
				m_movie->set_cxform( m_color_transform->m_color_transform );
				return true;
			}
			case concatenatedColorTransform:
			{
				//read-only
				return true;
			}
			case matrix:
			{
				assert( false && "todo" );
				return true;
			}
			case concatenatedMatrix:
			{
				//read-only
				return true;
			}
			case pixelBounds:
			{
				assert( false && "todo" );
				return true;
			}
			default:
                                break;
		};

		return as_object::set_member( name, val );
	}

	bool	as_transform::get_member(const tu_stringi& name, as_value* val)
	{
		as_transform_member	member = get_transform_member( name );

		switch( member )
		{
			case colorTransform:
			{
				val->set_as_object( m_color_transform.get_ptr() );
				return true;
			}
			case concatenatedColorTransform:
			{
				assert( false && "todo" );
				return true;
			}
			case matrix:
			{
				assert( false && "todo" );
				return true;
			}
			case concatenatedMatrix:
			{
				assert( false && "todo" );
				return true;
			}
			case pixelBounds:
			{
				assert( false && "todo" );
				return true;
			}
			default:
                                break;
		};

		return as_object::get_member( name, val );
	}

	as_transform_member	get_transform_member(const tu_stringi& name)
	{
		if (s_transform_member_map.size() == 0)
		{
			s_transform_member_map.set_capacity(int(AS_TRANSFORM_MEMBER_COUNT));
			s_transform_member_map.add("colorTransform", colorTransform);
			s_transform_member_map.add("concatenatedColorTransform", concatenatedColorTransform);
			s_transform_member_map.add("matrix", matrix);
			s_transform_member_map.add("concatenatedMatrix", concatenatedMatrix);
			s_transform_member_map.add("pixelBounds", pixelBounds);
		}

		as_transform_member	result = invalidMember;
		s_transform_member_map.get(name, &result);

		return result;
	}


}
Пример #4
0
namespace gameswf
{

void clears_tag_loaders();
void clear_disasm();

//
//	gameswf's statics
//

static glyph_provider* s_glyph_provider;
void set_glyph_provider(glyph_provider* gp)
{
    s_glyph_provider = gp;
}
glyph_provider* get_glyph_provider()
{
    return s_glyph_provider;
}

static bool	s_use_cached_movie_def = true;

// load movies from separate thread
static bool	s_use_separate_loader = true;

//
// file_opener callback stuff
//

static file_opener_callback	s_opener_function = NULL;

void	register_file_opener_callback(file_opener_callback opener)
// Host calls this to register a function for opening files,
// for loading movies.
{
    s_opener_function = opener;
}

static bool	s_use_cache_files = false;

void	set_use_cache_files(bool use_cache)
// Enable/disable attempts to read cache files when loading
// movies.
{
    s_use_cache_files = use_cache;
}


int player::s_player_count = 0;

// standard method map, this stuff should be high optimized

static stringi_hash<as_value>*	s_standard_method_map[BUILTIN_COUNT];
void clear_standard_method_map()
{
    for (int i = 0; i < BUILTIN_COUNT; i++)
    {
        if (s_standard_method_map[i])
        {
            delete s_standard_method_map[i];
        }
    }
}

bool get_builtin(builtin_object id, const tu_stringi& name, as_value* val)
{
    if (s_standard_method_map[id])
    {
        return s_standard_method_map[id]->get(name, val);
    }
    return false;
}

stringi_hash<as_value>* new_standard_method_map(builtin_object id)
{
    if (s_standard_method_map[id] == NULL)
    {
        s_standard_method_map[id] = new stringi_hash<as_value>;
    }
    return s_standard_method_map[id];
}

void standard_method_map_init()
{
    // setup builtin methods
    stringi_hash<as_value>* map;

    // as_object builtins
    map = new_standard_method_map(BUILTIN_OBJECT_METHOD);
    map->add("addProperty", as_object_addproperty);
    map->add("registerClass", as_object_registerclass);
    map->add("hasOwnProperty", as_object_hasownproperty);
    map->add("watch", as_object_watch);
    map->add("unwatch", as_object_unwatch);

    // flash9
    map->add("addEventListener", as_object_add_event_listener);

    // for debugging
#ifdef _DEBUG
    map->add("dump", as_object_dump);
#endif

    // as_number builtins
    map = new_standard_method_map(BUILTIN_NUMBER_METHOD);
    map->add("toString", as_number_to_string);
    map->add("valueOf", as_number_valueof);

    // as_boolean builtins
    map = new_standard_method_map(BUILTIN_BOOLEAN_METHOD);
    map->add("toString", as_boolean_to_string);
    map->add("valueOf", as_boolean_valueof);

    // as_string builtins
    map = new_standard_method_map(BUILTIN_STRING_METHOD);
    map->add("toString", string_to_string);
    map->add("fromCharCode", string_from_char_code);
    map->add("charCodeAt", string_char_code_at);
    map->add("concat", string_concat);
    map->add("indexOf", string_index_of);
    map->add("lastIndexOf", string_last_index_of);
    map->add("slice", string_slice);
    map->add("split", string_split);
    map->add("substring", string_substring);
    map->add("substr", string_substr);
    map->add("toLowerCase", string_to_lowercase);
    map->add("toUpperCase", string_to_uppercase);
    map->add("charAt", string_char_at);
    map->add("length", as_value(string_length, as_value()));

    // sprite_instance builtins
    map = new_standard_method_map(BUILTIN_SPRITE_METHOD);
    map->add("play", sprite_play);
    map->add("stop", sprite_stop);
    map->add("gotoAndStop", sprite_goto_and_stop);
    map->add("gotoAndPlay", sprite_goto_and_play);
    map->add("nextFrame", sprite_next_frame);
    map->add("prevFrame", sprite_prev_frame);
    map->add("getBytesLoaded", sprite_get_bytes_loaded);
    map->add("getBytesTotal", sprite_get_bytes_total);
    map->add("swapDepths", sprite_swap_depths);
    map->add("duplicateMovieClip", sprite_duplicate_movieclip);
    map->add("getDepth", sprite_get_depth);
    map->add("createEmptyMovieClip", sprite_create_empty_movieclip);
    map->add("removeMovieClip", sprite_remove_movieclip);
    map->add("hitTest", sprite_hit_test);
    map->add("startDrag", sprite_start_drag);
    map->add("stopDrag", sprite_stop_drag);
    map->add("loadMovie", sprite_loadmovie);
    map->add("unloadMovie", sprite_unloadmovie);
    map->add("getNextHighestDepth", sprite_getnexthighestdepth);
    map->add("createTextField", sprite_create_text_field);
    map->add("attachMovie", sprite_attach_movie);
    map->add("localToGlobal", sprite_local_global);
    map->add("globalToLocal", sprite_global_local);
    map->add("getRect", sprite_get_rect);
    map->add("getBounds", sprite_get_bounds);
    map->add("setMask", sprite_set_mask);

    // drawing API
    map->add("beginFill", sprite_begin_fill);
    map->add("endFill", sprite_end_fill);
    map->add("lineTo", sprite_line_to);
    map->add("moveTo", sprite_move_to);
    map->add("curveTo", sprite_curve_to);
    map->add("clear", sprite_clear);
    map->add("lineStyle", sprite_line_style);

    // gameSWF extension
    // reset root FPS
    map->add("setFPS", sprite_set_fps);

    // gameSWF extension
    // return true if movieclip is in PLAY state
    map->add("getPlayState", sprite_get_play_state);

    // Flash9
    map->add("addFrameScript", sprite_add_script);

}

// Standard property lookup.

static stringi_hash<as_standard_member>	s_standard_property_map;
void clear_standard_property_map()
{
    s_standard_property_map.clear();
}

const char* get_gameswf_version()
{
#ifdef WIN32
    static tu_string s_gameswf_version("WIN "__DATE__" "__TIME__);
#else
    static tu_string s_gameswf_version("LINUX "__DATE__" "__TIME__);
#endif

    return s_gameswf_version.c_str();
}

// dynamic library stuff, for sharing DLL/shared library among different movies.

static string_hash<tu_loadlib*> s_shared_libs;
string_hash<tu_loadlib*>* get_shared_libs()
{
    return &s_shared_libs;
}

void clear_shared_libs()
{
    for (string_hash<tu_loadlib*>::iterator it = s_shared_libs.begin();
            it != s_shared_libs.end(); ++it)
    {
        delete it->second;
    }
    s_shared_libs.clear();
}

struct registered_type_node
{
    registered_type_node(const tu_string& classname, gameswf_module_init type_init_func) :
        m_next(NULL),
        m_classname(classname),
        m_type_init(type_init_func)
    {
    }

    registered_type_node *m_next;
    tu_string             m_classname;
    gameswf_module_init   m_type_init;
};

static registered_type_node* s_registered_types = NULL;

void register_type_handler(const tu_string& type_name, gameswf_module_init type_init_func )
{
    registered_type_node** node = &s_registered_types;
    while(*node)
    {
        node = &((*node)->m_next);
    }
    *node = new registered_type_node(type_name, type_init_func);
}

void clear_registered_type_handlers()
{
    registered_type_node *curr = s_registered_types;
    s_registered_types = NULL;
    while(curr)
    {
        registered_type_node *next = curr->m_next;
        delete curr;
        curr = next;
    }
}

gameswf_module_init find_type_handler(const tu_string& type_name)
{
    registered_type_node *node = s_registered_types;
    while(node)
    {
        if (node->m_classname == type_name)
        {
            return node->m_type_init;
        }
        node = node->m_next;
    }
    return NULL;
}

// External interface.

static fscommand_callback	s_fscommand_handler = NULL;

fscommand_callback	get_fscommand_callback()
{
    return s_fscommand_handler;
}

void	register_fscommand_callback(fscommand_callback handler)
{
    s_fscommand_handler = handler;
}

as_standard_member	get_standard_member(const tu_stringi& name)
{
    if (s_standard_property_map.size() == 0)
    {
        s_standard_property_map.set_capacity(int(AS_STANDARD_MEMBER_COUNT));

        s_standard_property_map.add("_x", M_X);
        s_standard_property_map.add("_y", M_Y);
        s_standard_property_map.add("_xscale", M_XSCALE);
        s_standard_property_map.add("_yscale", M_YSCALE);
        s_standard_property_map.add("_currentframe", M_CURRENTFRAME);
        s_standard_property_map.add("_totalframes", M_TOTALFRAMES);
        s_standard_property_map.add("_alpha", M_ALPHA);
        s_standard_property_map.add("_visible", M_VISIBLE);
        s_standard_property_map.add("_width", M_WIDTH);
        s_standard_property_map.add("_height", M_HEIGHT);
        s_standard_property_map.add("_rotation", M_ROTATION);
        s_standard_property_map.add("_target", M_TARGET);
        s_standard_property_map.add("_framesloaded", M_FRAMESLOADED);
        s_standard_property_map.add("_name", M_NAME);
        s_standard_property_map.add("_droptarget", M_DROPTARGET);
        s_standard_property_map.add("_url", M_URL);
        s_standard_property_map.add("_highquality", M_HIGHQUALITY);
        s_standard_property_map.add("_focusrect", M_FOCUSRECT);
        s_standard_property_map.add("_soundbuftime", M_SOUNDBUFTIME);
        s_standard_property_map.add("_xmouse", M_XMOUSE);
        s_standard_property_map.add("_ymouse", M_YMOUSE);
        s_standard_property_map.add("_parent", M_PARENT);
        s_standard_property_map.add("text", M_TEXT);
        s_standard_property_map.add("textWidth", M_TEXTWIDTH);
        s_standard_property_map.add("textColor", M_TEXTCOLOR);
        s_standard_property_map.add("border", M_BORDER);
        s_standard_property_map.add("multiline", M_MULTILINE);
        s_standard_property_map.add("wordWrap", M_WORDWRAP);
        s_standard_property_map.add("type", M_TYPE);
        s_standard_property_map.add("backgroundColor", M_BACKGROUNDCOLOR);
        s_standard_property_map.add("_this", M_THIS);
        s_standard_property_map.add("this", MTHIS);
        s_standard_property_map.add("_root", M_ROOT);
        s_standard_property_map.add(".", MDOT);
        s_standard_property_map.add("..", MDOT2);
        s_standard_property_map.add("_level0", M_LEVEL0);
        s_standard_property_map.add("_global", M_GLOBAL);
        s_standard_property_map.add("enabled", M_ENABLED);
        s_standard_property_map.add("password", M_PASSWORD);
        s_standard_property_map.add("onMouseMove", M_MOUSE_MOVE);
    }

    as_standard_member	result = M_INVALID_MEMBER;
    s_standard_property_map.get(name, &result);

    return result;
}

//
// properties by number
//

static const tu_string	s_property_names[] =
{
    tu_string("_x"),
    tu_string("_y"),
    tu_string("_xscale"),
    tu_string("_yscale"),
    tu_string("_currentframe"),
    tu_string("_totalframes"),
    tu_string("_alpha"),
    tu_string("_visible"),
    tu_string("_width"),
    tu_string("_height"),
    tu_string("_rotation"),
    tu_string("_target"),
    tu_string("_framesloaded"),
    tu_string("_name"),
    tu_string("_droptarget"),
    tu_string("_url"),
    tu_string("_highquality"),
    tu_string("_focusrect"),
    tu_string("_soundbuftime"),
    tu_string("mysteryquality"), //tu_string("@@ mystery quality member"),  //this seems like a stupid bug to me . . . but I don't want it accessing the heap yet.
    tu_string("_xmouse"),
    tu_string("_ymouse"),
};

as_value	get_property(as_object* obj, int prop_number)
{
    as_value	val;
    if (prop_number >= 0 && prop_number < int(sizeof(s_property_names)/sizeof(s_property_names[0])))
    {
        obj->get_member(s_property_names[prop_number], &val);
    }
    else
    {
        log_error("error: invalid property query, property number %d\n", prop_number);
    }
    return val;
}

void	set_property(as_object* obj, int prop_number, const as_value& val)
{
    if (prop_number >= 0 && prop_number < int(sizeof(s_property_names)/sizeof(s_property_names[0])))
    {
        obj->set_member(s_property_names[prop_number], val);
    }
    else
    {
        log_error("error: invalid set_property, property number %d\n", prop_number);
    }
}

//
//	player
//

player::player() :
    m_force_realtime_framerate(false),
    m_log_bitmap_info(false)
{
    m_global = new as_object(this);

    action_init();

    if (s_player_count == 0)
    {
        // timer should be inited only once
        tu_timer::init_timer();

        standard_method_map_init();
    }

    ++s_player_count;

    // set startup random position
    Uint64 t = tu_timer::get_systime();
    t &= 0xFF;	// truncate
    for (unsigned int i = 0; i < t; i++)
    {
        tu_random::next_random();
    }

}

player::~player()
{
    // Clean up gameswf as much as possible, so valgrind will help find actual leaks.
    // Maximum release of resources.  Calls clear_library() and
    // fontlib::clear(), and also clears some extra internal stuff
    // that may have been allocated (e.g. global ActionScript
    // objects).  This should get all gameswf structures off the
    // heap, with the exception of any objects that are still
    // referenced by the host program and haven't had drop_ref()
    // called on them.

    m_current_root = NULL;
    m_global = NULL;
    --s_player_count;

    clear_heap();

    gameswf_engine_mutex().lock();

    clear_library();

    // Clear shared stuff only when all players are deleted
    if (s_player_count == 0)
    {
        clears_tag_loaders();
        clear_shared_libs();
        clear_registered_type_handlers();
        clear_standard_method_map();
        clear_disasm();
        delete s_glyph_provider;
        s_glyph_provider = NULL;
    }

    gameswf_engine_mutex().unlock();

    action_clear();
}

void player::set_flash_vars(const tu_string& param)
// Allow pass user variables to Flash
{
    m_flash_vars = param;
}

void player::verbose_action(bool val)
{
    set_verbose_action(val);
}

void player::verbose_parse(bool val)
{
    set_verbose_parse(val);
}

void	as_global_trace(const fn_call& fn);
void	player::action_init()
// Create/hook built-ins.
{
    //
    // global init
    //

    m_heap.set(m_global.get_ptr(), false);
    m_global->builtin_member("trace", as_global_trace);
    m_global->builtin_member("Object", as_global_object_ctor);
    m_global->builtin_member("Sound", as_global_sound_ctor);

    m_global->builtin_member("Array", new as_global_array(this));
    m_global->builtin_member("MovieClip", as_global_movieclip_ctor);
    m_global->builtin_member("TextField", as_global_textfield_ctor);
    m_global->builtin_member("TextFormat", as_global_textformat_ctor);
    m_global->builtin_member("SharedObject", new as_sharedobject(this));
    m_global->builtin_member("Mouse", new as_mouse(this));

    //			m_global->set_member("XML", as_value(xml_new));
    m_global->builtin_member("MovieClipLoader", as_global_mcloader_ctor);
    m_global->builtin_member("String", get_global_string_ctor(this));
    m_global->builtin_member("Number", as_global_number_ctor);
    m_global->builtin_member("Boolean", as_global_boolean_ctor);
    m_global->builtin_member("Color", as_global_color_ctor);
    m_global->builtin_member("Date", as_global_date_ctor);
    m_global->builtin_member("Selection", selection_init(this));

    as_object * capabilities = new as_object(this);
    capabilities->set_member( "version", "WIN 9,0,45,0" );
    m_global->builtin_member("Capabilities", capabilities);

#if TU_ENABLE_NETWORK == 1
    m_global->builtin_member("XMLSocket", as_global_xmlsock_ctor);
    m_global->builtin_member("LoadVars", as_global_loadvars_ctor);
#endif

    // ASSetPropFlags
    m_global->builtin_member("ASSetPropFlags", as_global_assetpropflags);

    // for video
    m_global->builtin_member("NetStream", as_global_netstream_ctor);
    m_global->builtin_member("NetConnection", as_global_netconnection_ctor);

    m_global->builtin_member("math", math_init(this));
    m_global->builtin_member("Key", key_init(this));
    m_global->builtin_member("AsBroadcaster", broadcaster_init(this));
    m_global->builtin_member("flash", flash_init(this));

    // global builtins functions
    m_global->builtin_member("setInterval",  as_global_setinterval);
    m_global->builtin_member("clearInterval",  as_global_clearinterval);
    m_global->builtin_member("setTimeout",  as_global_settimeout);
    m_global->builtin_member("clearTimeout",  as_global_clearinterval);
    m_global->builtin_member("getVersion",  as_global_get_version);
    m_global->builtin_member("parseFloat",  as_global_parse_float);
    m_global->builtin_member("parseInt",  as_global_parse_int);
    m_global->builtin_member("isNaN",  as_global_isnan);
    m_global->builtin_member("$version", as_value(as_global_get_version, as_value()));
    m_global->builtin_member("updateAfterEvent", as_global_update_after_event);
}


void	player::action_clear()
{
    if ( 0 == s_player_count )
    {
        clear_standard_property_map();
    }
}

as_object* player::get_global() const
{
    return m_global.get_ptr();
}

void player::notify_key_object(key::code k, bool down)
{
    as_value	kval;
    as_object* global = get_global();
    global->get_member("Key", &kval);
    as_key*	ko = cast_to<as_key>(kval.to_object());
    if (ko)
    {
        if (down) ko->set_key_down(k);
        else ko->set_key_up(k);
    }
    else
    {
        log_error("gameswf::notify_key_event(): no Key built-in\n");
    }
}

root* player::get_root()
{
    // on exit m_current_root may be NULL
//		assert(m_current_root.get_ptr() != NULL);
    return m_current_root.get_ptr();
}

character*	player::get_root_movie() const
{
    if (m_current_root != NULL)
    {
        return m_current_root->get_root_movie();
    }
    return NULL;
}

void player::notify_key_event(key::code k, bool down)
{
    m_current_root->notify_key_event(this, k, down);
}

void player::set_root(root* m)
{
    assert(m != NULL);
    m_current_root = m;
}

const char* player::get_workdir() const
{
    return m_workdir.c_str();
}

void player::set_workdir(const char* dir)
{
    assert(dir != NULL);
    m_workdir = dir;
}

// library stuff, for sharing resources among different movies.
string_hash<gc_ptr<character_def> >* player::get_chardef_library()
{
    return &m_chardef_library;
}

const char* player::get_root_filename(const character_def* rdef)
// get filename by root movie definition
{
    for (string_hash<gc_ptr<character_def> >::iterator it = m_chardef_library.begin();
            it != m_chardef_library.end(); ++it)
    {
        if (it->second == rdef)
        {
            return it->first.c_str();
        }
    }
    return NULL;
}

void player::clear_library()
// Drop all library references to movie_definitions, so they
// can be cleaned up.
{
    for (string_hash<gc_ptr<character_def> >::iterator it =
                m_chardef_library.begin(); it != m_chardef_library.end(); ++it)
    {
        if (gc_collector::debug_get_ref_count(it->second) > 1)
        {
            printf("memory leaks is found out: on exit movie_definition_sub ref_count > 1\n");
            printf("this = 0x%p, ref_count = %d\n", it->second.get_ptr(),
                   gc_collector::debug_get_ref_count(it->second));

            // to detect memory leaks
            while (gc_collector::debug_get_ref_count(it->second) > 1) {
                gc_collector::debug_decrement_ref_count(it->second);
            }
        }
    }
    m_chardef_library.clear();
}

void	ensure_loaders_registered();
movie_definition*	player::create_movie(const char* filename)
{
    assert(filename);

    // Is the movie already in the library?
    if (s_use_cached_movie_def)
    {
        gc_ptr<character_def>	m;
        get_chardef_library()->get(filename, &m);
        if (m != NULL)
        {
            // Return cached movie.
            return cast_to<movie_definition>(m.get_ptr());
        }
    }

    if (s_opener_function == NULL)
    {
        // Don't even have a way to open the file.
        log_error("error: no file opener function; can't create movie.	"
                  "See gameswf::register_file_opener_callback\n");
        return NULL;
    }

    tu_file* in = s_opener_function(filename);
    if (in == NULL)
    {
        log_error("failed to open '%s'; can't create movie.\n", filename);
        return NULL;
    }
    else if (in->get_error())
    {
        log_error("error: file opener can't open '%s'\n", filename);
        delete in;
        return NULL;
    }

    ensure_loaders_registered();

    movie_def_impl*	m = new movie_def_impl(this, DO_LOAD_BITMAPS, DO_LOAD_FONT_SHAPES);

    if (s_use_cached_movie_def)
    {
        get_chardef_library()->add(filename, m);
    }

    m->read(in);

    // "in" will be deleted after termination of the loader thread
    //	delete in;

    if (m && s_use_cache_files)
    {
        // Try to load a .gsc file.
        tu_string	cache_filename(filename);
        cache_filename += ".gsc";
        tu_file*	cache_in = s_opener_function(cache_filename.c_str());
        if (cache_in == NULL
                || cache_in->get_error() != TU_FILE_NO_ERROR)
        {
            // Can't open cache file; don't sweat it.
            IF_VERBOSE_PARSE(log_msg("note: couldn't open cache file '%s'\n", cache_filename.c_str()));
        }
        else
        {
            // Load the cached data.
            m->input_cached_data(cache_in);
        }

        delete cache_in;
    }

    return m;
}

gc_ptr<root> player::load_file(const char* infile)
// Load the actual movie.
{
    gc_ptr<gameswf::movie_definition>	md = create_movie(infile);
    if (md == NULL)
    {
        fprintf(stderr, "error: can't create a movie from '%s'\n", infile);
        return NULL;
    }

    gc_ptr<gameswf::root>	m = md->create_instance();
    if (m == NULL)
    {
        fprintf(stderr, "error: can't create movie instance\n");
        return NULL;
    }

    int	movie_version = m->get_movie_version();

#ifdef _DEBUG
    log_msg("Playing %s, swf version %d\n", infile, movie_version);
#else
    IF_VERBOSE_PARSE(log_msg("Playing %s, swf version %d\n", infile, movie_version));
#endif

    return m;
}

const bool player::get_force_realtime_framerate() const
{
    return m_force_realtime_framerate;
}

void player::set_force_realtime_framerate(const bool force_realtime_framerate)
{
    m_force_realtime_framerate = force_realtime_framerate;
}

// garbage collector

void player::set_alive(as_object* obj)
{
    m_heap.set(obj, false);
}

bool player::is_garbage(as_object* obj)
{
    bool is_garbage = false;
    m_heap.get(obj, &is_garbage);
    return is_garbage;
}

void player::clear_heap()
{
    for (hash<gc_ptr<as_object>, bool>::iterator it = m_heap.begin();
            it != m_heap.end(); ++it)
    {
        as_object* obj = it->first.get_ptr();
        if (obj)
        {
            if (gc_collector::debug_get_ref_count(obj) > 1)
            {
                hash<as_object*, bool> visited_objects;
                obj->clear_refs(&visited_objects, obj);
            }
        }
    }
    m_heap.clear();
}

void player::set_as_garbage()
{
    for (hash<gc_ptr<as_object>, bool>::iterator it = m_heap.begin();
            it != m_heap.end(); ++it)
    {
        as_object* obj = it->first.get_ptr();
        if (obj)
        {
            m_heap.set(obj, true);
        }
    }
}

void player::clear_garbage()
{
    m_global->this_alive();
    for (hash<gc_ptr<as_object>, bool>::iterator it = m_heap.begin();
            it != m_heap.end(); ++it)
    {
        as_object* obj = it->first.get_ptr();
        if (obj)
        {
            if (it->second)	// is garbage ?
            {
                if (gc_collector::debug_get_ref_count(obj) > 1)	// is in heap only ?
                {
                    hash<as_object*, bool> visited_objects;
                    obj->clear_refs(&visited_objects, obj);
                }
                m_heap.erase(obj);
            }
        }
    }
}

bool player::use_separate_thread()
{
    return s_use_separate_loader;
}

void player::set_separate_thread(bool flag)
{
    s_use_separate_loader = flag;
}

}
Пример #5
0
as_standard_member	get_standard_member(const tu_stringi& name)
{
    if (s_standard_property_map.size() == 0)
    {
        s_standard_property_map.set_capacity(int(AS_STANDARD_MEMBER_COUNT));

        s_standard_property_map.add("_x", M_X);
        s_standard_property_map.add("_y", M_Y);
        s_standard_property_map.add("_xscale", M_XSCALE);
        s_standard_property_map.add("_yscale", M_YSCALE);
        s_standard_property_map.add("_currentframe", M_CURRENTFRAME);
        s_standard_property_map.add("_totalframes", M_TOTALFRAMES);
        s_standard_property_map.add("_alpha", M_ALPHA);
        s_standard_property_map.add("_visible", M_VISIBLE);
        s_standard_property_map.add("_width", M_WIDTH);
        s_standard_property_map.add("_height", M_HEIGHT);
        s_standard_property_map.add("_rotation", M_ROTATION);
        s_standard_property_map.add("_target", M_TARGET);
        s_standard_property_map.add("_framesloaded", M_FRAMESLOADED);
        s_standard_property_map.add("_name", M_NAME);
        s_standard_property_map.add("_droptarget", M_DROPTARGET);
        s_standard_property_map.add("_url", M_URL);
        s_standard_property_map.add("_highquality", M_HIGHQUALITY);
        s_standard_property_map.add("_focusrect", M_FOCUSRECT);
        s_standard_property_map.add("_soundbuftime", M_SOUNDBUFTIME);
        s_standard_property_map.add("_xmouse", M_XMOUSE);
        s_standard_property_map.add("_ymouse", M_YMOUSE);
        s_standard_property_map.add("_parent", M_PARENT);
        s_standard_property_map.add("text", M_TEXT);
        s_standard_property_map.add("textWidth", M_TEXTWIDTH);
        s_standard_property_map.add("textColor", M_TEXTCOLOR);
        s_standard_property_map.add("border", M_BORDER);
        s_standard_property_map.add("multiline", M_MULTILINE);
        s_standard_property_map.add("wordWrap", M_WORDWRAP);
        s_standard_property_map.add("type", M_TYPE);
        s_standard_property_map.add("backgroundColor", M_BACKGROUNDCOLOR);
        s_standard_property_map.add("_this", M_THIS);
        s_standard_property_map.add("this", MTHIS);
        s_standard_property_map.add("_root", M_ROOT);
        s_standard_property_map.add(".", MDOT);
        s_standard_property_map.add("..", MDOT2);
        s_standard_property_map.add("_level0", M_LEVEL0);
        s_standard_property_map.add("_global", M_GLOBAL);
        s_standard_property_map.add("enabled", M_ENABLED);
        s_standard_property_map.add("password", M_PASSWORD);
        s_standard_property_map.add("onMouseMove", M_MOUSE_MOVE);
    }

    as_standard_member	result = M_INVALID_MEMBER;
    s_standard_property_map.get(name, &result);

    return result;
}
Пример #6
0
void clear_standard_property_map()
{
    s_standard_property_map.clear();
}