1685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com 2685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com/* 3685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * Copyright 2006 The Android Open Source Project 4685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * 5685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * found in the LICENSE file. 7685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com */ 8685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com 9bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 10bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDisplayEvents.h" 11bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkAnimateMaker.h" 12bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkAnimator.h" 13bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDisplayEvent.h" 14bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDisplayMovie.h" 15bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDrawable.h" 16bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#ifdef SK_DEBUG 17bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDump.h" 18bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#endif 19bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 20bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comSkEventState::SkEventState() : fCode(0), fDisable(false), fDisplayable(0), fX(0), fY(0) { 21bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 22bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 23bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comSkEvents::SkEvents() { 24bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 25bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 26bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comSkEvents::~SkEvents() { 27bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 28bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 29bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.combool SkEvents::doEvent(SkAnimateMaker& maker, SkDisplayEvent::Kind kind, SkEventState* state) { 30bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com/*#ifdef SK_DUMP_ENABLED 31bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (maker.fDumpEvents) { 32bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkDebugf("doEvent: "); 33bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkString str; 34bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkDump::GetEnumString(SkType_EventKind, kind, &str); 35bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkDebugf("kind=%s ", str.c_str()); 36bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (state && state->fDisplayable) 37bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com state->fDisplayable->SkDisplayable::dump(&maker); 38bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com else 39bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkDebugf("\n"); 40bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 41bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#endif*/ 42bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com bool handled = false; 43bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkDisplayable** firstMovie = maker.fMovies.begin(); 44bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkDisplayable** endMovie = maker.fMovies.end(); 45bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com for (SkDisplayable** ptr = firstMovie; ptr < endMovie; ptr++) { 46bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkDisplayMovie* movie = (SkDisplayMovie*) *ptr; 47bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (kind != SkDisplayEvent::kOnload) 48bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com movie->doEvent(kind, state); 49bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 50bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkDisplayable* displayable = state ? state->fDisplayable : NULL; 51bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com int keyCode = state ? state->fCode : 0; 52bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com int count = fEvents.count(); 53bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com for (int index = 0; index < count; index++) { 54bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkDisplayEvent* evt = fEvents[index]; 55bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (evt->disable) 56bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com continue; 57bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (evt->kind != kind) 58bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com continue; 59bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (evt->code != (SkKey) -1) { 60bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if ((int) evt->code > keyCode || (int) (evt->fMax != (SkKey) -1 ? evt->fMax : evt->code) < keyCode) 61bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com continue; 62bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com evt->fLastCode = (SkKey) keyCode; 63bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 64bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (evt->fTarget != NULL && evt->fTarget != displayable) 65bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com continue; 66bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (state == NULL || state->fDisable == 0) { 67bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (kind >= SkDisplayEvent::kMouseDown && kind <= SkDisplayEvent::kMouseUp) { 68bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com evt->x = state->fX; 69bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com evt->y = state->fY; 70bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 71bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (evt->enableEvent(maker)) 72bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com fError = true; 73bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 74bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com handled = true; 75bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 76bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return handled; 77bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 78bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 79bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#ifdef SK_DUMP_ENABLED 80bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comvoid SkEvents::dump(SkAnimateMaker& maker) { 81bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com int index; 82bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkTDDrawableArray& drawArray = maker.fDisplayList.fDrawList; 83bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com int count = drawArray.count(); 84bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com for (index = 0; index < count; index++) { 85bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkDrawable* drawable = drawArray[index]; 86dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com drawable->dumpEvents(); 87bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 88bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com count = fEvents.count(); 89bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com for (index = 0; index < count; index++) { 90bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkDisplayEvent* evt = fEvents[index]; 91bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com evt->dumpEvent(&maker); 92bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 93bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 94bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#endif 95bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 96bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com// currently this only removes onLoad events 97bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comvoid SkEvents::removeEvent(SkDisplayEvent::Kind kind, SkEventState* state) { 98bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com int keyCode = state ? state->fCode : 0; 99bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkDisplayable* displayable = state ? state->fDisplayable : NULL; 100bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com for (SkDisplayEvent** evtPtr = fEvents.begin(); evtPtr < fEvents.end(); evtPtr++) { 101bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkDisplayEvent* evt = *evtPtr; 102bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (evt->kind != kind) 103bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com continue; 104bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (evt->code != (SkKey) -1) { 105bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if ((int) evt->code > keyCode || (int) (evt->fMax != (SkKey) -1 ? evt->fMax : evt->code) < keyCode) 106bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com continue; 107bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 108bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (evt->fTarget != NULL && evt->fTarget != displayable) 109bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com continue; 110bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com int index = fEvents.find(evt); 111bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com fEvents.remove(index); 112bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 113bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 114