1d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams/*
2d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * Copyright (C) 2009 The Android Open Source Project
3d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams *
4d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * you may not use this file except in compliance with the License.
6d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * You may obtain a copy of the License at
7d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams *
8d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams *
10d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * Unless required by applicable law or agreed to in writing, software
11d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * See the License for the specific language governing permissions and
14d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * limitations under the License.
15d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams */
16d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
17d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#ifndef ANDROID_STRUCTURED_ELEMENT_H
18d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#define ANDROID_STRUCTURED_ELEMENT_H
19d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
20718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams#include "rsComponent.h"
210011bcf57ff711a221a3a4c73f2a79125111647dJason Sams#include "rsUtils.h"
220011bcf57ff711a221a3a4c73f2a79125111647dJason Sams#include "rsObjectBase.h"
23d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
24d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// ---------------------------------------------------------------------------
25d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace android {
26d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace renderscript {
27d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
28d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
29d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// An element is a group of Components that occupies one cell in a structure.
30d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsclass Element : public ObjectBase
31d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
32d19f10d43aa400e1183aa21a97099d02074131a2Jason Samspublic:
33d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    ~Element();
34d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
35e2ae85fc5a07591cb27bfae93557f80c55bb259cJason Sams    uint32_t getGLType() const;
36e2ae85fc5a07591cb27bfae93557f80c55bb259cJason Sams    uint32_t getGLFormat() const;
37d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
38d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    size_t getSizeBits() const;
391bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams    size_t getSizeBytes() const {
401bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams        return (getSizeBits() + 7) >> 3;
41d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
42d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
430011bcf57ff711a221a3a4c73f2a79125111647dJason Sams    size_t getFieldOffsetBits(uint32_t componentNumber) const;
440011bcf57ff711a221a3a4c73f2a79125111647dJason Sams    size_t getFieldOffsetBytes(uint32_t componentNumber) const {
450011bcf57ff711a221a3a4c73f2a79125111647dJason Sams        return (getFieldOffsetBits(componentNumber) + 7) >> 3;
46d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
47d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
480011bcf57ff711a221a3a4c73f2a79125111647dJason Sams    uint32_t getFieldCount() const {return mFieldCount;}
490011bcf57ff711a221a3a4c73f2a79125111647dJason Sams    const Element * getField(uint32_t idx) const {return mFields[idx].e.get();}
500011bcf57ff711a221a3a4c73f2a79125111647dJason Sams    const char * getFieldName(uint32_t idx) const {return mFields[idx].name.string();}
51d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
52718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    const Component & getComponent() const {return mComponent;}
53718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    RsDataType getType() const {return mComponent.getType();}
54718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    RsDataKind getKind() const {return mComponent.getKind();}
550011bcf57ff711a221a3a4c73f2a79125111647dJason Sams    uint32_t getBits() const {return mBits;}
563c0dfbab807a459622aeade4940daddf482dec66Jason Sams
57718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    String8 getCType(uint32_t indent=0) const;
58718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    String8 getCStructBody(uint32_t indent=0) const;
59e17964e150e459bacced5658ae36fe1c56082e37Jason Sams    String8 getGLSLType(uint32_t indent=0) const;
603c0dfbab807a459622aeade4940daddf482dec66Jason Sams
61718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    void dumpLOGV(const char *prefix) const;
620011bcf57ff711a221a3a4c73f2a79125111647dJason Sams
63e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams    static const Element * create(Context *rsc, RsDataType dt, RsDataKind dk,
64718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams                            bool isNorm, uint32_t vecSize);
65e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams    static const Element * create(Context *rsc, size_t count, const Element **,
66718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams                            const char **, const size_t * lengths);
670011bcf57ff711a221a3a4c73f2a79125111647dJason Sams
68d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsprotected:
69d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    // deallocate any components that are part of this element.
70d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    void clear();
71d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
720011bcf57ff711a221a3a4c73f2a79125111647dJason Sams    typedef struct {
730011bcf57ff711a221a3a4c73f2a79125111647dJason Sams        String8 name;
74718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        ObjectBaseRef<const Element> e;
750011bcf57ff711a221a3a4c73f2a79125111647dJason Sams    } ElementField_t;
760011bcf57ff711a221a3a4c73f2a79125111647dJason Sams    ElementField_t *mFields;
770011bcf57ff711a221a3a4c73f2a79125111647dJason Sams    size_t mFieldCount;
780011bcf57ff711a221a3a4c73f2a79125111647dJason Sams
79d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
80a9e7a05b84470257637c97d65f6562aa832c66efJason Sams    Element(Context *);
810011bcf57ff711a221a3a4c73f2a79125111647dJason Sams
82718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    Component mComponent;
830011bcf57ff711a221a3a4c73f2a79125111647dJason Sams    uint32_t mBits;
84d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams};
85d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
86d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
87d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsclass ElementState {
88d19f10d43aa400e1183aa21a97099d02074131a2Jason Samspublic:
89d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    ElementState();
90d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    ~ElementState();
91d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
92e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams    // Cache of all existing elements.
93e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams    Vector<const Element *> mElements;
94d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams};
95d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
96d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
97d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
98d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
99d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#endif //ANDROID_STRUCTURED_ELEMENT_H
100