1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkEvent.h"
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1287fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.comvoid SkEvent::initialize(const char* type, size_t typeLen,
1387fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com                         SkEventSinkID targetID) {
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fType = NULL;
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    setType(type, typeLen);
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    f32 = 0;
1787fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    fTargetID = targetID;
1887fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    fTargetProc = NULL;
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fTime = 0;
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fNextEvent = NULL;
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkEvent::SkEvent()
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
2787fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    initialize("", 0, 0);
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkEvent::SkEvent(const SkEvent& src)
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    *this = src;
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (((size_t) fType & 1) == 0)
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        setType(src.fType);
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3787fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.comSkEvent::SkEvent(const SkString& type, SkEventSinkID targetID)
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
3987fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    initialize(type.c_str(), type.size(), targetID);
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4287fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.comSkEvent::SkEvent(const char type[], SkEventSinkID targetID)
438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(type);
4587fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    initialize(type, strlen(type), targetID);
468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkEvent::~SkEvent()
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (((size_t) fType & 1) == 0)
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        sk_free((void*) fType);
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic size_t makeCharArray(char* buffer, size_t compact)
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    size_t bits = (size_t) compact >> 1;
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    memcpy(buffer, &bits, sizeof(compact));
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    buffer[sizeof(compact)] = 0;
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return strlen(buffer);
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
62d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comvoid SkEvent::getType(SkString* str) const
63d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com{
64d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    if (str)
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if ((size_t) fType & 1) // not a pointer
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            char chars[sizeof(size_t) + 1];
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            size_t len = makeCharArray(chars, (size_t) fType);
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            str->set(chars, len);
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        else
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            str->set(fType);
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
77d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.combool SkEvent::isType(const SkString& str) const
788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
79d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    return this->isType(str.c_str(), str.size());
808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
82d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.combool SkEvent::isType(const char type[], size_t typeLen) const
83d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com{
848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (typeLen == 0)
858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        typeLen = strlen(type);
868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if ((size_t) fType & 1) {   // not a pointer
878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        char chars[sizeof(size_t) + 1];
888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        size_t len = makeCharArray(chars, (size_t) fType);
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return len == typeLen && strncmp(chars, type, typeLen) == 0;
908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
91d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    return strncmp(fType, type, typeLen) == 0 && fType[typeLen] == 0;
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkEvent::setType(const char type[], size_t typeLen)
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (typeLen == 0)
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        typeLen = strlen(type);
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (typeLen <= sizeof(fType)) {
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        size_t slot = 0;
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        memcpy(&slot, type, typeLen);
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (slot << 1 >> 1 != slot)
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            goto useCharStar;
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        slot <<= 1;
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        slot |= 1;
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fType = (char*) slot;
1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    } else {
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comuseCharStar:
1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fType = (char*) sk_malloc_throw(typeLen + 1);
1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkASSERT(((size_t) fType & 1) == 0);
1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        memcpy(fType, type, typeLen);
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fType[typeLen] = 0;
1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkEvent::setType(const SkString& type)
1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    setType(type.c_str());
1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////////////////////////////////////////////////////////////////////////
1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkParse.h"
1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkEvent::inflate(const SkDOM& dom, const SkDOM::Node* node)
1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const char* name = dom.findAttr(node, "type");
1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (name)
1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        this->setType(name);
1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const char* value;
1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if ((value = dom.findAttr(node, "fast32")) != NULL)
1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int32_t n;
1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (SkParse::FindS32(value, &n))
1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            this->setFast32(n);
1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (node = dom.getFirstChild(node); node; node = dom.getNextSibling(node))
1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (strcmp(dom.getName(node), "data"))
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkDEBUGCODE(SkDebugf("SkEvent::inflate unrecognized subelement <%s>\n", dom.getName(node));)
1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            continue;
1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        name = dom.findAttr(node, "name");
1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (name == NULL)
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkDEBUGCODE(SkDebugf("SkEvent::inflate missing required \"name\" attribute in <data> subelement\n");)
1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            continue;
1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if ((value = dom.findAttr(node, "s32")) != NULL)
1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            int32_t n;
1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (SkParse::FindS32(value, &n))
1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                this->setS32(name, n);
1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        else if ((value = dom.findAttr(node, "scalar")) != NULL)
1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkScalar x;
1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (SkParse::FindScalar(value, &x))
1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                this->setScalar(name, x);
1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        else if ((value = dom.findAttr(node, "string")) != NULL)
1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            this->setString(name, value);
1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG
1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        else
1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkDebugf("SkEvent::inflate <data name=\"%s\"> subelement missing required type attribute [S32 | scalar | string]\n", name);
1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG
1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #ifndef SkScalarToFloat
1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        #define SkScalarToFloat(x)  ((x) / 65536.f)
1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #endif
1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void SkEvent::dump(const char title[])
1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (title)
1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkDebugf("%s ", title);
186d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkString    etype;
1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        this->getType(&etype);
1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("event<%s> fast32=%d", etype.c_str(), this->getFast32());
1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        const SkMetaData&   md = this->getMetaData();
1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkMetaData::Iter    iter(md);
1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkMetaData::Type    mtype;
1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int                 count;
1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        const char*         name;
196d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        while ((name = iter.next(&mtype, &count)) != NULL)
1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkASSERT(count > 0);
2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkDebugf(" <%s>=", name);
2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            switch (mtype) {
2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            case SkMetaData::kS32_Type:     // vector version???
2048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                {
2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    int32_t value;
2068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    md.findS32(name, &value);
2078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    SkDebugf("%d ", value);
2088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                }
2098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                break;
2108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            case SkMetaData::kScalar_Type:
2118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                {
2128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    const SkScalar* values = md.findScalars(name, &count, NULL);
2138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    SkDebugf("%f", SkScalarToFloat(values[0]));
2148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    for (int i = 1; i < count; i++)
2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        SkDebugf(", %f", SkScalarToFloat(values[i]));
2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    SkDebugf(" ");
2178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                }
2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                break;
2198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            case SkMetaData::kString_Type:
2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                {
2218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    const char* value = md.findString(name);
2228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    SkASSERT(value);
2238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    SkDebugf("<%s> ", value);
2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                }
2258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                break;
2268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            case SkMetaData::kPtr_Type:     // vector version???
2278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                {
2288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    void*   value;
2298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    md.findPtr(name, &value);
2308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    SkDebugf("%p ", value);
2318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                }
2328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                break;
2338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            case SkMetaData::kBool_Type:    // vector version???
2348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                {
2358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    bool    value;
2368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    md.findBool(name, &value);
2378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    SkDebugf("%s ", value ? "true" : "false");
2388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                }
2398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                break;
2408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            default:
2410c00f21fee3f5cfa3aa7e5d46ff94cb8cf340451tomhudson@google.com                SkDEBUGFAIL("unknown metadata type returned from iterator");
2428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                break;
2438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
2448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
2458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("\n");
2468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////////////////////////////////////////////////////////////////////////////////////
2508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG
2528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// #define SK_TRACE_EVENTSx
2538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_TRACE_EVENTS
2568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static void event_log(const char s[])
2578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
2588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDEBUGF(("%s\n", s));
2598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #define EVENT_LOG(s)        event_log(s)
2628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #define EVENT_LOGN(s, n)    do { SkString str(s); str.append(" "); str.appendS32(n); event_log(str.c_str()); } while (0)
2638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else
2648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #define EVENT_LOG(s)
2658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #define EVENT_LOGN(s, n)
2668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkThread.h"
2698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTime.h"
2708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2719998c669300281b5682fce72b036c1a6a619a44ereed@google.comclass SkEvent_Globals {
2728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
2739998c669300281b5682fce72b036c1a6a619a44ereed@google.com    SkEvent_Globals() {
2749998c669300281b5682fce72b036c1a6a619a44ereed@google.com        fEventQHead = NULL;
2759998c669300281b5682fce72b036c1a6a619a44ereed@google.com        fEventQTail = NULL;
2769998c669300281b5682fce72b036c1a6a619a44ereed@google.com        fDelayQHead = NULL;
2779998c669300281b5682fce72b036c1a6a619a44ereed@google.com        SkDEBUGCODE(fEventCounter = 0;)
2789998c669300281b5682fce72b036c1a6a619a44ereed@google.com    }
2799998c669300281b5682fce72b036c1a6a619a44ereed@google.com
2808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkMutex     fEventMutex;
2818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkEvent*    fEventQHead, *fEventQTail;
2828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkEvent*    fDelayQHead;
2838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDEBUGCODE(int fEventCounter;)
2848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
2858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2869998c669300281b5682fce72b036c1a6a619a44ereed@google.comstatic SkEvent_Globals& getGlobals() {
2879998c669300281b5682fce72b036c1a6a619a44ereed@google.com    // leak this, so we don't incure any shutdown perf hit
2889998c669300281b5682fce72b036c1a6a619a44ereed@google.com    static SkEvent_Globals* gGlobals = new SkEvent_Globals;
2899998c669300281b5682fce72b036c1a6a619a44ereed@google.com    return *gGlobals;
2908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
29287fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com///////////////////////////////////////////////////////////////////////////////
2938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
29487fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.comvoid SkEvent::postDelay(SkMSec delay) {
29587fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    if (!fTargetID && !fTargetProc) {
29687fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com        delete this;
29787fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com        return;
2988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
299d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
30087fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    if (delay) {
30187fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com        this->postTime(SkTime::GetMSecs() + delay);
30287fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com        return;
30387fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    }
30487fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com
3059998c669300281b5682fce72b036c1a6a619a44ereed@google.com    SkEvent_Globals& globals = getGlobals();
3068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    globals.fEventMutex.acquire();
30887fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    bool wasEmpty = SkEvent::Enqueue(this);
3098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    globals.fEventMutex.release();
310d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
3118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // call outside of us holding the mutex
31287fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    if (wasEmpty) {
3138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkEvent::SignalNonEmptyQueue();
31487fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    }
3158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
3168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
31787fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.comvoid SkEvent::postTime(SkMSec time) {
31887fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    if (!fTargetID && !fTargetProc) {
31987fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com        delete this;
32087fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com        return;
3218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
3228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3239998c669300281b5682fce72b036c1a6a619a44ereed@google.com    SkEvent_Globals& globals = getGlobals();
324d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
3258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    globals.fEventMutex.acquire();
32687fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    SkMSec queueDelay = SkEvent::EnqueueTime(this, time);
3278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    globals.fEventMutex.release();
328d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
3298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // call outside of us holding the mutex
33087fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    if ((int32_t)queueDelay != ~0) {
3318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkEvent::SignalQueueTimer(queueDelay);
332c514dde99e10fb3dbfff5a15537211a7eb094365reed@google.com    }
333c514dde99e10fb3dbfff5a15537211a7eb094365reed@google.com}
334c514dde99e10fb3dbfff5a15537211a7eb094365reed@google.com
33587fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.combool SkEvent::Enqueue(SkEvent* evt) {
3369998c669300281b5682fce72b036c1a6a619a44ereed@google.com    SkEvent_Globals& globals = getGlobals();
3378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    //  gEventMutex acquired by caller
3388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(evt);
3408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool wasEmpty = globals.fEventQHead == NULL;
3428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (globals.fEventQTail)
3448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        globals.fEventQTail->fNextEvent = evt;
3458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    globals.fEventQTail = evt;
3468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (globals.fEventQHead == NULL)
3478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        globals.fEventQHead = evt;
3488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    evt->fNextEvent = NULL;
3498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDEBUGCODE(++globals.fEventCounter);
3518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return wasEmpty;
3538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
3548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
35587fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.comSkEvent* SkEvent::Dequeue() {
3569998c669300281b5682fce72b036c1a6a619a44ereed@google.com    SkEvent_Globals& globals = getGlobals();
3578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    globals.fEventMutex.acquire();
3588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkEvent* evt = globals.fEventQHead;
36087fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    if (evt) {
3618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDEBUGCODE(--globals.fEventCounter);
3628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        globals.fEventQHead = evt->fNextEvent;
36487fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com        if (globals.fEventQHead == NULL) {
3658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            globals.fEventQTail = NULL;
36687fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com        }
3678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
3688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    globals.fEventMutex.release();
3698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return evt;
3718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
3728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
37387fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.combool SkEvent::QHasEvents() {
3749998c669300281b5682fce72b036c1a6a619a44ereed@google.com    SkEvent_Globals& globals = getGlobals();
3758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // this is not thread accurate, need a semaphore for that
3778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return globals.fEventQHead != NULL;
3788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
3798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_TRACE_EVENTS
3818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static int gDelayDepth;
3828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
3838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
38487fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.comSkMSec SkEvent::EnqueueTime(SkEvent* evt, SkMSec time) {
3859998c669300281b5682fce72b036c1a6a619a44ereed@google.com    SkEvent_Globals& globals = getGlobals();
3868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    //  gEventMutex acquired by caller
3878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkEvent* curr = globals.fDelayQHead;
3898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkEvent* prev = NULL;
3908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
39187fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    while (curr) {
39287fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com        if (SkMSec_LT(time, curr->fTime)) {
3938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
39487fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com        }
3958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        prev = curr;
3968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        curr = curr->fNextEvent;
3978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
3988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    evt->fTime = time;
4008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    evt->fNextEvent = curr;
40187fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    if (prev == NULL) {
4028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        globals.fDelayQHead = evt;
40387fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    } else {
4048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        prev->fNextEvent = evt;
40587fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    }
4068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkMSec delay = globals.fDelayQHead->fTime - SkTime::GetMSecs();
40887fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    if ((int32_t)delay <= 0) {
4098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        delay = 1;
41087fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    }
4118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return delay;
4128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
4138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
41487fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com///////////////////////////////////////////////////////////////////////////////
4158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkEventSink.h"
4178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
41887fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.combool SkEvent::ProcessEvent() {
41987fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    SkEvent*                evt = SkEvent::Dequeue();
4208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkAutoTDelete<SkEvent>  autoDelete(evt);
42187fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    bool                    again = false;
4228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    EVENT_LOGN("ProcessEvent", (int32_t)evt);
4248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
42587fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    if (evt) {
42687fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com        (void)SkEventSink::DoEvent(*evt);
4278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        again = SkEvent::QHasEvents();
4288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
4298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return again;
4308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
4318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkEvent::ServiceQueueTimer()
4338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
4349998c669300281b5682fce72b036c1a6a619a44ereed@google.com    SkEvent_Globals& globals = getGlobals();
4358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    globals.fEventMutex.acquire();
4378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool        wasEmpty = false;
4398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkMSec      now = SkTime::GetMSecs();
4408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkEvent*    evt = globals.fDelayQHead;
4418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    while (evt)
4438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
4448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (SkMSec_LT(now, evt->fTime))
4458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
4468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_TRACE_EVENTS
4488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        --gDelayDepth;
4498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("dequeue-delay %s (%d)", evt->getType(), gDelayDepth);
4508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        const char* idStr = evt->findString("id");
4518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (idStr)
4528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkDebugf(" (%s)", idStr);
4538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("\n");
4548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
4558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkEvent* next = evt->fNextEvent;
4578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (SkEvent::Enqueue(evt))
4588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            wasEmpty = true;
4598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        evt = next;
4608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
4618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    globals.fDelayQHead = evt;
4628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkMSec time = evt ? evt->fTime - now : 0;
4648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    globals.fEventMutex.release();
4668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (wasEmpty)
4688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkEvent::SignalNonEmptyQueue();
4698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkEvent::SignalQueueTimer(time);
4718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
4728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
473f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comint SkEvent::CountEventsOnQueue() {
4749998c669300281b5682fce72b036c1a6a619a44ereed@google.com    SkEvent_Globals& globals = getGlobals();
475f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    globals.fEventMutex.acquire();
476d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
477f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    int count = 0;
478f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    const SkEvent* evt = globals.fEventQHead;
479f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    while (evt) {
480f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        count += 1;
481f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        evt = evt->fNextEvent;
482f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
483f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    globals.fEventMutex.release();
484f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
485f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    return count;
486f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com}
487f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
4889998c669300281b5682fce72b036c1a6a619a44ereed@google.com///////////////////////////////////////////////////////////////////////////////
4898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4909998c669300281b5682fce72b036c1a6a619a44ereed@google.comvoid SkEvent::Init() {}
4918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4929998c669300281b5682fce72b036c1a6a619a44ereed@google.comvoid SkEvent::Term() {
4939998c669300281b5682fce72b036c1a6a619a44ereed@google.com    SkEvent_Globals& globals = getGlobals();
4948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkEvent* evt = globals.fEventQHead;
4969998c669300281b5682fce72b036c1a6a619a44ereed@google.com    while (evt) {
4978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkEvent* next = evt->fNextEvent;
4988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        delete evt;
4998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        evt = next;
5008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
5018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
5028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    evt = globals.fDelayQHead;
5039998c669300281b5682fce72b036c1a6a619a44ereed@google.com    while (evt) {
5048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkEvent* next = evt->fNextEvent;
5058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        delete evt;
5068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        evt = next;
5078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
5088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
509