[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Gnash-commit] gnash ChangeLog server/asobj/Key.cpp server/aso...
From: |
zou lunkai |
Subject: |
Re: [Gnash-commit] gnash ChangeLog server/asobj/Key.cpp server/aso... |
Date: |
Thu, 11 Oct 2007 08:41:39 +0800 |
Hi bwy,
> bool
> -key_as_object::is_key_down(int code)
> +key_as_object::is_key_down(int keycode)
> {
> - if (code < 0 || code >= key::KEYCOUNT) return false;
> + if (keycode < 0 || keycode >= key::KEYCOUNT) return false;
>
> - for(int i = 0; i <
> sizeof(m_unreleased_keys)/sizeof(m_unreleased_keys[0]); i++)
> - {
> - if( m_unreleased_keys[i] != 0)
> - {
> - for(int j=0; j<8; j++)
> - {
> - if( m_unreleased_keys[i] & (1 << j) )
> - {
> - if(key::codeMap[i*8+j][1] == code) return true;
> - }
> - }
> - }
> - }
> + // Select the relevant byte of the bit array:
> + int byte_index = keycode >> 3;
> + // Find bit within the byte:
> + int bit_index = keycode - (byte_index << 3);
> +
> + uint8_t mask = ~(1 << bit_index);
> +
> + if ((m_unreleased_keys[byte_index] & mask) !=
> m_unreleased_keys[byte_index] ) return true; ---------> [1]
>
> return false;
> }
Is this an attempt for optimization or fixing anything? Any
assumption for with [1]?
eg. If there are 2 bits set within the same byte, [1] would always return true.
--zou
On 10/10/07, Benjamin Wolsey <address@hidden> wrote:
> CVSROOT: /sources/gnash
> Module name: gnash
> Changes by: Benjamin Wolsey <bwy> 07/10/10 14:07:58
>
> Modified files:
> . : ChangeLog
> server/asobj : Key.cpp Key.h
>
> Log message:
> * server/asobj/Key.{h,cpp}: change is_key_down() to take SWF
> keycode
> and check the relevant bit in m_unreleased_keys (bit array).
>
> CVSWeb URLs:
> http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.4588&r2=1.4589
> http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/Key.cpp?cvsroot=gnash&r1=1.39&r2=1.40
> http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/Key.h?cvsroot=gnash&r1=1.28&r2=1.29
>
> Patches:
> Index: ChangeLog
> ===================================================================
> RCS file: /sources/gnash/gnash/ChangeLog,v
> retrieving revision 1.4588
> retrieving revision 1.4589
> diff -u -b -r1.4588 -r1.4589
> --- ChangeLog 10 Oct 2007 13:38:08 -0000 1.4588
> +++ ChangeLog 10 Oct 2007 14:07:57 -0000 1.4589
> @@ -1,3 +1,8 @@
> +2007-10-10 Benjamin Wolsey <address@hidden>
> +
> + * server/asobj/Key.{h,cpp}: change is_key_down() to take SWF keycode
> + and check the relevant bit in m_unreleased_keys (bit array).
> +
> 2007-10-10 Sandro Santilli <address@hidden>
>
> * server/movie_root.cpp (notify_key_listeners): don't use a
>
> Index: server/asobj/Key.cpp
> ===================================================================
> RCS file: /sources/gnash/gnash/server/asobj/Key.cpp,v
> retrieving revision 1.39
> retrieving revision 1.40
> diff -u -b -r1.39 -r1.40
> --- server/asobj/Key.cpp 10 Oct 2007 08:55:46 -0000 1.39
> +++ server/asobj/Key.cpp 10 Oct 2007 14:07:58 -0000 1.40
> @@ -51,23 +51,18 @@
> }
>
> bool
> -key_as_object::is_key_down(int code)
> +key_as_object::is_key_down(int keycode)
> {
> - if (code < 0 || code >= key::KEYCOUNT) return false;
> + if (keycode < 0 || keycode >= key::KEYCOUNT) return false;
>
> - for(int i = 0; i <
> sizeof(m_unreleased_keys)/sizeof(m_unreleased_keys[0]); i++)
> - {
> - if( m_unreleased_keys[i] != 0)
> - {
> - for(int j=0; j<8; j++)
> - {
> - if( m_unreleased_keys[i] & (1 << j) )
> - {
> - if(key::codeMap[i*8+j][1] == code) return true;
> - }
> - }
> - }
> - }
> + // Select the relevant byte of the bit array:
> + int byte_index = keycode >> 3;
> + // Find bit within the byte:
> + int bit_index = keycode - (byte_index << 3);
> +
> + uint8_t mask = ~(1 << bit_index);
> +
> + if ((m_unreleased_keys[byte_index] & mask) !=
> m_unreleased_keys[byte_index] ) return true;
>
> return false;
> }
> @@ -98,9 +93,8 @@
> {
> if (code < 0 || code >= key::KEYCOUNT) return;
>
> - // Key.isDown() only cares about flash keycode, not character, so
> - // we lookup keycode to add to m_unreleased_keys.
> -
> + // This is used for getAscii() of the last key event, so we use gnash's
> + // internal code.
> m_last_key_event = code;
>
> // Key.isDown() only cares about flash keycode, not character, so
> @@ -286,9 +280,9 @@
> return as_value();
> }
>
> - int code = fn.arg(0).to_number<int>();
> + int keycode = fn.arg(0).to_number<int>();
>
> - return as_value(ko->is_key_down(code));
> + return as_value(ko->is_key_down(keycode));
> }
>
> /// \brief
>
> Index: server/asobj/Key.h
> ===================================================================
> RCS file: /sources/gnash/gnash/server/asobj/Key.h,v
> retrieving revision 1.28
> retrieving revision 1.29
> diff -u -b -r1.28 -r1.29
> --- server/asobj/Key.h 10 Oct 2007 07:45:28 -0000 1.28
> +++ server/asobj/Key.h 10 Oct 2007 14:07:58 -0000 1.29
> @@ -16,7 +16,7 @@
> // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
> //
>
> -/* $Id: Key.h,v 1.28 2007/10/10 07:45:28 bwy Exp $ */
> +/* $Id: Key.h,v 1.29 2007/10/10 14:07:58 bwy Exp $ */
>
> #ifndef __KEY_H__
> #define __KEY_H__
> @@ -79,10 +79,17 @@
>
> key_as_object();
>
> - bool is_key_down(int code);
> + // Pass SWF keycode, returns true if currently pressed.
> + bool is_key_down(int keycode);
>
> + // Pass gnash::key::code. Changes m_last_key_event
> + // and adds appropriate SWF keycode to bit array of keys
> + // pressed (m_unreleased_keys)
> void set_key_down(int code);
>
> + // Pass gnash::key::code. Changes m_last_key_event
> + // and removes appropriate SWF keycode from bit array of keys
> + // pressed (m_unreleased_keys)
> void set_key_up(int code);
>
> #ifndef NEW_KEY_LISTENER_LIST_DESIGN
>
>
> _______________________________________________
> Gnash-commit mailing list
> address@hidden
> http://lists.gnu.org/mailman/listinfo/gnash-commit
>