p_ga.inc 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617
  1. {
  2. Free Pascal port of the Hermes C library.
  3. Copyright (C) 2001-2003 Nikolay Nikolov ([email protected])
  4. Original C version by Christian Nentwich ([email protected])
  5. This library is free software; you can redistribute it and/or
  6. modify it under the terms of the GNU Lesser General Public
  7. License as published by the Free Software Foundation; either
  8. version 2.1 of the License, or (at your option) any later version.
  9. This library is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. Lesser General Public License for more details.
  13. You should have received a copy of the GNU Lesser General Public
  14. License along with this library; if not, write to the Free Software
  15. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  16. }
  17. {
  18. Generic format conversion routines for the HERMES library
  19. Copyright (c) 1998 Christian Nentwich ([email protected])
  20. This source code is licensed under the GNU LGPL
  21. Please refer to the file COPYING.LIB contained in the distribution for
  22. licensing conditions
  23. }
  24. Procedure ConvertP_Generic32_A_Generic32_A(iface : PHermesConverterInterface); CDecl;
  25. Var
  26. s_pixel, r, g, b, a : int32;
  27. count : DWord;
  28. source, dest : Pchar8;
  29. Begin
  30. source := iface^.s_pixels; dest := iface^.d_pixels;
  31. Repeat
  32. count := iface^.s_width;
  33. Repeat
  34. s_pixel := Pint32(source)^;
  35. r := ((s_pixel Shr iface^.info.r_right) Shl iface^.info.r_left) And
  36. iface^.mask_r;
  37. g := ((s_pixel Shr iface^.info.g_right) Shl iface^.info.g_left) And
  38. iface^.mask_g;
  39. b := ((s_pixel Shr iface^.info.b_right) Shl iface^.info.b_left) And
  40. iface^.mask_b;
  41. a := ((s_pixel Shr iface^.info.a_right) Shl iface^.info.a_left) And
  42. iface^.mask_a;
  43. Pint32(dest)^ := r Or g Or b Or a;
  44. Inc(source, 4);
  45. Inc(dest, 4);
  46. Dec(count);
  47. Until count = 0;
  48. Inc(source, iface^.s_add);
  49. Inc(dest, iface^.d_add);
  50. Dec(iface^.s_height);
  51. Until iface^.s_height = 0;
  52. End;
  53. Procedure ConvertP_Generic32_A_Generic24_A(iface : PHermesConverterInterface); CDecl;
  54. Var
  55. s_pixel, r, g, b, a : int32;
  56. d_ptr : Pchar8;
  57. count : DWord;
  58. source, dest : Pchar8;
  59. Begin
  60. d_ptr := @s_pixel;
  61. source := iface^.s_pixels; dest := iface^.d_pixels;
  62. Repeat
  63. count := iface^.s_width;
  64. Repeat
  65. s_pixel := Pint32(source)^;
  66. r := ((s_pixel Shr iface^.info.r_right) Shl iface^.info.r_left) And
  67. iface^.mask_r;
  68. g := ((s_pixel Shr iface^.info.g_right) Shl iface^.info.g_left) And
  69. iface^.mask_g;
  70. b := ((s_pixel Shr iface^.info.b_right) Shl iface^.info.b_left) And
  71. iface^.mask_b;
  72. a := ((s_pixel Shr iface^.info.a_right) Shl iface^.info.a_left) And
  73. iface^.mask_a;
  74. s_pixel := r Or g Or b Or a;
  75. (dest+R_24)^ := (d_ptr+R_32)^;
  76. (dest+G_24)^ := (d_ptr+G_32)^;
  77. (dest+B_24)^ := (d_ptr+B_32)^;
  78. Inc(source, 4);
  79. Inc(dest, 3);
  80. Dec(count);
  81. Until count = 0;
  82. Inc(source, iface^.s_add);
  83. Inc(dest, iface^.d_add);
  84. Dec(iface^.s_height);
  85. Until iface^.s_height = 0;
  86. End;
  87. Procedure ConvertP_Generic32_A_Generic16_A(iface : PHermesConverterInterface); CDecl;
  88. Var
  89. s_pixel, r, g, b, a : int32;
  90. count : DWord;
  91. source, dest : Pchar8;
  92. Begin
  93. source := iface^.s_pixels; dest := iface^.d_pixels;
  94. Repeat
  95. count := iface^.s_width Shr 1;
  96. If count <> 0 Then
  97. Repeat
  98. r := (((Pint32(source)^) Shr iface^.info.r_right) Shl iface^.info.r_left) And
  99. iface^.mask_r;
  100. g := (((Pint32(source)^) Shr iface^.info.g_right) Shl iface^.info.g_left) And
  101. iface^.mask_g;
  102. b := (((Pint32(source)^) Shr iface^.info.b_right) Shl iface^.info.b_left) And
  103. iface^.mask_b;
  104. a := (((Pint32(source)^) Shr iface^.info.a_right) Shl iface^.info.a_left) And
  105. iface^.mask_a;
  106. s_pixel := (r Or g Or b Or a) And $FFFF;
  107. r := ((((Pint32(source)+1)^) Shr iface^.info.r_right) Shl iface^.info.r_left) And
  108. iface^.mask_r;
  109. g := ((((Pint32(source)+1)^) Shr iface^.info.g_right) Shl iface^.info.g_left) And
  110. iface^.mask_g;
  111. b := ((((Pint32(source)+1)^) Shr iface^.info.b_right) Shl iface^.info.b_left) And
  112. iface^.mask_b;
  113. a := ((((Pint32(source)+1)^) Shr iface^.info.a_right) Shl iface^.info.a_left) And
  114. iface^.mask_a;
  115. s_pixel := s_pixel Or ((r Or g Or b Or a) Shl 16);
  116. Pint32(dest)^ := s_pixel;
  117. Inc(source, 8);
  118. Inc(dest, 4);
  119. Dec(count);
  120. Until count = 0;
  121. { Trailing pixel }
  122. If (iface^.s_width And 1) <> 0 Then
  123. Begin
  124. r := (((Pint32(source)^) Shr iface^.info.r_right) Shl iface^.info.r_left) And
  125. iface^.mask_r;
  126. g := (((Pint32(source)^) Shr iface^.info.g_right) Shl iface^.info.g_left) And
  127. iface^.mask_g;
  128. b := (((Pint32(source)^) Shr iface^.info.b_right) Shl iface^.info.b_left) And
  129. iface^.mask_b;
  130. a := (((Pint32(source)^) Shr iface^.info.a_right) Shl iface^.info.a_left) And
  131. iface^.mask_a;
  132. Pshort16(dest)^ := r Or g Or b Or a;
  133. Inc(dest, 2);
  134. Inc(source, 4);
  135. End;
  136. Inc(source, iface^.s_add);
  137. Inc(dest, iface^.d_add);
  138. Dec(iface^.s_height);
  139. Until iface^.s_height = 0;
  140. End;
  141. Procedure ConvertP_Generic32_A_Generic8_A(iface : PHermesConverterInterface); CDecl;
  142. Var
  143. s_pixel, r, g, b, a : int32;
  144. count : DWord;
  145. source, dest : Pchar8;
  146. Begin
  147. source := iface^.s_pixels; dest := iface^.d_pixels;
  148. Repeat
  149. count := iface^.s_width;
  150. Repeat
  151. s_pixel := Pint32(source)^;
  152. r := ((s_pixel Shr iface^.info.r_right) Shl iface^.info.r_left) And
  153. iface^.mask_r;
  154. g := ((s_pixel Shr iface^.info.g_right) Shl iface^.info.g_left) And
  155. iface^.mask_g;
  156. b := ((s_pixel Shr iface^.info.b_right) Shl iface^.info.b_left) And
  157. iface^.mask_b;
  158. a := ((s_pixel Shr iface^.info.a_right) Shl iface^.info.a_left) And
  159. iface^.mask_a;
  160. dest^ := r Or g Or b Or a;
  161. Inc(source, 4);
  162. Inc(dest);
  163. Dec(count);
  164. Until count = 0;
  165. Inc(source, iface^.s_add);
  166. Inc(dest, iface^.d_add);
  167. Dec(iface^.s_height);
  168. Until iface^.s_height = 0;
  169. End;
  170. Procedure ConvertP_Generic24_A_Generic32_A(iface : PHermesConverterInterface); CDecl;
  171. Var
  172. s_pixel, r, g, b, a : int32;
  173. count : DWord;
  174. source, dest : Pchar8;
  175. Begin
  176. source := iface^.s_pixels; dest := iface^.d_pixels;
  177. Repeat
  178. count := iface^.s_width;
  179. Repeat
  180. s_pixel := ((Pint32(source+R_24)^) Shl 16) Or
  181. ((Pint32(source+G_24)^) Shl 8) Or
  182. (PInt32(source+B_24)^);
  183. r := ((s_pixel Shr iface^.info.r_right) Shl iface^.info.r_left) And
  184. iface^.mask_r;
  185. g := ((s_pixel Shr iface^.info.g_right) Shl iface^.info.g_left) And
  186. iface^.mask_g;
  187. b := ((s_pixel Shr iface^.info.b_right) Shl iface^.info.b_left) And
  188. iface^.mask_b;
  189. a := ((s_pixel Shr iface^.info.a_right) Shl iface^.info.a_left) And
  190. iface^.mask_a;
  191. Pint32(dest)^ := r Or g Or b Or a;
  192. Inc(source, 3);
  193. Inc(dest, 4);
  194. Dec(count);
  195. Until count = 0;
  196. Inc(source, iface^.s_add);
  197. Inc(dest, iface^.d_add);
  198. Dec(iface^.s_height);
  199. Until iface^.s_height = 0;
  200. End;
  201. Procedure ConvertP_Generic24_A_Generic24_A(iface : PHermesConverterInterface); CDecl;
  202. Var
  203. s_pixel, r, g, b, a : int32;
  204. d_ptr : Pchar8;
  205. count : DWord;
  206. source, dest : PChar8;
  207. Begin
  208. d_ptr := @s_pixel;
  209. source := iface^.s_pixels; dest := iface^.d_pixels;
  210. Repeat
  211. count := iface^.s_width;
  212. Repeat
  213. s_pixel := ((Pint32(source+R_24)^) Shl 16) Or
  214. ((Pint32(source+G_24)^) Shl 8) Or
  215. (PInt32(source+B_24)^);
  216. r := ((s_pixel Shl iface^.info.r_left) Shr iface^.info.r_right) And
  217. iface^.mask_r;
  218. g := ((s_pixel Shl iface^.info.g_left) Shr iface^.info.g_right) And
  219. iface^.mask_g;
  220. b := ((s_pixel Shl iface^.info.b_left) Shr iface^.info.b_right) And
  221. iface^.mask_b;
  222. a := ((s_pixel Shl iface^.info.a_left) Shr iface^.info.a_right) And
  223. iface^.mask_a;
  224. s_pixel := r Or g Or b Or a;
  225. (dest + R_24)^ := (d_ptr + R_32)^;
  226. (dest + G_24)^ := (d_ptr + G_32)^;
  227. (dest + B_24)^ := (d_ptr + B_32)^;
  228. Inc(source, 3);
  229. Inc(dest, 3);
  230. Dec(count);
  231. Until count = 0;
  232. Inc(source, iface^.s_add);
  233. Inc(dest, iface^.d_add);
  234. Dec(iface^.s_height);
  235. Until iface^.s_height = 0;
  236. End;
  237. Procedure ConvertP_Generic24_A_Generic16_A(iface : PHermesConverterInterface); CDecl;
  238. Var
  239. s_pixel, r, g, b, a : int32;
  240. count : DWord;
  241. source, dest : Pchar8;
  242. Begin
  243. source := iface^.s_pixels; dest := iface^.d_pixels;
  244. Repeat
  245. count := iface^.s_width;
  246. Repeat
  247. s_pixel := ((Pint32(source+R_24)^) Shl 16) Or
  248. ((Pint32(source+G_24)^) Shl 8) Or
  249. (PInt32(source+B_24)^);
  250. r := ((s_pixel Shr iface^.info.r_right) Shl iface^.info.r_left) And
  251. iface^.mask_r;
  252. g := ((s_pixel Shr iface^.info.g_right) Shl iface^.info.g_left) And
  253. iface^.mask_g;
  254. b := ((s_pixel Shr iface^.info.b_right) Shl iface^.info.b_left) And
  255. iface^.mask_b;
  256. a := ((s_pixel Shr iface^.info.a_right) Shl iface^.info.a_left) And
  257. iface^.mask_a;
  258. Pshort16(dest)^ := r Or g Or b Or a;
  259. Inc(source, 3);
  260. Inc(dest, 2);
  261. Dec(count);
  262. Until count = 0;
  263. Inc(source, iface^.s_add);
  264. Inc(dest, iface^.d_add);
  265. Dec(iface^.s_height);
  266. Until iface^.s_height = 0;
  267. End;
  268. Procedure ConvertP_Generic24_A_Generic8_A(iface : PHermesConverterInterface); CDecl;
  269. Var
  270. s_pixel, r, g, b, a : int32;
  271. count : DWord;
  272. source, dest : Pchar8;
  273. Begin
  274. source := iface^.s_pixels; dest := iface^.d_pixels;
  275. Repeat
  276. count := iface^.s_width;
  277. Repeat
  278. s_pixel := ((Pint32(source+R_24)^) Shl 16) Or
  279. ((Pint32(source+G_24)^) Shl 8) Or
  280. (PInt32(source+B_24)^);
  281. r := ((s_pixel Shr iface^.info.r_right) Shl iface^.info.r_left) And
  282. iface^.mask_r;
  283. g := ((s_pixel Shr iface^.info.g_right) Shl iface^.info.g_left) And
  284. iface^.mask_g;
  285. b := ((s_pixel Shr iface^.info.b_right) Shl iface^.info.b_left) And
  286. iface^.mask_b;
  287. a := ((s_pixel Shr iface^.info.a_right) Shl iface^.info.a_left) And
  288. iface^.mask_a;
  289. dest^ := r Or g Or b Or a;
  290. Inc(source, 3);
  291. Inc(dest);
  292. Dec(count);
  293. Until count = 0;
  294. Inc(source, iface^.s_add);
  295. Inc(dest, iface^.d_add);
  296. Dec(iface^.s_height);
  297. Until iface^.s_height = 0;
  298. End;
  299. Procedure ConvertP_Generic16_A_Generic32_A(iface : PHermesConverterInterface); CDecl;
  300. Var
  301. s_pixel, r, g, b, a : int32;
  302. count : DWord;
  303. source, dest : Pchar8;
  304. Begin
  305. source := iface^.s_pixels; dest := iface^.d_pixels;
  306. Repeat
  307. count := iface^.s_width;
  308. Repeat
  309. s_pixel := Pshort16(source)^;
  310. r := ((s_pixel Shr iface^.info.r_right) Shl iface^.info.r_left) And
  311. iface^.mask_r;
  312. g := ((s_pixel Shr iface^.info.g_right) Shl iface^.info.g_left) And
  313. iface^.mask_g;
  314. b := ((s_pixel Shr iface^.info.b_right) Shl iface^.info.b_left) And
  315. iface^.mask_b;
  316. a := ((s_pixel Shr iface^.info.a_right) Shl iface^.info.a_left) And
  317. iface^.mask_a;
  318. Pint32(dest)^ := r Or g Or b Or a;
  319. Inc(source, 2);
  320. Inc(dest, 4);
  321. Dec(count);
  322. Until count = 0;
  323. Inc(source, iface^.s_add);
  324. Inc(dest, iface^.d_add);
  325. Dec(iface^.s_height);
  326. Until iface^.s_height = 0;
  327. End;
  328. Procedure ConvertP_Generic16_A_Generic24_A(iface : PHermesConverterInterface); CDecl;
  329. Var
  330. s_pixel, r, g, b, a : int32;
  331. d_ptr : Pchar8;
  332. count : DWord;
  333. source, dest : Pchar8;
  334. Begin
  335. d_ptr := @s_pixel;
  336. source := iface^.s_pixels; dest := iface^.d_pixels;
  337. Repeat
  338. count := iface^.s_width;
  339. Repeat
  340. s_pixel := Pshort16(source)^;
  341. r := ((s_pixel Shr iface^.info.r_right) Shl iface^.info.r_left) And
  342. iface^.mask_r;
  343. g := ((s_pixel Shr iface^.info.g_right) Shl iface^.info.g_left) And
  344. iface^.mask_g;
  345. b := ((s_pixel Shr iface^.info.b_right) Shl iface^.info.b_left) And
  346. iface^.mask_b;
  347. a := ((s_pixel Shr iface^.info.a_right) Shl iface^.info.a_left) And
  348. iface^.mask_a;
  349. s_pixel := r Or g Or b Or a;
  350. (dest + R_24)^ := (d_ptr + R_32)^;
  351. (dest + G_24)^ := (d_ptr + G_32)^;
  352. (dest + B_24)^ := (d_ptr + B_32)^;
  353. Inc(source, 2);
  354. Inc(dest, 3);
  355. Dec(count);
  356. Until count = 0;
  357. Inc(source, iface^.s_add);
  358. Inc(dest, iface^.d_add);
  359. Dec(iface^.s_height);
  360. Until iface^.s_height = 0;
  361. End;
  362. Procedure ConvertP_Generic16_A_Generic16_A(iface : PHermesConverterInterface); CDecl;
  363. Var
  364. s_pixel, r, g, b, a : int32;
  365. count : DWord;
  366. source, dest : Pchar8;
  367. Begin
  368. source := iface^.s_pixels; dest := iface^.d_pixels;
  369. Repeat
  370. count := iface^.s_width;
  371. Repeat
  372. s_pixel := Pshort16(source)^;
  373. r := ((s_pixel Shr iface^.info.r_right) Shl iface^.info.r_left) And
  374. iface^.mask_r;
  375. g := ((s_pixel Shr iface^.info.g_right) Shl iface^.info.g_left) And
  376. iface^.mask_g;
  377. b := ((s_pixel Shr iface^.info.b_right) Shl iface^.info.b_left) And
  378. iface^.mask_b;
  379. a := ((s_pixel Shr iface^.info.a_right) Shl iface^.info.a_left) And
  380. iface^.mask_a;
  381. Pshort16(dest)^ := r Or g Or b Or a;
  382. Inc(source, 2);
  383. Inc(dest, 2);
  384. Dec(count);
  385. Until count = 0;
  386. Inc(source, iface^.s_add);
  387. Inc(dest, iface^.d_add);
  388. Dec(iface^.s_height);
  389. Until iface^.s_height = 0;
  390. End;
  391. Procedure ConvertP_Generic16_A_Generic8_A(iface : PHermesConverterInterface); CDecl;
  392. Var
  393. s_pixel, r, g, b, a : int32;
  394. count : DWord;
  395. source, dest : Pchar8;
  396. Begin
  397. source := iface^.s_pixels; dest := iface^.d_pixels;
  398. Repeat
  399. count := iface^.s_width;
  400. Repeat
  401. s_pixel := Pshort16(source)^;
  402. r := ((s_pixel Shr iface^.info.r_right) Shl iface^.info.r_left) And
  403. iface^.mask_r;
  404. g := ((s_pixel Shr iface^.info.g_right) Shl iface^.info.g_left) And
  405. iface^.mask_g;
  406. b := ((s_pixel Shr iface^.info.b_right) Shl iface^.info.b_left) And
  407. iface^.mask_b;
  408. a := ((s_pixel Shr iface^.info.a_right) Shl iface^.info.a_left) And
  409. iface^.mask_a;
  410. dest^ := r Or g Or b Or a;
  411. Inc(source, 2);
  412. Inc(dest);
  413. Dec(count);
  414. Until count = 0;
  415. Inc(source, iface^.s_add);
  416. Inc(dest, iface^.d_add);
  417. Dec(iface^.s_height);
  418. Until iface^.s_height = 0;
  419. End;
  420. { -------------------------------------------------------------------------
  421. STRETCH CONVERTERS
  422. ------------------------------------------------------------------------- }
  423. Procedure ConvertP_Generic32_A_Generic32_A_S(iface : PHermesConverterInterface); CDecl;
  424. Var
  425. s_pixel, r, g, b, a : int32;
  426. count : DWord;
  427. source, dest : Pchar8;
  428. dx, dy, x, y : DWord;
  429. Begin
  430. source := iface^.s_pixels;
  431. dest := iface^.d_pixels;
  432. dy := (iface^.s_height Shl 16) Div iface^.d_height;
  433. dx := (iface^.s_width Shl 16) Div iface^.d_width;
  434. y := 0;
  435. Repeat
  436. count := iface^.d_width;
  437. x := 0;
  438. Repeat
  439. s_pixel := (Pint32(source)+(x Shr 16))^;
  440. r := ((s_pixel Shr iface^.info.r_right) Shl iface^.info.r_left) And
  441. iface^.mask_r;
  442. g := ((s_pixel Shr iface^.info.g_right) Shl iface^.info.g_left) And
  443. iface^.mask_g;
  444. b := ((s_pixel Shr iface^.info.b_right) Shl iface^.info.b_left) And
  445. iface^.mask_b;
  446. a := ((s_pixel Shr iface^.info.a_right) Shl iface^.info.a_left) And
  447. iface^.mask_a;
  448. Pint32(dest)^ := r Or g Or b Or a;
  449. Inc(x, dx);
  450. Inc(dest, 4);
  451. Dec(count);
  452. Until count = 0;
  453. Inc(dest, iface^.d_add);
  454. Inc(y, dy);
  455. Inc(source, (y Shr 16)*DWord(iface^.s_pitch));
  456. y := y And $ffff;
  457. Dec(iface^.d_height);
  458. Until iface^.d_height = 0;
  459. End;
  460. Procedure ConvertP_Generic32_A_Generic16_A_S(iface : PHermesConverterInterface); CDecl;
  461. Var
  462. s_pixel, r, g, b, a : int32;
  463. count : DWord;
  464. source, dest : Pchar8;
  465. dx, dy, x, y : DWord;
  466. Begin
  467. source := iface^.s_pixels;
  468. dest := iface^.d_pixels;
  469. dy := (iface^.s_height Shl 16) Div iface^.d_height;
  470. dx := (iface^.s_width Shl 16) Div iface^.d_width;
  471. y := 0;
  472. Repeat
  473. count := iface^.d_width;
  474. x := 0;
  475. Repeat
  476. s_pixel := (Pint32(source)+(x Shr 16))^;
  477. r := ((s_pixel Shr iface^.info.r_right) Shl iface^.info.r_left) And
  478. iface^.mask_r;
  479. g := ((s_pixel Shr iface^.info.g_right) Shl iface^.info.g_left) And
  480. iface^.mask_g;
  481. b := ((s_pixel Shr iface^.info.b_right) Shl iface^.info.b_left) And
  482. iface^.mask_b;
  483. a := ((s_pixel Shr iface^.info.a_right) Shl iface^.info.a_left) And
  484. iface^.mask_a;
  485. Pshort16(dest)^ := r Or g Or b Or a;
  486. Inc(x, dx);
  487. Inc(dest, 2);
  488. Dec(count);
  489. Until count = 0;
  490. Inc(dest, iface^.d_add);
  491. Inc(y, dy);
  492. Inc(source, (y Shr 16)*DWord(iface^.s_pitch));
  493. y := y And $ffff;
  494. Dec(iface^.d_height);
  495. Until iface^.d_height = 0;
  496. End;