slang_rs_reflection.cpp revision bd49c8ff5a35befb413de3b6d7989d257b54f057
1462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_context.hpp"
2462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_export_var.hpp"
3462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_reflection.hpp"
4462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_export_func.hpp"
5462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
6462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <ctype.h>
7462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
8462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <utility>
9462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <cstdarg>
10462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
11462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaousing std::make_pair;
12462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaousing std::endl;
13462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
14462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
15462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_SCRIPT_CLASS_NAME_PREFIX         "ScriptC_"
16462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_SCRIPT_CLASS_SUPER_CLASS_NAME    "ScriptC"
17462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
18462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_TYPE_CLASS_NAME_PREFIX           "ScriptField_"
19462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_TYPE_CLASS_SUPER_CLASS_NAME      "android.renderscript.Script.FieldBase"
20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_TYPE_ITEM_CLASS_NAME             "Item"
22462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
23462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_TYPE_ITEM_BUFFER_NAME            "mItemArray"
24462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_TYPE_ITEM_BUFFER_PACKER_NAME     "mIOBuffer"
25462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
26462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_EXPORT_VAR_INDEX_PREFIX          "mExportVarIdx_"
27462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_EXPORT_VAR_PREFIX                "mExportVar_"
28462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
29462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_EXPORT_FUNC_INDEX_PREFIX         "mExportFuncIdx_"
30462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
31462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_EXPORT_VAR_ALLOCATION_PREFIX     "mAlloction_"
32462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_EXPORT_VAR_DATA_STORAGE_PREFIX   "mData_"
33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
34462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang {
35462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
36462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/* Some utility function using internal in RSReflection */
37462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic bool GetFileNameWithoutExtension(const std::string& FileName, std::string& OutFileName) {
38462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    OutFileName.clear();
39462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
40462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(FileName.empty() || (FileName == "-"))
41462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return true;
42462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
43462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* find last component in given path */
44462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    size_t SlashPos = FileName.find_last_of("/\\");
45462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
46462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if((SlashPos != std::string::npos) && ((SlashPos + 1) < FileName.length()))
47462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        OutFileName = FileName.substr(SlashPos + 1);
48462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    else
49462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        OutFileName = FileName;
50462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
51462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    size_t DotPos = OutFileName.find_first_of('.');
522dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao    if(DotPos != std::string::npos)
532dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao        OutFileName.erase(DotPos);
54462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
55462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return true;
56462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
57462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
58462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetPrimitiveTypeName(const RSExportPrimitiveType* EPT) {
59462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    static const char* PrimitiveTypeJavaNameMap[] = {
60462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "",
61462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "",
62462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "float",    /* RSExportPrimitiveType::DataTypeFloat32 */
63462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "double",   /* RSExportPrimitiveType::DataTypeFloat64 */
64462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "byte",     /* RSExportPrimitiveType::DataTypeSigned8 */
65462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "short",    /* RSExportPrimitiveType::DataTypeSigned16 */
66462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "int",      /* RSExportPrimitiveType::DataTypeSigned32 */
67462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "long",     /* RSExportPrimitiveType::DataTypeSigned64 */
68c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao        "short",    /* RSExportPrimitiveType::DataTypeUnsigned8 */
69c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao        "int",      /* RSExportPrimitiveType::DataTypeUnsigned16 */
70c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao        "long",     /* RSExportPrimitiveType::DataTypeUnsigned32 */
71462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "long",     /* RSExportPrimitiveType::DataTypeUnsigned64 */
72462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
73c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao        "int",      /* RSExportPrimitiveType::DataTypeUnsigned565 */
74c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao        "int",      /* RSExportPrimitiveType::DataTypeUnsigned5551 */
75c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao        "int",      /* RSExportPrimitiveType::DataTypeUnsigned4444 */
76462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
77462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element",  /* RSExportPrimitiveType::DataTypeRSElement */
78462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Type",     /* RSExportPrimitiveType::DataTypeRSType */
79462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Allocation",   /* RSExportPrimitiveType::DataTypeRSAllocation */
80462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Sampler",  /* RSExportPrimitiveType::DataTypeRSSampler */
81462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Script",   /* RSExportPrimitiveType::DataTypeRSScript */
82462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "SimpleMesh",       /* RSExportPrimitiveType::DataTypeRSSimpleMesh */
83462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "ProgramFragment",  /* RSExportPrimitiveType::DataTypeRSProgramFragment */
84462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "ProgramVertex",    /* RSExportPrimitiveType::DataTypeRSProgramVertex */
85462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "ProgramRaster",    /* RSExportPrimitiveType::DataTypeRSProgramRaster */
86462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "ProgramStore",     /* RSExportPrimitiveType::DataTypeRSProgramStore */
87462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    };
88462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
89462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if((EPT->getType() >= 0) && (EPT->getType() < (sizeof(PrimitiveTypeJavaNameMap) / sizeof(const char*))))
90462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return PrimitiveTypeJavaNameMap[ EPT->getType() ];
91462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
92462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    assert(false && "GetPrimitiveTypeName : Unknown primitive data type");
93462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return NULL;
94462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
95462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
96462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetVectorTypeName(const RSExportVectorType* EVT) {
97462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    static const char* VectorTypeJavaNameMap[][3] = {
98462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        /* 0 */ { "Byte2",  "Byte3",    "Byte4" },
99462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        /* 1 */ { "Short2", "Short3",   "Short4" },
100462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        /* 2 */ { "Int2",   "Int3",     "Int4" },
101c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao        /* 3 */ { "Long2",  "Long3",    "Long4" },
102c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao        /* 4 */ { "Float2", "Float3",   "Float4" },
103462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    };
104462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
105462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const char** BaseElement;
106462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
107462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    switch(EVT->getType()) {
108462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportPrimitiveType::DataTypeSigned8:
109462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            BaseElement = VectorTypeJavaNameMap[0];
110462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
111462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
112462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportPrimitiveType::DataTypeSigned16:
113c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao        case RSExportPrimitiveType::DataTypeUnsigned8:
114462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            BaseElement = VectorTypeJavaNameMap[1];
115462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
116462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
117462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportPrimitiveType::DataTypeSigned32:
118c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao        case RSExportPrimitiveType::DataTypeUnsigned16:
119462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            BaseElement = VectorTypeJavaNameMap[2];
120462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
121462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
122c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao        case RSExportPrimitiveType::DataTypeUnsigned32:
123462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            BaseElement = VectorTypeJavaNameMap[3];
124462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
125462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1262dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao        case RSExportPrimitiveType::DataTypeFloat32:
127c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao            BaseElement = VectorTypeJavaNameMap[4];
128c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao        break;
129c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao
130462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        default:
131462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            assert(false && "RSReflection::genElementTypeName : Unsupported vector element data type");
132462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
133462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
134462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
135462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    assert((EVT->getNumElement() > 1) && (EVT->getNumElement() <= 4) && "Number of element in vector type is invalid");
136462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
137462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return BaseElement[EVT->getNumElement() - 2];
138462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
139462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
140462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetPackerAPIName(const RSExportPrimitiveType* EPT) {
141462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    static const char* PrimitiveTypePackerAPINameMap[] = {
142462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "",
143462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "",
144462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addF32",   /* RSExportPrimitiveType::DataTypeFloat32 */
145462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addF64",   /* RSExportPrimitiveType::DataTypeFloat64 */
146462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addI8",    /* RSExportPrimitiveType::DataTypeSigned8 */
147462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addI16",   /* RSExportPrimitiveType::DataTypeSigned16 */
148462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addI32",   /* RSExportPrimitiveType::DataTypeSigned32 */
149462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addI64",   /* RSExportPrimitiveType::DataTypeSigned64 */
150462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addU8",    /* RSExportPrimitiveType::DataTypeUnsigned8 */
151462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addU16",   /* RSExportPrimitiveType::DataTypeUnsigned16 */
152462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addU32",   /* RSExportPrimitiveType::DataTypeUnsigned32 */
153462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addU64",   /* RSExportPrimitiveType::DataTypeUnsigned64 */
154462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
155462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addU16",   /* RSExportPrimitiveType::DataTypeUnsigned565 */
156462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addU16",   /* RSExportPrimitiveType::DataTypeUnsigned5551 */
157462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addU16",   /* RSExportPrimitiveType::DataTypeUnsigned4444 */
158462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
159462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addObj",   /* RSExportPrimitiveType::DataTypeRSElement */
160462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addObj",   /* RSExportPrimitiveType::DataTypeRSType */
161462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addObj",   /* RSExportPrimitiveType::DataTypeRSAllocation */
162462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addObj",   /* RSExportPrimitiveType::DataTypeRSSampler */
163462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addObj",   /* RSExportPrimitiveType::DataTypeRSScript */
164462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addObj",   /* RSExportPrimitiveType::DataTypeRSSimpleMesh */
165462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addObj",   /* RSExportPrimitiveType::DataTypeRSProgramFragment */
166462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addObj",   /* RSExportPrimitiveType::DataTypeRSProgramVertex */
167462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addObj",   /* RSExportPrimitiveType::DataTypeRSProgramRaster */
168462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addObj",   /* RSExportPrimitiveType::DataTypeRSProgramStore */
169462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    };
170462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
171462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if((EPT->getType() >= 0) && (EPT->getType() < (sizeof(PrimitiveTypePackerAPINameMap) / sizeof(const char*))))
172462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return PrimitiveTypePackerAPINameMap[ EPT->getType() ];
173462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
174462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    assert(false && "GetPackerAPIName : Unknown primitive data type");
175462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return NULL;
176462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
177462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
178462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic std::string GetTypeName(const RSExportType* ET) {
179462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    switch(ET->getClass()) {
180462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportType::ExportClassPrimitive:
181462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            return GetPrimitiveTypeName(static_cast<const RSExportPrimitiveType*>(ET));
182462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
183462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
184462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportType::ExportClassPointer:
185462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        {
186462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            const RSExportType* PointeeType = static_cast<const RSExportPointerType*>(ET)->getPointeeType();
187462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
188462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            if(PointeeType->getClass() != RSExportType::ExportClassRecord)
189462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                return "Allocation";
190462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            else
191462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                return RS_TYPE_CLASS_NAME_PREFIX + PointeeType->getName();
192462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
193462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
194462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
195462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportType::ExportClassVector:
196462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            return GetVectorTypeName(static_cast<const RSExportVectorType*>(ET));
197462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
198462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
199462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportType::ExportClassRecord:
200462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            return RS_TYPE_CLASS_NAME_PREFIX + ET->getName() + "."RS_TYPE_ITEM_CLASS_NAME;
201462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
202462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
203462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        default:
204462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            assert(false && "Unknown class of type");
205462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
206462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
207462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
208462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return "";
209462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
210462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
211462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetBuiltinElementConstruct(const RSExportType* ET) {
212462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(ET->getClass() == RSExportType::ExportClassPrimitive) {
213462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        const RSExportPrimitiveType* EPT = static_cast<const RSExportPrimitiveType*>(ET);
214462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        if(EPT->getKind() == RSExportPrimitiveType::DataKindUser) {
215462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            static const char* PrimitiveBuiltinElementConstructMap[] = {
216462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                NULL,
217462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                NULL,
218bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "F32", /* RSExportPrimitiveType::DataTypeFloat32 */
219462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                NULL,       /* RSExportPrimitiveType::DataTypeFloat64 */
220bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "I8",  /* RSExportPrimitiveType::DataTypeSigned8 */
221462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                NULL,       /* RSExportPrimitiveType::DataTypeSigned16 */
222bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "I32", /* RSExportPrimitiveType::DataTypeSigned32 */
223462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                NULL,       /* RSExportPrimitiveType::DataTypeSigned64 */
224bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "U8",  /* RSExportPrimitiveType::DataTypeUnsigned8 */
225462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                NULL,       /* RSExportPrimitiveType::DataTypeUnsigned16 */
226bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "U32", /* RSExportPrimitiveType::DataTypeUnsigned32 */
227462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                NULL,       /* RSExportPrimitiveType::DataTypeUnsigned64 */
228462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
229462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                NULL,   /* RSExportPrimitiveType::DataTypeUnsigned565 */
230462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                NULL,   /* RSExportPrimitiveType::DataTypeUnsigned5551 */
231462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                NULL,   /* RSExportPrimitiveType::DataTypeUnsigned4444 */
232462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
233bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "ELEMENT", /* RSExportPrimitiveType::DataTypeRSElement */
234bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "TYPE",    /* RSExportPrimitiveType::DataTypeRSType */
235bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "ALLOCATION",  /* RSExportPrimitiveType::DataTypeRSAllocation */
236bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "SAMPLER",     /* RSExportPrimitiveType::DataTypeRSSampler */
237bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "SCRIPT",      /* RSExportPrimitiveType::DataTypeRSScript */
238bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "MESH",        /* RSExportPrimitiveType::DataTypeRSSimpleMesh */
239bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "PROGRAM_FRAGMENT",    /* RSExportPrimitiveType::DataTypeRSProgramFragment */
240bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "PROGRAM_VERTEX",      /* RSExportPrimitiveType::DataTypeRSProgramVertex */
241bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "PROGRAM_RASTER",      /* RSExportPrimitiveType::DataTypeRSProgramRaster */
242bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "PROGRAM_STORE",       /* RSExportPrimitiveType::DataTypeRSProgramStore */
243462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            };
244462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
245462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            if((EPT->getType() >= 0) && (EPT->getType() < (sizeof(PrimitiveBuiltinElementConstructMap) / sizeof(const char*))))
246462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                return PrimitiveBuiltinElementConstructMap[ EPT->getType() ];
247462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        } else if(EPT->getKind() == RSExportPrimitiveType::DataKindPixelA) {
2482dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao            if(EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned8)
249462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                return "A_8";
250462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        } else if(EPT->getKind() == RSExportPrimitiveType::DataKindPixelRGB) {
251462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            if(EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned565)
252462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                return "RGB_565";
253462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            else if(EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned8)
254462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                return "RGB_888";
255462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        } else if(EPT->getKind() == RSExportPrimitiveType::DataKindPixelRGBA) {
256462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            if(EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned5551)
257462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                return "RGB_5551";
258462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            else if(EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned4444)
259462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                return "RGB_4444";
260462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            else if(EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned8)
261462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                return "RGB_8888";
262462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        } else if(EPT->getKind() == RSExportPrimitiveType::DataKindIndex) {
263462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            if(EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned16)
264462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                return "INDEX_16";
265462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
266462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    } else if(ET->getClass() == RSExportType::ExportClassVector) {
267462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        const RSExportVectorType* EVT = static_cast<const RSExportVectorType*>(ET);
268462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        if(EVT->getKind() == RSExportPrimitiveType::DataKindPosition) {
269462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            if(EVT->getType() == RSExportPrimitiveType::DataTypeFloat32) {
270462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                if(EVT->getNumElement() == 2)
271462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    return "ATTRIB_POSITION_2";
272462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                else if(EVT->getNumElement() == 3)
273462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    return "ATTRIB_POSITION_3";
274462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            }
275462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        } else if(EVT->getKind() == RSExportPrimitiveType::DataKindTexture) {
276462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            if(EVT->getType() == RSExportPrimitiveType::DataTypeFloat32) {
277462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                if(EVT->getNumElement() == 2)
278462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    return "ATTRIB_TEXTURE_2";
279462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            }
280462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        } else if(EVT->getKind() == RSExportPrimitiveType::DataKindNormal) {
281462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            if(EVT->getType() == RSExportPrimitiveType::DataTypeFloat32) {
282462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                if(EVT->getNumElement() == 3)
283462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    return "ATTRIB_NORMAL_3";
284462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            }
285462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        } else if(EVT->getKind() == RSExportPrimitiveType::DataKindColor) {
286462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            if(EVT->getType() == RSExportPrimitiveType::DataTypeFloat32) {
287462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                if(EVT->getNumElement() == 4)
288462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    return "ATTRIB_COLOR_F32_4";
289462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            } else if(EVT->getType() == RSExportPrimitiveType::DataTypeUnsigned8) {
290462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                if(EVT->getNumElement() == 4)
291462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    return "ATTRIB_COLOR_U8_4";
292462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            }
293462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
294462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    } else if(ET->getClass() == RSExportType::ExportClassPointer) {
295c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao        return "USER_I32";  /* tread pointer type variable as unsigned int (TODO: this is target dependent) */
296462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
297462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
298462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return NULL;
299462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
300462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
301462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetElementDataKindName(RSExportPrimitiveType::DataKind DK) {
302462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    static const char* ElementDataKindNameMap[] = {
303462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataKind.USER",        /* RSExportPrimitiveType::DataKindUser */
304462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataKind.COLOR",       /* RSExportPrimitiveType::DataKindColor */
305462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataKind.POSITION",    /* RSExportPrimitiveType::DataKindPosition */
306462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataKind.TEXTURE",     /* RSExportPrimitiveType::DataKindTexture */
307462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataKind.NORMAL",      /* RSExportPrimitiveType::DataKindNormal */
308462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataKind.INDEX",       /* RSExportPrimitiveType::DataKindIndex */
309462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataKind.POINT_SIZE",  /* RSExportPrimitiveType::DataKindPointSize */
310462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataKind.PIXEL_L",     /* RSExportPrimitiveType::DataKindPixelL */
311462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataKind.PIXEL_A",     /* RSExportPrimitiveType::DataKindPixelA */
312462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataKind.PIXEL_LA",    /* RSExportPrimitiveType::DataKindPixelLA */
313462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataKind.PIXEL_RGB",   /* RSExportPrimitiveType::DataKindPixelRGB */
314462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataKind.PIXEL_RGBA",  /* RSExportPrimitiveType::DataKindPixelRGBA */
315462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    };
316462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
317462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if((DK >= 0) && (DK < (sizeof(ElementDataKindNameMap) / sizeof(const char*))))
318462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return ElementDataKindNameMap[ DK ];
319462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    else
320462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return NULL;
321462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
322462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
323462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetElementDataTypeName(RSExportPrimitiveType::DataType DT) {
324462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    static const char* ElementDataTypeNameMap[] = {
325462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        NULL,
326462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        NULL,
327462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.FLOAT_32",    /* RSExportPrimitiveType::DataTypeFloat32 */
328462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        NULL,                           /* RSExportPrimitiveType::DataTypeFloat64 */
329462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.SIGNED_8",    /* RSExportPrimitiveType::DataTypeSigned8 */
330462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.SIGNED_16",   /* RSExportPrimitiveType::DataTypeSigned16 */
331462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.SIGNED_32",   /* RSExportPrimitiveType::DataTypeSigned32 */
332462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        NULL,                           /* RSExportPrimitiveType::DataTypeSigned64 */
333462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.UNSIGNED_8",  /* RSExportPrimitiveType::DataTypeUnsigned8 */
334462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.UNSIGNED_16", /* RSExportPrimitiveType::DataTypeUnsigned16 */
335462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.UNSIGNED_32", /* RSExportPrimitiveType::DataTypeUnsigned32 */
336462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        NULL,                           /* RSExportPrimitiveType::DataTypeUnsigned64 */
337462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
338462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.UNSIGNED_5_6_5",   /* RSExportPrimitiveType::DataTypeUnsigned565 */
339462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.UNSIGNED_5_5_5_1", /* RSExportPrimitiveType::DataTypeUnsigned5551 */
340462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.UNSIGNED_4_4_4_4", /* RSExportPrimitiveType::DataTypeUnsigned4444 */
341462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
342462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.RS_ELEMENT",  /* RSExportPrimitiveType::DataTypeRSElement */
343462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.RS_TYPE",     /* RSExportPrimitiveType::DataTypeRSType */
344462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.RS_ALLOCATION",   /* RSExportPrimitiveType::DataTypeRSAllocation */
345462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.RS_SAMPLER",      /* RSExportPrimitiveType::DataTypeRSSampler */
346462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.RS_SCRIPT",       /* RSExportPrimitiveType::DataTypeRSScript */
347462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.RS_MESH",         /* RSExportPrimitiveType::DataTypeRSSimpleMesh */
348462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.RS_PROGRAM_FRAGMENT", /* RSExportPrimitiveType::DataTypeRSProgramFragment */
349462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.RS_PROGRAM_VERTEX",   /* RSExportPrimitiveType::DataTypeRSProgramVertex */
350462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.RS_PROGRAM_RASTER",   /* RSExportPrimitiveType::DataTypeRSProgramRaster */
351462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.RS_PROGRAM_STORE",    /* RSExportPrimitiveType::DataTypeRSProgramStore */
352462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    };
353462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
354462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if((DT >= 0) && (DT < (sizeof(ElementDataTypeNameMap) / sizeof(const char*))))
355462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return ElementDataTypeNameMap[ DT ];
356462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    else
357462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return NULL;
358462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
359462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
360462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** Methods to generate script class ******************************/
361462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSReflection::genScriptClass(Context& C, const std::string& ClassName, std::string& ErrorMsg) {
3622dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao    if(!C.startClass(Context::AM_Public, false, ClassName, RS_SCRIPT_CLASS_SUPER_CLASS_NAME, ErrorMsg))
363462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return false;
364462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
365462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    genScriptClassConstructor(C);
366462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
367462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* Reflect export variable */
368462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    for(RSContext::const_export_var_iterator I = mRSContext->export_vars_begin();
369462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        I != mRSContext->export_vars_end();
370462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        I++)
371462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        genExportVariable(C, *I);
372462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
373462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* Reflect export function */
374462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    for(RSContext::const_export_func_iterator I = mRSContext->export_funcs_begin();
375462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        I != mRSContext->export_funcs_end();
376462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        I++)
377462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        genExportFunction(C, *I);
378462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
379462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endClass();
380462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
381462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return true;
382462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
383462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
384462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genScriptClassConstructor(Context& C) {
385462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "// Constructor" << endl;
3862dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao    C.startFunction(Context::AM_Public, false, NULL, C.getClassName(), 4, "RenderScript", "rs",
387462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                                                                          "Resources", "resources",
3882dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao                                                                          "int", "id",
389462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                                                                          "boolean", "isRoot");
390462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* Call constructor of super class */
3912dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao    C.indent() << "super(rs, resources, id, isRoot);" << endl;
392462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endFunction();
393462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
394462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
395462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
396462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genExportVariable(Context& C, const RSExportVar* EV) {
397462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const RSExportType* ET = EV->getType();
398462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
399462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "private final static int "RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << " = " << C.getNextExportVarSlot() << ";" << endl;
400462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
401462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    switch(ET->getClass()) {
402462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportType::ExportClassPrimitive:
403462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            genPrimitiveTypeExportVariable(C, EV);
404462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
405462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
406462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportType::ExportClassPointer:
407462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            genPointerTypeExportVariable(C, EV);
408462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
409462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
410462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportType::ExportClassVector:
411462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            genVectorTypeExportVariable(C, EV);
412462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
413462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
414462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportType::ExportClassRecord:
415462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            genRecordTypeExportVariable(C, EV);
416462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
417462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
418462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        default:
419462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            assert(false && "Unknown class of type");
420462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
421462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
422462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
423462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
424462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
425462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
426462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genExportFunction(Context& C, const RSExportFunc* EF) {
427462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "private final static int "RS_EXPORT_FUNC_INDEX_PREFIX << EF->getName() << " = " << C.getNextExportFuncSlot() << ";" << endl;
428462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
429462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* invoke_*() */
430462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    Context::ArgTy Args;
431462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
432462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    for(RSExportFunc::const_param_iterator I = EF->params_begin();
433462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        I != EF->params_end();
4342dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao        I++)
435462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    {
436462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        const RSExportFunc::Parameter* P = *I;
437462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        Args.push_back( make_pair(GetTypeName(P->getType()), P->getName()) );
438462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
439462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
440462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.startFunction(Context::AM_Public, false, "void", "invoke_" + EF->getName(), Args);
441462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
442462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(!EF->hasParam()) {
4432dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao        C.indent() << "invoke("RS_EXPORT_FUNC_INDEX_PREFIX << EF->getName() << ");" << endl;
444462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    } else {
445462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        const RSExportRecordType* ERT = EF->getParamPacketType();
446462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        std::string FieldPackerName = EF->getName() + "_fp";
447462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
448462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        if(genCreateFieldPacker(C, ERT, FieldPackerName.c_str()))
449462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            genPackVarOfType(C, ERT, NULL, FieldPackerName.c_str());
450462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
451bdd788877b3f18980836a3ed0d46627169483653Shih-wei Liao        C.indent() << "invoke("RS_EXPORT_FUNC_INDEX_PREFIX << EF->getName() << ", " << FieldPackerName << ");" << endl;
452462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
453462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
454462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endFunction();
455462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
456462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
457462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
458462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genPrimitiveTypeExportVariable(Context& C, const RSExportVar* EV) {
459462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    assert((EV->getType()->getClass() == RSExportType::ExportClassPrimitive) && "Variable should be type of primitive here");
460462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
461462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const RSExportPrimitiveType* EPT = static_cast<const RSExportPrimitiveType*>(EV->getType());
462462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const char* TypeName = GetPrimitiveTypeName(EPT);
463462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
464462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX << EV->getName() << ";" << endl;
465462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
466462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* set_*() */
467462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.startFunction(Context::AM_Public, false, "void", "set_" + EV->getName(), 1, TypeName, "v");
468462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << endl;
469462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
470462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(EPT->isRSObjectType())
47160c985d5a07b76b34e5113fbd166bf73ba16b7d0Shih-wei Liao        C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", (v == null) ? 0 : v.getID());" << endl;
472462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    else
473462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", v);" << endl;
474462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
475462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endFunction();
476462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
477462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    genGetExportVariable(C, TypeName, EV->getName());
478462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
479462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
480462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
481462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
482462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genPointerTypeExportVariable(Context& C, const RSExportVar* EV) {
483462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const RSExportType* ET = EV->getType();
484462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const RSExportType* PointeeType;
485462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    std::string TypeName;
486462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
487462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    assert((ET->getClass() == RSExportType::ExportClassPointer) && "Variable should be type of pointer here");
488462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
489462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    PointeeType = static_cast<const RSExportPointerType*>(ET)->getPointeeType();
490462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    TypeName = GetTypeName(ET);
491462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
492462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* bind_*() */
493462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX << EV->getName() << ";" << endl;
494462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
495462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.startFunction(Context::AM_Public, false, "void", "bind_" + EV->getName(), 1, TypeName.c_str(), "v");
496462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
497462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << endl;
498462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "if(v == null) bindAllocation(null, "RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ");" << endl;
499462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
500462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(PointeeType->getClass() == RSExportType::ExportClassRecord)
501462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        C.indent() << "else bindAllocation(v.getAllocation(), "RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ");" << endl;
502462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    else
503462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        C.indent() << "else bindAllocation(v, "RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ");" << endl;
504462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
505462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endFunction();
506462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
507462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    genGetExportVariable(C, TypeName, EV->getName());
508462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
509462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
510462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
511462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
512462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genVectorTypeExportVariable(Context& C, const RSExportVar* EV) {
513462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    assert((EV->getType()->getClass() == RSExportType::ExportClassVector) && "Variable should be type of vector here");
514462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
515462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const RSExportVectorType* EVT = static_cast<const RSExportVectorType*>(EV->getType());
516462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const char* TypeName = GetVectorTypeName(EVT);
517462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const char* FieldPackerName = "fp";
518462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
519462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX << EV->getName() << ";" << endl;
520462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
521462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* set_*() */
522462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.startFunction(Context::AM_Public, false, "void", "set_" + EV->getName(), 1, TypeName, "v");
523462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << endl;
524462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
525462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(genCreateFieldPacker(C, EVT, FieldPackerName))
526462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        genPackVarOfType(C, EVT, "v", FieldPackerName);
527462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", " << FieldPackerName << ");" << endl;
528462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
529462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endFunction();
530462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
531462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    genGetExportVariable(C, TypeName, EV->getName());
532462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
533462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
534462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
535462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genRecordTypeExportVariable(Context& C, const RSExportVar* EV) {
536462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    assert((EV->getType()->getClass() == RSExportType::ExportClassRecord) && "Variable should be type of struct here");
537462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
538462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const RSExportRecordType* ERT = static_cast<const RSExportRecordType*>(EV->getType());
539462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    std::string TypeName = RS_TYPE_CLASS_NAME_PREFIX + ERT->getName() + "."RS_TYPE_ITEM_CLASS_NAME;
540462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const char* FieldPackerName = "fp";
541462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
542462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX << EV->getName() << ";" << endl;
543462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
544462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* set_*() */
545462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.startFunction(Context::AM_Public, false, "void", "set_" + EV->getName(), 1, TypeName.c_str(), "v");
546462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << endl;
547462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
548462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(genCreateFieldPacker(C, ERT, FieldPackerName))
549462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        genPackVarOfType(C, ERT, "v", FieldPackerName);
550462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", " << FieldPackerName << ");" << endl;
551462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
552462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endFunction();
553462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
554462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    genGetExportVariable(C, TypeName.c_str(), EV->getName());
555462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
556462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
557462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
558462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genGetExportVariable(Context& C, const std::string& TypeName, const std::string& VarName) {
559462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.startFunction(Context::AM_Public, false, TypeName.c_str(), "get_" + VarName, 0);
560462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
561462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "return "RS_EXPORT_VAR_PREFIX << VarName << ";" << endl;
562462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
563462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endFunction();
564462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
565462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
566462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
567462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** Methods to generate script class /end ******************************/
568462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
569462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSReflection::genCreateFieldPacker(Context& C, const RSExportType* ET, const char* FieldPackerName) {
570462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    size_t AllocSize = RSExportType::GetTypeAllocSize(ET);
571462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(AllocSize > 0)
572462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        C.indent() << "FieldPacker " << FieldPackerName << " = new FieldPacker(" << AllocSize << ");" << endl;
573462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    else
574462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return false;
575462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return true;
576462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
577462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
578462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genPackVarOfType(Context& C, const RSExportType* ET, const char* VarName, const char* FieldPackerName) {
579462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    switch(ET->getClass()) {
580462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportType::ExportClassPrimitive:
581462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportType::ExportClassVector:
582462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            C.indent() << FieldPackerName << "." << GetPackerAPIName(static_cast<const RSExportPrimitiveType*>(ET)) << "(" << VarName << ");" << endl;
583462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
584462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
585462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportType::ExportClassPointer:
586462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        {
587462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            /* Must reflect as type Allocation in Java */
588462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            const RSExportType* PointeeType = static_cast<const RSExportPointerType*>(ET)->getPointeeType();
589462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
590462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            if(PointeeType->getClass() != RSExportType::ExportClassRecord)
591c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao                C.indent() << FieldPackerName << ".addI32(" << VarName << ".getPtr());" << endl;
592462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            else
593c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao                C.indent() << FieldPackerName << ".addI32(" << VarName << ".getAllocation().getPtr());" << endl;
594462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
595462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
596462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
597462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportType::ExportClassRecord:
598462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        {
599462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            const RSExportRecordType* ERT = static_cast<const RSExportRecordType*>(ET);
600462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            int Pos = 0;    /* relative pos from now on in field packer */
601462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
602462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            for(RSExportRecordType::const_field_iterator I = ERT->fields_begin();
603462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                I != ERT->fields_end();
604462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                I++)
605462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            {
606462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                const RSExportRecordType::Field* F = *I;
607462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                std::string FieldName;
608462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                size_t FieldOffset = F->getOffsetInParent();
609462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                size_t FieldStoreSize = RSExportType::GetTypeStoreSize(F->getType());
610462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                size_t FieldAllocSize = RSExportType::GetTypeAllocSize(F->getType());
611462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
612462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                if(VarName != NULL)
613462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    FieldName = VarName + ("." + F->getName());
614462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                else
615462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    FieldName = F->getName();
616462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
617462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                if(FieldOffset > Pos)
618462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    C.indent() << FieldPackerName << ".skip(" << (FieldOffset - Pos) << ");" << endl;
619462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
620462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                genPackVarOfType(C, F->getType(), FieldName.c_str(), FieldPackerName);
621462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
622462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                if(FieldAllocSize > FieldStoreSize)  /* there's padding in the field type */
623462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    C.indent() << FieldPackerName << ".skip(" << (FieldAllocSize - FieldStoreSize) << ");" << endl;
624462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
625462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                Pos = FieldOffset + FieldAllocSize;
626462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            }
627462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
628462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            /* There maybe some padding after the struct */
629462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            size_t Padding = RSExportType::GetTypeAllocSize(ERT) - Pos;
630462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            if(Padding > 0)
631462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                C.indent() << FieldPackerName << ".skip(" << Padding << ");" << endl;
632462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
633462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
634462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
635462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        default:
636462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            assert(false && "Unknown class of type");
637462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
638462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
639462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
640462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
641462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
642462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
643462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** Methods to generate type class  ******************************/
644462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSReflection::genTypeClass(Context& C, const RSExportRecordType* ERT, std::string& ErrorMsg) {
645462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    std::string ClassName = RS_TYPE_CLASS_NAME_PREFIX + ERT->getName();
646462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
6472dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao    if(!C.startClass(Context::AM_Public, false, ClassName, RS_TYPE_CLASS_SUPER_CLASS_NAME, ErrorMsg))
648462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return false;
649462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
650462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(!genTypeItemClass(C, ERT, ErrorMsg))
651462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return false;
652462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
653462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* Declare item buffer and item buffer packer */
654462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "private "RS_TYPE_ITEM_CLASS_NAME" "RS_TYPE_ITEM_BUFFER_NAME"[];" << endl;
655462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "private FieldPacker "RS_TYPE_ITEM_BUFFER_PACKER_NAME";" << endl;
656462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
657462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    genTypeClassConstructor(C, ERT);
658462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    genTypeClassCopyToArray(C, ERT);
659462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    genTypeClasSet(C, ERT);
660462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    genTypeClasCopyAll(C, ERT);
661462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
662462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endClass();
663462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
664462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return true;
665462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
666462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
667462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSReflection::genTypeItemClass(Context& C, const RSExportRecordType* ERT, std::string& ErrorMsg) {
668462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "static public class "RS_TYPE_ITEM_CLASS_NAME;
669462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.startBlock();
670462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
671462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "public static final int sizeof = " << RSExportType::GetTypeAllocSize(ERT) << ";" << endl;
672462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
673462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* Member elements */
674462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.out() << endl;
675462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    for(RSExportRecordType::const_field_iterator FI = ERT->fields_begin();
676462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        FI != ERT->fields_end();
6772dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao        FI++)
678462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        C.indent() << GetTypeName((*FI)->getType()) << " " << (*FI)->getName() << ";" << endl;
679462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
680462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* Constructor */
681462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.out() << endl;
682462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << RS_TYPE_ITEM_CLASS_NAME"()";
683462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.startBlock();
684462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
685462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    for(RSExportRecordType::const_field_iterator FI = ERT->fields_begin();
686462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        FI != ERT->fields_end();
6872dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao        FI++)
688462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    {
689462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        const RSExportRecordType::Field* F = *FI;
690462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        if((F->getType()->getClass() == RSExportType::ExportClassVector) || (F->getType()->getClass() == RSExportType::ExportClassRecord))
691462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        C.indent() << F->getName() << " = new " << GetTypeName(F->getType()) << "();" << endl;
692462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
693462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
694462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endBlock();   /* end Constructor */
695462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
696462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endBlock();   /* end Item class */
697462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
698462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
699462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return true;
700462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
701462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
702462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genTypeClassConstructor(Context& C, const RSExportRecordType* ERT) {
703462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const char* RenderScriptVar = "rs";
704462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
705462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.startFunction(Context::AM_Public, false, NULL, C.getClassName(), 2, "RenderScript", RenderScriptVar,
706462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                                                                          "int", "count");
707462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
708462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << RS_TYPE_ITEM_BUFFER_NAME" = null;" << endl;
709462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME" = null;" << endl;
710462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
711462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    genBuildElement(C, ERT, "mElement", RenderScriptVar);
712462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* Call init() in super class */
713462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "init(" << RenderScriptVar << ", count);" << endl;
714462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endFunction();
715462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
716462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
717462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
718462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
719462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genTypeClassCopyToArray(Context& C, const RSExportRecordType* ERT) {
720462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.startFunction(Context::AM_Private, false, "void", "copyToArray", 2, RS_TYPE_ITEM_CLASS_NAME, "i",
721462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                                                                          "int", "index");
722462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
723462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "if ("RS_TYPE_ITEM_BUFFER_PACKER_NAME" == null) "RS_TYPE_ITEM_BUFFER_PACKER_NAME" = new FieldPacker("RS_TYPE_ITEM_CLASS_NAME".sizeof * mType.getX() /* count */);" << endl;
724462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME".reset(index * "RS_TYPE_ITEM_CLASS_NAME".sizeof);" << endl;
725462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
726462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    genPackVarOfType(C, ERT, "i", RS_TYPE_ITEM_BUFFER_PACKER_NAME);
727462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
728462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endFunction();
729462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
730462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
731462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
732462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genTypeClasSet(Context& C, const RSExportRecordType* ERT) {
733462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.startFunction(Context::AM_Public, false, "void", "set", 3, RS_TYPE_ITEM_CLASS_NAME, "i",
734462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                                                                 "int", "index",
735462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                                                                 "boolean", "copyNow");
736462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "if ("RS_TYPE_ITEM_BUFFER_NAME" == null) "RS_TYPE_ITEM_BUFFER_NAME" = new "RS_TYPE_ITEM_CLASS_NAME"[mType.getX() /* count */];" << endl;
737462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << RS_TYPE_ITEM_BUFFER_NAME"[index] = i;" << endl;
738462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
739462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "if (copyNow) ";
740462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.startBlock();
7412dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao
742462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "copyToArray(i, index);" << endl;
743462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "mAllocation.subData1D(index * "RS_TYPE_ITEM_CLASS_NAME".sizeof, "RS_TYPE_ITEM_CLASS_NAME".sizeof, "RS_TYPE_ITEM_BUFFER_PACKER_NAME".getData());" << endl;
744462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
745462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endBlock();   /* end if (copyNow) */
746462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
747462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endFunction();
748462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
749462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
750462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
751462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genTypeClasCopyAll(Context& C, const RSExportRecordType* ERT) {
752462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.startFunction(Context::AM_Public, false, "void", "copyAll", 0);
753462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
754462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "for (int ct=0; ct < "RS_TYPE_ITEM_BUFFER_NAME".length; ct++) copyToArray("RS_TYPE_ITEM_BUFFER_NAME"[ct], ct);" << endl;
755462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "mAllocation.data("RS_TYPE_ITEM_BUFFER_PACKER_NAME".getData());" << endl;
756462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
757462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endFunction();
758462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
759462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
760462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
761462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** Methods to generate type class /end ******************************/
762462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
763462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/******************** Methods to create Element in Java of given record type ********************/
764462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genBuildElement(Context& C, const RSExportRecordType* ERT, const char* ElementName, const char* RenderScriptVar) {
765462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const char* ElementBuilderName = "eb";
766462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
767462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* Create element builder */
768462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.startBlock(true);
769462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
770462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "Element.Builder " << ElementBuilderName << " = new Element.Builder(" << RenderScriptVar << ");" << endl;
771462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
772462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* eb.add(...) */
773462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    genAddElementToElementBuilder(C, ERT, "", ElementBuilderName, RenderScriptVar);
774462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
775462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << ElementName << " = " << ElementBuilderName << ".create();" << endl;
776462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
777462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endBlock();
778462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
779462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
780462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
781462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define EB_ADD(x, ...)  \
782b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao    C.indent() << ElementBuilderName << ".add(Element." << x ##__VA_ARGS__ ", \"" << VarName << "\");" << endl
783b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao
784462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genAddElementToElementBuilder(Context& C, const RSExportType* ET, const std::string& VarName, const char* ElementBuilderName, const char* RenderScriptVar) {
785b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao    const char* ElementConstruct = GetBuiltinElementConstruct(ET);
786b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao
787bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao    if(ElementConstruct != NULL) {
788bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao      EB_ADD(ElementConstruct << "(" << RenderScriptVar << ")");
789b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao    } else {
790bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao      if((ET->getClass() == RSExportType::ExportClassPrimitive) || (ET->getClass() == RSExportType::ExportClassVector)) {
791bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        const RSExportPrimitiveType* EPT = static_cast<const RSExportPrimitiveType*>(ET);
792bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        const char* DataKindName = GetElementDataKindName(EPT->getKind());
793bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        const char* DataTypeName = GetElementDataTypeName(EPT->getType());
794bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        int Size = (ET->getClass() == RSExportType::ExportClassVector) ? static_cast<const RSExportVectorType*>(ET)->getNumElement() : 1;
795bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao
796bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        switch(EPT->getKind()) {
797bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          case RSExportPrimitiveType::DataKindColor:
798bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          case RSExportPrimitiveType::DataKindPosition:
799bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          case RSExportPrimitiveType::DataKindTexture:
800bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          case RSExportPrimitiveType::DataKindNormal:
801bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          case RSExportPrimitiveType::DataKindPointSize:
802bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            /* Element.createAttrib() */
803bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            EB_ADD("createAttrib(" << RenderScriptVar << ", " << DataTypeName << ", " << DataKindName << ", " << Size << ")");
804bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            break;
805bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao
806bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          case RSExportPrimitiveType::DataKindIndex:
807bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            /* Element.createIndex() */
808bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            EB_ADD("createAttrib(" << RenderScriptVar << ")");
809bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            break;
810bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao
811bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          case RSExportPrimitiveType::DataKindPixelL:
812bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          case RSExportPrimitiveType::DataKindPixelA:
813bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          case RSExportPrimitiveType::DataKindPixelLA:
814bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          case RSExportPrimitiveType::DataKindPixelRGB:
815bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          case RSExportPrimitiveType::DataKindPixelRGBA:
816bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            /* Element.createPixel() */
817bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            EB_ADD("createVector(" << RenderScriptVar << ", " << DataTypeName << ", " << DataKindName << ")");
818bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            break;
819bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao
820bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          case RSExportPrimitiveType::DataKindUser:
821bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          default:
822bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            if(EPT->getClass() == RSExportType::ExportClassPrimitive)
823bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao              /* Element.createUser() */
824bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao              EB_ADD("createUser(" << RenderScriptVar << ", " << DataTypeName << ")");
825bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            else /* (ET->getClass() == RSExportType::ExportClassVector) must hold here */
826bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao              /* Element.createVector() */
827bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao              EB_ADD("createVector(" << RenderScriptVar << ", " << DataTypeName << ", " << Size << ")");
828bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            break;
829bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        }
830bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao      } else if(ET->getClass() == RSExportType::ExportClassPointer) {
831bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        /* Pointer type variable should be resolved in GetBuiltinElementConstruct()  */
832bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        assert(false && "??");
833bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao      } else if(ET->getClass() == RSExportType::ExportClassRecord) {
834bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        /*
835bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao         * Simalar to genPackVarOfType.
836bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao         *
837bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao         * TODO: Generalize these two function such that there's no duplicated codes.
838bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao         */
839bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        const RSExportRecordType* ERT = static_cast<const RSExportRecordType*>(ET);
840bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        int Pos = 0;    /* relative pos from now on */
841bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao
842bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        for(RSExportRecordType::const_field_iterator I = ERT->fields_begin();
843bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            I != ERT->fields_end();
844bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            I++)
845bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        {
846bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          const RSExportRecordType::Field* F = *I;
847bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          std::string FieldName;
848bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          size_t FieldOffset = F->getOffsetInParent();
849bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          size_t FieldStoreSize = RSExportType::GetTypeStoreSize(F->getType());
850bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          size_t FieldAllocSize = RSExportType::GetTypeAllocSize(F->getType());
851bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao
852bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          if(!VarName.empty())
853bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            FieldName = VarName + "." + F->getName();
854bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          else
855bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            FieldName = F->getName();
856bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao
857bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          /* alignment */
858bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          genAddPaddingToElementBuiler(C, (FieldOffset - Pos), ElementBuilderName, RenderScriptVar);
859bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao
860bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          /* eb.add(...) */
861bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          genAddElementToElementBuilder(C, (*I)->getType(), FieldName, ElementBuilderName, RenderScriptVar);
862bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao
863bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          /* there's padding within the field type */
864bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          genAddPaddingToElementBuiler(C, (FieldAllocSize - FieldStoreSize), ElementBuilderName, RenderScriptVar);
865bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao
866bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          Pos = FieldOffset + FieldAllocSize;
867bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        }
868bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao
869bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        /* There maybe some padding after the struct */
870bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        genAddPaddingToElementBuiler(C, (RSExportType::GetTypeAllocSize(ERT) - Pos), ElementBuilderName, RenderScriptVar);
871bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao      } else {
872bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        assert(false && "Unknown class of type");
873bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao      }
874b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao    }
875462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
876462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
877462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genAddPaddingToElementBuiler(Context& C, size_t PaddingSize, const char* ElementBuilderName, const char* RenderScriptVar) {
878462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    while(PaddingSize > 0) {
879462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        const std::string& VarName = C.createPaddingField();
880462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        if(PaddingSize >= 4) {
881bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          EB_ADD("U32(" << RenderScriptVar << ")");
882bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          PaddingSize -= 4;
883462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        } else if(PaddingSize >= 2) {
884bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            EB_ADD("U16(" << RenderScriptVar << ")");
885462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            PaddingSize -= 2;
886462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        } else if(PaddingSize >= 1) {
887bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            EB_ADD("U8(" << RenderScriptVar << ")");
888462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            PaddingSize -= 1;
889462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
890462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
891462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
892462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
893462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
894462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#undef EB_ADD
895462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/******************** Methods to create Element in Java of given record type /end ********************/
896462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
897462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSReflection::reflect(const char* OutputPackageName, const std::string& InputFileName, const std::string& OutputBCFileName) {
898462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    Context *C = NULL;
899462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    std::string ResourceId = "";
900462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
901462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(!GetFileNameWithoutExtension(OutputBCFileName, ResourceId))
902462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return false;
903462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
904462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(ResourceId.empty())
905462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        ResourceId = "<Resource ID>";
906462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
9072dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao    if((OutputPackageName == NULL) || (*OutputPackageName == '\0') || strcmp(OutputPackageName, "-") == 0)
908462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        C = new Context("<Package Name>", ResourceId, true);
9092dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao    else
910462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        C = new Context(OutputPackageName, ResourceId, false);
911462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
912462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(C != NULL) {
913462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        std::string ErrorMsg, ScriptClassName;
914462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        /* class ScriptC_<ScriptName> */
915462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        if(!GetFileNameWithoutExtension(InputFileName, ScriptClassName))
916462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            return false;
917462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
918462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        if(ScriptClassName.empty())
919462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            ScriptClassName = "<Input Script Name>";
920462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
921462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        ScriptClassName.at(0) = toupper(ScriptClassName.at(0));
922462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        ScriptClassName.insert(0, RS_SCRIPT_CLASS_NAME_PREFIX);
923462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
924462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        if(!genScriptClass(*C, ScriptClassName, ErrorMsg)) {
925462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            std::cerr << "Failed to generate class " << ScriptClassName << " (" << ErrorMsg << ")" << endl;
926462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            return false;
927462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
928462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
929462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        /* class ScriptField_<TypeName> */
930462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        for(RSContext::const_export_type_iterator TI = mRSContext->export_types_begin();
931462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            TI != mRSContext->export_types_end();
9322dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao            TI++)
933462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        {
934462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            const RSExportType* ET = TI->getValue();
935462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
936462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            if(ET->getClass() == RSExportType::ExportClassRecord) {
937462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                const RSExportRecordType* ERT = static_cast<const RSExportRecordType*>(ET);
938462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
939462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                if(!ERT->isArtificial() && !genTypeClass(*C, ERT, ErrorMsg)) {
940462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    std::cerr << "Failed to generate type class for struct '" << ERT->getName() << "' (" << ErrorMsg << ")" << endl;
941462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    return false;
942462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                }
943462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            }
944462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
945462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
946462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
947462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return true;
948462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
949462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
950462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** RSReflection::Context ******************************/
9512dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liaoconst char* const RSReflection::Context::LicenseNote =
952462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    "/*\n"
953462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao	" * Copyright (C) 2010 The Android Open Source Project\n"
954462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao	" *\n"
955462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao	" * Licensed under the Apache License, Version 2.0 (the \"License\");\n"
956462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao	" * you may not use this file except in compliance with the License.\n"
957462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao	" * You may obtain a copy of the License at\n"
958462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao	" *\n"
959462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao	" *      http://www.apache.org/licenses/LICENSE-2.0\n"
960462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao	" *\n"
961462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao	" * Unless required by applicable law or agreed to in writing, software\n"
962462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao	" * distributed under the License is distributed on an \"AS IS\" BASIS,\n"
963462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao	" * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"
964462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao	" * See the License for the specific language governing permissions and\n"
965462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao	" * limitations under the License.\n"
966462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao	" */\n";
967462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
968462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoconst char* const RSReflection::Context::Import[] = {
969462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* RenderScript java class */
970462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    "android.renderscript.*",
971462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* Import R */
972462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    "android.content.res.Resources",
973462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* Import for debugging */
974462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    "android.util.Log",
975462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao};
976462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
977462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoconst char* RSReflection::Context::AccessModifierStr(AccessModifier AM) {
978462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    switch(AM) {
979462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case AM_Public: return "public"; break;
980462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case AM_Protected: return "protected"; break;
981462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case AM_Private: return "private"; break;
982462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        default: return ""; break;
983462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
984462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
985462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
986462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSReflection::Context::startClass(AccessModifier AM, bool IsStatic, const std::string& ClassName, const char* SuperClassName, std::string& ErrorMsg) {
9872dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao    if(mVerbose)
988462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        std::cout << "Generating " << ClassName << ".java ..." << endl;
989462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
990462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* Open the file */
991462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(!mUseStdout) {
992462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        mOF.clear();
993462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        mOF.open((ClassName + ".java").c_str());
994462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        if(!mOF.good()) {
995462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            ErrorMsg = "failed to open file '" + ClassName + ".java' for write";
996462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            return false;
997462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
998462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
999462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1000462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* License */
1001462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    out() << LicenseNote << endl;
1002462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1003462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* Package */
1004462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(!mPackageName.empty())
1005462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        out() << "package " << mPackageName << ";" << endl;
1006462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    out() << endl;
1007462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1008462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* Imports */
1009462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    for(int i=0;i<(sizeof(Import)/sizeof(const char*));i++)
1010462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        out() << "import " << Import[i] << ";" << endl;
1011462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    out() << endl;
1012462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1013462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    out() << AccessModifierStr(AM) << ((IsStatic) ? " static" : "") << " class " << ClassName;
1014462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(SuperClassName != NULL)
1015462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        out() << " extends " << SuperClassName;
1016462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1017462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    startBlock();
1018462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1019462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    mClassName = ClassName;
1020462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1021462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return true;
1022462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1023462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1024462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endClass() {
1025462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    endBlock();
1026462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(!mUseStdout)
1027462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        mOF.close();
1028462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    clear();
1029462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
1030462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1031462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1032462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::startBlock(bool ShouldIndent) {
1033462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(ShouldIndent)
1034462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        indent() << "{" << endl;
1035462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    else
1036462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        out() << " {" << endl;
1037462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    incIndentLevel();
1038462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
1039462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1040462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1041462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endBlock() {
1042462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    decIndentLevel();
1043462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    indent() << "}" << endl << endl;
1044462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
1045462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1046462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1047462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::startTypeClass(const std::string& ClassName) {
1048462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    indent() << "public static class " << ClassName;
1049462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    startBlock();
1050462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
1051462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1052462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1053462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endTypeClass() {
1054462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    endBlock();
1055462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
1056462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1057462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1058462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::startFunction(AccessModifier AM, bool IsStatic, const char* ReturnType, const std::string& FunctionName, int Argc, ...) {
1059462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    ArgTy Args;
1060462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    va_list vl;
1061462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    va_start(vl, Argc);
1062462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1063462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    for(int i=0;i<Argc;i++) {
1064462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        const char* ArgType = va_arg(vl, const char*);
1065462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        const char* ArgName = va_arg(vl, const char*);
1066462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1067462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        Args.push_back( make_pair(ArgType, ArgName) );
1068462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
1069462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    va_end(vl);
1070462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1071462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    startFunction(AM, IsStatic, ReturnType, FunctionName, Args);
1072462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1073462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
1074462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1075462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
10762dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liaovoid RSReflection::Context::startFunction(AccessModifier AM,
10772dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao                                          bool IsStatic,
10782dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao                                          const char* ReturnType,
10792dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao                                          const std::string& FunctionName,
10802dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao                                          const ArgTy& Args)
1081462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao{
1082462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    indent() << AccessModifierStr(AM) << ((IsStatic) ? " static " : " ") << ((ReturnType) ? ReturnType : "") << " " << FunctionName << "(";
1083462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1084462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    bool FirstArg = true;
1085462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    for(ArgTy::const_iterator I = Args.begin();
1086462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        I != Args.end();
1087462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        I++)
1088462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    {
10892dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao        if(!FirstArg)
1090462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            out() << ", ";
1091462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        else
1092462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            FirstArg = false;
1093462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1094462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        out() << I->first << " " << I->second;
1095462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
1096462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1097462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    out() << ")";
1098462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    startBlock();
1099462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1100462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
1101462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1102462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1103462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endFunction() {
1104462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    endBlock();
1105462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
1106462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1107462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1108462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}   /* namespace slang */
1109