p_16.inc 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795
  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. 16 bit to * converters 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. { TO 32 BIT RGB }
  25. Procedure ConvertP_16rgb565_32rgb888(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  26. Var
  27. d_pixel : int32;
  28. Begin
  29. Repeat
  30. d_pixel := Pshort16(source)^;
  31. d_pixel := ((d_pixel And $f800) Shl 8) Or ((d_pixel And $7e0) Shl 5) Or
  32. ((d_pixel And $1f) Shl 3) Or $030103;
  33. Pint32(dest)^ := d_pixel;
  34. Inc(source, 2);
  35. Inc(dest, 4);
  36. Dec(count);
  37. Until count = 0;
  38. End;
  39. { TO 32 BIT BGR }
  40. Procedure ConvertP_16rgb565_32bgr888(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  41. Var
  42. d_pixel : int32;
  43. Begin
  44. Repeat
  45. d_pixel := Pshort16(source)^;
  46. d_pixel := ((d_pixel And $f800) Shr 8) Or ((d_pixel And $7e0) Shl 5) Or
  47. ((d_pixel And $1f) Shl 19) Or $030103;
  48. Pint32(dest)^ := d_pixel;
  49. Inc(source, 2);
  50. Inc(dest, 4);
  51. Dec(count);
  52. Until count = 0;
  53. End;
  54. { TO 32 BIT RGBA }
  55. Procedure ConvertP_16rgb565_32rgba888(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  56. Var
  57. d_pixel : int32;
  58. Begin
  59. Repeat
  60. d_pixel := Pshort16(source)^;
  61. d_pixel := ((d_pixel And $f800) Shl 8) Or ((d_pixel And $7e0) Shl 5) Or
  62. ((d_pixel And $1f) Shl 3) Or $030103;
  63. Pint32(dest)^ := (d_pixel Shl 8) Or $ff;
  64. Inc(source, 2);
  65. Inc(dest, 4);
  66. Dec(count);
  67. Until count = 0;
  68. End;
  69. { TO 32 BIT BGRA }
  70. Procedure ConvertP_16rgb565_32bgra888(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  71. Var
  72. d_pixel : int32;
  73. Begin
  74. Repeat
  75. d_pixel := Pshort16(source)^;
  76. d_pixel := ((d_pixel And $f800) Shr 8) Or ((d_pixel And $7e0) Shl 5) Or
  77. ((d_pixel And $1f) Shl 19) Or $030103;
  78. Pint32(dest)^ := (d_pixel Shl 8) Or $ff;
  79. Inc(source, 2);
  80. Inc(dest, 4);
  81. Dec(count);
  82. Until count = 0;
  83. End;
  84. { TO 24 BIT RGB }
  85. Procedure ConvertP_16rgb565_24rgb888(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  86. Var
  87. d_pixel : int32;
  88. d_ptr : Pchar8;
  89. Begin
  90. d_ptr := @d_pixel;
  91. Repeat
  92. d_pixel := Pshort16(source)^;
  93. d_pixel := ((d_pixel And $f800) Shl 8) Or ((d_pixel And $7e0) Shl 5) Or
  94. ((d_pixel And $1f) Shl 3) Or $030103;
  95. (dest + R_24)^ := (d_ptr + R_32)^;
  96. (dest + G_24)^ := (d_ptr + G_32)^;
  97. (dest + B_24)^ := (d_ptr + B_32)^;
  98. Inc(source, 2);
  99. Inc(dest, 3);
  100. Dec(count);
  101. Until count = 0;
  102. End;
  103. { TO 24 BIT BGR }
  104. Procedure ConvertP_16rgb565_24bgr888(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  105. Var
  106. d_pixel : int32;
  107. d_ptr : Pchar8;
  108. Begin
  109. d_ptr := @d_pixel;
  110. Repeat
  111. d_pixel := Pshort16(source)^;
  112. d_pixel := ((d_pixel And $f800) Shl 8) Or ((d_pixel And $7e0) Shl 5) Or
  113. ((d_pixel And $1f) Shl 3) Or $030103;
  114. { Red and blue are swapped here }
  115. (dest + R_24)^ := (d_ptr + B_32)^;
  116. (dest + G_24)^ := (d_ptr + G_32)^;
  117. (dest + B_24)^ := (d_ptr + R_32)^;
  118. Inc(source, 2);
  119. Inc(dest, 3);
  120. Dec(count);
  121. Until count = 0;
  122. End;
  123. { TO 16 BIT BGR 565 }
  124. Procedure ConvertP_16rgb565_16bgr565(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  125. Var
  126. i : DWord;
  127. s_pixel : int32;
  128. Begin
  129. { If we are not aligned to a dword, try and convert a single pixel }
  130. If (PtrUInt(dest) And $3) <> 0 Then
  131. Begin
  132. s_pixel := Pshort16(source)^;
  133. { Swap around R and B, leave G unchanged }
  134. s_pixel := (s_pixel Shr 11) Or (s_pixel And $7e0) Or
  135. ((s_pixel Shl 11) And $f800);
  136. Pshort16(dest)^ := s_pixel;
  137. Dec(count);
  138. Inc(dest, 2); Inc(source, 2);
  139. End;
  140. { Now copy blocks of dwords }
  141. For i := 1 To count Shr 1 Do
  142. Begin
  143. s_pixel := Pint32(source)^;
  144. { Leave G unchanged, shift R to the right and B to the left }
  145. s_pixel := (s_pixel And $07e007e0) Or ((s_pixel And $f800f800) Shr 11) Or
  146. ((s_pixel And $001f001f) Shl 11);
  147. Pint32(dest)^ := s_pixel;
  148. Inc(source, 4); Inc(dest, 4);
  149. End;
  150. If (count And 1) <> 0 Then
  151. Begin
  152. s_pixel := Pshort16(source)^;
  153. { Swap around R and B, leave G unchanged }
  154. s_pixel := (s_pixel Shr 11) Or (s_pixel And $7e0) Or
  155. ((s_pixel Shl 11) And $f800);
  156. Pshort16(dest)^ := s_pixel;
  157. End;
  158. End;
  159. { TO 16 BIT RGB 555 }
  160. Procedure ConvertP_16rgb565_16rgb555(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  161. Var
  162. i : DWord;
  163. s_pixel : int32;
  164. Begin
  165. { If we are not aligned to a dword, try and convert a single pixel }
  166. If (PtrUInt(dest) And $3) <> 0 Then
  167. Begin
  168. s_pixel := Pshort16(source)^;
  169. { Leave blue untouched, mask red and shift by one, mask green and shift
  170. by one }
  171. s_pixel := (s_pixel And $1f) Or ((s_pixel And $f800) Shr 1) Or
  172. ((s_pixel And $7c0) Shr 1);
  173. Pshort16(dest)^ := s_pixel;
  174. Dec(count);
  175. Inc(dest, 2); Inc(source, 2);
  176. End;
  177. { Now copy blocks of dwords }
  178. For i := 1 To count Shr 1 Do
  179. Begin
  180. s_pixel := Pint32(source)^;
  181. { Leave blue untouched, mask red and shift by one, mask green and shift
  182. by one }
  183. s_pixel := (s_pixel And $001f001f) Or ((s_pixel And $f800f800) Shr 1) Or
  184. ((s_pixel And $07c007c0) Shr 1);
  185. Pint32(dest)^ := s_pixel;
  186. Inc(source, 4); Inc(dest, 4);
  187. End;
  188. If (count And 1) <> 0 Then
  189. Begin
  190. s_pixel := Pshort16(source)^;
  191. { Leave blue untouched, mask red and shift by one, mask green and shift
  192. by one }
  193. s_pixel := (s_pixel And $1f) Or ((s_pixel And $f800) Shr 1) Or
  194. ((s_pixel And $7c0) Shr 1);
  195. Pshort16(dest)^ := s_pixel;
  196. End;
  197. End;
  198. { TO 16 BIT BGR 555 }
  199. Procedure ConvertP_16rgb565_16bgr555(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  200. Var
  201. i : DWord;
  202. s_pixel : int32;
  203. Begin
  204. { If we are not aligned to a dword, try and convert a single pixel }
  205. If (PtrUInt(dest) And $3) <> 0 Then
  206. Begin
  207. s_pixel := Pshort16(source)^;
  208. { Shift red right by 11, mask green and shift right one, shift blue
  209. left ten }
  210. s_pixel := ((s_pixel And $f800) Shr 11) Or ((s_pixel And $7c0) Shr 1) Or
  211. ((s_pixel And $1f) Shl 10);
  212. Pshort16(dest)^ := s_pixel;
  213. Dec(count);
  214. Inc(dest, 2); Inc(source, 2);
  215. End;
  216. { Now copy blocks of dwords }
  217. For i := 1 To count Shr 1 Do
  218. Begin
  219. s_pixel := Pint32(source)^;
  220. { Shift red right by 11, mask green and shift right one, shift blue
  221. left ten }
  222. s_pixel := ((s_pixel And $f800f800) Shr 11) Or
  223. ((s_pixel And $07c007c0) Shr 1) Or
  224. ((s_pixel And $001f001f) Shl 10);
  225. Pint32(dest)^ := s_pixel;
  226. Inc(source, 4); Inc(dest, 4);
  227. End;
  228. If (count And 1) <> 0 Then
  229. Begin
  230. s_pixel := Pshort16(source)^;
  231. { Shift red right by 11, mask green and shift right one, shift blue
  232. left ten }
  233. s_pixel := ((s_pixel And $f800) Shr 11) Or ((s_pixel And $7c0) Shr 1) Or
  234. ((s_pixel And $1f) Shl 10);
  235. Pshort16(dest)^ := s_pixel;
  236. End;
  237. End;
  238. { TO 8 BIT RGB 332 }
  239. Procedure ConvertP_16rgb565_8rgb332(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  240. Var
  241. s_block, d_block : int32;
  242. i : DWord;
  243. Begin
  244. { Align to dword first }
  245. While (PtrUInt(dest) And $3) <> 0 Do
  246. Begin
  247. s_block := Pshort16(source)^;
  248. s_block := ((s_block And $e000) Shr 8) Or ((s_block And $0700) Shr 6) Or
  249. ((s_block And $18) Shr 3);
  250. dest^ := s_block;
  251. Dec(count);
  252. If count = 0 Then
  253. Exit;
  254. Inc(source, 2);
  255. Inc(dest);
  256. End;
  257. { Write blocks of four pixels }
  258. For i := 1 To count Shr 2 Do
  259. Begin
  260. { Read and process first two pixels }
  261. s_block := Pint32(source)^;
  262. d_block := ((s_block And $e000e000) Shr 8) Or
  263. ((s_block And $07000700) Shr 6) Or
  264. ((s_block And $00180018) Shr 3);
  265. d_block := (d_block And $ff) Or ((d_block And $ff0000) Shr 8);
  266. { And the second two }
  267. s_block := (Pint32(source)+1)^;
  268. s_block := ((s_block And $e000e000) Shr 8) Or
  269. ((s_block And $07000700) Shr 6) Or
  270. ((s_block And $00180018) Shr 3);
  271. s_block := (s_block And $ff) Or ((s_block And $ff0000) Shr 8);
  272. { Put it all in one dword and write it }
  273. d_block := d_block Or (s_block Shl 16);
  274. Pint32(dest)^ := d_block;
  275. Inc(source, 8);
  276. Inc(dest, 4);
  277. End;
  278. { Clean up remaining pixels }
  279. count := count And 3;
  280. While count > 0 Do
  281. Begin
  282. Dec(count);
  283. s_block := Pshort16(source)^;
  284. dest^ := ((s_block And $e000) Shr 8) Or ((s_block And $0700) Shr 6) Or
  285. ((s_block And $18) Shr 3);
  286. Inc(dest);
  287. Inc(source, 2);
  288. End;
  289. End;
  290. { -------------------------------------------------------------------------
  291. STRETCH CONVERTERS
  292. ------------------------------------------------------------------------- }
  293. Procedure ConvertP_16rgb565_32rgb888_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  294. Var
  295. x : DWord;
  296. p : int32;
  297. Begin
  298. x := 0;
  299. Repeat
  300. p := (((Pshort16(source) + (x Shr 16))^ And $f800) Shl 8) Or
  301. (((Pshort16(source) + (x Shr 16))^ And $7e0) Shl 5) Or
  302. (((Pshort16(source) + (x Shr 16))^ And $1f) Shl 3) Or $30103;
  303. Inc(x, inc_source);
  304. Pint32(dest)^ := p;
  305. Inc(dest, 4);
  306. Dec(count);
  307. Until count = 0;
  308. End;
  309. Procedure ConvertP_16rgb565_32bgr888_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  310. Var
  311. d_pixel : int32;
  312. x : DWord;
  313. Begin
  314. x := 0;
  315. Repeat
  316. d_pixel := (Pshort16(source) + (x Shr 16))^;
  317. d_pixel := ((d_pixel And $f800) Shr 8) Or ((d_pixel And $7e0) Shl 5) Or
  318. ((d_pixel And $1f) Shl 19) Or $30103;
  319. Pint32(dest)^ := d_pixel;
  320. Inc(dest, 4);
  321. Inc(x, inc_source);
  322. Dec(count);
  323. Until count = 0;
  324. End;
  325. Procedure ConvertP_16rgb565_32rgba888_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  326. Var
  327. x : DWord;
  328. p : int32;
  329. Begin
  330. x := 0;
  331. Repeat
  332. p := (((Pshort16(source) + (x Shr 16))^ And $f800) Shl (8+8)) Or
  333. (((Pshort16(source) + (x Shr 16))^ And $7e0) Shl (5+8)) Or
  334. (((Pshort16(source) + (x Shr 16))^ And $1f) Shl (3+8)) Or $30103ff;
  335. Inc(x, inc_source);
  336. Pint32(dest)^ := p;
  337. Inc(dest, 4);
  338. Dec(count);
  339. Until count = 0;
  340. End;
  341. Procedure ConvertP_16rgb565_32bgra888_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  342. Var
  343. d_pixel : int32;
  344. x : DWord;
  345. Begin
  346. x := 0;
  347. Repeat
  348. d_pixel := (Pshort16(source) + (x Shr 16))^;
  349. d_pixel := ((d_pixel And $f800) {Shr 8}) Or ((d_pixel And $7e0) Shl (5+8)) Or
  350. ((d_pixel And $1f) Shl (19+8)) Or $30103ff;
  351. Pint32(dest)^ := d_pixel;
  352. Inc(dest, 4);
  353. Inc(x, inc_source);
  354. Dec(count);
  355. Until count = 0;
  356. End;
  357. Procedure ConvertP_16rgb565_24rgb888_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  358. Var
  359. x : DWord;
  360. p1, p2, p3, p4 : DWord;
  361. c : DWord;
  362. Begin
  363. x := 0;
  364. While (PtrUInt(dest) And 3) <> 0 Do
  365. Begin
  366. p1 := (((Pshort16(source) + (x Shr 16))^ And $f800) Shl 8) Or
  367. (((Pshort16(source) + (x Shr 16))^ And $7e0) Shl 5) Or
  368. (((Pshort16(source) + (x Shr 16))^ And $1f) Shl 3) Or $30103;
  369. Pshort16(dest)^ := p1 And $FFFF;
  370. (dest + 2)^ := p1 Shr 16;
  371. Inc(dest, 3);
  372. Inc(x, inc_source);
  373. Dec(count);
  374. If count = 0 Then
  375. Exit;
  376. End;
  377. c := count Shr 2;
  378. While c > 0 Do
  379. Begin
  380. p1 := (Pshort16(source) + (x Shr 16))^;
  381. p2 := (Pshort16(source) + ((x + inc_source) Shr 16))^;
  382. p3 := (Pshort16(source) + ((x + 2*inc_source) Shr 16))^;
  383. p4 := (Pshort16(source) + ((x + 3*inc_source) Shr 16))^;
  384. Pint32(dest + 0)^ := ((p2 And $001F) Shl 27) Or ((p1 And $F800) Shl 8) Or ((p1 And $07E0) Shl 5) Or ((p1 And $001F) Shl 3) Or $03030103;
  385. Pint32(dest + 4)^ := ((p3 And $07E0) Shl 21) Or ((p3 And $001F) Shl 19) Or (p2 And $F800) Or ((p2 And $07E0) Shr 3) Or $01030301;
  386. Pint32(dest + 8)^ := ((p4 And $F800) Shl 16) Or ((p4 And $07E0) Shl 13) Or ((p4 And $001F) Shl 11) Or ((p3 And $F800) Shr 8) Or $03010303;
  387. Inc(x, 4*inc_source);
  388. Inc(dest, 12);
  389. Dec(c);
  390. End;
  391. count := count And 3;
  392. While count > 0 Do
  393. Begin
  394. p1 := (((Pshort16(source) + (x Shr 16))^ And $f800) Shl 8) Or
  395. (((Pshort16(source) + (x Shr 16))^ And $7e0) Shl 5) Or
  396. (((Pshort16(source) + (x Shr 16))^ And $1f) Shl 3) Or $30103;
  397. Pshort16(dest)^ := p1 And $FFFF;
  398. (dest + 2)^ := p1 Shr 16;
  399. Inc(dest, 3);
  400. Inc(x, inc_source);
  401. Dec(count);
  402. End;
  403. End;
  404. Procedure ConvertP_16rgb565_24bgr888_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  405. Var
  406. x : DWord;
  407. p1, p2, p3, p4 : DWord;
  408. c : DWord;
  409. Begin
  410. x := 0;
  411. While (PtrUInt(dest) And 3) <> 0 Do
  412. Begin
  413. p1 := (((Pshort16(source) + (x Shr 16))^ And $f800) Shr 8) Or
  414. (((Pshort16(source) + (x Shr 16))^ And $7e0) Shl 5) Or
  415. (((Pshort16(source) + (x Shr 16))^ And $1f) Shl 19) Or $30103;
  416. Pshort16(dest)^ := p1 And $FFFF;
  417. (dest + 2)^ := p1 Shr 16;
  418. Inc(dest, 3);
  419. Inc(x, inc_source);
  420. Dec(count);
  421. If count = 0 Then
  422. Exit;
  423. End;
  424. c := count Shr 2;
  425. While c > 0 Do
  426. Begin
  427. p1 := (Pshort16(source) + (x Shr 16))^;
  428. p2 := (Pshort16(source) + ((x + inc_source) Shr 16))^;
  429. p3 := (Pshort16(source) + ((x + 2*inc_source) Shr 16))^;
  430. p4 := (Pshort16(source) + ((x + 3*inc_source) Shr 16))^;
  431. Pint32(dest + 0)^ := ((p2 And $F800) Shl 16) Or ((p1 And $001F) Shl 19) Or ((p1 And $07E0) Shl 5) Or ((p1 And $F800) Shr 8) Or $03030103;
  432. Pint32(dest + 4)^ := ((p3 And $07E0) Shl 21) Or ((p3 And $F800) Shl 8) Or ((p2 And $001F) Shl 11) Or ((p2 And $07E0) Shr 3) Or $01030301;
  433. Pint32(dest + 8)^ := ((p4 And $001F) Shl 27) Or ((p4 And $07E0) Shl 13) Or (p4 And $F800) Or ((p3 And $001F) Shl 3) Or $03010303;
  434. Inc(x, 4*inc_source);
  435. Inc(dest, 12);
  436. Dec(c);
  437. End;
  438. count := count And 3;
  439. While count > 0 Do
  440. Begin
  441. p1 := (((Pshort16(source) + (x Shr 16))^ And $f800) Shr 8) Or
  442. (((Pshort16(source) + (x Shr 16))^ And $7e0) Shl 5) Or
  443. (((Pshort16(source) + (x Shr 16))^ And $1f) Shl 19) Or $30103;
  444. Pshort16(dest)^ := p1 And $FFFF;
  445. (dest + 2)^ := p1 Shr 16;
  446. Inc(dest, 3);
  447. Inc(x, inc_source);
  448. Dec(count);
  449. End;
  450. End;
  451. Procedure ConvertP_16rgb565_16bgr565_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  452. Var
  453. x, c : DWord;
  454. p : int32;
  455. Begin
  456. x := 0;
  457. { If we are not aligned to a dword, try and convert a single pixel }
  458. If (PtrUInt(dest) And $3) <> 0 Then
  459. Begin
  460. { Swap r and b, leave g untouched }
  461. Pshort16(dest)^ := ((Pshort16(source) + (x Shr 16))^ Shr 11) Or
  462. ((Pshort16(source) + (x Shr 16))^ And $7e0) Or
  463. (((Pshort16(source) + (x Shr 16))^ Shl 11) And $f800);
  464. Inc(x, inc_source);
  465. Inc(dest, 2);
  466. Dec(count);
  467. End;
  468. c := count Shr 1;
  469. While c <> 0 Do
  470. Begin
  471. Dec(c);
  472. { Swap r and b, leave g untouched }
  473. p := ((Pshort16(source) + (x Shr 16))^ Shr 11) Or
  474. ((Pshort16(source) + (x Shr 16))^ And $7e0) Or
  475. (((Pshort16(source) + (x Shr 16))^ Shl 11) And $f800);
  476. Inc(x, inc_source);
  477. p := p Or ((((Pshort16(source) + (x Shr 16))^ Shr 11) Or
  478. ((Pshort16(source) + (x Shr 16))^ And $7e0) Or
  479. (((Pshort16(source) + (x Shr 16))^ Shl 11) And $f800)) Shl 16);
  480. Inc(x, inc_source);
  481. Pint32(dest)^ := p;
  482. Inc(dest, 4);
  483. End;
  484. If (count And 1) <> 0 Then
  485. Pshort16(dest)^ := ((Pshort16(source) + (x Shr 16))^ Shr 11) Or
  486. ((Pshort16(source) + (x Shr 16))^ And $7e0) Or
  487. (((Pshort16(source) + (x Shr 16))^ Shl 11) And $f800);
  488. End;
  489. Procedure ConvertP_16rgb565_16rgb555_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  490. Var
  491. x, c : DWord;
  492. p : int32;
  493. Begin
  494. x := 0;
  495. { If we are not aligned to a dword, try and convert a single pixel }
  496. If (PtrUInt(dest) And $3) <> 0 Then
  497. Begin
  498. Pshort16(dest)^ := (((Pshort16(source) + (x Shr 16))^ And $f800) Shr 1) Or
  499. (((Pshort16(source) + (x Shr 16))^ And $7c0) Shr 1) Or
  500. ((Pshort16(source) + (x Shr 16))^ And $1f);
  501. Inc(dest, 2);
  502. Inc(x, inc_source);
  503. Dec(count);
  504. End;
  505. c := count Shr 1;
  506. While c <> 0 Do
  507. Begin
  508. Dec(c);
  509. { Leave blue untouched, mask red and shift by one, mask green and shift
  510. by one }
  511. p := (((Pshort16(source) + (x Shr 16))^ And $f800) Shr 1) Or
  512. (((Pshort16(source) + (x Shr 16))^ And $7c0) Shr 1) Or
  513. ((Pshort16(source) + (x Shr 16))^ And $1f);
  514. Inc(x, inc_source);
  515. p := p Or (((((Pshort16(source) + (x Shr 16))^ And $f800) Shr 1) Or
  516. (((Pshort16(source) + (x Shr 16))^ And $7c0) Shr 1) Or
  517. ((Pshort16(source) + (x Shr 16))^ And $1f)) Shl 16);
  518. Inc(x, inc_source);
  519. Pint32(dest)^ := p;
  520. Inc(dest, 4);
  521. End;
  522. If (count And 1) <> 0 Then
  523. Pshort16(dest)^ := (((Pshort16(source) + (x Shr 16))^ And $f800) Shr 1) Or
  524. (((Pshort16(source) + (x Shr 16))^ And $7c0) Shr 1) Or
  525. ((Pshort16(source) + (x Shr 16))^ And $1f);
  526. End;
  527. Procedure ConvertP_16rgb565_16bgr555_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  528. Var
  529. x, c : DWord;
  530. p : int32;
  531. Begin
  532. x := 0;
  533. { If we are not aligned to a dword, try and convert a single pixel }
  534. If (PtrUInt(dest) And $3) <> 0 Then
  535. Begin
  536. Pshort16(dest)^ := (((Pshort16(source) + (x Shr 16))^ And $f800) Shr 11) Or
  537. (((Pshort16(source) + (x Shr 16))^ And $7c0) Shr 1) Or
  538. (((Pshort16(source) + (x Shr 16))^ And $1f) Shl 10);
  539. Inc(dest, 2);
  540. Inc(x, inc_source);
  541. Dec(count);
  542. End;
  543. c := count Shr 1;
  544. While c <> 0 Do
  545. Begin
  546. Dec(c);
  547. p := (((Pshort16(source) + (x Shr 16))^ And $f800) Shr 11) Or
  548. (((Pshort16(source) + (x Shr 16))^ And $7c0) Shr 1) Or
  549. (((Pshort16(source) + (x Shr 16))^ And $1f) Shl 10);
  550. Inc(x, inc_source);
  551. p := p Or (((((Pshort16(source) + (x Shr 16))^ And $f800) Shr 11) Or
  552. (((Pshort16(source) + (x Shr 16))^ And $7c0) Shr 1) Or
  553. (((Pshort16(source) + (x Shr 16))^ And $1f) Shl 10)) Shl 16);
  554. Inc(x, inc_source);
  555. Pint32(dest)^ := p;
  556. Inc(dest, 4);
  557. End;
  558. If (count And 1) <> 0 Then
  559. Pshort16(dest)^ := (((Pshort16(source) + (x Shr 16))^ And $f800) Shr 11) Or
  560. (((Pshort16(source) + (x Shr 16))^ And $7c0) Shr 1) Or
  561. (((Pshort16(source) + (x Shr 16))^ And $1f) Shl 10);
  562. End;
  563. Procedure ConvertP_16rgb565_8rgb332_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  564. Var
  565. x, c : DWord;
  566. p : int32;
  567. Begin
  568. x := 0;
  569. { Write single pixels until the destination address is aligned mod 4 }
  570. While (PtrUInt(dest) And $3) <> 0 Do
  571. Begin
  572. dest^ := (((Pshort16(source) + (x Shr 16))^ Shr 8) And $e0) Or
  573. (((Pshort16(source) + (x Shr 16))^ Shr 6) And $1c) Or
  574. (((Pshort16(source) + (x Shr 16))^ Shr 3) And $3);
  575. Inc(x, inc_source);
  576. Inc(dest);
  577. Dec(count);
  578. If count = 0 Then
  579. Exit;
  580. End;
  581. {* Write blocks of four pixels now }
  582. c := count Shr 2;
  583. While c <> 0 Do
  584. Begin
  585. Dec(c);
  586. p := (((Pshort16(source) + (x Shr 16))^ Shr 8) And $e0) Or
  587. (((Pshort16(source) + (x Shr 16))^ Shr 6) And $1c) Or
  588. (((Pshort16(source) + (x Shr 16))^ Shr 3) And $3);
  589. Inc(x, inc_source);
  590. p := p Or
  591. (((((Pshort16(source) + (x Shr 16))^ Shr 8) And $e0) Or
  592. (((Pshort16(source) + (x Shr 16))^ Shr 6) And $1c) Or
  593. (((Pshort16(source) + (x Shr 16))^ Shr 3) And $3)) Shl 8);
  594. Inc(x, inc_source);
  595. p := p Or
  596. (((((Pshort16(source) + (x Shr 16))^ Shr 8) And $e0) Or
  597. (((Pshort16(source) + (x Shr 16))^ Shr 6) And $1c) Or
  598. (((Pshort16(source) + (x Shr 16))^ Shr 3) And $3)) Shl 16);
  599. Inc(x, inc_source);
  600. p := p Or
  601. (((((Pshort16(source) + (x Shr 16))^ Shr 8) And $e0) Or
  602. (((Pshort16(source) + (x Shr 16))^ Shr 6) And $1c) Or
  603. (((Pshort16(source) + (x Shr 16))^ Shr 3) And $3)) Shl 24);
  604. Inc(x, inc_source);
  605. Pint32(dest)^ := p;
  606. Inc(dest, 4);
  607. End;
  608. { Write up to three trailing pixels }
  609. c := count And $3;
  610. While c <> 0 Do
  611. Begin
  612. Dec(c);
  613. dest^ := (((Pshort16(source) + (x Shr 16))^ Shr 8) And $e0) Or
  614. (((Pshort16(source) + (x Shr 16))^ Shr 6) And $1c) Or
  615. (((Pshort16(source) + (x Shr 16))^ Shr 3) And $3);
  616. Inc(x, inc_source);
  617. Inc(dest);
  618. End;
  619. End;