*/}}
Ver código fonte

Compose background last

YimingWu 16 horas atrás
pai
commit
f98af4f871
2 arquivos alterados com 40 adições e 53 exclusões
  1. 1 0
      android/apk_build.cmake
  2. 39 53
      ouroperations.c

+ 1 - 0
android/apk_build.cmake

@@ -92,6 +92,7 @@ macro(setup_variant VARIANT)
     -DLAGUI_USE_PNG=True
     -DLAGUI_ANDROID=True
     -DLAGUI_USE_LUAJIT=False
+    -DLCMS_SRC_DIR=${LCMS_SRC_DIR}
     -DFREETYPE_SRC_DIR=${FREETYPE_SRC_DIR}
     -DPNG_SRC_DIR=${PNG_SRC_DIR}
     -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/install/${VARIANT}

+ 39 - 53
ouroperations.c

@@ -1398,7 +1398,7 @@ int our_PigmentMultiplySlices(real a[16], real b[16], real factor){
 int our_PigmentOver(OurPigmentData* p0, OurPigmentData* p1, real alpha){
     int res=0;
     p0->Reflectance[15]*=alpha; p0->Absorption[15]*=alpha;
-    float rfac=p0->Reflectance[15]; p1->Absorption[15]=tnsInterpolate(p1->Absorption[15],0.,rfac*rfac);
+    real rfac=p0->Reflectance[15]; p1->Absorption[15]=tnsInterpolate(p1->Absorption[15],0.,rfac*rfac);
     if(our_PigmentOverSlices(p0->Reflectance,p1->Reflectance)) res|=1;
     if(our_PigmentMultiplySlices(p0->Absorption,p1->Absorption,1.0f)) res|=2;
     return res;
@@ -1957,15 +1957,15 @@ void our_LayerEnsureTiles(OurLayer* ol, real xmin,real xmax, real ymin,real ymax
     { (pf)[0]=(pow((p[0]&0xff)/255.0f,2.2)); (pf)[1]=(pow((p[0]>>8)/255.0f,2.2)); (pf)[2]=(pow((p[1]&0xff)/255.0f,2.2)); (pf)[3]=(pow((p[1]>>8)/255.0f,2.2)); \
       (pf)[4]=(pow((p[2]&0xff)/255.0f,2.2)); (pf)[5]=(pow((p[2]>>8)/255.0f,2.2)); (pf)[6]=0; (pf)[7]=(p[3]/65535.0f); }
 #define OUR_PX_FL4(p,pf) \
-    { (pf)[0]=(pow((p[0]&0xff)/15.0f,2.2)); (pf)[1]=(pow((p[0]>>4)/15.0f,2.2)); (pf)[2]=(pow((p[1]&0xff)/15.0f,2.2)); (pf)[3]=(pow((p[1]>>4)/15.0f,2.2)); \
-      (pf)[4]=(pow((p[2]&0xff)/15.0f,2.2)); (pf)[5]=(pow((p[2]>>4)/15.0f,2.2)); (pf)[6]=(pow((p[3]&0xff)/15.0f,2.2)); (pf)[7]=(pow((p[3]>>4)/15.0f,2.2)); }
+    { (pf)[0]=(pow((p[0]&0x0f)/15.0f,2.2)); (pf)[1]=(pow((p[0]>>4)/15.0f,2.2)); (pf)[2]=(pow((p[1]&0x0f)/15.0f,2.2)); (pf)[3]=(pow((p[1]>>4)/15.0f,2.2)); \
+      (pf)[4]=(pow((p[2]&0x0f)/15.0f,2.2)); (pf)[5]=(pow((p[2]>>4)/15.0f,2.2)); (pf)[6]=(pow((p[3]&0x0f)/15.0f,2.2)); (pf)[7]=(pow((p[3]>>4)/15.0f,2.2)); }
 #define OUR_PX_FH4(p,pf) \
-    { (pf)[0]=(pow((p[0]&0xff)/15.0f,2.2)); (pf)[1]=(pow((p[0]>>4)/15.0f,2.2)); (pf)[2]=(pow((p[1]&0xff)/15.0f,2.2)); (pf)[3]=(pow((p[1]>>4)/15.0f,2.2)); \
-      (pf)[4]=(pow((p[2]&0xff)/15.0f,2.2)); (pf)[5]=(pow((p[2]>>4)/15.0f,2.2)); (pf)[6]=0; (pf)[7]=(p[3]/255.0f); }
+    { (pf)[0]=(pow((p[0]&0x0f)/15.0f,2.2)); (pf)[1]=(pow((p[0]>>4)/15.0f,2.2)); (pf)[2]=(pow((p[1]&0x0f)/15.0f,2.2)); (pf)[3]=(pow((p[1]>>4)/15.0f,2.2)); \
+      (pf)[4]=(pow((p[2]&0x0f)/15.0f,2.2)); (pf)[5]=(pow((p[2]>>4)/15.0f,2.2)); (pf)[6]=0; (pf)[7]=(p[3]/255.0f); }
 #define OUR_FL_2PX(pf) \
     ((((uint16_t)(round(pow((pf)[1],1.0/2.2)*255.0f)))<<8)|(((uint16_t)(round(pow((pf)[0],1.0/2.2)*255.0f)))&0xff))
 #define OUR_FL_2PX4(pf) \
-    ((((uint8_t)(round(pow((pf)[1],1.0/2.2)*15.0f)))<<4)|(((uint8_t)(round(pow((pf)[0],1.0/2.2)*15.0f)))&0xf))
+    ((((uint8_t)(round(pow((pf)[1],1.0/2.2)*15.0f)))<<4)|(((uint8_t)(round(pow((pf)[0],1.0/2.2)*15.0f)))&0x0f))
 #define OUR_FL_1PX(pf) \
     ((uint16_t)((pf)[1]*65535.0f))
 #define OUR_FL_1PX4(pf) \
@@ -2114,8 +2114,8 @@ void our_CanvasFillImageBufferBackground(int ColorProfile, int transparent){
     uint16_t BColorU16[4]; uint8_t BColorU8[4];
 
 #define OUR_SET_BCOLORS \
-    { BColorU16[0]=bk[0]*65535;  BColorU16[1]=bk[1]*65535;  BColorU16[2]=bk[2]*65535;  BColorU16[3]=65535; \
-      BColorU8[0]=0.5+bk[0]*255; BColorU8[1]=0.5+bk[1]*255; BColorU8[2]=0.5+bk[2]*255; BColorU8[3]=255; }
+    { BColorU16[0]=bk[0]*65535;  BColorU16[1]=bk[1]*65535;  BColorU16[2]=bk[2]*65535;  BColorU16[3]=round(bk[3]*65535); \
+      BColorU8[0]=0.5+bk[0]*255; BColorU8[1]=0.5+bk[1]*255; BColorU8[2]=0.5+bk[2]*255; BColorU8[3]=round(bk[3]*255); }
 #define OUR_SET_GLOBAL_BCOLORS \
     { Our->BColorU16[0]=bk[0]*65535;  Our->BColorU16[1]=bk[1]*65535;  Our->BColorU16[2]=bk[2]*65535;  Our->BColorU16[3]=65535; \
       Our->BColorU8[0]=0.5+bk[0]*255; Our->BColorU8[1]=0.5+bk[1]*255; Our->BColorU8[2]=0.5+bk[2]*255; Our->BColorU8[3]=255; }
@@ -2127,8 +2127,9 @@ void our_CanvasFillImageBufferBackground(int ColorProfile, int transparent){
         elif(ColorProfile==OUR_EXPORT_COLOR_MODE_D65_P3){ tnsXYZ2D65P3(xyz,bk); tns2LogsRGB(bk); }
         elif(ColorProfile==OUR_EXPORT_COLOR_MODE_FLAT){ tnsXYZ2sRGB(xyz,bk); }
         TNS_CLAMP(bk[0],0,1);TNS_CLAMP(bk[1],0,1);TNS_CLAMP(bk[2],0,1);
-        bk[0]=pow(bk[0],2.2);bk[1]=pow(bk[1],2.2);bk[2]=pow(bk[2],2.2);
         OUR_SET_GLOBAL_BCOLORS
+        bk[0]=bk[1]=bk[2]=bk[3]=0;
+        OUR_SET_BCOLORS
     }else{
         real xyz[3]={0}; tnsVectorSet3v(bk,Our->BackgroundColor); bk[3]=1; int itp=0;
         if(ColorProfile!=OUR_EXPORT_COLOR_MODE_FLAT){
@@ -2148,45 +2149,14 @@ void our_CanvasFillImageBufferBackground(int ColorProfile, int transparent){
     if(transparent){ return; } // it should already be 0,0,0,0.
 
     OUR_PIX_COMPACT* image_buffer = Our->ImageBuffer;
-    if(Our->PigmentMode){
-        OurPigmentData* pd=&Our->CanvasSurface->Reflectance; pd->Reflectance[15]=1;
-        for(int row=0;row<Our->ImageH;row+=2){
-            for(int col=0;col<Our->ImageW;col+=2){
-                OUR_PIX_COMPACT* s0=&image_buffer[((int64_t)(row)*Our->ImageW+col)*4];
-                OUR_PIX_COMPACT* s1=&image_buffer[((int64_t)(row+1)*Our->ImageW+col)*4];
-                OUR_PIX_COMPACT* s2=&image_buffer[((int64_t)(row)*Our->ImageW+(col+1))*4];
-                OUR_PIX_COMPACT* s3=&image_buffer[((int64_t)(row+1)*Our->ImageW+(col+1))*4];
-#ifdef LA_USE_GLES
-                s0[0]=OUR_FL_2PX4(&pd->Reflectance[0]);  s0[1]=OUR_FL_2PX4(&pd->Reflectance[2]);
-                s0[2]=OUR_FL_2PX4(&pd->Reflectance[4]);  s0[3]=OUR_FL_2PX4(&pd->Reflectance[6]);
-                s1[0]=OUR_FL_2PX4(&pd->Reflectance[8]);  s1[1]=OUR_FL_2PX4(&pd->Reflectance[10]);
-                s1[2]=OUR_FL_2PX4(&pd->Reflectance[12]); s1[3]=OUR_FL_1PX4(&pd->Reflectance[14]);
-                s2[0]=OUR_FL_2PX4(&pd->Absorption[0]);   s2[1]=OUR_FL_2PX4(&pd->Absorption[2]);
-                s2[2]=OUR_FL_2PX4(&pd->Absorption[4]);   s2[3]=OUR_FL_2PX4(&pd->Absorption[6]);
-                s3[0]=OUR_FL_2PX4(&pd->Absorption[8]);   s3[1]=OUR_FL_2PX4(&pd->Absorption[10]);
-                s3[2]=OUR_FL_2PX4(&pd->Absorption[12]);  s3[3]=OUR_FL_1PX4(&pd->Absorption[14]);
-#else
-                s0[0]=OUR_FL_2PX(&pd->Reflectance[0]);  s0[1]=OUR_FL_2PX(&pd->Reflectance[2]);
-                s0[2]=OUR_FL_2PX(&pd->Reflectance[4]);  s0[3]=OUR_FL_2PX(&pd->Reflectance[6]);
-                s1[0]=OUR_FL_2PX(&pd->Reflectance[8]);  s1[1]=OUR_FL_2PX(&pd->Reflectance[10]);
-                s1[2]=OUR_FL_2PX(&pd->Reflectance[12]); s1[3]=OUR_FL_1PX(&pd->Reflectance[14]);
-                s2[0]=OUR_FL_2PX(&pd->Absorption[0]);   s2[1]=OUR_FL_2PX(&pd->Absorption[2]);
-                s2[2]=OUR_FL_2PX(&pd->Absorption[4]);   s2[3]=OUR_FL_2PX(&pd->Absorption[6]);
-                s3[0]=OUR_FL_2PX(&pd->Absorption[8]);   s3[1]=OUR_FL_2PX(&pd->Absorption[10]);
-                s3[2]=OUR_FL_2PX(&pd->Absorption[12]);  s3[3]=OUR_FL_1PX(&pd->Absorption[14]);
-#endif
-            }
-        }
-    }else{
-        int64_t count=Our->ImageW*Our->ImageH;
-        for(int64_t i=0;i<count;i++){
-            OUR_PIX_COMPACT* p=&image_buffer[(int64_t)i*4];
+    int64_t count=Our->ImageW*Our->ImageH;
+    for(int64_t i=0;i<count;i++){
+        OUR_PIX_COMPACT* p=&image_buffer[(int64_t)i*4];
 #ifdef LA_USE_GLES
-            tnsVectorSet4v(p,BColorU8);
+        tnsVectorSet4v(p,BColorU8);
 #else
-            tnsVectorSet4v(p,BColorU16);
+        tnsVectorSet4v(p,BColorU16);
 #endif
-        }
     }
 }
 void our_Pix16to8(uint8_t* converted, uint16_t* source){
@@ -2198,12 +2168,12 @@ void our_Pix16to8H(uint8_t* converted, uint16_t* source){
     converted[2]=((source[2]&0xff)/17)|(((source[2]>>8)/17)<<4); converted[3]=(source[3])/257;
 }
 void our_Pix8to16(uint16_t* converted, uint8_t* source){
-    converted[0]=((source[0]&0x0f)*17)|(((source[0]>>4)*17)<<8); converted[1]=((source[1]&0x0f)*17)|(((source[1]>>4)*17)<<8);
-    converted[2]=((source[2]&0x0f)*17)|(((source[2]>>4)*17)<<8); converted[3]=((source[3]&0x0f)*17)|(((source[3]>>4)*17)<<8);
+    converted[0]=(((uint16_t)source[0]&0x0f)*17)|(((uint16_t)(source[0]>>4)*17)<<8); converted[1]=(((uint16_t)source[1]&0x0f)*17)|(((uint16_t)(source[1]>>4)*17)<<8);
+    converted[2]=(((uint16_t)source[2]&0x0f)*17)|(((uint16_t)(source[2]>>4)*17)<<8); converted[3]=(((uint16_t)source[3]&0x0f)*17)|(((uint16_t)(source[3]>>4)*17)<<8);
 }
 void our_Pix8to16H(uint16_t* converted, uint8_t* source){
-    converted[0]=((source[0]&0x0f)*17)|(((source[0]>>4)*17)<<8); converted[1]=((source[1]&0x0f)*17)|(((source[1]>>4)*17)<<8);
-    converted[2]=((source[2]&0x0f)*17)|(((source[2]>>4)*17)<<8); converted[3]=(source[3])*257;
+    converted[0]=(((uint16_t)source[0]&0x0f)*17)|(((uint16_t)(source[0]>>4)*17)<<8); converted[1]=(((uint16_t)source[1]&0x0f)*17)|(((uint16_t)(source[1]>>4)*17)<<8);
+    converted[2]=(((uint16_t)source[2]&0x0f)*17)|(((uint16_t)(source[2]>>4)*17)<<8); converted[3]=((uint16_t)source[3])*257;
 }
 void our_ImageBufferFromNative(){
 #ifdef LA_USE_GLES
@@ -2416,10 +2386,14 @@ void our_GetImagePigmentDataDebayer(int row, int col, OurPigmentData* pd){ //row
 typedef int (*OurPigmentConversionFunction)(OurPigmentConversionData* pcd);
 static int ourthread_PigmentConversionSimple16(OurPigmentConversionData* pcd){
     OurPigmentData pd; real xyz[3]; real rgb[3];
+    OurPigmentData* canvas=&Our->CanvasSurface->Reflectance;canvas->Reflectance[15]=1.0f;
+    OurPigmentData bkg={0};
     for(int row=pcd->RowStart;row<pcd->RowCount+pcd->RowStart;row++){
         for(int col=0;col<pcd->cols;col++){
             our_GetImagePigmentDataSimple(row*2,col*2,&pd);
-            our_PigmentToXYZDirect(&pd,xyz);
+            memcpy(&bkg,canvas,sizeof(real)*16);
+            our_PigmentOver(&pd,&bkg,1.0f);
+            our_PigmentToXYZDirect(&bkg,xyz);
             pcd->XYZ2RGB(xyz,rgb); TNS_CLAMP(rgb[0],0,1);TNS_CLAMP(rgb[1],0,1);TNS_CLAMP(rgb[2],0,1); tns2LogsRGB(rgb);
             uint16_t* pix=&pcd->ImageConversionBuffer[((int64_t)row*pcd->cols+col)*4];
             pix[0]=rgb[0]*65535; pix[1]=rgb[1]*65535; pix[2]=rgb[2]*65535; pix[3]=65535;
@@ -2429,10 +2403,14 @@ static int ourthread_PigmentConversionSimple16(OurPigmentConversionData* pcd){
 }
 static int ourthread_PigmentConversionSimple8(OurPigmentConversionData* pcd){
     OurPigmentData pd; real xyz[3]; real rgb[3];
+    OurPigmentData* canvas=&Our->CanvasSurface->Reflectance;canvas->Reflectance[15]=1.0f;
+    OurPigmentData bkg={0};
     for(int row=pcd->RowStart;row<pcd->RowCount+pcd->RowStart;row++){
         for(int col=0;col<pcd->cols;col++){
             our_GetImagePigmentDataSimple(row*2,col*2,&pd);
-            our_PigmentToXYZDirect(&pd,xyz);
+            memcpy(&bkg,canvas,sizeof(real)*16);
+            our_PigmentOver(&pd,&bkg,1.0f);
+            our_PigmentToXYZDirect(&bkg,xyz);
             pcd->XYZ2RGB(xyz,rgb); TNS_CLAMP(rgb[0],0,1);TNS_CLAMP(rgb[1],0,1);TNS_CLAMP(rgb[2],0,1); tns2LogsRGB(rgb);
             uint8_t* pix=&((uint8_t*)pcd->ImageConversionBuffer)[((int64_t)row*pcd->cols+col)*4];
             pix[0]=rgb[0]*255.0f; pix[1]=rgb[1]*255.0f; pix[2]=rgb[2]*255.0f; pix[3]=255;
@@ -2442,10 +2420,14 @@ static int ourthread_PigmentConversionSimple8(OurPigmentConversionData* pcd){
 }
 static int ourthread_PigmentConversionDebayer16(OurPigmentConversionData* pcd){
     OurPigmentData pd; real xyz[3]; real rgb[3];
+    OurPigmentData* canvas=&Our->CanvasSurface->Reflectance;canvas->Reflectance[15]=1.0f;
+    OurPigmentData bkg={0};
     for(int row=pcd->RowStart;row<pcd->RowCount+pcd->RowStart;row++){
         for(int col=0;col<pcd->cols;col++){
             our_GetImagePigmentDataDebayer(row,col,&pd);
-            our_PigmentToXYZDirect(&pd,xyz);
+            memcpy(&bkg,canvas,sizeof(real)*16);
+            our_PigmentOver(&pd,&bkg,1.0f);
+            our_PigmentToXYZDirect(&bkg,xyz);
             pcd->XYZ2RGB(xyz,rgb); TNS_CLAMP(rgb[0],0,1);TNS_CLAMP(rgb[1],0,1);TNS_CLAMP(rgb[2],0,1); tns2LogsRGB(rgb);
             uint16_t* pix=&pcd->ImageConversionBuffer[((int64_t)row*pcd->cols+col)*4];
             pix[0]=rgb[0]*65535; pix[1]=rgb[1]*65535; pix[2]=rgb[2]*65535; pix[3]=65535;
@@ -2455,10 +2437,14 @@ static int ourthread_PigmentConversionDebayer16(OurPigmentConversionData* pcd){
 }
 static int ourthread_PigmentConversionDebayer8(OurPigmentConversionData* pcd){
     OurPigmentData pd; real xyz[3]; real rgb[3];
+    OurPigmentData* canvas=&Our->CanvasSurface->Reflectance;canvas->Reflectance[15]=1.0f;
+    OurPigmentData bkg={0};
     for(int row=pcd->RowStart;row<pcd->RowCount+pcd->RowStart;row++){
         for(int col=0;col<pcd->cols;col++){
             our_GetImagePigmentDataDebayer(row,col,&pd);
-            our_PigmentToXYZDirect(&pd,xyz);
+            memcpy(&bkg,canvas,sizeof(real)*16);
+            our_PigmentOver(&pd,&bkg,1.0f);
+            our_PigmentToXYZDirect(&bkg,xyz);
             pcd->XYZ2RGB(xyz,rgb); TNS_CLAMP(rgb[0],0,1);TNS_CLAMP(rgb[1],0,1);TNS_CLAMP(rgb[2],0,1); tns2LogsRGB(rgb);
             uint8_t* pix=&((uint8_t*)pcd->ImageConversionBuffer)[((int64_t)row*pcd->cols+col)*4];
             pix[0]=rgb[0]*255.0f; pix[1]=rgb[1]*255.0f; pix[2]=rgb[2]*255.0f; pix[3]=255;