Janilabo

TPAFloodFillEx

Jul 22nd, 2013
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 22.81 KB | None | 0 0
  1. // BLACK [0] pixels is the TPA we use flood fill for.
  2. // NOTE: If you use start point to point that TPA contains (which is inside AREA!), it will floodfill
  3. // the outline pixels (TPA points) inside the area, else it will do the opposite.
  4. // ..that is, filling the white pixels (non-TPA points) inside the area.
  5.  
  6. const
  7.   FLOODFILL_8WAY = False; // Change to see the effect. :) However, this works with Example ID 2 only!
  8.   FLOODFILL_COLOR = 65535; // ..with this color.
  9.   DISPLAY_DELAY = 1000; // Minimum delay that it waits before it shows the result.
  10.   AREA_X1 = 50;
  11.   AREA_Y1 = 50;
  12.   AREA_X2 = 340;
  13.   AREA_Y2 = 250;
  14.   DEBUG_AREA = True; // Display the area where we used flood filling in.
  15.   DEBUG_AREA_COLOR = 255;
  16.   START_POINT_X = 150; // NOTE:
  17.   START_POINT_Y = 200; // COORDINATES MUST BE INSIDE AREA! Else it wont detect anything, obviously.
  18.   DEBUG_START_POINT = True;
  19.   DEBUG_START_POINT_COLOR = 32768;
  20.   DEBUG_START_POINT_SIZE = 2; //
  21.   EXAMPLE = 2; // 1 or 2.
  22.  
  23. type
  24.   TFloodFill = (ff4Way, ff8Way);
  25.  
  26. procedure __TPAFloodFillEx(var store, check: array of TBoolArray; X, Y, W, H: Integer; method: TFloodFill; skip: Boolean);
  27. begin
  28.   if ((X > -1) and (Y > -1) and (X < W) and (Y < H)) then
  29.     if (check[X][Y] = skip) then
  30.     begin
  31.       check[X][Y] := not skip;
  32.       if not store[X][Y] then
  33.       begin
  34.         store[X][Y] := True;
  35.         __TPAFloodFillEx(store, check, (X - 1), Y, W, H, method, skip);
  36.         __TPAFloodFillEx(store, check, (X + 1), Y, W, H, method, skip);
  37.         __TPAFloodFillEx(store, check, X, (Y - 1), W, H, method, skip);
  38.         __TPAFloodFillEx(store, check, X, (Y + 1), W, H, method, skip);
  39.         if (method = ff8Way) then
  40.         begin
  41.           __TPAFloodFillEx(store, check, (X - 1), (Y - 1), W, H, method, skip);
  42.           __TPAFloodFillEx(store, check, (X + 1), (Y + 1), W, H, method, skip);
  43.           __TPAFloodFillEx(store, check, (X + 1), (Y - 1), W, H, method, skip);
  44.           __TPAFloodFillEx(store, check, (X - 1), (Y + 1), W, H, method, skip);
  45.         end;
  46.       end;
  47.     end;
  48. end;
  49.  
  50. {==============================================================================]
  51.   Explanation: !
  52. [==============================================================================}
  53. function TPAFloodFillEx(TPA: TPointArray; start: TPoint; method: TFloodFill; area: TBox): TPointArray;
  54. var
  55.   i, l, r, X, Y, W, H: Integer;
  56.   store, check: array of TBoolArray;
  57.   overlap, skip: Boolean;
  58. begin
  59.   l := Length(TPA);
  60.   if (l > 0) then
  61.   begin
  62.     if (area.X1 > area.X2) then
  63.       Swap(area.X1, area.X2);
  64.     if (area.Y1 > area.Y2) then
  65.       Swap(area.Y1, area.Y2);
  66.     if ((start.X >= area.X1) and (start.Y >= area.Y1) and (start.X <= area.X2) and (start.Y <= area.Y2)) then
  67.     begin
  68.       W := ((area.X2 - area.X1) + 1);
  69.       H := ((area.Y2 - area.Y1) + 1);
  70.       SetLength(store, W);
  71.       SetLength(check, W);
  72.       for i := 0 to (W - 1) do
  73.       begin
  74.         SetLength(check[i], H);
  75.         SetLength(store[i], H);
  76.       end;
  77.       for i := 0 to (l - 1) do
  78.       begin
  79.         if not overlap then
  80.           overlap := ((start.X = TPA[i].X) and (start.Y = TPA[i].Y));
  81.         if (((TPA[i].X - area.X1) > -1) and ((TPA[i].Y - area.Y1) > -1) and ((TPA[i].Y - area.Y1) < H) and ((TPA[i].X - area.X1) < W)) then
  82.           check[(TPA[i].X - area.X1)][(TPA[i].Y - area.Y1)] := True;
  83.       end;
  84.       skip := not overlap;
  85.       __TPAFloodFillEx(store, check, (start.X - area.X1), (start.Y - area.Y1), W, H, method, not skip);
  86.       SetLength(check, 0);
  87.       SetLength(Result, (W * H));
  88.       for Y := 0 to (H - 1) do
  89.         for X := 0 to (W - 1) do
  90.           if store[X][Y] then
  91.           begin
  92.             Result[r] := Point((X + area.X1), (Y + area.Y1));
  93.             Inc(r);
  94.           end;
  95.       SetLength(store, 0);
  96.     end;
  97.   end;
  98.   SetLength(Result, r);
  99. end;
  100.  
  101. //******* DIRTY EXAMPLE BELLOW: *******//
  102. procedure SetPixels(bmp: Integer; TPA: TPointArray; color: Integer);
  103. var
  104.   a, z, w, h: Integer;
  105. begin
  106.   z := High(TPA);
  107.   if (z > -1) then
  108.   begin
  109.     GetBitmapSize(bmp, w, h);
  110.     for a := 0 to z do
  111.       if ((TPA[a].X >= 0) and (TPA[a].Y >= 0) and (TPA[a].X < w) and (TPA[a].Y < h)) then
  112.         FastSetPixel(bmp, TPA[a].X, TPA[a].Y, color);
  113.   end;
  114. end;
  115.  
  116. function GetBitmapColorTPA(bmp: Integer; color: Integer): TPointArray;
  117. var
  118.   w, h, x, y, r: Integer;
  119. begin
  120.   try
  121.     GetBitmapSize(bmp, w, h);
  122.   except
  123.   end;
  124.   if ((w > 0) and (h > 0)) then
  125.   begin
  126.     SetLength(Result, (w * h));
  127.     for y := 0 to (h - 1) do
  128.       for x := 0 to (w - 1) do
  129.         if (FastGetPixel(bmp, x, y) = color) then
  130.         begin
  131.           Result[r] := Point(x, y);
  132.           Inc(r);
  133.         end;
  134.   end;
  135.   SetLength(Result, r);
  136. end;
  137.  
  138. var
  139.   bmp: Integer;
  140.  
  141. procedure Example1;
  142. begin
  143.   bmp := BitmapFromString(490, 361, 'meJzt21mSKzkOBdHc/6ajPmSm' +
  144.         '0ouRwQG4APz8dlcKBD1ZyjbrbQMAAAAAAAAAAAAAAAAAAAAAAAAAA' +
  145.         'AAAAAAAAAAAAAAAqPsD1qNq5GNcNZHDC1UjH7Oqrzp3HAAVGGdG1T' +
  146.         'Dgnpn7AKiA1xv5uGfmPgAq4PVGPu6ZuQ+ACni9kY97Zu4DoAJeb+T' +
  147.         'jnpn7AKiA1xv5uGfmPgAq4PVGPu6ZuQ+ACni9kY97Zu4DoAJeb+Tj' +
  148.         'npn7AKiA1xv5uGfmPgAq4PVGPu6ZuQ+ACni9kY97Zu4DoAJeb+Tjn' +
  149.         'pn7AKiA1xv5uGfmPgAq4PVGPu6ZuQ+ACni9kY97Zu4DoAJeb+Tjnp' +
  150.         'n7AKiA1xv5uGfmPgAq4PVGPu6ZuQ+ACni9kY97Zu4DoAJeb+Tjnpn' +
  151.         '7AKiA1xv5uGfmPgAq4PVGPu6ZuQ+ACni9kY97Zu4DoAJeb+Tjnpn7' +
  152.         'AKiA1xv5uGfmPgAq4PVGPu6ZuQ+ACni9kY97Zu4DoAJeb+Tjnpn7A' +
  153.         'KiA1xv5uGfmPgAq4PVGPu6ZuQ+ACni9kY97Zu4DpPRnxfugrXi9E6' +
  154.         'DqHfdp3QeIzizpdt4rOWE8mOweovCL95L3Sk64D+Y+QDjr4lz3k90' +
  155.         'ZT6Jz8CjWtbfuJ7tzn8R9AH3KaSnPdpwz68dFpFyO8mzHOV0+WmQA' +
  156.         'TfrlXNGcPPfHRaHZRgvNyd0X5T6AFKk2ZlE4VLVfKykKAUyncCj31' +
  157.         'bkP4E4hAzNehzVeY7Jb60DV+aoWHMBRkbavWB7feKVFbvAUVWetWn' +
  158.         'AAe5XbvrJ6J7zeq1H1UbKqBQewRN6PFq2I13sdqn6Uo2rBAQyQd4e' +
  159.         '5S+P1no6qO4SuWnCApSh80KwF8npPRNWDglYtOMAi5D3X4D55vaeg' +
  160.         '6rliVS04wHQUvk73bnm9B1H1OlGqFhxgIgq30bFnXu9uVG1Dv2rBA' +
  161.         'WahcGOvFs7r3YeqjSlXLTjAOAp31Lh8Xu+3qNqRZtWCA4ygcBGPF8' +
  162.         'Hr3Y6qRahVfeQ+QDcKV3NzI7zejahajU7VR+4DdODLiayrq+H1fkT' +
  163.         'VskSqvhrMcYC3KFzf8Y54ve9RtT73qq9GchzgFSKP4vh1hdf7ClVH' +
  164.         '4Vv11TyOA7QT2Rja8Xo/oupweL1f0VkX3nK5uxCdUHVcInenX47Cl' +
  165.         'jDI+BL1a6HqBNwvUbwf9/1gFsurFA+GqtPwvUrlhIg8GbMLVW6Gqp' +
  166.         'NxvFDZiog8JZtrlc2GqlPyulbNkIg8MYPL1SyHqhNzuVzBlog8vdV' +
  167.         'XLBgPVadnf8VqORF5EUsvWq0fqi7C+KKliiLyUtZdt1RCVF2K5XVL' +
  168.         'RUXk1ZR6vb0HgZGCrzeR17Ti3nVCouqabO5dJC3+uixrxdWLhETVZ' +
  169.         'dlcvUJaRF7c9AAUWqLq4gwCUKiLyJH49fYdA47Sv958RcE2OwP3nK' +
  170.         'gaW4H/XwOR4yPl6+04AxQkfr2JHL9m9UDV0LGuB8fM+OsSO7OSoGr' +
  171.         'oWJeEQucunw5NaV5vl0+HJl5vVMDrjXySvd5EjivjbVA11Kxog86h' +
  172.         'htcb+aR5vf9+GH809I3nQdVQsyIP386NPxdRhH69jT8XUfB6owJeb' +
  173.         '+TD640KeL2RT4LXm8ivsJZfI51QtQ7W8mtuJ3Qu4u+H9ywSeL0ToO' +
  174.         'odXu9k/g68J5LA6x0aVZ/i9c7kGDmb+eD1jouqr/B6p7Frm8384vU' +
  175.         'Oiqpv8HoncPq1hM384vUOh6of8XpHdxr5xmb+xesdC1W34PUO7bTw' +
  176.         '3X/kMpgaXu9AqLrRitfbxZT5A3k8ftnNnBrZhlHBZ6bvQdzj8ctu5' +
  177.         'tT0bRhlfTBr/hBazl5zM1cGt2EU8cHcJYhrOXvNzVyJvo3o83do/O' +
  178.         '0uuJkbsbYRa9opqLpD9G1En/+VV1/MSm3mUaxtxJp2EFV3i76N6PO' +
  179.         '3exX5VmkzLWJtI9a0I6h6RPRtRJ+/0avCd//I0sGiiLWNWNN2o+pB' +
  180.         '0bcRff5Hb7+cHP/BdbMFEmsbsabtQNVTRN9G9Pnv9RW++2dXDBZOr' +
  181.         'G3EmvYtqp4lwTYSHOGo+8vJ8SdMny2ciKuIOPMjqp4oxypynOLXeO' +
  182.         'RbxrV0i7iKiDPfo+q5cqwixym+xgv//TmzpgotYiERZ75B1dPZF7L' +
  183.         'i42aF4W7Kl5PdT5syWGgGeVD1DapewT6Pv4PpP3nWD7S3IvLQC5nF' +
  184.         '5umm6lNUvYj9Ko6dzxog+rVO/92PvpCJ7F9vqv6g6nUcX+/tovlZP' +
  185.         'zyQ6b/yux876wcGZbAHqj6i6qW89nD80FnBR7zZRZFvMbexgs0eqP' +
  186.         'oXVa/m+3qffu5g8IuCWWfpwLFWsYhZElT9RdWrOSbR8rndwUe53O7' +
  187.         'f5Y6PWPHDozBbAlVvVG3Fdwkd3bZXoX+/BpFvEfawmvEGqJqqDbhv' +
  188.         'oGOA9uANEhphNp7yEgzYZ0DVVL2aQgYjA7QE737AUy2/pCs+bvUHa' +
  189.         'bI/PlVT9Woixx+c4bT27w+0zKmR/UhqG7DkFQBVm32izcdJ0Qlg1h' +
  190.         'hXwQue1HgYkePbc7x6qjb7XLNPFKFz9duCW9Ds3HESheO7cDw4VZt' +
  191.         '9tOWHKlA7+KJhdGoX+XT7j3bkfmqqtvl0+492JHjq1SM5Bu/+K7ZJ' +
  192.         '3vhq7jvfqNpqBpdPd+G+81NmIxkHrxD5Vq9zhZ1vVL2Y+wDGFHZ+x' +
  193.         'XKqq9rnDqCzbZExbOisfaPqlUTGsKGz9lMusy0Kft3vzuA83oMsJ7' +
  194.         'X2japX0plkNam1n/Idb2LwapFv3rs1o7b2zXvzVJ2A2tqvKEw4GLz' +
  195.         'mqgVHmk5z8xtVLyM40nSamz8lNefb4Dt+KcxoTjWR7OY3seVTdSCy' +
  196.         'mz8lOOpN7b9zKke+SS52IuXNb5LLp2p9ypu/IjvtffDiexYfr1uI5' +
  197.         'W9UvYb4eN1CLP+U/szhIt8ibLVDiM1/6M9J1SJCbP5KoMmjRL6F2m' +
  198.         'qLQJv/iDiq/sAhhmwXaPM3Qg+vKXoSv4JGHmvaEMI1cCNo1UcJjqA' +
  199.         'mx0r/DrwneiHizOJyrDR01Uc5TiElwUqjFx53clkJVhq96lOZzqIg' +
  200.         'dB5pvpyEHl5Q6B7SVH2U70S+gu4zWeE5TqEj6D6TVX2U9Vxewu0zZ' +
  201.         'eGZzqIg3D5TVn0q9+mMBarlWHiIsRslO46vQHnkrvqowhnNhFhmhc' +
  202.         'KznstFiGVWqPqozkkNiC+zTuG5T2dMfJl1qj5V7bzraMZzmrfakNN' +
  203.         'VOKMNzWBqVn1U9uDTqW2ycuGlDruU2iYrV31U/PgTiWySvDeZu0hA' +
  204.         'ZJNUfYU9TOFb1FXeZW+28tknompxLGQK+zXetM1tsocpqFocm5nCZ' +
  205.         'o33bXOPX2xjCqrWx37GrcuMtvuwmXFUrY91jZu4w5awua9HbGkcVe' +
  206.         'tjb+P6dtieNHf0FhsbR9UhsMNBHcUS9moscBBVh8BWBxG2IFY6iKp' +
  207.         'DYMmDSFoQex5E1VGw+RFsTxP3MoLtRcG/OkewOk1UPYLVRUHnI1id' +
  208.         'JqoeweoC4bK6sTpZXE03VhcIX1S6sTdZVN2NvQVC593Ymyyq7sbeY' +
  209.         'uG++vBEKONq+lB1LNxXN1Yni6vpxuoC4bJG/P3wngX/41JGUHUgXN' +
  210.         'MgUhfEjQyi6hC4pnF8XVHDdYyjan1c0CxsUgd3MQubFMftzELqOri' +
  211.         'IWahaGbczEX9viuAWJqJqWdzLdKzUHVcwHSvVxKVMx9cVdyx/OqoW' +
  212.         'xI0swmIdsfxFWKwUrmMdduuFza/DbqVwF+vw96YXdr4OVevgIlZjw' +
  213.         '/bY+WpsWAG3YICvK8bYtgGqVsD+bZC6JVZtg6odsXxLbNsGe7bEtl' +
  214.         '2wdnv8vbka67VH1cbYtiOWvwiLdcTyzbBnX3xdWYF9+qJqA6xXBKl' +
  215.         'PxCZFUPU67FYK1zEFa5TCdazAVgXx9+YgtieIqqdjmbJIvRt7k0XV' +
  216.         's7BGcXxd6cC6xFH1OBYYBTfVjl1FwU11Y3WxcF8t2FIs3FcflhYOf' +
  217.         '28+YjnhUPVb7CouUr/CWuKi6kYsKjq+rhyxkOio+hH7SYOr/GIVaX' +
  218.         'CVN9hMJqT+wRIyoepT7CQf/t6sfPasqHqHbSRW9nLLHrwCLveDPaR' +
  219.         'X8OtKtfMWVLDqo9DHDz28sVKphz5p6OGNlap6J/TB+ZfvW0XWFfqM' +
  220.         'VP1WzXVFP/Xfv7zHiSH9xqKfjqo7VNtYgsP+HXhPFEbWjSU4F1V3q' +
  221.         '7OxBMc8dh79RJZSLi3Bcah6RIWl5Tjd7zVVuLUVMi0tx0Goelzipa' +
  222.         'U52vEg1N4i5Ve7NGeh6j4pq97JdLTTs+S+vhHHvNNsKf1Zkt3XRIm' +
  223.         'rPsp0tKubSn+Jr1TIO9OJqLpFhap3kh3w5sqKXOiVq7ZTbiPZuaj6' +
  224.         'Sqmqd5Kd9PHuSl3uR8G2k52Rqo8KVr2T78gtJypy12XzzndSqv4qW' +
  225.         '/VRvoM33mbieyfvfOelaqreSXn89mvN1MBV2wmO9lbKU1N18ap3su' +
  226.         '7h1bmi90DbO1k3QNVBz7JC4oW8PVrEPMj7VOI9UDW+Eq+l49KjpEL' +
  227.         'e9xJvg6rxkXs5fbcvmw1tN8q9FqrGlvqvy4/uA0pVRN6vpN8PVaPC' +
  228.         'ukbO6F4UeXeosCWqRoWlDbZhX9dV2+lvapYKu6Lq4oqsbjwSm9Joe' +
  229.         '4oiS6PqyoqsceIxF7VH3hMV2R5VV1ZnmXNPOrFDl7xzXzpVD/40qg' +
  230.         '6hznmn9zPS5FXbS+/C/rfJS+Kj7VB1nap36px0W/N9rCMYy9hufps' +
  231.         'SX33iox1RdZGqd0oddlt23lfZGGT22HbuzhMf7RRVV6h6p85Jv9Yd' +
  232.         'ubEcmwEeq07cedZz3aDqV9PmUOSYv5Zebks8cwd41fa6MaRkPdcNq' +
  233.         'l4xhrIix9xZfb+PqQ9+emPY9x/R+F+LKOWhHlF1y5BpFDnmkcHB7y' +
  234.         'vq+PTxsK9+4Ksx9GU91yOq3srcfpFjnrI5+1V+7Z8+ve3H2aJLeah' +
  235.         'GVJ216qMKZ7xidsWnOd1/9Lq2Tz9l8OeoSXmoRlSdteqdCme8MrGW' +
  236.         'vo87zd6g7dOpJv5Md/lO1I6qt6RV71Q44w3747eXvC7s03kW/XwXK' +
  237.         'Q/VjqorBNC9c3EdG1i35JsPnXiQ8WEMPsvGzJKUdGxg3ZJvPnTiQc' +
  238.         'aHMfgsLzPbEvN2A0v3fPO53ZNPH8Pyc5dalZSAtxtYuuebz+2efPo' +
  239.         'Ylp9rb1E/jkJ0vmk05j7AIlRN1SGuFTuv7q7yRSv8oqERVTei6uja' +
  240.         'r6/yRVc+e0RU3aLy2dOg83t8RYmIqu9RdRotl1j2rssePDqqvlH24' +
  241.         'Pm0XGXZ6y578Oio+kbZg6dE56dqnjoNqj5V89S53V9ozRuveepMqP' +
  242.         'qo5qlzu7nTmtdd89TJUPVOzVNXcHWzNW+85qnzoepfNU9dBJ1//P3' +
  243.         'wngWjqPqDqnM7vdyCN17wyIlR9UfBI1dzvOJql85XlHyomqqLoPNS' +
  244.         '5y2Cqkudt7Lfiy5173xFSYyqi5y3uN+7LnXvpQ5bDVV7DwIjfwfeE' +
  245.         '1koddiCqBrpETnyoWrkVrPwj4JHLoKqSx25JiKvduoKqLraqaupXP' +
  246.         'hH2YMnRtVlD14EhW98RUmHqjeqTo3Cv9hAGlT9xQayIvIvlpAGVX+' +
  247.         'xhJQofIc9JEDVO+whGQo/xTZCo+pTbCMTCj/FQkKj6lMsJA2+nNxg' +
  248.         'J0FR9Q12kgCF32MzEVH1PTYTHYW3YDmxUHULlhMakbdgP7FQdQv2E' +
  249.         'xeFt2NFUVB1O1YUEYW/wqJCoOpXWFQ4FN6BXYmj6g7sKhYi78O6lF' +
  250.         'F1H9YVBYV3Y2myqLobSwuBwsexOjVUPY7ViaPwKdihFKqegh3K4sv' +
  251.         'JXKxRAVXPxRrVUPgi7NMRVS/CPkVQ+FIs1gVVL8ViFRC5AXZrjKoN' +
  252.         'sFsFpL4au7VH1auxWxHH1LmRudiqPapeja3qOK2dq5mCfXqh6nXYp' +
  253.         'xpqX4RlOqLqRVimJmqfjjW6o+rpWKMsap+IHYqg6onYobjT2rmsDq' +
  254.         'xOB1XPwur0Ufs49qaGqsext0CofQQb00TVI9hYLHxp6cauZFF1N3Y' +
  255.         'VDrV3YFHiqLoDi4qL2l9hRSFQ9SusKDRqb8R+AqHqRuwngdPaudAd' +
  256.         '1hILVbdgLTlQ+z12EhFV32MnyVD7FRYSF1VfYSH58KXlFHsIjapPs' +
  257.         'YeUqH2HJSRA1TssITdq/yp+/Eyo+qv48Ssg9Y0vKulQ9UbVZZB65b' +
  258.         'NnRdWVz14NqZc9e2JUXfbs1VS+6+K/5olVvlaqrqP4RRc/flbFr7X' +
  259.         '48esoftF8UUmp+J1SdRHcMhvIhztlAxXwr2k2kA93ygaK4JZJPR8u' +
  260.         'lKor4Io3lpAOF7qxhAK44o0vKulwmxtVF8D9frCHTLjND/aQm++/o' +
  261.         'P8u+E5i/+mYS6clnUnsPx0GvO73KvJ7BvOs+wiYoerdPOs+Ao5idb' +
  262.         '60f1JPg6qPI035aZDicrn3H+rV//RfHHih6tPPnXFKCLG/2e5PnNj' +
  263.         '/1afTeQ5UPWU2iHu8+hAfN/dXgNSjo2qqLsLsZu0rovOyqJqqK7C5' +
  264.         'WamE6Dw9qqbqCgxuNlA/IYbEI6r+FWJIdLDsfN1HAL+oGhWs/gpB5' +
  265.         'LBH1ShiXYqB/rpEMlSNChalSORwRNWoYEWNRA5fVI0KpgdJ5HBH1a' +
  266.         'hgbpNEDgVUjSImlknkEEHVqGBWnEQOHVSNCqb0yV+XkELVqGC8TyK' +
  267.         'HGqpGBYOJEjkEUTWK6A6VyCGLqlHBeOcrpgJGUDUq6MuVyKGMqlFB' +
  268.         'R7FEDnFUjQreRsv/MAh9VI0i2rslckRB1aigMV0iRyBUjQpa6iVyx' +
  269.         'ELVqOBV52ZTASOoGhU8NkzkCIeqUcRNyfx1iaCoGhVclUzkiIuqUc' +
  270.         'FpzESO0KgaFRx7JnJER9WoYJc0kSMBqkYRv2ETOXKgalTwd+A9ETC' +
  271.         'KqlEBnSMfqkYFRI58qBoVEDnyoWoUQeTIh6oBAAAAAAAAAAAAAB3+' +
  272.         'A9qZhKc=');
  273. end;
  274.  
  275. procedure Example2;
  276. begin
  277.  bmp := BitmapFromString(490, 361, 'meJzt3dtyorkOgNG8/0tnVw2z' +
  278.         'KQYSIvz7INlr3TexP4E6B9L9/Q0AAAAAAAAAAAAAAAAAAAAAAADzf' +
  279.         'AEks3ov1iAUkIqlFCQUkIqlFCQUkIqlFCQUkIqlFCQUkIqlFCQUkI' +
  280.         'qlFCQUkIqlFCQUkIqlFCQUkIqlFCRUA9FgHK+vIKE+dSumGwzixRU' +
  281.         'k1KdsbxjKiytIqI885pIORvDKChIq7rWVetCdl1WQUEG/hRIQ+vKa' +
  282.         'ChIqyPaGObymgoSKeF9JQ+jICypIqD9FEskIvXg1BQn1XrCPjNCLV' +
  283.         '1OQUO/F+ygJXXgpBQn1xqdxxITrvI6ChPpNQxkx4TqvoyChftScRU' +
  284.         '+4yIsoSKgfXckiKVzhFRQk1KvrTVSFZl4+QUI96RJkQtUv0hv9HNi' +
  285.         'VdEFCPekVZHRYg0vOgJpJFyTUo741hrY1uOQMqJl0QULddU9he5/M' +
  286.         'gJpJFyTUzaAO4/IaXHIG1Ey6IKFuyq1Zg0vOgJpJFyTUd82fMBpcc' +
  287.         'gbUTLogoSYUsL0PZEDNpAs6PNS069f6kSjXGVAz6YIODzXz+oXejs' +
  288.         'h1BtRMuqCTQ02+u+19FANqJl3QsaGWXLzjBz12cFUYUDPpgo4Nter' +
  289.         'iVX4Tn4sMqJl0QWeGWnvrLh/9zMEVYkDNpAs6MNTyK9veJzCgZtIF' +
  290.         'nRYqyX2vHyPJRfiNATWTLui0UHnue/EkeS7CjwyomXRBR4VKdVnbe' +
  291.         '28G1Ey6oHNCJbzplSMlvA6PDKiZdEGHhEp7zeaDpb0RNwbUTLqgQ0' +
  292.         'KlvabtvSsDaiZd0Amhkt+x7XjJL4UBNZMuaPtQJS7YcMgS9zqZATW' +
  293.         'TLmjvUIVu9+lRC13tTAbUTLqgvUMVup3tvRkDaiZd0PV3HWfWq9Ic' +
  294.         'q2v9YXWeYhRrJl3Q9VBSLzEzuxE3EK2ZdEG2d1G2d3KiNZMuqEsot' +
  295.         'eeb1txw2+jWTLqgXqEEn2xOcGNtJl0z6YJs76Js7+SkayZdUMdQms' +
  296.         '80obaBXqFeM+mCbO+ibO/k1GsmXVDfULJPMzq1UV4kYDPpgrqHUn6' +
  297.         'OoZ0N8ToNm0kXZHsXZXsnp2Ez6YJGhBJ/gnGRja8LGZtJFzQolP6j' +
  298.         'GVxySjaTLsgSKMrgklOymXRBvgAvyre8khOzmXRBfvhVlB83J6dnM' +
  299.         '+mCbO+ibO/k9GwmXZBf+ijKr1klJ2kz6YJs76Js7+QkbSZdkH8uoy' +
  300.         'j/QE1yqjaTLsg/NFqUf9o3OWGbSRdkexdleycnbDPpgvwHW0X5L+2' +
  301.         'S07aZdEH+c9ui/HfSycnbTLog27so2zs5eZtJFzQ5lLn0crGkQYym' +
  302.         'cDPpgmzvomzv5BRuJl3Q/FBG08WVjEYwgcjNpAtaEsp0rmtuKP4cv' +
  303.         'jhqdvLdP2J7F2V7J3f9i6NjJ3XsxT+1KpQBXdQWUPZpuvz1eua8zr' +
  304.         'x1g4WhzOiKhnqCz2R7Nzvz1g1s76Js7+R6fXF04NQOvHKbtaGMqdm' +
  305.         'n6aSerONfr6fN7rT7NlseavkBivqom8jz9f3r9agJHnXZK5aHWn6A' +
  306.         'omzv5GzvZkdd9ooMoTKcoZx4NHmX6P7X6zlzPOemF2UIleEM5djey' +
  307.         'Y0Y0CGjPOSa1yUJleQYhQSLCbvKoAGdMNAT7thFnlB5TlKCr7WTGz' +
  308.         'SgE2Z6wh27yBMqz0lKsL2TGzeg7ce6/QV7SRUq1WGS+7OVmGsNHdD' +
  309.         'ew937dh3lCZXnJCX43Du50e8A3Hi4G1+trzyh8pykBNs7uTfxe81l' +
  310.         '1/nueq/ukoRKcoxCvOckOdu72a736i5DqAxnKOfim4S/rul6lT39V' +
  311.         'qlvvS1nseWlRsgQKsMZyvloe3dfv1b6n377S3POByptvxsNsjzU8g' +
  312.         'MU9f4L86elOieyZf7otcC4JpvV3uw64ywPtfwART11e782l0Q+fJO' +
  313.         '/Dmjax6pus+uMszaUMTW7f1IdXI/LB33aGp+5vSc8/kw73WWohaHM' +
  314.         'qFnbMswQ/Jw1/njHad+5mvBRJtjmIqPZ3oVc/FZ2quDbr/H71Wbec' +
  315.         'Y+ee9xiglWhDOgjr4uuLWDC7Lvu8Jk/L376oNXtcYsJVv08a/4HrW' +
  316.         'jEDyJzxt/vU/El23vJR+xugyvMYXvn9Ocq22x7322zwxdepHrA6ue' +
  317.         'fxucG2Ux4D0n+EWyww5e/yWfhR7+o9OFn8n25PD5aWRdLlhhE3R2+' +
  318.         '/ORFu92UPvxMtncGDS/2E7b3zfJN+KlV3/H+8RgV1T35ZN7OtFbza' +
  319.         'roes9Y4Cu3wJNs7yRkaFD32fLb3Qmu/d11xHPnPfD9hkqMmOcZHKp' +
  320.         '55iWmhTOTR9c8ku/SsOJTMn4Q/HizPIfOcJKjcgVeZE8o4HqVavEV' +
  321.         'Hk/DYT0fKc8I8Jwkqd+BVbO+ZOn7emO1x5sv2SXja7f2d7DB/qnXa' +
  322.         'hSaEMoubvh06PlrpASU5/OsxkhzsLtt53ih01LVGhzKIm+4d0v5dM' +
  323.         'N/yw/94gOWnepXwSD+qcs7lbO8JRkSwvR8tPP9vHzph0oRH+lGVcy' +
  324.         '43NJQpjPvebPJP5udb8m3wNx8xZ8+cp3pS4pAZ2N7j1Gq7x7Am36L' +
  325.         'c9v5OfLC7/CdMYlyow0dQ8VtSe4wsya8wZI6Z+Wzf6Y+XR5Wv62up' +
  326.         '+06ePQaXoX/mkpnP9p3+eHlYAt2Vfgv9NoNb/m2r5CUzHy/z2VLxB' +
  327.         'XhfSb5sz/nIk61NlD9j2hOmPVg2fvjV0cy7L//csoSFn5yUaJjzkD' +
  328.         'lPlZDt3Uuedzskf/DJVr0xvkrDhOdMeKSc/NJHF6neaVzi8WfqdZe' +
  329.         'PHqdKwITnTHiknPxzGdctuXiGt1UUcv0unz5CoXrZjprtPGnZ3het' +
  330.         'urXt/amL19l4e38nO22qw2S25IvKbST85zUqfpRpmq/T8AfLpctz4' +
  331.         'DwnSc72brb2yrZ3m2l7uFy6PAfOc5LkuoQ6s/YJ23vmB5pj2jdAKn' +
  332.         'ZLcuYkx8hv/k9z9rD81tu8t3y+OW8dKRotw7EznKEE27tBhivb3ld' +
  333.         'M+I2butGWn3z5Aaq4/oP4zHpVerryiIf9PjLmQn/e6OKV6xZbfvLl' +
  334.         'B6hi71Ajbjeo2KcPu/fgJngf8Hre0gNae/jS6WbaO1T3243LZXvP9' +
  335.         '1vDLm2rD2jh+aunm2b7UB0vmGd1t/0RXv2Y0fa+WXWFDdLNcUKoXn' +
  336.         'dM8j2TK3+KJ68Zkz9bJltyiz3STXBIqLTfxmx+2EMGN8FjyRJfqc1' +
  337.         'ke2d2SCjbm9/cS/ZNus2A5l9km3SjnRPqyk2zre6Lf5Ynt5i2928m' +
  338.         '32WndEMdFSrVd5iPfTtxToXenrTEzOtslm6c00LleXeH7Z3HiF9H2' +
  339.         'mxAtndCp4VK8rbqtN+HP5DvewdNu9F+6QY5MNRHV07725oHDm6EQW' +
  340.         '846f5oScy51JbpRjgzVPDWaT/x7vUgPGX0jsE/TbjXrum6OzZU5OJ' +
  341.         'pP/Hu+DgnG/erOn0fKhXbO49jQy3Z3pZDHuN+R777Q2Uz+mobp+vr' +
  342.         '5FDv7555dXd/tNO8qeeLo4iht9s7XUeHh5rwKh70gIcP7iLb+7pxF' +
  343.         '9w+XS+Hh/rt+slX94gHPMef6fxYOSjzj/VPINTo7392f7Rxj3mCaT' +
  344.         '/vOGFAtvdaQn0Pfu9B90cb95jbm/lO0UMG5Lm9kFA35X5r44v0Rsw' +
  345.         '9oe43PSfdRULdfI3Z3vLm8dEsDO4jfXOJHyTU3T1Fryba5vHpLMzu' +
  346.         'I7b3EkI96vsFr7ZJtA3C+D7ihTOfUE984r2Z5kGY4Ke8diYT6kmXI' +
  347.         'KrmYXvP5OUzk1BPunzzRNUkrgzCEBvY3jMJ9eQWxKt+AxcHYY5tfP' +
  348.         'IzjVCPrr/tRM8kfBK4kL835xDq0cV3fYuZhB+fLeer1wmEevRUw5u' +
  349.         'Ei7K9l7O9JxDq0WuNeB8lk/DG4yR8+3E0oR41b28Zk/BLf6n4Pamh' +
  350.         'hLr7LUUkkYwZjJiCyV7k50fjCHX3JsX7ShomYXvn5OdHgwh117aiB' +
  351.         'Uxi0CDM9zrbexCh7mzvusZNwXy78M/zjiDU3Z8prrwjhXGGTsGIe/' +
  352.         'H2re6Euvv0p5PSZTB6CqbckXdw9SXU3UdPLd2SsL0Lsb37EurO9i5' +
  353.         'nwhQMui/vv+1IqDvfl6tlzhTMuruGHzDxI6HupChk2rA8K0bwCxRd' +
  354.         'CHUnRSG2d2m2dxdC3UlRxcxJeVYM0vyrzdwJdSdFCV9s5LcRT35SF' +
  355.         'SXUnRS88qyYT/Mgoe6k4JVnxXyaBwl1JwWvPCvm0zxIqDspeOVZMZ' +
  356.         '/mQUI9UoNHng9LyB4k1CM1eOT5sITsQUI9UoNHng9LyB4k1CM1eOT' +
  357.         '5sITsQUI9UoNHng9LyB4k1BNBuPFMWEX5IKGeCMKNZ8IqygcJ9UQQ' +
  358.         'bjwTVlE+SKgngnDjmbCK8kFCPRGEG8+EVZQPEuqVJngOLCR+kFCvN' +
  359.         'MFzYCHxg4R6pQmeAwuJHyTUj2Q5memvpX+QUD+S5WSmv5b+QUL9SJ' +
  360.         'aTmf5a+gcJ9RtlzmTuyxlBkFC/UeZM5r6cEQQJ9YY4pzHxDEwhSKg' +
  361.         '3xDmNiWdgCkFCvSHOaUw8A1MIEuo9fc5h1kkYRJBQ7+lzDrNOwiCC' +
  362.         'hPqTRCcw5TzMIkioP0l0AlPOwyyChIpQaW/mm4pxBAkVJNSuTDYbE' +
  363.         'wkSKkioXZlsNiYSJFScVvsx04QMJUioOK32Y6YJGUqQUB+RayemmZ' +
  364.         'O5BAn1KcX2YI5pGU2QUJ9SbA/mmJbRBAnVQLTqTDAz0wkSqo1udZl' +
  365.         'dcgYUJFQz6SoytfzMKEioZtJVZGr5mVGQUFeoV4t5lWBMQUJdJGAV' +
  366.         'JlWFSQUJdZ2G+ZlRIYYVJFQXMmZmOrWYV5BQvSiZk7mUY2RBQnUkZ' +
  367.         'jYmUpGpBQnVl555mEVRBhckVHeSZmAKdZldkFAjqLqW/qUZX5BQgw' +
  368.         'i7ivLVmWCQUONoO5/mGzDEIKGGkncmtfdgjkFCjfb1j9Wn2JzIOzH' +
  369.         'KIKHm0HkcbTdjoEFCTSP1CKrux0yDhJrJF/gdibkrYw0Saj7Nr9Nw' +
  370.         'Y4YbJNQSPm9sJt32zDdIqIXE/5RiJzDlIKHW8plkkFDnMOggoTKwm' +
  371.         't4Q5zTGHSRUHtbUE0HOZOhBQmVjZX2LcDajDxIqp2PX17EX584TIE' +
  372.         'iozL7+b/VBhjvnpvzJ0yBIqBI23mwbX402ng9BQhWy0yeoO92Fvjw' +
  373.         'rgoSqqO7qq3typvH0CBKqtCrLsMo5ycDzJEioPXw9WH2WfyU8EiV4' +
  374.         'wgQJtZ+v/9r+47IZT54gobb39ZOEjwk3nktBQp3px/Ubt/r47MwTL' +
  375.         'EgoIBVLKUgoIBVLKUgoIBVLKUgoIBVLKUgoIBVLKUgoIBVLKUgoIB' +
  376.         'VLKUgoIBVLKUgoIBVLKUgoIBVLKUgoIBVLKUgoIBVLKUgoIBVLKUg' +
  377.         'oIBVLKUgoIBVLKUgoIBVLKUgoIBVLKUgoIBVLKUgoIBVLKUgoIBVL' +
  378.         'KUgoIBVLKUgoIBVLKUgoIBVLKUgoIBVLKUgoIBVLKUgoIBVLKUgoI' +
  379.         'BVLKUgoIBVLKUgoIBVLKUgoIBVLKUgoIBVLKUgoIBVLKUgoIBVLKU' +
  380.         'goIBVLKUgoIBVLKUgoIBVLKUgoIBVLKUgoIBVLKUgoIBVLKegLIJn' +
  381.         'VexEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
  382.         'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
  383.         'IBK/gdQF2fi');
  384. end;
  385.  
  386. function Bitmap(ID: Integer): Boolean;
  387. begin
  388.   Result := ((ID = 1) or (ID = 2));
  389.   if Result then
  390.   case ID of
  391.     1: Example1;
  392.     2: Example2;
  393.   end;
  394. end;
  395.  
  396. procedure Setup;
  397. var
  398.   shape, TPA: TPointArray;
  399.   w, h, t, x, y: Integer;
  400.   start: TPoint;
  401.   area: TBox;
  402. begin
  403.   if not Bitmap(EXAMPLE) then
  404.   begin
  405.     WriteLn('Invalid example... TERMINATING!');
  406.     TerminateScript;
  407.   end;
  408.   GetBitmapSize(bmp, w, h);
  409.   DisplayDebugImgWindow(w, h);
  410.   start := Point(START_POINT_X, START_POINT_Y);
  411.   area := IntToBox(AREA_X1, AREA_Y1, AREA_X2, AREA_Y2);
  412.   if (area.X1 < 0) then
  413.     area.X1 := 0;
  414.   if (area.Y1 < 0) then
  415.     area.Y1 := 0;
  416.   if (area.X2 > (w - 1)) then
  417.     area.X2 := (w - 1);
  418.   if (area.Y2 > (h - 1)) then
  419.     area.Y2 := (h - 1);
  420.   if DEBUG_AREA then
  421.   begin
  422.     for x := area.X1 to area.X2 do
  423.       FastSetPixel(bmp, x, area.Y1, 255);
  424.     for x := area.X1 to area.X2 do
  425.       FastSetPixel(bmp, x, area.Y2, 255);
  426.     for y := area.Y1 to area.Y2 do
  427.       FastSetPixel(bmp, area.X1, y, 255);
  428.     for y := area.Y1 to area.Y2 do
  429.       FastSetPixel(bmp, area.X2, y, 255);
  430.   end;
  431.   if DEBUG_START_POINT then
  432.     if (DEBUG_START_POINT_SIZE > 1) then
  433.       SetPixels(bmp, TPAFromBox(IntToBox((START_POINT_X - DEBUG_START_POINT_SIZE), (START_POINT_Y - DEBUG_START_POINT_SIZE), (START_POINT_X + DEBUG_START_POINT_SIZE), (START_POINT_Y + DEBUG_START_POINT_SIZE))), DEBUG_START_POINT_COLOR);
  434.   DrawBitmapDebugImg(bmp);
  435.   FreeBitmap(bmp);
  436.   Bitmap(EXAMPLE);
  437.   TPA := GetBitmapColorTPA(bmp, 0);
  438.   t := GetSystemTime;
  439.   if FLOODFILL_8WAY then
  440.     shape := TPAFloodFillEx(TPA, start, ff8Way, area)
  441.   else
  442.     shape := TPAFloodFillEx(TPA, start, ff4Way, area);
  443.   WriteLn('TPAFloodFill() finished in ' + IntToStr(GetSystemTime - t) + ' ms.');
  444.   while ((GetSystemTime - t) < DISPLAY_DELAY) do
  445.     Wait(1);
  446.   SetPixels(bmp, shape, FLOODFILL_COLOR);
  447.   if DEBUG_AREA then
  448.   begin
  449.     for x := area.X1 to area.X2 do
  450.       FastSetPixel(bmp, x, area.Y1, 255);
  451.     for x := area.X1 to area.X2 do
  452.       FastSetPixel(bmp, x, area.Y2, 255);
  453.     for y := area.Y1 to area.Y2 do
  454.       FastSetPixel(bmp, area.X1, y, 255);
  455.     for y := area.Y1 to area.Y2 do
  456.       FastSetPixel(bmp, area.X2, y, 255);
  457.   end;
  458.   if DEBUG_START_POINT then
  459.     if (DEBUG_START_POINT_SIZE > 1) then
  460.       SetPixels(bmp, TPAFromBox(IntToBox((START_POINT_X - DEBUG_START_POINT_SIZE), (START_POINT_Y - DEBUG_START_POINT_SIZE), (START_POINT_X + DEBUG_START_POINT_SIZE), (START_POINT_Y + DEBUG_START_POINT_SIZE))), DEBUG_START_POINT_COLOR);
  461.   DrawBitmapDebugImg(bmp);
  462.   FreeBitmap(bmp);
  463.   SetLength(TPA, 0);
  464. end;
  465.  
  466. begin
  467.   ClearDebug;
  468.   Setup;
  469. end.
Advertisement
Add Comment
Please, Sign In to add comment