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