|
@@ -1154,6 +1154,9 @@ laProp *laAddRawProperty(laPropContainer *Container, const char *Identifier, con
|
|
|
la_AssignPropertyGeneralSub(p);
|
|
|
return p;
|
|
|
}
|
|
|
+void laRawPropertyExtraFunctions(laProp* p, laRawMultiGetF MultiGet, laRawMultiCanGetF CanMultiGet){
|
|
|
+ laRawProp *rp=p; rp->RawMultiCanGet=CanMultiGet; rp->RawMultiGet=MultiGet;
|
|
|
+}
|
|
|
|
|
|
|
|
|
//void laPropertySignal(laProp* p, int Throw, int Catch) {
|
|
@@ -2042,7 +2045,15 @@ void* laGetRaw(laPropPack *pp, int* r_size, int* return_is_a_copy){
|
|
|
return data;
|
|
|
} return 0;
|
|
|
}
|
|
|
-int laSetRaw(laPropPack *pp, void* data, int _size){
|
|
|
+int laGetMultiRaw(laPropPack* pp, int* r_chunks, int* r_sizes, void** pointers){
|
|
|
+ if (pp->LastPs->p->PropertyType == LA_PROP_RAW){
|
|
|
+ laRawProp* rp=pp->LastPs->p; if(!rp->RawMultiGet){ return 0; }
|
|
|
+ rp->RawMultiGet(pp->LastPs->UseInstance,r_chunks,r_sizes,pointers);
|
|
|
+ if(*r_chunks>0){ return 1; } return 0;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+int laSetRaw(laPropPack *pp, void* data, uint32_t _size){
|
|
|
if (pp->LastPs->p->PropertyType == LA_PROP_RAW){ laRawProp* rp=pp->LastPs->p;
|
|
|
if(rp->RawSet){ rp->RawSet(pp->LastPs->UseInstance, data, _size); return 1; }
|
|
|
if(rp->Base.OffsetIsPointer){ void** target=(((char*)pp->LastPs->UseInstance)+rp->Base.Offset); if(*target) free(*target);
|
|
@@ -2088,6 +2099,10 @@ int laGetFloatRange(laPropPack *pp, real *min, real *max){
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+int laCanGetMultiRaw(laProp *p,void* inst){
|
|
|
+ laRawProp *rp = p; if (p->PropertyType == LA_PROP_RAW){
|
|
|
+ if (rp->RawMultiGet && (!rp->RawMultiCanGet || rp->RawMultiCanGet(inst))) return 1; } return 0;
|
|
|
+}
|
|
|
int laCanGetState(laProp *sub){ laSubProp *sp = sub; if (sub->PropertyType == LA_PROP_SUB){ if (sp->GetState) return 1; } return 0; }
|
|
|
int laCanGetTheme(laProp *sub){ laSubProp *sp = sub; if (sub->PropertyType == LA_PROP_SUB){ if (sp->GetTheme) return 1; } return 0; }
|
|
|
int laCanGetGap(laProp *sub){ laSubProp *sp = sub; if (sub->PropertyType == LA_PROP_SUB){ if (sp->GetGap) return 1; } return 0; }
|
|
@@ -2415,6 +2430,9 @@ void la_WriteOnlyMBString(laUDF *udf, char *String){
|
|
|
void la_WriteInt(laUDF *udf, int Data){
|
|
|
fwrite(&Data, sizeof(int), 1, udf->DiskFile);
|
|
|
}
|
|
|
+void la_WriteUInt(laUDF *udf, uint32_t Data){
|
|
|
+ fwrite(&Data, sizeof(uint32_t), 1, udf->DiskFile);
|
|
|
+}
|
|
|
void la_WriteUByte(laUDF *udf, unsigned char Data){
|
|
|
fwrite(&Data, sizeof(unsigned char), 1, udf->DiskFile);
|
|
|
}
|
|
@@ -2452,6 +2470,12 @@ int la_ReadInt(laUDF *udf){
|
|
|
else{ memcpy(&result, udf->FileContent + udf->Seek, sizeof(int)); udf->Seek += sizeof(int); }
|
|
|
return result;
|
|
|
}
|
|
|
+uint32_t la_ReadUInt(laUDF *udf){
|
|
|
+ uint32_t result;
|
|
|
+ if(!udf->FileContent){ fread(&result, sizeof(uint32_t), 1, udf->DiskFile); }
|
|
|
+ else{ memcpy(&result, udf->FileContent + udf->Seek, sizeof(uint32_t)); udf->Seek += sizeof(uint32_t); }
|
|
|
+ return result;
|
|
|
+}
|
|
|
u64bit la_ReadLong(laUDF *udf){
|
|
|
u64bit result;
|
|
|
if(!udf->FileContent){ fread(&result, sizeof(u64bit), 1, udf->DiskFile); }
|
|
@@ -2508,8 +2532,8 @@ void la_ReadBuffer(laUDF *udf, u64bit Size, void *Result){
|
|
|
if(!udf->FileContent){ fread(Result, Size, 1, udf->DiskFile); }
|
|
|
else{ memcpy(Result, udf->FileContent + udf->Seek, Size); udf->Seek += Size; }
|
|
|
}
|
|
|
-void* la_ReadRaw(laUDF *udf, int* _sz){
|
|
|
- int _size = la_ReadInt(udf);
|
|
|
+void* la_ReadRaw(laUDF *udf, uint32_t* _sz){
|
|
|
+ uint32_t _size = la_ReadUInt(udf);
|
|
|
if(_sz){
|
|
|
if (_size){
|
|
|
void* data=calloc(1,_size);
|
|
@@ -2750,7 +2774,7 @@ void la_WriteEnumProp(laUDF *udf, laPropPack *pp){
|
|
|
void la_ReadRawProp(laUDF *udf, laPropPack *pp){
|
|
|
la_ReadShort(udf);//mark
|
|
|
if (pp) {
|
|
|
- int _size=0;
|
|
|
+ uint32_t _size=0;
|
|
|
void* data=la_ReadRaw(udf,&_size);
|
|
|
laSetRaw(pp, data, _size); free(data);
|
|
|
}else{
|
|
@@ -2759,11 +2783,22 @@ void la_ReadRawProp(laUDF *udf, laPropPack *pp){
|
|
|
}
|
|
|
void la_WriteRawProp(laUDF *udf, laPropPack *pp){
|
|
|
laProp *p = pp->LastPs->p;
|
|
|
- void* data; int _size=0, IsCopy=0;
|
|
|
- data=laGetRaw(pp, &_size, &IsCopy);
|
|
|
la_WriteShort(udf, LA_UDF_RAW_MARK);
|
|
|
+ if(laCanGetMultiRaw(p,pp->LastPs->UseInstance)){
|
|
|
+ int chunks=0; uint32_t sizes[128]={0}; void* pointers[128]={0};
|
|
|
+ uint32_t totalsize=0;
|
|
|
+ if(laGetMultiRaw(pp,&chunks,sizes,pointers)){ TNS_CLAMP(chunks,1,128);
|
|
|
+ for(int i=0;i<chunks;i++){ totalsize+=sizes[i]; } la_WriteUInt(udf,totalsize);
|
|
|
+ if(totalsize){
|
|
|
+ for(int i=0;i<chunks;i++){ if(sizes[i] && pointers[i]){ la_WriteSized(udf,pointers[i],sizes[i]); free(pointers[i]); } }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ void* data; uint32_t _size=0, IsCopy=0;
|
|
|
+ data=laGetRaw(pp, &_size, &IsCopy);
|
|
|
if(!data){ _size=0; }
|
|
|
- la_WriteInt(udf,_size);
|
|
|
+ la_WriteUInt(udf,_size);
|
|
|
if(_size){ la_WriteSized(udf,data,_size); }
|
|
|
if(IsCopy && data){ free(data); }
|
|
|
}
|