|  | @@ -313,11 +313,11 @@ void ourui_ColorPanel(laUiList *uil, laPropPack *This, laPropPack *DetachedProps
 | 
											
												
													
														|  |      laShowItem(uil,c,0,"our.current_color");
 |  |      laShowItem(uil,c,0,"our.current_color");
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  void ourui_BrushPage(laUiList *uil, laPropPack *This, laPropPack *DetachedProps, laColumn *UNUSED, int context){
 |  |  void ourui_BrushPage(laUiList *uil, laPropPack *This, laPropPack *DetachedProps, laColumn *UNUSED, int context){
 | 
											
												
													
														|  | -    laColumn* c=laFirstColumn(uil);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    laColumn* c=laFirstColumn(uil); laColumn* cl,*cr; laSplitColumn(uil,c,0.5); cl=laLeftColumn(c,0);cr=laRightColumn(c,15);
 | 
											
												
													
														|  |      
 |  |      
 | 
											
												
													
														|  | -    laShowItemFull(uil,c,0,"our.tools.current_brush",LA_WIDGET_COLLECTION_SELECTOR,0,laui_IdentifierOnly,0);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    laShowItemFull(uil,cr,0,"our.tools.current_brush",LA_WIDGET_COLLECTION_SELECTOR,0,laui_IdentifierOnly,0);
 | 
											
												
													
														|  |      laUiItem* b=laOnConditionThat(uil,c,laPropExpression(0,"our.tools.current_brush"));{
 |  |      laUiItem* b=laOnConditionThat(uil,c,laPropExpression(0,"our.tools.current_brush"));{
 | 
											
												
													
														|  | -        laShowItemFull(uil,c,0,"our.tools.current_brush.rack_page",LA_WIDGET_COLLECTION_SINGLE,0,0,0)->Extra->HeightCoeff=-1;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        laShowItemFull(uil,c,0,"our.tools.current_brush.rack_page",LA_WIDGET_COLLECTION_SINGLE,0,0,0)->Flags|=LA_UI_FLAGS_NO_DECAL;
 | 
											
												
													
														|  |      }laEndCondition(uil,b);
 |  |      }laEndCondition(uil,b);
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  void ourui_AboutAuthor(laUiList *uil, laPropPack *This, laPropPack *DetachedProps, laColumn *UNUSED, int context){
 |  |  void ourui_AboutAuthor(laUiList *uil, laPropPack *This, laPropPack *DetachedProps, laColumn *UNUSED, int context){
 | 
											
										
											
												
													
														|  | @@ -326,7 +326,10 @@ void ourui_AboutAuthor(laUiList *uil, laPropPack *This, laPropPack *DetachedProp
 | 
											
												
													
														|  |      gu = g->Page;{
 |  |      gu = g->Page;{
 | 
											
												
													
														|  |          gc = laFirstColumn(gu);
 |  |          gc = laFirstColumn(gu);
 | 
											
												
													
														|  |          laShowLabel(gu,gc,"OurPaint is made by Wu Yiming.",0,0)->Flags|=LA_TEXT_LINE_WRAP;
 |  |          laShowLabel(gu,gc,"OurPaint is made by Wu Yiming.",0,0)->Flags|=LA_TEXT_LINE_WRAP;
 | 
											
												
													
														|  | 
 |  | +        laUiItem* b =laBeginRow(gu,gc,0,0);
 | 
											
												
													
														|  |          laShowItemFull(gu, gc, 0, "LA_open_internet_link", 0, "link=http://www.ChengduLittleA.com/ourpaint;text=OurPaint Blog", 0, 0);
 |  |          laShowItemFull(gu, gc, 0, "LA_open_internet_link", 0, "link=http://www.ChengduLittleA.com/ourpaint;text=OurPaint Blog", 0, 0);
 | 
											
												
													
														|  | 
 |  | +        laShowItemFull(gu, gc, 0, "LA_open_internet_link", 0, "link=http://www.ChengduLittleA.com/ourpaintlog;text=Dev log", 0, 0);
 | 
											
												
													
														|  | 
 |  | +        laEndRow(gu,b);
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  void ourui_AboutVersion(laUiList *uil, laPropPack *This, laPropPack *DetachedProps, laColumn *UNUSED, int context){
 |  |  void ourui_AboutVersion(laUiList *uil, laPropPack *This, laPropPack *DetachedProps, laColumn *UNUSED, int context){
 | 
											
										
											
												
													
														|  | @@ -335,6 +338,7 @@ void ourui_AboutVersion(laUiList *uil, laPropPack *This, laPropPack *DetachedPro
 | 
											
												
													
														|  |      gu = g->Page;{
 |  |      gu = g->Page;{
 | 
											
												
													
														|  |          gc = laFirstColumn(gu); char buf[128]; sprintf(buf,"OurPaint %d.%d",OUR_VERSION_MAJOR,OUR_VERSION_MINOR);
 |  |          gc = laFirstColumn(gu); char buf[128]; sprintf(buf,"OurPaint %d.%d",OUR_VERSION_MAJOR,OUR_VERSION_MINOR);
 | 
											
												
													
														|  |          laShowLabel(gu,gc,buf,0,0)->Flags|=LA_TEXT_MONO;
 |  |          laShowLabel(gu,gc,buf,0,0)->Flags|=LA_TEXT_MONO;
 | 
											
												
													
														|  | 
 |  | +        laShowLabel(gu, gc, "Single canvas implementation.", 0, 0)->Flags|=LA_TEXT_MONO|LA_TEXT_LINE_WRAP;
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  void ourui_AboutContent(laUiList *uil, laPropPack *This, laPropPack *DetachedProps, laColumn *UNUSED, int context){
 |  |  void ourui_AboutContent(laUiList *uil, laPropPack *This, laPropPack *DetachedProps, laColumn *UNUSED, int context){
 | 
											
										
											
												
													
														|  | @@ -602,6 +606,7 @@ void our_TileEnsureUndoBuffer(OurTexTile* t, real xmin,real xmax, real ymin,real
 | 
											
												
													
														|  |      for(int row=0;row<rows;row++){
 |  |      for(int row=0;row<rows;row++){
 | 
											
												
													
														|  |          memcpy(&t->FullData[((+row+t->cb)*OUR_TILE_W+t->cl)*4],&temp[row*cols*4],sizeof(uint16_t)*4*cols);
 |  |          memcpy(&t->FullData[((+row+t->cb)*OUR_TILE_W+t->cl)*4],&temp[row*cols*4],sizeof(uint16_t)*4*cols);
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | 
 |  | +    free(temp);
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  void our_TileSwapBuffers(OurTexTile* t, uint16_t* data, int IsRedo, int l, int r, int u, int b){
 |  |  void our_TileSwapBuffers(OurTexTile* t, uint16_t* data, int IsRedo, int l, int r, int u, int b){
 | 
											
												
													
														|  |      int rows=u-b,cols=r-l; int bufsize=rows*cols*sizeof(uint16_t)*4;
 |  |      int rows=u-b,cols=r-l; int bufsize=rows*cols*sizeof(uint16_t)*4;
 | 
											
										
											
												
													
														|  | @@ -1696,8 +1701,8 @@ void ourui_MenuButtons(laUiList *uil, laPropPack *pp, laPropPack *actinst, laCol
 | 
											
												
													
														|  |          laShowLabel(muil, mc, "Image", 0, 0)->Flags|=LA_TEXT_MONO|LA_UI_FLAGS_DISABLED;
 |  |          laShowLabel(muil, mc, "Image", 0, 0)->Flags|=LA_TEXT_MONO|LA_UI_FLAGS_DISABLED;
 | 
											
												
													
														|  |          laShowItem(muil, mc, 0, "OUR_export_image");
 |  |          laShowItem(muil, mc, 0, "OUR_export_image");
 | 
											
												
													
														|  |          laShowLabel(muil, mc, "Layer", 0, 0)->Flags|=LA_TEXT_MONO|LA_UI_FLAGS_DISABLED;
 |  |          laShowLabel(muil, mc, "Layer", 0, 0)->Flags|=LA_TEXT_MONO|LA_UI_FLAGS_DISABLED;
 | 
											
												
													
														|  | -        laShowItem(muil, mc, 0, "OUR_export_layer");
 |  | 
 | 
											
												
													
														|  |          laShowItem(muil, mc, 0, "OUR_import_layer");
 |  |          laShowItem(muil, mc, 0, "OUR_import_layer");
 | 
											
												
													
														|  | 
 |  | +        laShowItem(muil, mc, 0, "OUR_export_layer");
 | 
											
												
													
														|  |          laShowLabel(muil, mc, "Others", 0, 0)->Flags|=LA_TEXT_MONO|LA_UI_FLAGS_DISABLED;
 |  |          laShowLabel(muil, mc, "Others", 0, 0)->Flags|=LA_TEXT_MONO|LA_UI_FLAGS_DISABLED;
 | 
											
												
													
														|  |          laShowItem(muil, mc, 0, "LA_terminate_program");
 |  |          laShowItem(muil, mc, 0, "LA_terminate_program");
 | 
											
												
													
														|  |          //laui_DefaultMenuButtonsFileEntries(muil,pp,actinst,extracol,0);
 |  |          //laui_DefaultMenuButtonsFileEntries(muil,pp,actinst,extracol,0);
 | 
											
										
											
												
													
														|  | @@ -1718,6 +1723,15 @@ void ourPushEverything(){
 | 
											
												
													
														|  |      laFreeOlderDifferences(0);
 |  |      laFreeOlderDifferences(0);
 | 
											
												
													
														|  |      for(OurLayer* ol=Our->Layers.pFirst;ol;ol=ol->Item.pNext){ our_LayerRefreshLocal(ol); }
 |  |      for(OurLayer* ol=Our->Layers.pFirst;ol;ol=ol->Item.pNext){ our_LayerRefreshLocal(ol); }
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  | 
 |  | +void ourCleanUp(){
 | 
											
												
													
														|  | 
 |  | +    while(Our->Layers.pFirst){ our_RemoveLayer(Our->Layers.pFirst); }
 | 
											
												
													
														|  | 
 |  | +    while(Our->Brushes.pFirst){ our_RemoveBrush(Our->Brushes.pFirst); }
 | 
											
												
													
														|  | 
 |  | +    free(Our->icc_Clay);free(Our->icc_sRGB);free(Our->icc_LinearClay);free(Our->icc_LinearsRGB);
 | 
											
												
													
														|  | 
 |  | +    tnsDeleteTexture(Our->SmudgeTexture);
 | 
											
												
													
														|  | 
 |  | +    glDeleteShader(Our->CanvasShader); glDeleteProgram(Our->CanvasProgram);
 | 
											
												
													
														|  | 
 |  | +    glDeleteShader(Our->CompositionShader); glDeleteProgram(Our->CompositionProgram);
 | 
											
												
													
														|  | 
 |  | +    arrFree(&Our->Dabs,&Our->MaxDab);
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  void ourRegisterEverything(){
 |  |  void ourRegisterEverything(){
 | 
											
												
													
														|  |      laPropContainer* pc; laKeyMapper* km; laProp* p; laOperatorType* at;
 |  |      laPropContainer* pc; laKeyMapper* km; laProp* p; laOperatorType* at;
 | 
											
										
											
												
													
														|  | @@ -1921,6 +1935,7 @@ void ourRegisterEverything(){
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      laSetFrameCallbacks(ourPreFrame,0,0);
 |  |      laSetFrameCallbacks(ourPreFrame,0,0);
 | 
											
												
													
														|  |      laSetDiffCallback(ourPushEverything);
 |  |      laSetDiffCallback(ourPushEverything);
 | 
											
												
													
														|  | 
 |  | +    laSetCleanupCallback(ourCleanUp);
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  int ourInit(){
 |  |  int ourInit(){
 |