summaryrefslogtreecommitdiffstats
path: root/libs/rs/rsElement.cpp
diff options
context:
space:
mode:
authorJason Sams <rjsams@android.com>2010-09-02 17:35:23 -0700
committerAlex Sakhartchouk <alexst@google.com>2010-09-07 12:06:05 -0700
commit70d4e5024298f71edb3b04867e05568f5495b4ce (patch)
tree031a101a16e33230c0d902f0e2c389aaf7996116 /libs/rs/rsElement.cpp
parent355383e424882b590139590296562d644dd97a95 (diff)
downloadframeworks_base-70d4e5024298f71edb3b04867e05568f5495b4ce.zip
frameworks_base-70d4e5024298f71edb3b04867e05568f5495b4ce.tar.gz
frameworks_base-70d4e5024298f71edb3b04867e05568f5495b4ce.tar.bz2
Add arrays to elements.
Change-Id: I624b03bfc1fd26136afd9305a96026b91b1fad3c
Diffstat (limited to 'libs/rs/rsElement.cpp')
-rw-r--r--libs/rs/rsElement.cpp30
1 files changed, 22 insertions, 8 deletions
diff --git a/libs/rs/rsElement.cpp b/libs/rs/rsElement.cpp
index 2602dd4..0b7bb27 100644
--- a/libs/rs/rsElement.cpp
+++ b/libs/rs/rsElement.cpp
@@ -65,7 +65,7 @@ size_t Element::getSizeBits() const
size_t total = 0;
for (size_t ct=0; ct < mFieldCount; ct++) {
- total += mFields[ct].e->mBits;
+ total += mFields[ct].e->mBits * mFields[ct].arraySize;;
}
return total;
}
@@ -95,6 +95,7 @@ void Element::serialize(OStream *stream) const
stream->addU32(mFieldCount);
for(uint32_t ct = 0; ct < mFieldCount; ct++) {
stream->addString(&mFields[ct].name);
+ stream->addU32(mFields[ct].arraySize);
mFields[ct].e->serialize(stream);
}
}
@@ -122,6 +123,7 @@ Element *Element::createFromStream(Context *rsc, IStream *stream)
elem->mFields = new ElementField_t [elem->mFieldCount];
for(uint32_t ct = 0; ct < elem->mFieldCount; ct ++) {
stream->loadString(&elem->mFields[ct].name);
+ elem->mFields[ct].arraySize = stream->loadU32();
Element *fieldElem = Element::createFromStream(rsc, stream);
elem->mFields[ct].e.set(fieldElem);
elem->mFields[ct].offsetBits = offset;
@@ -155,7 +157,8 @@ Element *Element::createFromStream(Context *rsc, IStream *stream)
for (uint32_t i=0; i < elem->mFieldCount; i++) {
if ((ee->mFields[i].e.get() != elem->mFields[i].e.get()) ||
(ee->mFields[i].name.length() != elem->mFields[i].name.length()) ||
- (ee->mFields[i].name != elem->mFields[i].name)) {
+ (ee->mFields[i].name != elem->mFields[i].name) ||
+ (ee->mFields[i].arraySize != elem->mFields[i].arraySize)) {
match = false;
break;
}
@@ -200,7 +203,7 @@ const Element * Element::create(Context *rsc, RsDataType dt, RsDataKind dk,
}
const Element * Element::create(Context *rsc, size_t count, const Element **ein,
- const char **nin, const size_t * lengths)
+ const char **nin, const size_t * lengths, const uint32_t *asin)
{
// Look for an existing match.
for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
@@ -210,7 +213,8 @@ const Element * Element::create(Context *rsc, size_t count, const Element **ein,
for (uint32_t i=0; i < count; i++) {
if ((ee->mFields[i].e.get() != ein[i]) ||
(ee->mFields[i].name.length() != lengths[i]) ||
- (ee->mFields[i].name != nin[i])) {
+ (ee->mFields[i].name != nin[i]) ||
+ (ee->mFields[i].arraySize != asin[i])) {
match = false;
break;
}
@@ -230,6 +234,7 @@ const Element * Element::create(Context *rsc, size_t count, const Element **ein,
e->mFields[ct].e.set(ein[ct]);
e->mFields[ct].name.setTo(nin[ct], lengths[ct]);
e->mFields[ct].offsetBits = bits;
+ e->mFields[ct].arraySize = asin[ct];
bits += ein[ct]->getSizeBits();
if (ein[ct]->mHasReference) {
@@ -274,7 +279,11 @@ void Element::incRefs(const void *ptr) const
const uint8_t *p = static_cast<const uint8_t *>(ptr);
for (uint32_t i=0; i < mFieldCount; i++) {
if (mFields[i].e->mHasReference) {
- mFields[i].e->incRefs(&p[mFields[i].offsetBits >> 3]);
+ p = &p[mFields[i].offsetBits >> 3];
+ for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) {
+ mFields[i].e->incRefs(p);
+ p += mFields[i].e->getSizeBytes();
+ }
}
}
}
@@ -293,7 +302,11 @@ void Element::decRefs(const void *ptr) const
const uint8_t *p = static_cast<const uint8_t *>(ptr);
for (uint32_t i=0; i < mFieldCount; i++) {
if (mFields[i].e->mHasReference) {
- mFields[i].e->decRefs(&p[mFields[i].offsetBits >> 3]);
+ p = &p[mFields[i].offsetBits >> 3];
+ for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) {
+ mFields[i].e->decRefs(p);
+ p += mFields[i].e->getSizeBytes();
+ }
}
}
}
@@ -331,10 +344,11 @@ RsElement rsi_ElementCreate2(Context *rsc,
size_t count,
const RsElement * ein,
const char ** names,
- const size_t * nameLengths)
+ const size_t * nameLengths,
+ const uint32_t * arraySizes)
{
//LOGE("rsi_ElementCreate2 %i", count);
- const Element *e = Element::create(rsc, count, (const Element **)ein, names, nameLengths);
+ const Element *e = Element::create(rsc, count, (const Element **)ein, names, nameLengths, arraySizes);
e->incUserRef();
return (RsElement)e;
}