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 "SkMetaData.h"
11895443dada55325555a701d61f150843a74101b8reed@google.com#include "SkRefCnt.h"
12895443dada55325555a701d61f150843a74101b8reed@google.com
13895443dada55325555a701d61f150843a74101b8reed@google.comstruct PtrPair {
14895443dada55325555a701d61f150843a74101b8reed@google.com    void*               fPtr;
15895443dada55325555a701d61f150843a74101b8reed@google.com    SkMetaData::PtrProc fProc;
16895443dada55325555a701d61f150843a74101b8reed@google.com};
17895443dada55325555a701d61f150843a74101b8reed@google.com
18895443dada55325555a701d61f150843a74101b8reed@google.comvoid* SkMetaData::RefCntProc(void* ptr, bool doRef) {
19895443dada55325555a701d61f150843a74101b8reed@google.com    SkASSERT(ptr);
20895443dada55325555a701d61f150843a74101b8reed@google.com    SkRefCnt* refcnt = reinterpret_cast<SkRefCnt*>(ptr);
21895443dada55325555a701d61f150843a74101b8reed@google.com
22895443dada55325555a701d61f150843a74101b8reed@google.com    if (doRef) {
23895443dada55325555a701d61f150843a74101b8reed@google.com        refcnt->ref();
24895443dada55325555a701d61f150843a74101b8reed@google.com    } else {
25895443dada55325555a701d61f150843a74101b8reed@google.com        refcnt->unref();
26895443dada55325555a701d61f150843a74101b8reed@google.com    }
27895443dada55325555a701d61f150843a74101b8reed@google.com    return ptr;
28895443dada55325555a701d61f150843a74101b8reed@google.com}
29bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
30bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comSkMetaData::SkMetaData() : fRec(NULL)
31bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{
32bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
33bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
34bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comSkMetaData::SkMetaData(const SkMetaData& src) : fRec(NULL)
35bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{
36bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    *this = src;
37bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
38bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
39bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comSkMetaData::~SkMetaData()
40bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{
41bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    this->reset();
42bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
43bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
44bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comvoid SkMetaData::reset()
45bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{
46bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    Rec* rec = fRec;
47895443dada55325555a701d61f150843a74101b8reed@google.com    while (rec) {
48895443dada55325555a701d61f150843a74101b8reed@google.com        if (kPtr_Type == rec->fType) {
49895443dada55325555a701d61f150843a74101b8reed@google.com            PtrPair* pair = (PtrPair*)rec->data();
50895443dada55325555a701d61f150843a74101b8reed@google.com            if (pair->fProc && pair->fPtr) {
51895443dada55325555a701d61f150843a74101b8reed@google.com                pair->fPtr = pair->fProc(pair->fPtr, false);
52895443dada55325555a701d61f150843a74101b8reed@google.com            }
53895443dada55325555a701d61f150843a74101b8reed@google.com        }
54bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        Rec* next = rec->fNext;
55bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        Rec::Free(rec);
56bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        rec = next;
57bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    }
58bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    fRec = NULL;
59bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
60bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
61bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comSkMetaData& SkMetaData::operator=(const SkMetaData& src)
62bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{
63bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    this->reset();
64bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
65bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    const Rec* rec = src.fRec;
66bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    while (rec)
67bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    {
68bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        this->set(rec->name(), rec->data(), rec->fDataLen, (Type)rec->fType, rec->fDataCount);
69bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        rec = rec->fNext;
70bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    }
71bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    return *this;
72bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
73bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
74bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comvoid SkMetaData::setS32(const char name[], int32_t value)
75bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{
76bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    (void)this->set(name, &value, sizeof(int32_t), kS32_Type, 1);
77bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
78bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
79bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comvoid SkMetaData::setScalar(const char name[], SkScalar value)
80bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{
81bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    (void)this->set(name, &value, sizeof(SkScalar), kScalar_Type, 1);
82bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
83bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
84bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comSkScalar* SkMetaData::setScalars(const char name[], int count, const SkScalar values[])
85bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{
86bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkASSERT(count > 0);
87bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    if (count > 0)
88bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        return (SkScalar*)this->set(name, values, sizeof(SkScalar), kScalar_Type, count);
89bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    return NULL;
90bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
91bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
92bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comvoid SkMetaData::setString(const char name[], const char value[])
93bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{
94bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    (void)this->set(name, value, sizeof(char), kString_Type, strlen(value) + 1);
95bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
96bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
97895443dada55325555a701d61f150843a74101b8reed@google.comvoid SkMetaData::setPtr(const char name[], void* ptr, PtrProc proc) {
98895443dada55325555a701d61f150843a74101b8reed@google.com    PtrPair pair = { ptr, proc };
99895443dada55325555a701d61f150843a74101b8reed@google.com    (void)this->set(name, &pair, sizeof(PtrPair), kPtr_Type, 1);
100bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
101bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
102bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comvoid SkMetaData::setBool(const char name[], bool value)
103bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{
104bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    (void)this->set(name, &value, sizeof(bool), kBool_Type, 1);
105bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
106bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
107e216b62841acd5db9d91b63960805568259a2e0ereed@android.comvoid SkMetaData::setData(const char name[], const void* data, size_t byteCount) {
108e216b62841acd5db9d91b63960805568259a2e0ereed@android.com    (void)this->set(name, data, sizeof(char), kData_Type, byteCount);
109e216b62841acd5db9d91b63960805568259a2e0ereed@android.com}
110e216b62841acd5db9d91b63960805568259a2e0ereed@android.com
111bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comvoid* SkMetaData::set(const char name[], const void* data, size_t dataSize, Type type, int count)
112bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{
113bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkASSERT(name);
114bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkASSERT(dataSize);
115bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkASSERT(count > 0);
116bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
117bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    (void)this->remove(name, type);
118bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
119bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    size_t  len = strlen(name);
120bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    Rec*    rec = Rec::Alloc(sizeof(Rec) + dataSize * count + len + 1);
121bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
122bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#ifndef SK_DEBUG
123bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    rec->fType = SkToU8(type);
124bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#else
125bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    rec->fType = type;
126bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#endif
127bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    rec->fDataLen = SkToU8(dataSize);
128bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    rec->fDataCount = SkToU16(count);
129bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    if (data)
130bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        memcpy(rec->data(), data, dataSize * count);
131bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    memcpy(rec->name(), name, len + 1);
132bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
133895443dada55325555a701d61f150843a74101b8reed@google.com    if (kPtr_Type == type) {
134895443dada55325555a701d61f150843a74101b8reed@google.com        PtrPair* pair = (PtrPair*)rec->data();
135895443dada55325555a701d61f150843a74101b8reed@google.com        if (pair->fProc && pair->fPtr) {
136895443dada55325555a701d61f150843a74101b8reed@google.com            pair->fPtr = pair->fProc(pair->fPtr, true);
137895443dada55325555a701d61f150843a74101b8reed@google.com        }
138bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    }
139bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
140bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    rec->fNext = fRec;
141bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    fRec = rec;
142bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    return rec->data();
143bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
144bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
145bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.combool SkMetaData::findS32(const char name[], int32_t* value) const
146bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{
147bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    const Rec* rec = this->find(name, kS32_Type);
148bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    if (rec)
149bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    {
150bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        SkASSERT(rec->fDataCount == 1);
151bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        if (value)
152bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            *value = *(const int32_t*)rec->data();
153bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        return true;
154bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    }
155bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    return false;
156bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
157bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
158bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.combool SkMetaData::findScalar(const char name[], SkScalar* value) const
159bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{
160bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    const Rec* rec = this->find(name, kScalar_Type);
161bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    if (rec)
162bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    {
163bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        SkASSERT(rec->fDataCount == 1);
164bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        if (value)
165bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            *value = *(const SkScalar*)rec->data();
166bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        return true;
167bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    }
168bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    return false;
169bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
170bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
171bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comconst SkScalar* SkMetaData::findScalars(const char name[], int* count, SkScalar values[]) const
172bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{
173bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    const Rec* rec = this->find(name, kScalar_Type);
174bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    if (rec)
175bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    {
176bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        if (count)
177bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            *count = rec->fDataCount;
178bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        if (values)
179bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            memcpy(values, rec->data(), rec->fDataCount * rec->fDataLen);
180bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        return (const SkScalar*)rec->data();
181bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    }
182bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    return NULL;
183bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
184bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
185895443dada55325555a701d61f150843a74101b8reed@google.combool SkMetaData::findPtr(const char name[], void** ptr, PtrProc* proc) const {
186bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    const Rec* rec = this->find(name, kPtr_Type);
187895443dada55325555a701d61f150843a74101b8reed@google.com    if (rec) {
188bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        SkASSERT(rec->fDataCount == 1);
189895443dada55325555a701d61f150843a74101b8reed@google.com        const PtrPair* pair = (const PtrPair*)rec->data();
190895443dada55325555a701d61f150843a74101b8reed@google.com        if (ptr) {
191895443dada55325555a701d61f150843a74101b8reed@google.com            *ptr = pair->fPtr;
192895443dada55325555a701d61f150843a74101b8reed@google.com        }
193895443dada55325555a701d61f150843a74101b8reed@google.com        if (proc) {
194895443dada55325555a701d61f150843a74101b8reed@google.com            *proc = pair->fProc;
195895443dada55325555a701d61f150843a74101b8reed@google.com        }
196bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        return true;
197bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    }
198bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    return false;
199bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
200bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
201bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comconst char* SkMetaData::findString(const char name[]) const
202bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{
203bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    const Rec* rec = this->find(name, kString_Type);
204bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkASSERT(rec == NULL || rec->fDataLen == sizeof(char));
205bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    return rec ? (const char*)rec->data() : NULL;
206bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
207bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
208bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.combool SkMetaData::findBool(const char name[], bool* value) const
209bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{
210bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    const Rec* rec = this->find(name, kBool_Type);
211bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    if (rec)
212bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    {
213bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        SkASSERT(rec->fDataCount == 1);
214bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        if (value)
215bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            *value = *(const bool*)rec->data();
216bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        return true;
217bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    }
218bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    return false;
219bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
220bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
221e216b62841acd5db9d91b63960805568259a2e0ereed@android.comconst void* SkMetaData::findData(const char name[], size_t* length) const {
222e216b62841acd5db9d91b63960805568259a2e0ereed@android.com    const Rec* rec = this->find(name, kData_Type);
223e216b62841acd5db9d91b63960805568259a2e0ereed@android.com    if (rec) {
224e216b62841acd5db9d91b63960805568259a2e0ereed@android.com        SkASSERT(rec->fDataLen == sizeof(char));
225e216b62841acd5db9d91b63960805568259a2e0ereed@android.com        if (length) {
226e216b62841acd5db9d91b63960805568259a2e0ereed@android.com            *length = rec->fDataCount;
227e216b62841acd5db9d91b63960805568259a2e0ereed@android.com        }
228e216b62841acd5db9d91b63960805568259a2e0ereed@android.com        return rec->data();
229e216b62841acd5db9d91b63960805568259a2e0ereed@android.com    }
230e216b62841acd5db9d91b63960805568259a2e0ereed@android.com    return NULL;
231e216b62841acd5db9d91b63960805568259a2e0ereed@android.com}
232e216b62841acd5db9d91b63960805568259a2e0ereed@android.com
233bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comconst SkMetaData::Rec* SkMetaData::find(const char name[], Type type) const
234bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{
235bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    const Rec* rec = fRec;
236bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    while (rec)
237bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    {
238bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        if (rec->fType == type && !strcmp(rec->name(), name))
239bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            return rec;
240bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        rec = rec->fNext;
241bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    }
242bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    return NULL;
243bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
244bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
245895443dada55325555a701d61f150843a74101b8reed@google.combool SkMetaData::remove(const char name[], Type type) {
246bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    Rec* rec = fRec;
247bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    Rec* prev = NULL;
248895443dada55325555a701d61f150843a74101b8reed@google.com    while (rec) {
249bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        Rec* next = rec->fNext;
250895443dada55325555a701d61f150843a74101b8reed@google.com        if (rec->fType == type && !strcmp(rec->name(), name)) {
251895443dada55325555a701d61f150843a74101b8reed@google.com            if (prev) {
252bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                prev->fNext = next;
253895443dada55325555a701d61f150843a74101b8reed@google.com            } else {
254bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                fRec = next;
255895443dada55325555a701d61f150843a74101b8reed@google.com            }
256895443dada55325555a701d61f150843a74101b8reed@google.com
257895443dada55325555a701d61f150843a74101b8reed@google.com            if (kPtr_Type == type) {
258895443dada55325555a701d61f150843a74101b8reed@google.com                PtrPair* pair = (PtrPair*)rec->data();
259895443dada55325555a701d61f150843a74101b8reed@google.com                if (pair->fProc && pair->fPtr) {
260895443dada55325555a701d61f150843a74101b8reed@google.com                    (void)pair->fProc(pair->fPtr, false);
261895443dada55325555a701d61f150843a74101b8reed@google.com                }
262895443dada55325555a701d61f150843a74101b8reed@google.com            }
263bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            Rec::Free(rec);
264bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            return true;
265bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        }
266bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        prev = rec;
267bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        rec = next;
268bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    }
269bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    return false;
270bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
271bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
272bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.combool SkMetaData::removeS32(const char name[])
273bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{
274bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    return this->remove(name, kS32_Type);
275bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
276bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
277bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.combool SkMetaData::removeScalar(const char name[])
278bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{
279bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    return this->remove(name, kScalar_Type);
280bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
281bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
282bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.combool SkMetaData::removeString(const char name[])
283bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{
284bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    return this->remove(name, kString_Type);
285bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
286bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
287bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.combool SkMetaData::removePtr(const char name[])
288bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{
289bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    return this->remove(name, kPtr_Type);
290bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
291bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
292bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.combool SkMetaData::removeBool(const char name[])
293bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{
294bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    return this->remove(name, kBool_Type);
295bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
296bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
297e216b62841acd5db9d91b63960805568259a2e0ereed@android.combool SkMetaData::removeData(const char name[]) {
298e216b62841acd5db9d91b63960805568259a2e0ereed@android.com    return this->remove(name, kData_Type);
299e216b62841acd5db9d91b63960805568259a2e0ereed@android.com}
300e216b62841acd5db9d91b63960805568259a2e0ereed@android.com
301895443dada55325555a701d61f150843a74101b8reed@google.com///////////////////////////////////////////////////////////////////////////////
302bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
303895443dada55325555a701d61f150843a74101b8reed@google.comSkMetaData::Iter::Iter(const SkMetaData& metadata) {
304bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    fRec = metadata.fRec;
305bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
306bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
307895443dada55325555a701d61f150843a74101b8reed@google.comvoid SkMetaData::Iter::reset(const SkMetaData& metadata) {
308bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    fRec = metadata.fRec;
309bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
310bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
311895443dada55325555a701d61f150843a74101b8reed@google.comconst char* SkMetaData::Iter::next(SkMetaData::Type* t, int* count) {
312bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    const char* name = NULL;
313bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
314895443dada55325555a701d61f150843a74101b8reed@google.com    if (fRec) {
315895443dada55325555a701d61f150843a74101b8reed@google.com        if (t) {
316bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            *t = (SkMetaData::Type)fRec->fType;
317895443dada55325555a701d61f150843a74101b8reed@google.com        }
318895443dada55325555a701d61f150843a74101b8reed@google.com        if (count) {
319bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            *count = fRec->fDataCount;
320895443dada55325555a701d61f150843a74101b8reed@google.com        }
321bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        name = fRec->name();
322bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
323bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        fRec = fRec->fNext;
324bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    }
325bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    return name;
326bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
327bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
328895443dada55325555a701d61f150843a74101b8reed@google.com///////////////////////////////////////////////////////////////////////////////
329bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
330895443dada55325555a701d61f150843a74101b8reed@google.comSkMetaData::Rec* SkMetaData::Rec::Alloc(size_t size) {
331bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    return (Rec*)sk_malloc_throw(size);
332bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
333bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
334895443dada55325555a701d61f150843a74101b8reed@google.comvoid SkMetaData::Rec::Free(Rec* rec) {
335bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    sk_free(rec);
336bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
337