hedgewars/uLandGraphics.pas
changeset 184 f97a7a3dc8f6
parent 109 ab0340f580c2
child 188 a7c2a61524c2
--- a/hedgewars/uLandGraphics.pas	Thu Oct 05 16:33:18 2006 +0000
+++ b/hedgewars/uLandGraphics.pas	Thu Oct 05 17:02:09 2006 +0000
@@ -1,250 +1,250 @@
-unit uLandGraphics;
-interface
-
-type PRangeArray = ^TRangeArray;
-     TRangeArray = array[0..31] of record
-                                   Left, Right: integer;
-                                   end;
-
-procedure DrawExplosion(X, Y, Radius: integer);
-procedure DrawHLinesExplosions(ar: PRangeArray; Radius: integer; y, dY: integer; Count: Byte);
-procedure DrawTunnel(X, Y, dX, dY: Double; ticks, HalfWidth: integer);
-procedure FillRoundInLand(X, Y, Radius: integer; Value: Longword);
-
-implementation
-uses SDLh, uStore, uMisc, uLand, uConsts;
-
-procedure FillCircleLines(x, y, dx, dy: integer; Value: Longword);
-var i: integer;
-begin
-if ((y + dy) and $FFFFFC00) = 0 then
-   for i:= max(x - dx, 0) to min(x + dx, 2047) do Land[y + dy, i]:= Value;
-if ((y - dy) and $FFFFFC00) = 0 then
-   for i:= max(x - dx, 0) to min(x + dx, 2047) do Land[y - dy, i]:= Value;
-if ((y + dx) and $FFFFFC00) = 0 then
-   for i:= max(x - dy, 0) to min(x + dy, 2047) do Land[y + dx, i]:= Value;
-if ((y - dx) and $FFFFFC00) = 0 then
-   for i:= max(x - dy, 0) to min(x + dy, 2047) do Land[y - dx, i]:= Value;
-end;
-
-procedure FillRoundInLand(X, Y, Radius: integer; Value: Longword);
-var dx, dy, d: integer;
-begin
-  dx:= 0;
-  dy:= Radius;
-  d:= 3 - 2 * Radius;
-  while (dx < dy) do
-     begin
-     FillCircleLines(x, y, dx, dy, Value);
-     if (d < 0)
-     then d:= d + 4 * dx + 6
-     else begin
-          d:= d + 4 * (dx - dy) + 10;
-          dec(dy)
-          end;
-     inc(dx)
-     end;
-  if (dx = dy) then FillCircleLines(x, y, dx, dy, Value);
-end;
-
-procedure ClearLandPixel(y, x: integer);
-var p: PByteArray;
-begin
-p:= @PByteArray(LandSurface.pixels)^[LandSurface.pitch*y];
-case LandSurface.format.BytesPerPixel of
-     1: ;// not supported
-     2: PWord(@p[x * 2])^:= 0;
-     3: begin
-        p[x * 3 + 0]:= 0;
-        p[x * 3 + 1]:= 0;
-        p[x * 3 + 2]:= 0;
-        end;
-     4: PLongword(@p[x * 4])^:= 0;
-     end
-end;
-
-procedure SetLandPixel(y, x: integer);
-var p: PByteArray;
-begin
-p:= @PByteArray(LandSurface.pixels)^[LandSurface.pitch*y];
-case LandSurface.format.BytesPerPixel of
-     1: ;// not supported
-     2: PWord(@p[x * 2])^:= cExplosionBorderColor;
-     3: begin
-        p[x * 3 + 0]:= cExplosionBorderColor and $FF;
-        p[x * 3 + 1]:= (cExplosionBorderColor shr 8) and $FF;
-        p[x * 3 + 2]:= cExplosionBorderColor shr 16;
-        end;
-     4: PLongword(@p[x * 4])^:= cExplosionBorderColor;
-     end
-end;
-
-procedure FillLandCircleLines0(x, y, dx, dy: integer);
-var i: integer;
-begin
-if ((y + dy) and $FFFFFC00) = 0 then
-   for i:= max(x - dx, 0) to min(x + dx, 2047) do ClearLandPixel(y + dy, i);
-if ((y - dy) and $FFFFFC00) = 0 then
-   for i:= max(x - dx, 0) to min(x + dx, 2047) do ClearLandPixel(y - dy, i);
-if ((y + dx) and $FFFFFC00) = 0 then
-   for i:= max(x - dy, 0) to min(x + dy, 2047) do ClearLandPixel(y + dx, i);
-if ((y - dx) and $FFFFFC00) = 0 then
-   for i:= max(x - dy, 0) to min(x + dy, 2047) do ClearLandPixel(y - dx, i);
-end;
-
-procedure FillLandCircleLinesEBC(x, y, dx, dy: integer);
-var i: integer;
-begin
-if ((y + dy) and $FFFFFC00) = 0 then
-   for i:= max(x - dx, 0) to min(x + dx, 2047) do
-       if Land[y + dy, i] = COLOR_LAND then SetLandPixel(y + dy, i);
-if ((y - dy) and $FFFFFC00) = 0 then
-   for i:= max(x - dx, 0) to min(x + dx, 2047) do
-       if Land[y - dy, i] = COLOR_LAND then SetLandPixel(y - dy, i);
-if ((y + dx) and $FFFFFC00) = 0 then
-   for i:= max(x - dy, 0) to min(x + dy, 2047) do
-       if Land[y + dx, i] = COLOR_LAND then SetLandPixel(y + dx, i);
-if ((y - dx) and $FFFFFC00) = 0 then
-   for i:= max(x - dy, 0) to min(x + dy, 2047) do
-       if Land[y - dx, i] = COLOR_LAND then SetLandPixel(y - dx, i);
-end;
-
-procedure DrawExplosion(X, Y, Radius: integer);
-var dx, dy, d: integer;
-begin
-FillRoundInLand(X, Y, Radius, 0);
-
-if SDL_MustLock(LandSurface) then
-   SDLTry(SDL_LockSurface(LandSurface) >= 0, true);
-
-  dx:= 0;
-  dy:= Radius;
-  d:= 3 - 2 * Radius;
-  while (dx < dy) do
-     begin
-     FillLandCircleLines0(x, y, dx, dy);
-     if (d < 0)
-     then d:= d + 4 * dx + 6
-     else begin
-          d:= d + 4 * (dx - dy) + 10;
-          dec(dy)
-          end;
-     inc(dx)
-     end;
-  if (dx = dy) then FillLandCircleLines0(x, y, dx, dy);
-  inc(Radius, 4);
-  dx:= 0;
-  dy:= Radius;
-  d:= 3 - 2 * Radius;
-  while (dx < dy) do
-     begin
-     FillLandCircleLinesEBC(x, y, dx, dy);
-     if (d < 0)
-     then d:= d + 4 * dx + 6
-     else begin
-          d:= d + 4 * (dx - dy) + 10;
-          dec(dy)
-          end;
-     inc(dx)
-     end;
-  if (dx = dy) then FillLandCircleLinesEBC(x, y, dx, dy);  
-  
-if SDL_MustLock(LandSurface) then
-   SDL_UnlockSurface(LandSurface);
-end;
-
-procedure DrawHLinesExplosions(ar: PRangeArray; Radius: integer; y, dY: integer; Count: Byte);
-var tx, ty, i: LongInt;
-begin
-if SDL_MustLock(LandSurface) then
-   SDL_LockSurface(LandSurface);
-
-for i:= 0 to Pred(Count) do
-    begin
-    for ty:= max(-Radius, -y) to min(Radius, 1023 - y) do
-        for tx:= max(0, ar[i].Left - Radius) to min(2047, ar[i].Right + Radius) do
-            ClearLandPixel(y + ty, tx);
-    inc(y, dY)
-    end;
-
-inc(Radius, 4);
-dec(y, Count*dY);
-
-for i:= 0 to Pred(Count) do
-    begin
-    for ty:= max(-Radius, -y) to min(Radius, 1023 - y) do
-        for tx:= max(0, ar[i].Left - Radius) to min(2047, ar[i].Right + Radius) do
-            if Land[y + ty, tx] = $FFFFFF then
-                  SetLandPixel(y + ty, tx);
-    inc(y, dY)
-    end;
-
-if SDL_MustLock(LandSurface) then
-   SDL_UnlockSurface(LandSurface);
-end;
-
-//
-//  - (dX, dY) - direction, vector of length = 0.5
-//
-procedure DrawTunnel(X, Y, dX, dY: Double; ticks, HalfWidth: integer);
-var nx, ny: Double;
-    i, t, tx, ty: Longint;
-begin  // (-dY, dX) is (dX, dY) rotated by PI/2
-if SDL_MustLock(LandSurface) then
-   SDL_LockSurface(LandSurface);
-
-nx:= X + dY * (HalfWidth + 8);
-ny:= Y - dX * (HalfWidth + 8);
-
-for i:= 0 to 7 do
-    begin
-    X:= nx - 8 * dX;
-    Y:= ny - 8 * dY;
-    for t:= -8 to ticks + 8 do
-        {$include tunsetborder.inc}
-    nx:= nx - dY;
-    ny:= ny + dX;
-    end;
-
-for i:= -HalfWidth to HalfWidth do
-    begin
-    X:= nx - dX * 8;
-    Y:= ny - dY * 8;
-    for t:= 0 to 7 do
-        {$include tunsetborder.inc}
-    X:= nx;
-    Y:= ny;
-    for t:= 0 to ticks do
-        begin
-        X:= X + dX;
-        Y:= Y + dY;
-        tx:= round(X);
-        ty:= round(Y);
-        if ((ty and $FFFFFC00) = 0) and ((tx and $FFFFF800) = 0) then
-           begin
-           Land[ty, tx]:= 0;
-           ClearLandPixel(ty, tx);
-           end
-        end;
-    for t:= 0 to 7 do
-        {$include tunsetborder.inc}
-    nx:= nx - dY;
-    ny:= ny + dX;
-    end;
-
-for i:= 0 to 7 do
-    begin
-    X:= nx - 8 * dX;
-    Y:= ny - 8 * dY;
-    for t:= -8 to ticks + 8 do
-        {$include tunsetborder.inc}
-    nx:= nx - dY;
-    ny:= ny + dX;
-    end;
-
-if SDL_MustLock(LandSurface) then
-   SDL_UnlockSurface(LandSurface)
-end;
-
-
-end.
+unit uLandGraphics;
+interface
+
+type PRangeArray = ^TRangeArray;
+     TRangeArray = array[0..31] of record
+                                   Left, Right: integer;
+                                   end;
+
+procedure DrawExplosion(X, Y, Radius: integer);
+procedure DrawHLinesExplosions(ar: PRangeArray; Radius: integer; y, dY: integer; Count: Byte);
+procedure DrawTunnel(X, Y, dX, dY: Double; ticks, HalfWidth: integer);
+procedure FillRoundInLand(X, Y, Radius: integer; Value: Longword);
+
+implementation
+uses SDLh, uStore, uMisc, uLand, uConsts;
+
+procedure FillCircleLines(x, y, dx, dy: integer; Value: Longword);
+var i: integer;
+begin
+if ((y + dy) and $FFFFFC00) = 0 then
+   for i:= max(x - dx, 0) to min(x + dx, 2047) do Land[y + dy, i]:= Value;
+if ((y - dy) and $FFFFFC00) = 0 then
+   for i:= max(x - dx, 0) to min(x + dx, 2047) do Land[y - dy, i]:= Value;
+if ((y + dx) and $FFFFFC00) = 0 then
+   for i:= max(x - dy, 0) to min(x + dy, 2047) do Land[y + dx, i]:= Value;
+if ((y - dx) and $FFFFFC00) = 0 then
+   for i:= max(x - dy, 0) to min(x + dy, 2047) do Land[y - dx, i]:= Value;
+end;
+
+procedure FillRoundInLand(X, Y, Radius: integer; Value: Longword);
+var dx, dy, d: integer;
+begin
+  dx:= 0;
+  dy:= Radius;
+  d:= 3 - 2 * Radius;
+  while (dx < dy) do
+     begin
+     FillCircleLines(x, y, dx, dy, Value);
+     if (d < 0)
+     then d:= d + 4 * dx + 6
+     else begin
+          d:= d + 4 * (dx - dy) + 10;
+          dec(dy)
+          end;
+     inc(dx)
+     end;
+  if (dx = dy) then FillCircleLines(x, y, dx, dy, Value);
+end;
+
+procedure ClearLandPixel(y, x: integer);
+var p: PByteArray;
+begin
+p:= @PByteArray(LandSurface.pixels)^[LandSurface.pitch*y];
+case LandSurface.format.BytesPerPixel of
+     1: ;// not supported
+     2: PWord(@p[x * 2])^:= 0;
+     3: begin
+        p[x * 3 + 0]:= 0;
+        p[x * 3 + 1]:= 0;
+        p[x * 3 + 2]:= 0;
+        end;
+     4: PLongword(@p[x * 4])^:= 0;
+     end
+end;
+
+procedure SetLandPixel(y, x: integer);
+var p: PByteArray;
+begin
+p:= @PByteArray(LandSurface.pixels)^[LandSurface.pitch*y];
+case LandSurface.format.BytesPerPixel of
+     1: ;// not supported
+     2: PWord(@p[x * 2])^:= cExplosionBorderColor;
+     3: begin
+        p[x * 3 + 0]:= cExplosionBorderColor and $FF;
+        p[x * 3 + 1]:= (cExplosionBorderColor shr 8) and $FF;
+        p[x * 3 + 2]:= cExplosionBorderColor shr 16;
+        end;
+     4: PLongword(@p[x * 4])^:= cExplosionBorderColor;
+     end
+end;
+
+procedure FillLandCircleLines0(x, y, dx, dy: integer);
+var i: integer;
+begin
+if ((y + dy) and $FFFFFC00) = 0 then
+   for i:= max(x - dx, 0) to min(x + dx, 2047) do ClearLandPixel(y + dy, i);
+if ((y - dy) and $FFFFFC00) = 0 then
+   for i:= max(x - dx, 0) to min(x + dx, 2047) do ClearLandPixel(y - dy, i);
+if ((y + dx) and $FFFFFC00) = 0 then
+   for i:= max(x - dy, 0) to min(x + dy, 2047) do ClearLandPixel(y + dx, i);
+if ((y - dx) and $FFFFFC00) = 0 then
+   for i:= max(x - dy, 0) to min(x + dy, 2047) do ClearLandPixel(y - dx, i);
+end;
+
+procedure FillLandCircleLinesEBC(x, y, dx, dy: integer);
+var i: integer;
+begin
+if ((y + dy) and $FFFFFC00) = 0 then
+   for i:= max(x - dx, 0) to min(x + dx, 2047) do
+       if Land[y + dy, i] = COLOR_LAND then SetLandPixel(y + dy, i);
+if ((y - dy) and $FFFFFC00) = 0 then
+   for i:= max(x - dx, 0) to min(x + dx, 2047) do
+       if Land[y - dy, i] = COLOR_LAND then SetLandPixel(y - dy, i);
+if ((y + dx) and $FFFFFC00) = 0 then
+   for i:= max(x - dy, 0) to min(x + dy, 2047) do
+       if Land[y + dx, i] = COLOR_LAND then SetLandPixel(y + dx, i);
+if ((y - dx) and $FFFFFC00) = 0 then
+   for i:= max(x - dy, 0) to min(x + dy, 2047) do
+       if Land[y - dx, i] = COLOR_LAND then SetLandPixel(y - dx, i);
+end;
+
+procedure DrawExplosion(X, Y, Radius: integer);
+var dx, dy, d: integer;
+begin
+FillRoundInLand(X, Y, Radius, 0);
+
+if SDL_MustLock(LandSurface) then
+   SDLTry(SDL_LockSurface(LandSurface) >= 0, true);
+
+  dx:= 0;
+  dy:= Radius;
+  d:= 3 - 2 * Radius;
+  while (dx < dy) do
+     begin
+     FillLandCircleLines0(x, y, dx, dy);
+     if (d < 0)
+     then d:= d + 4 * dx + 6
+     else begin
+          d:= d + 4 * (dx - dy) + 10;
+          dec(dy)
+          end;
+     inc(dx)
+     end;
+  if (dx = dy) then FillLandCircleLines0(x, y, dx, dy);
+  inc(Radius, 4);
+  dx:= 0;
+  dy:= Radius;
+  d:= 3 - 2 * Radius;
+  while (dx < dy) do
+     begin
+     FillLandCircleLinesEBC(x, y, dx, dy);
+     if (d < 0)
+     then d:= d + 4 * dx + 6
+     else begin
+          d:= d + 4 * (dx - dy) + 10;
+          dec(dy)
+          end;
+     inc(dx)
+     end;
+  if (dx = dy) then FillLandCircleLinesEBC(x, y, dx, dy);  
+  
+if SDL_MustLock(LandSurface) then
+   SDL_UnlockSurface(LandSurface);
+end;
+
+procedure DrawHLinesExplosions(ar: PRangeArray; Radius: integer; y, dY: integer; Count: Byte);
+var tx, ty, i: LongInt;
+begin
+if SDL_MustLock(LandSurface) then
+   SDL_LockSurface(LandSurface);
+
+for i:= 0 to Pred(Count) do
+    begin
+    for ty:= max(-Radius, -y) to min(Radius, 1023 - y) do
+        for tx:= max(0, ar[i].Left - Radius) to min(2047, ar[i].Right + Radius) do
+            ClearLandPixel(y + ty, tx);
+    inc(y, dY)
+    end;
+
+inc(Radius, 4);
+dec(y, Count*dY);
+
+for i:= 0 to Pred(Count) do
+    begin
+    for ty:= max(-Radius, -y) to min(Radius, 1023 - y) do
+        for tx:= max(0, ar[i].Left - Radius) to min(2047, ar[i].Right + Radius) do
+            if Land[y + ty, tx] = $FFFFFF then
+                  SetLandPixel(y + ty, tx);
+    inc(y, dY)
+    end;
+
+if SDL_MustLock(LandSurface) then
+   SDL_UnlockSurface(LandSurface);
+end;
+
+//
+//  - (dX, dY) - direction, vector of length = 0.5
+//
+procedure DrawTunnel(X, Y, dX, dY: Double; ticks, HalfWidth: integer);
+var nx, ny: Double;
+    i, t, tx, ty: Longint;
+begin  // (-dY, dX) is (dX, dY) rotated by PI/2
+if SDL_MustLock(LandSurface) then
+   SDL_LockSurface(LandSurface);
+
+nx:= X + dY * (HalfWidth + 8);
+ny:= Y - dX * (HalfWidth + 8);
+
+for i:= 0 to 7 do
+    begin
+    X:= nx - 8 * dX;
+    Y:= ny - 8 * dY;
+    for t:= -8 to ticks + 8 do
+        {$include tunsetborder.inc}
+    nx:= nx - dY;
+    ny:= ny + dX;
+    end;
+
+for i:= -HalfWidth to HalfWidth do
+    begin
+    X:= nx - dX * 8;
+    Y:= ny - dY * 8;
+    for t:= 0 to 7 do
+        {$include tunsetborder.inc}
+    X:= nx;
+    Y:= ny;
+    for t:= 0 to ticks do
+        begin
+        X:= X + dX;
+        Y:= Y + dY;
+        tx:= round(X);
+        ty:= round(Y);
+        if ((ty and $FFFFFC00) = 0) and ((tx and $FFFFF800) = 0) then
+           begin
+           Land[ty, tx]:= 0;
+           ClearLandPixel(ty, tx);
+           end
+        end;
+    for t:= 0 to 7 do
+        {$include tunsetborder.inc}
+    nx:= nx - dY;
+    ny:= ny + dX;
+    end;
+
+for i:= 0 to 7 do
+    begin
+    X:= nx - 8 * dX;
+    Y:= ny - 8 * dY;
+    for t:= -8 to ticks + 8 do
+        {$include tunsetborder.inc}
+    nx:= nx - dY;
+    ny:= ny + dX;
+    end;
+
+if SDL_MustLock(LandSurface) then
+   SDL_UnlockSurface(LandSurface)
+end;
+
+
+end.