*/}}
Browse Source

transparency export

YimingWu 3 weeks ago
parent
commit
41574c304a
3 changed files with 22 additions and 3 deletions
  1. 19 3
      ouroperations.c
  2. 1 0
      ourpaint.h
  3. 2 0
      ourtranslations.c

+ 19 - 3
ouroperations.c

@@ -1134,7 +1134,8 @@ int our_CanvasEnsureImageBuffer(){
     if(!Our->ImageBuffer){ return 0; }
     return 1;
 }
-void our_CanvasFillImageBufferBackground(){
+void our_CanvasFillImageBufferBackground(int transparent){
+    if(transparent){ return; } // it should already be 0,0,0,0.
     int64_t count=Our->ImageW*Our->ImageH;
     real bk[4]; tnsVectorSet3v(bk,Our->BackgroundColor); bk[3]=1;
     Our->BColorU16[0]=bk[0]*65535; Our->BColorU16[1]=bk[1]*65535; Our->BColorU16[2]=bk[2]*65535; Our->BColorU16[3]=65535;
@@ -1192,6 +1193,14 @@ void our_ImageConvertForExport(int BitDepth, int ColorProfile){
     cmsHPROFILE input_buffer_profile=NULL,input_gamma_profile=NULL;
     cmsHPROFILE output_buffer_profile=NULL;
 
+    /* unpremultiply */
+    for(int row=0;row<Our->ImageH;row++){
+        for(int col=0;col<Our->ImageW;col++){ uint16_t* p=&Our->ImageBuffer[((int64_t)row*Our->ImageW+col)*4];
+            real a=(real)p[3]/65535.0f;
+            if(a>0){ p[0]=(real)p[0]/a; p[1]=(real)p[1]/a; p[2]=(real)p[2]/a; }
+        }
+    }
+
     if(BitDepth==OUR_EXPORT_BIT_DEPTH_16){ return; /* only export 16bit flat */ }
 
     input_buffer_profile=(Our->ColorInterpretation==OUR_CANVAS_INTERPRETATION_CLAY)?
@@ -2037,7 +2046,7 @@ int ourmod_ExportImage(laOperator* a, laEvent* e){
                 FILE* fp=fopen(ex->FilePath->Ptr,"wb");
                 if(!fp) return LA_FINISHED;
                 static int LayerCount=0; static int CurrentLayer=0; LayerCount=lstCountElements(&Our->Layers); CurrentLayer=0;
-                our_CanvasFillImageBufferBackground();
+                our_CanvasFillImageBufferBackground(ex->Transparent);
                 laShowProgress(0,-1);
                 for(OurLayer* l=Our->Layers.pLast;l;l=l->Item.pPrev){
                     our_LayerToImageBuffer(l, 1);
@@ -2074,6 +2083,10 @@ void ourui_ExportImage(laUiList *uil, laPropPack *This, laPropPack *Operator, la
 
     laShowLabel(uil,cl,"Canvas Current:",0,0)->Flags|=LA_TEXT_ALIGN_RIGHT; laShowItem(uil,cr,0,"our.canvas.color_interpretation");
 
+    laShowSeparator(uil,c);
+    laShowItem(uil,cl,Operator,"transparent")->Flags|=LA_UI_FLAGS_EXPAND|LA_UI_FLAGS_NO_CONFIRM;
+    laShowSeparator(uil,c);
+
     b=laBeginRow(uil,c,0,0);laShowSeparator(uil,c)->Expand=1;laShowItem(uil,c,0,"LA_confirm")->Flags|=LA_UI_FLAGS_HIGHLIGHT;laEndRow(uil,b);
 }
 
@@ -2698,7 +2711,10 @@ void ourRegisterEverything(){
     laAddEnumItemAs(p,"FLAT","Flat","Export pixels in current canvans linear color space",OUR_EXPORT_COLOR_MODE_FLAT,0);
     laAddEnumItemAs(p,"SRGB","sRGB","Convert pixels into non-linear sRGB (Most used)",OUR_EXPORT_COLOR_MODE_SRGB,0);
     laAddEnumItemAs(p,"CLAY","Clay","Convert pixels into non-linear Clay (AdobeRGB 1998 compatible)",OUR_EXPORT_COLOR_MODE_CLAY,0);
-
+    p=laAddEnumProperty(pc, "transparent","Transparent","Transparent background",0,0,0,0,0,offsetof(OurPNGWriteExtra,Transparent),0,0,0,0,0,0,0,0,0,0);
+    laAddEnumItemAs(p,"OPAQUE","Opaque","Opaque background",0,0);
+    laAddEnumItemAs(p,"TRANSPARENT","Transparent","TransparentBackground",1,0);
+    
     laCreateOperatorType("OUR_toggle_erasing","Toggle Erasing","Toggle erasing",0,0,0,ourinv_ToggleErase,0,0,0);
     laCreateOperatorType("OUR_cycle_sketch","Cycle Sketches","Cycle sketch layer display mode",0,0,0,ourinv_CycleSketch,0,0,0);
 

+ 1 - 0
ourpaint.h

@@ -306,6 +306,7 @@ STRUCTURE(OurPNGWriteExtra){
     laSafeString* FilePath;
     int BitDepth;
     int ColorProfile;
+    int Transparent;
 };
 
 STRUCTURE(OurPaint){

+ 2 - 0
ourtranslations.c

@@ -23,6 +23,8 @@ extern tnsMain* T;
 extern OurPaint *Our;
 
 static const char *entries[]={
+"Transparent","透明",
+"Opaque","实色",
 "Clear Empty Tiles","清理空白图块",
 "Main canvas","主画布",
 "Inner","内边框",