1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
/*
* Copyright 2006 The Android Open Source Project
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "SkEvent.h"
void SkEvent::initialize(const char* type, size_t typeLen) {
fType = nullptr;
setType(type, typeLen);
f32 = 0;
}
SkEvent::SkEvent()
{
initialize("", 0);
}
SkEvent::SkEvent(const SkEvent& src)
{
*this = src;
if (((size_t) fType & 1) == 0)
setType(src.fType);
}
SkEvent::SkEvent(const SkString& type)
{
initialize(type.c_str(), type.size());
}
SkEvent::SkEvent(const char type[])
{
SkASSERT(type);
initialize(type, strlen(type));
}
SkEvent::~SkEvent()
{
if (((size_t) fType & 1) == 0)
sk_free((void*) fType);
}
static size_t makeCharArray(char* buffer, size_t compact)
{
size_t bits = (size_t) compact >> 1;
memcpy(buffer, &bits, sizeof(compact));
buffer[sizeof(compact)] = 0;
return strlen(buffer);
}
void SkEvent::getType(SkString* str) const
{
if (str)
{
if ((size_t) fType & 1) // not a pointer
{
char chars[sizeof(size_t) + 1];
size_t len = makeCharArray(chars, (size_t) fType);
str->set(chars, len);
}
else
str->set(fType);
}
}
bool SkEvent::isType(const SkString& str) const
{
return this->isType(str.c_str(), str.size());
}
bool SkEvent::isType(const char type[], size_t typeLen) const
{
if (typeLen == 0)
typeLen = strlen(type);
if ((size_t) fType & 1) { // not a pointer
char chars[sizeof(size_t) + 1];
size_t len = makeCharArray(chars, (size_t) fType);
return len == typeLen && strncmp(chars, type, typeLen) == 0;
}
return strncmp(fType, type, typeLen) == 0 && fType[typeLen] == 0;
}
void SkEvent::setType(const char type[], size_t typeLen)
{
if (typeLen == 0)
typeLen = strlen(type);
if (typeLen <= sizeof(fType)) {
size_t slot = 0;
memcpy(&slot, type, typeLen);
if (slot << 1 >> 1 != slot)
goto useCharStar;
slot <<= 1;
slot |= 1;
fType = (char*) slot;
} else {
useCharStar:
fType = (char*) sk_malloc_throw(typeLen + 1);
SkASSERT(((size_t) fType & 1) == 0);
memcpy(fType, type, typeLen);
fType[typeLen] = 0;
}
}
void SkEvent::setType(const SkString& type)
{
setType(type.c_str());
}
|