gfx/skia/trunk/src/animator/SkDisplayEvents.cpp

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/gfx/skia/trunk/src/animator/SkDisplayEvents.cpp	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,113 @@
     1.4 +
     1.5 +/*
     1.6 + * Copyright 2006 The Android Open Source Project
     1.7 + *
     1.8 + * Use of this source code is governed by a BSD-style license that can be
     1.9 + * found in the LICENSE file.
    1.10 + */
    1.11 +
    1.12 +
    1.13 +#include "SkDisplayEvents.h"
    1.14 +#include "SkAnimateMaker.h"
    1.15 +#include "SkAnimator.h"
    1.16 +#include "SkDisplayEvent.h"
    1.17 +#include "SkDisplayMovie.h"
    1.18 +#include "SkDrawable.h"
    1.19 +#ifdef SK_DEBUG
    1.20 +#include "SkDump.h"
    1.21 +#endif
    1.22 +
    1.23 +SkEventState::SkEventState() : fCode(0), fDisable(false), fDisplayable(0), fX(0), fY(0) {
    1.24 +}
    1.25 +
    1.26 +SkEvents::SkEvents() {
    1.27 +}
    1.28 +
    1.29 +SkEvents::~SkEvents() {
    1.30 +}
    1.31 +
    1.32 +bool SkEvents::doEvent(SkAnimateMaker& maker, SkDisplayEvent::Kind kind, SkEventState* state) {
    1.33 +/*#ifdef SK_DUMP_ENABLED
    1.34 +    if (maker.fDumpEvents) {
    1.35 +        SkDebugf("doEvent: ");
    1.36 +        SkString str;
    1.37 +        SkDump::GetEnumString(SkType_EventKind, kind, &str);
    1.38 +        SkDebugf("kind=%s ", str.c_str());
    1.39 +        if (state && state->fDisplayable)
    1.40 +            state->fDisplayable->SkDisplayable::dump(&maker);
    1.41 +        else
    1.42 +            SkDebugf("\n");
    1.43 +    }
    1.44 +#endif*/
    1.45 +    bool handled = false;
    1.46 +    SkDisplayable** firstMovie = maker.fMovies.begin();
    1.47 +    SkDisplayable** endMovie = maker.fMovies.end();
    1.48 +    for (SkDisplayable** ptr = firstMovie; ptr < endMovie; ptr++) {
    1.49 +        SkDisplayMovie* movie = (SkDisplayMovie*) *ptr;
    1.50 +        if (kind != SkDisplayEvent::kOnload)
    1.51 +            movie->doEvent(kind, state);
    1.52 +    }
    1.53 +    SkDisplayable* displayable = state ? state->fDisplayable : NULL;
    1.54 +    int keyCode = state ? state->fCode : 0;
    1.55 +    int count = fEvents.count();
    1.56 +    for (int index = 0; index < count; index++) {
    1.57 +        SkDisplayEvent* evt = fEvents[index];
    1.58 +        if (evt->disable)
    1.59 +            continue;
    1.60 +        if (evt->kind != kind)
    1.61 +            continue;
    1.62 +        if (evt->code != (SkKey) -1) {
    1.63 +            if ((int) evt->code > keyCode || (int) (evt->fMax != (SkKey) -1 ? evt->fMax : evt->code) < keyCode)
    1.64 +                continue;
    1.65 +            evt->fLastCode = (SkKey) keyCode;
    1.66 +        }
    1.67 +        if (evt->fTarget != NULL && evt->fTarget != displayable)
    1.68 +            continue;
    1.69 +        if (state == NULL || state->fDisable == 0) {
    1.70 +            if (kind >= SkDisplayEvent::kMouseDown && kind <= SkDisplayEvent::kMouseUp) {
    1.71 +                evt->x = state->fX;
    1.72 +                evt->y = state->fY;
    1.73 +            }
    1.74 +            if (evt->enableEvent(maker))
    1.75 +                fError = true;
    1.76 +        }
    1.77 +        handled = true;
    1.78 +    }
    1.79 +    return handled;
    1.80 +}
    1.81 +
    1.82 +#ifdef SK_DUMP_ENABLED
    1.83 +void SkEvents::dump(SkAnimateMaker& maker) {
    1.84 +    int index;
    1.85 +    SkTDDrawableArray& drawArray = maker.fDisplayList.fDrawList;
    1.86 +    int count = drawArray.count();
    1.87 +    for (index = 0; index < count; index++) {
    1.88 +        SkDrawable* drawable = drawArray[index];
    1.89 +        drawable->dumpEvents();
    1.90 +    }
    1.91 +    count = fEvents.count();
    1.92 +    for (index = 0; index < count; index++) {
    1.93 +        SkDisplayEvent* evt = fEvents[index];
    1.94 +        evt->dumpEvent(&maker);
    1.95 +    }
    1.96 +}
    1.97 +#endif
    1.98 +
    1.99 +// currently this only removes onLoad events
   1.100 +void SkEvents::removeEvent(SkDisplayEvent::Kind kind, SkEventState* state) {
   1.101 +    int keyCode = state ? state->fCode : 0;
   1.102 +    SkDisplayable* displayable = state ? state->fDisplayable : NULL;
   1.103 +    for (SkDisplayEvent** evtPtr = fEvents.begin(); evtPtr < fEvents.end(); evtPtr++) {
   1.104 +        SkDisplayEvent* evt = *evtPtr;
   1.105 +        if (evt->kind != kind)
   1.106 +            continue;
   1.107 +        if (evt->code != (SkKey) -1) {
   1.108 +            if ((int) evt->code > keyCode || (int) (evt->fMax != (SkKey) -1 ? evt->fMax : evt->code) < keyCode)
   1.109 +                continue;
   1.110 +        }
   1.111 +        if (evt->fTarget != NULL && evt->fTarget != displayable)
   1.112 +            continue;
   1.113 +        int index = fEvents.find(evt);
   1.114 +        fEvents.remove(index);
   1.115 +    }
   1.116 +}

mercurial