瀏覽代碼

#543 start with opaque pen, do not pick color on empty layer

Juliette ELSASS 1 年之前
父節點
當前提交
dba418c01c
共有 4 個文件被更改,包括 43 次插入13 次删除
  1. 9 0
      lazpaint/lazpaintinstance.pas
  2. 3 1
      lazpaint/tools/utool.pas
  3. 30 11
      lazpaint/tools/utoolbasic.pas
  4. 1 1
      lazpaint/uconfig.pas

+ 9 - 0
lazpaint/lazpaintinstance.pas

@@ -537,10 +537,19 @@ begin
 end;
 
 procedure TLazPaintInstance.UseConfig(ini: TInifile);
+var
+  c: TBGRAPixel;
 begin
   FreeAndNil(FConfig);
   BlackAndWhite := ini.ReadBool('General','BlackAndWhite',BlackAndWhite);
   FConfig := TLazPaintConfig.Create(ini,LazPaintVersionStr);
+  // make sure default pen color is not fully or almost fully transparent
+  if FConfig.DefaultToolForeColor.Alpha < 32 then
+  begin
+    c := FConfig.DefaultToolForeColor;
+    c.alpha := 255;
+    FConfig.SetDefaultToolForeColor(c);
+  end;
   ToolManager.LoadFromConfig;
   FGridVisible := Config.DefaultGridVisible;
   FDockLayersAndColors:= Config.DefaultDockLayersAndColors;

+ 3 - 1
lazpaint/tools/utool.pas

@@ -169,7 +169,8 @@ type
   TToolPopupMessage= (tpmNone, tpmHoldKeyForSquare, tpmHoldKeySnapToPixel,
     tpmReturnValides, tpmBackspaceRemoveLastPoint, tpmRightClickFinishShape, tpmHoldKeyRestrictRotation,
     tpmHoldKeysScaleMode, tpmCurveModeHint, tpmBlendOpBackground,
-    tpmRightClickForSource, tpmNothingToBeDeformed, tpmRightClickForTransformCenter);
+    tpmRightClickForSource, tpmNothingToBeDeformed, tpmRightClickForTransformCenter,
+    tpmLayerEmpty);
 
   TOnToolChangedHandler = procedure(sender: TToolManager; ANewToolType: TPaintToolType) of object;
   TOnPopupToolHandler = procedure(sender: TToolManager; APopupMessage: TToolPopupMessage; AKey: Word; AAlways: boolean) of object;
@@ -772,6 +773,7 @@ begin
   tpmRightClickForSource: result := rsRightClickForSource;
   tpmNothingToBeDeformed: result := rsNothingToBeDeformed;
   tpmRightClickForTransformCenter: result := rsRightClickForTransformCenter;
+  tpmLayerEmpty: result := rsEmptyLayer;
   else
     result := '';
   end;

+ 30 - 11
lazpaint/tools/utoolbasic.pas

@@ -453,20 +453,39 @@ begin
   result := EmptyRect;
   if colorpicking then
   begin
-    if (pt.X >= 0) and (pt.Y >= 0) and (pt.X < toolDest.Width) and (pt.Y < toolDest.Height) then
+    if ssShift in ShiftState then
     begin
-      if ssShift in ShiftState then
-        c := Manager.Image.RenderedImage.GetPixel(pt.X,pt.Y)
-        else c := toolDest.GetPixel(pt.X,pt.Y);
-      if colorpickingRight then
+      c := Manager.Image.RenderedImage.GetPixel(pt.X,pt.Y);
+      // rendered image is in fact empty
+      if (c.alpha = 0) and Manager.Image.RenderedImage.Empty then
       begin
-        Manager.BackColor := c;
-        Manager.QueryColorTarget(Manager.BackFill);
-      end else
-      begin
-        Manager.ForeColor := c;
-        Manager.QueryColorTarget(Manager.ForeFill);
+        Manager.ToolPopup(tpmLayerEmpty, 0, true);
+        exit;
       end;
+    end
+    else
+    begin
+      if (pt.X >= 0) and (pt.Y >= 0) and (pt.X < toolDest.Width) and (pt.Y < toolDest.Height) then
+      begin
+        c := toolDest.GetPixel(pt.X,pt.Y);
+        // layer is in fact empty
+        if (c.alpha = 0) and toolDest.Empty then
+        begin
+          Manager.ToolPopup(tpmLayerEmpty, 0, true);
+          exit;
+        end;
+      end
+      else
+        exit;
+    end;
+    if colorpickingRight then
+    begin
+      Manager.BackColor := c;
+      Manager.QueryColorTarget(Manager.BackFill);
+    end else
+    begin
+      Manager.ForeColor := c;
+      Manager.QueryColorTarget(Manager.ForeFill);
     end;
   end;
 end;

+ 1 - 1
lazpaint/uconfig.pas

@@ -823,7 +823,7 @@ end;
 
 function TLazPaintConfig.DefaultToolForeColor: TBGRAPixel;
 begin
-  result := StrToBGRA(iniOptions.ReadString('Tool','ForeColor','00000080'));
+  result := StrToBGRA(iniOptions.ReadString('Tool','ForeColor','000000FF'));
 end;
 
 function TLazPaintConfig.DefaultToolBackColor: TBGRAPixel;