Coverage Report

Created: 2024-05-20 07:14

/src/skia/tools/SkMetaData.cpp
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright 2006 The Android Open Source Project
3
 *
4
 * Use of this source code is governed by a BSD-style license that can be
5
 * found in the LICENSE file.
6
 */
7
8
#include "tools/SkMetaData.h"
9
10
#include "include/private/base/SkMalloc.h"
11
#include "include/private/base/SkTo.h"
12
13
void SkMetaData::reset()
14
0
{
15
0
    Rec* rec = fRec;
16
0
    while (rec) {
17
0
        Rec* next = rec->fNext;
18
0
        Rec::Free(rec);
19
0
        rec = next;
20
0
    }
21
0
    fRec = nullptr;
22
0
}
23
24
void SkMetaData::setS32(const char name[], int32_t value)
25
0
{
26
0
    (void)this->set(name, &value, sizeof(int32_t), kS32_Type, 1);
27
0
}
28
29
void SkMetaData::setScalar(const char name[], SkScalar value)
30
0
{
31
0
    (void)this->set(name, &value, sizeof(SkScalar), kScalar_Type, 1);
32
0
}
33
34
SkScalar* SkMetaData::setScalars(const char name[], int count, const SkScalar values[])
35
0
{
36
0
    SkASSERT(count > 0);
37
0
    if (count > 0)
38
0
        return (SkScalar*)this->set(name, values, sizeof(SkScalar), kScalar_Type, count);
39
0
    return nullptr;
40
0
}
Unexecuted instantiation: SkMetaData::setScalars(char const*, int, float const*)
Unexecuted instantiation: SkMetaData::setScalars(char const*, int, float const*)
41
42
0
void SkMetaData::setPtr(const char name[], void* ptr) {
43
0
    (void)this->set(name, &ptr, sizeof(void*), kPtr_Type, 1);
44
0
}
45
46
void SkMetaData::setBool(const char name[], bool value)
47
0
{
48
0
    (void)this->set(name, &value, sizeof(bool), kBool_Type, 1);
49
0
}
50
51
void* SkMetaData::set(const char name[], const void* data, size_t dataSize, Type type, int count)
52
0
{
53
0
    SkASSERT(name);
54
0
    SkASSERT(dataSize);
55
0
    SkASSERT(count > 0);
56
57
0
    FindResult result = this->findWithPrev(name, type);
58
59
0
    Rec* rec;
60
0
    bool reuseRec = result.rec &&
61
0
                    result.rec->fDataLen == dataSize &&
62
0
                    result.rec->fDataCount == count;
63
0
    if (reuseRec) {
64
0
        rec = result.rec;
65
0
    } else {
66
0
        size_t len = strlen(name);
67
0
        rec = Rec::Alloc(sizeof(Rec) + dataSize * count + len + 1);
68
0
        rec->fType = SkToU8(type);
69
0
        rec->fDataLen = SkToU8(dataSize);
70
0
        rec->fDataCount = SkToU16(count);
71
72
0
        memcpy(rec->name(), name, len + 1);
73
0
    }
74
0
    if (data) {
75
0
        memcpy(rec->data(), data, dataSize * count);
76
0
    }
77
78
0
    if (reuseRec) {
79
        // Do nothing, reused
80
0
    } else if (result.rec) {
81
        // Had one, but had to create a new one. Invalidates iterators.
82
        // Delayed removal since name or data may have been in the result.rec.
83
0
        this->remove(result);
84
0
        if (result.prev) {
85
0
            rec->fNext = result.prev->fNext;
86
0
            result.prev->fNext = rec;
87
0
        }
88
0
    } else {
89
        // Adding a new one, stick it at head.
90
0
        rec->fNext = fRec;
91
0
        fRec = rec;
92
0
    }
93
0
    return rec->data();
94
0
}
Unexecuted instantiation: SkMetaData::set(char const*, void const*, unsigned long, SkMetaData::Type, int)
Unexecuted instantiation: SkMetaData::set(char const*, void const*, unsigned long, SkMetaData::Type, int)
95
96
bool SkMetaData::findS32(const char name[], int32_t* value) const
97
0
{
98
0
    const Rec* rec = this->find(name, kS32_Type);
99
0
    if (rec)
100
0
    {
101
0
        SkASSERT(rec->fDataCount == 1);
102
0
        if (value)
103
0
            *value = *(const int32_t*)rec->data();
104
0
        return true;
105
0
    }
106
0
    return false;
107
0
}
Unexecuted instantiation: SkMetaData::findS32(char const*, int*) const
Unexecuted instantiation: SkMetaData::findS32(char const*, int*) const
108
109
bool SkMetaData::findScalar(const char name[], SkScalar* value) const
110
0
{
111
0
    const Rec* rec = this->find(name, kScalar_Type);
112
0
    if (rec)
113
0
    {
114
0
        SkASSERT(rec->fDataCount == 1);
115
0
        if (value)
116
0
            *value = *(const SkScalar*)rec->data();
117
0
        return true;
118
0
    }
119
0
    return false;
120
0
}
Unexecuted instantiation: SkMetaData::findScalar(char const*, float*) const
Unexecuted instantiation: SkMetaData::findScalar(char const*, float*) const
121
122
const SkScalar* SkMetaData::findScalars(const char name[], int* count, SkScalar values[]) const
123
0
{
124
0
    const Rec* rec = this->find(name, kScalar_Type);
125
0
    if (rec)
126
0
    {
127
0
        if (count)
128
0
            *count = rec->fDataCount;
129
0
        if (values)
130
0
            memcpy(values, rec->data(), rec->fDataCount * rec->fDataLen);
131
0
        return (const SkScalar*)rec->data();
132
0
    }
133
0
    return nullptr;
134
0
}
135
136
0
bool SkMetaData::findPtr(const char name[], void** ptr) const {
137
0
    const Rec* rec = this->find(name, kPtr_Type);
138
0
    if (rec) {
139
0
        SkASSERT(rec->fDataCount == 1);
140
0
        void* const* found = (void* const*)rec->data();
141
0
        if (ptr) {
142
0
            *ptr = *found;
143
0
        }
144
0
        return true;
145
0
    }
146
0
    return false;
147
0
}
Unexecuted instantiation: SkMetaData::findPtr(char const*, void**) const
Unexecuted instantiation: SkMetaData::findPtr(char const*, void**) const
148
149
bool SkMetaData::findBool(const char name[], bool* value) const
150
0
{
151
0
    const Rec* rec = this->find(name, kBool_Type);
152
0
    if (rec)
153
0
    {
154
0
        SkASSERT(rec->fDataCount == 1);
155
0
        if (value)
156
0
            *value = *(const bool*)rec->data();
157
0
        return true;
158
0
    }
159
0
    return false;
160
0
}
Unexecuted instantiation: SkMetaData::findBool(char const*, bool*) const
Unexecuted instantiation: SkMetaData::findBool(char const*, bool*) const
161
162
0
SkMetaData::FindResult SkMetaData::findWithPrev(const char name[], Type type) const {
163
0
    FindResult current { fRec, nullptr };
164
0
    while (current.rec) {
165
0
        if (current.rec->fType == type && !strcmp(current.rec->name(), name))
166
0
            return current;
167
0
        current.prev = current.rec;
168
0
        current.rec = current.rec->fNext;
169
0
    }
170
0
    return current;
171
0
}
172
173
174
0
const SkMetaData::Rec* SkMetaData::find(const char name[], Type type) const {
175
0
    return this->findWithPrev(name, type).rec;
176
0
}
177
178
0
void SkMetaData::remove(FindResult result) {
179
0
    SkASSERT(result.rec);
180
0
    if (result.prev) {
181
0
        result.prev->fNext = result.rec->fNext;
182
0
    } else {
183
0
        fRec = result.rec->fNext;
184
0
    }
185
0
    Rec::Free(result.rec);
186
0
}
Unexecuted instantiation: SkMetaData::remove(SkMetaData::FindResult)
Unexecuted instantiation: SkMetaData::remove(SkMetaData::FindResult)
187
188
0
bool SkMetaData::remove(const char name[], Type type) {
189
0
    FindResult result = this->findWithPrev(name, type);
190
0
    if (!result.rec) {
191
0
        return false;
192
0
    }
193
0
    this->remove(result);
194
0
    return true;
195
0
}
196
197
bool SkMetaData::removeS32(const char name[])
198
0
{
199
0
    return this->remove(name, kS32_Type);
200
0
}
201
202
bool SkMetaData::removeScalar(const char name[])
203
0
{
204
0
    return this->remove(name, kScalar_Type);
205
0
}
206
207
bool SkMetaData::removePtr(const char name[])
208
0
{
209
0
    return this->remove(name, kPtr_Type);
210
0
}
211
212
bool SkMetaData::removeBool(const char name[])
213
0
{
214
0
    return this->remove(name, kBool_Type);
215
0
}
216
217
///////////////////////////////////////////////////////////////////////////////
218
219
0
SkMetaData::Iter::Iter(const SkMetaData& metadata) {
220
0
    fRec = metadata.fRec;
221
0
}
222
223
0
void SkMetaData::Iter::reset(const SkMetaData& metadata) {
224
0
    fRec = metadata.fRec;
225
0
}
226
227
0
const char* SkMetaData::Iter::next(SkMetaData::Type* t, int* count) {
228
0
    const char* name = nullptr;
229
230
0
    if (fRec) {
231
0
        if (t) {
232
0
            *t = (SkMetaData::Type)fRec->fType;
233
0
        }
234
0
        if (count) {
235
0
            *count = fRec->fDataCount;
236
0
        }
237
0
        name = fRec->name();
238
239
0
        fRec = fRec->fNext;
240
0
    }
241
0
    return name;
242
0
}
243
244
///////////////////////////////////////////////////////////////////////////////
245
246
0
SkMetaData::Rec* SkMetaData::Rec::Alloc(size_t size) {
247
0
    return (Rec*)sk_malloc_throw(size);
248
0
}
249
250
0
void SkMetaData::Rec::Free(Rec* rec) {
251
0
    sk_free(rec);
252
0
}