sw_draw.h 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485
  1. /*
  2. * Copyright (c) 2020 Actions Technology Co., Ltd
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. /**
  7. * @file
  8. * @brief Utilities of sw draw API
  9. */
  10. #ifndef ZEPHYR_FRAMEWORK_INCLUDE_DISPLAY_SW_DRAW_H_
  11. #define ZEPHYR_FRAMEWORK_INCLUDE_DISPLAY_SW_DRAW_H_
  12. #include <stddef.h>
  13. #include <stdint.h>
  14. /**
  15. * @defgroup display-util Display Utilities
  16. * @ingroup display_libraries
  17. * @{
  18. */
  19. #ifdef _WIN32
  20. #define ALWAYS_INLINE inline
  21. #elif !defined(ALWAYS_INLINE)
  22. #define ALWAYS_INLINE inline __attribute__((always_inline))
  23. #endif
  24. #ifdef __cplusplus
  25. extern "C" {
  26. #endif
  27. /*******************************************************************************
  28. * public types
  29. ******************************************************************************/
  30. typedef union {
  31. struct {
  32. uint16_t b : 5;
  33. uint16_t g : 6;
  34. uint16_t r : 5;
  35. };
  36. uint16_t full;
  37. } sw_color16_t;
  38. typedef struct {
  39. union {
  40. struct {
  41. uint16_t b : 5;
  42. uint16_t g : 6;
  43. uint16_t r : 5;
  44. };
  45. uint16_t rgb;
  46. };
  47. uint8_t a;
  48. } sw_color16a8_t;
  49. typedef union {
  50. struct {
  51. uint8_t b;
  52. uint8_t g;
  53. uint8_t r;
  54. uint8_t a;
  55. };
  56. uint32_t full;
  57. } sw_color32_t;
  58. /*******************************************************************************
  59. * pixel format convert
  60. ******************************************************************************/
  61. /*
  62. * @brief convert rgb565 to argb8888
  63. *
  64. * @param src_color value
  65. * @param dest_color value
  66. *
  67. * @retval N/A
  68. */
  69. static ALWAYS_INLINE void cvt_rgb565_to_argb8888(uint8_t dest_color[4], const uint8_t src_color[2])
  70. {
  71. dest_color[0] = (src_color[0] << 3) | (src_color[0] & 0x7);
  72. dest_color[1] = (src_color[1] << 5) | ((src_color[0] >> 3) & 0x1c) | ((src_color[0] >> 5) & 0x3);
  73. dest_color[2] = (src_color[1] & 0xf8) | ((src_color[1] >> 3) & 0x7);
  74. dest_color[3] = 0xFF;
  75. }
  76. /*
  77. * @brief convert argb8565 to argb8888
  78. *
  79. * @param src_color value
  80. * @param dest_color value
  81. *
  82. * @retval N/A
  83. */
  84. static ALWAYS_INLINE void cvt_argb8565_to_argb8888(uint8_t dest_color[4], const uint8_t src_color[3])
  85. {
  86. dest_color[0] = (src_color[0] << 3) | (src_color[0] & 0x7);
  87. dest_color[1] = (src_color[1] << 5) | ((src_color[0] >> 3) & 0x1c) | ((src_color[0] >> 5) & 0x3);
  88. dest_color[2] = (src_color[1] & 0xf8) | ((src_color[1] >> 3) & 0x7);
  89. dest_color[3] = src_color[2];
  90. }
  91. /*
  92. * @brief convert argb6666 to argb8888
  93. *
  94. * @param src_color value
  95. * @param dest_color value
  96. *
  97. * @retval N/A
  98. */
  99. static ALWAYS_INLINE void cvt_argb6666_to_argb8888(uint8_t dest_color[4], const uint8_t src_color[3])
  100. {
  101. dest_color[0] = (src_color[0] << 2) | (src_color[0] & 0x3);
  102. dest_color[1] = (src_color[1] << 4) | ((src_color[0] >> 4) & 0x0c) | (src_color[0] >> 6);
  103. dest_color[2] = (src_color[2] << 6) | ((src_color[1] >> 2) & 0x3c) | ((src_color[1] >> 4) & 0x03);
  104. dest_color[3] = (src_color[2] & 0xfc) | ((src_color[2] >> 2) & 0x03);
  105. }
  106. /*
  107. * @brief convert argb1555 to argb8888
  108. *
  109. * @param src_color value
  110. * @param dest_color value
  111. *
  112. * @retval N/A
  113. */
  114. static ALWAYS_INLINE void cvt_argb1555_to_argb8888(uint8_t dest_color[4], const uint8_t src_color[2])
  115. {
  116. dest_color[0] = (src_color[0] << 3) | (src_color[0] & 0x7);
  117. dest_color[1] = (src_color[1] << 6) | ((src_color[0] >> 2) & 0x38) | (src_color[0] >> 5);
  118. dest_color[2] = (src_color[1] & 0xf8) | ((src_color[1] >> 3) & 0x7);
  119. dest_color[3] = (src_color[1] & 0x8) ? 0xFF : 0;
  120. }
  121. /*
  122. * @brief convert argb8888 to rgb565
  123. *
  124. * @param src_color value
  125. * @param dest_color value
  126. *
  127. * @retval N/A
  128. */
  129. static ALWAYS_INLINE void cvt_argb8888_to_rgb565(uint8_t dest_color[2], const uint8_t src_color[4])
  130. {
  131. dest_color[0] = ((src_color[1] & 0x1c) << 3) | (src_color[0] >> 3);
  132. dest_color[1] = (src_color[2] & 0xF8) | (src_color[1]>> 5);
  133. }
  134. /*
  135. * @brief convert argb8888 to argb8565
  136. *
  137. * @param src_color value
  138. * @param dest_color value
  139. *
  140. * @retval N/A
  141. */
  142. static ALWAYS_INLINE void cvt_argb8888_to_argb8565(uint8_t dest_color[3], const uint8_t src_color[4])
  143. {
  144. dest_color[0] = ((src_color[1] & 0x1c) << 3) | (src_color[0] >> 3);
  145. dest_color[1] = (src_color[2] & 0xF8) | (src_color[1]>> 5);
  146. dest_color[2] = src_color[3];
  147. }
  148. /*
  149. * @brief convert argb8888 to argb6666
  150. *
  151. * @param src_color value
  152. * @param dest_color value
  153. *
  154. * @retval N/A
  155. */
  156. static ALWAYS_INLINE void cvt_argb8888_to_argb6666(uint8_t dest_color[3], const uint8_t src_color[4])
  157. {
  158. dest_color[0] = ((src_color[1] & 0x0c) << 4) | ((src_color[0] & 0xfc) >> 2);
  159. dest_color[1] = ((src_color[2] & 0x3c) << 2) | ((src_color[1] & 0xf0) >> 4);
  160. dest_color[2] = (src_color[3] & 0xfc) | ((src_color[2] & 0xc0) >> 6);
  161. }
  162. /*
  163. * @brief convert argb8888 to argb1555
  164. *
  165. * @param src_color value
  166. * @param dest_color value
  167. *
  168. * @retval N/A
  169. */
  170. static ALWAYS_INLINE void cvt_argb8888_to_argb1555(uint8_t dest_color[2], const uint8_t src_color[4])
  171. {
  172. dest_color[0] = ((src_color[1] & 0x38) << 2) | (src_color[0] >> 3);
  173. dest_color[1] = ((src_color[2] & 0xF8) >> 1) | (src_color[3] & 0x80);
  174. }
  175. /*******************************************************************************
  176. * pixel format conversion
  177. ******************************************************************************/
  178. /*
  179. * @brief convert buffer pixel format
  180. *
  181. * @param dest_buf dest buffer address
  182. * @param dest_cf dest buffer pixel format
  183. * @param src_buf source buffer address
  184. * @param src_cf source buffer pixel format
  185. * @param len number of pixels to convert
  186. *
  187. * @retval argb8888 color value
  188. */
  189. int sw_convert_color_buffer(void * dest_buf, uint32_t dest_cf, const void * src_buf, uint32_t src_cf, uint32_t len);
  190. /*******************************************************************************
  191. * pixel blending
  192. ******************************************************************************/
  193. /*
  194. * @brief blend argb8888 over argb8888
  195. *
  196. * @param dest_color dest argb8888 value
  197. * @param src_color src argb8888 value
  198. *
  199. * @retval argb8888 color value
  200. */
  201. static ALWAYS_INLINE uint32_t mix_argb8888_over_argb8888(uint32_t dest_color, uint32_t src_color)
  202. {
  203. uint32_t a = src_color >> 24;
  204. uint32_t ra = 255 - a;
  205. uint32_t result_1 = (src_color & 0x00FF00FF) * a + (dest_color & 0x00FF00FF) * ra;
  206. uint32_t result_2 = ((src_color & 0xFF00FF00) >> 8) * a + ((dest_color & 0xFF00FF00) >> 8) * ra;
  207. return ((result_1 & 0xFF00FF00) >> 8) | (result_2 & 0xFF00FF00);
  208. }
  209. /*
  210. * @brief blend argb8888 over rgb565
  211. *
  212. * @param dest_color dest rgb565 value
  213. * @param src_color src argb8888 value
  214. *
  215. * @retval rgb565 color value
  216. */
  217. static ALWAYS_INLINE uint16_t mix_argb8888_over_rgb565(uint16_t dest_color, uint32_t src_color)
  218. {
  219. uint32_t a = src_color >> 24;
  220. uint32_t ra = 255 - a;
  221. #if 0
  222. uint32_t dest32_rb = ((dest_color & 0xf800) << 5) | (dest_color & 0x1f);
  223. dest32_rb = (dest32_rb << 3) | (dest32_rb & 0x00070007);
  224. dest32_rb = (src_color & 0x00FF00FF) * a + dest32_rb * ra;
  225. uint32_t dest32_g = ((dest_color & 0x07e0) << 5) | ((dest_color & 0x0060) << 3);
  226. dest32_g = (src_color & 0x0000FF00) * a + dest32_g * ra;
  227. return ((dest32_rb >> 16) & 0xf800) | ((dest32_rb >> 11) & 0x1f) |
  228. ((dest32_g >> 13) & 0x07e0);
  229. #else
  230. uint32_t dest32_rb = ((dest_color & 0xf800) << 8) | ((dest_color & 0x1f) << 3);
  231. dest32_rb = (src_color & 0x00FF00FF) * a + dest32_rb * ra;
  232. uint32_t dest32_g = (dest_color & 0x07e0) << 5;
  233. dest32_g = (src_color & 0x0000FF00) * a + dest32_g * ra;
  234. return ((dest32_rb >> 16) & 0xf800) | ((dest32_rb >> 11) & 0x1f) |
  235. ((dest32_g >> 13) & 0x07e0);
  236. #endif
  237. }
  238. /*
  239. * @brief blend rgb565 over rgb565
  240. *
  241. * @param dest_color dest rgb565 value
  242. * @param src_color src rgb565 value
  243. *
  244. * @retval rgb565 color value
  245. */
  246. static ALWAYS_INLINE uint16_t mix_rgb565_over_rgb565(uint16_t dest_color, uint16_t src_color, uint8_t src_a)
  247. {
  248. uint16_t dest_r = (dest_color >> 11) * (255 - src_a) + (src_color >> 11) * src_a;
  249. uint16_t dest_b = (dest_color & 0x001f) * (255 - src_a) + (src_color & 0x001f) * src_a;
  250. uint32_t dest_g = (dest_color & 0x07e0) * (255 - src_a) + (src_color & 0x07e0) * (uint32_t)src_a;
  251. return ((dest_r >> 8) << 11) | ((dest_g >> 8) & 0x07e0) | (dest_b >> 8);
  252. }
  253. /*
  254. * @brief blend rgb565 over rgb565
  255. *
  256. * @param dest_color dest rgb565 value
  257. * @param src_color src rgb565 value
  258. *
  259. * @retval rgb565 color value
  260. */
  261. static ALWAYS_INLINE uint16_t blend_rgb565_over_rgb565(uint16_t dest_color, uint16_t src_color, uint8_t src_a)
  262. {
  263. if (src_a <= 0) {
  264. return dest_color;
  265. } else if (src_a >= 255) {
  266. return src_color;
  267. } else {
  268. return mix_rgb565_over_rgb565(dest_color, src_color, src_a);
  269. }
  270. }
  271. /*
  272. * @brief blend rgb565 over argb8888
  273. *
  274. * @param dest_color dest argb8888 value
  275. * @param src_color src rgb565 value
  276. *
  277. * @retval argb8888 color value
  278. */
  279. static ALWAYS_INLINE uint32_t blend_rgb565_over_argb8888(uint32_t dest_color, uint16_t src_color, uint8_t src_a)
  280. {
  281. if (src_a <= 0) {
  282. return dest_color;
  283. } else {
  284. uint32_t src32_ag = ((src_color & 0x07e0) >> 3) | ((src_color & 0x0060) >> 5) | ((uint32_t)src_a << 16);
  285. uint32_t src32_rb = ((src_color & 0xf800) << 5) | (src_color & 0x1f);
  286. src32_rb = (src32_rb << 3) | (src32_rb & 0x00070007);
  287. if (src_a >= 255) {
  288. return (src32_ag << 8) | src32_rb;
  289. } else {
  290. uint32_t dest32_rb = src32_rb * src_a + (dest_color & 0x00FF00FF) * (255 - src_a);
  291. uint32_t dest32_ag = src32_ag * src_a + ((dest_color & 0xFF00FF00) >> 8) * (255 - src_a);
  292. return ((dest32_rb & 0xFF00FF00) >> 8) | (dest32_ag & 0xFF00FF00);
  293. }
  294. }
  295. }
  296. /*
  297. * @brief blend argb8565 over rgb565
  298. *
  299. * @param dest_color dest rgb565 value
  300. * @param src_color src argb8565 value
  301. *
  302. * @retval rgb565 color value
  303. */
  304. static ALWAYS_INLINE uint16_t blend_argb8565_over_rgb565(uint16_t dest_color, const uint8_t src_color[3])
  305. {
  306. return blend_rgb565_over_rgb565(dest_color, ((uint16_t)src_color[1] << 8) | src_color[0], src_color[2]);
  307. }
  308. /*
  309. * @brief blend argb8565 over argb8888
  310. *
  311. * @param dest_color dest argb8888 value
  312. * @param src_color src argb8565 value
  313. *
  314. * @retval argb8888 color value
  315. */
  316. static ALWAYS_INLINE uint32_t blend_argb8565_over_argb8888(uint32_t dest_color, const uint8_t src_color[3])
  317. {
  318. return blend_rgb565_over_argb8888(dest_color, ((uint16_t)src_color[1] << 8) | src_color[0], src_color[2]);
  319. }
  320. /*
  321. * @brief blend rgb565 over rgb565
  322. *
  323. * @param dest_color dest rgb565 value
  324. * @param src_color src argb6666 value
  325. *
  326. * @retval rgb565 color value
  327. */
  328. static ALWAYS_INLINE uint16_t blend_argb6666_over_rgb565(uint16_t dest_color, const uint8_t src_color[3])
  329. {
  330. uint8_t src_a = src_color[2] >> 2;
  331. if (src_a <= 0) {
  332. return dest_color;
  333. } else {
  334. uint8_t src_b = (src_color[0] & 0x3f);
  335. uint8_t src_g = ((src_color[1] & 0x0f) << 2) | (src_color[0] >> 6);
  336. uint8_t src_r = ((src_color[2] & 0x03) << 4) | (src_color[1] >> 4);
  337. if (src_a >= 63) {
  338. return ((src_r & 0x3e) << 10) | ((uint16_t)src_g << 5) | (src_b >> 1);
  339. } else {
  340. uint16_t dest_b = ((dest_color & 0x001f) << 1) | (dest_color & 0x1);
  341. dest_b = dest_b * (63 - src_a) + (uint16_t)src_b * src_a;
  342. uint16_t dest_g = (dest_color & 0x07e0) >> 5;
  343. dest_g = dest_g * (63 - src_a) + (uint16_t)src_g * src_a;
  344. uint16_t dest_r = ((dest_color & 0xf800) >> 10) | ((dest_color & 0x0800) >> 11);
  345. dest_r = dest_r * (63 - src_a) + (uint16_t)src_r * src_a;
  346. return ((dest_r & 0x0f80) << 4) | ((dest_g & 0x0fc0) >> 1) | (dest_b >> 7);
  347. }
  348. }
  349. }
  350. /*
  351. * @brief blend argb6666 over argb8888
  352. *
  353. * @param dest_color dest rgb565 value
  354. * @param src_color src argb6666 value
  355. *
  356. * @retval argb8888 color value
  357. */
  358. static ALWAYS_INLINE uint32_t blend_argb6666_over_argb8888(uint32_t dest_color, const uint8_t src_color[3])
  359. {
  360. uint8_t src_a = src_color[2] | ((src_color[2] &0x0c) >> 2);
  361. if (src_a <= 0) {
  362. return dest_color;
  363. } else {
  364. uint8_t src_b = ((src_color[0] & 0x3f) << 2) | (src_color[0] & 0x03);
  365. uint32_t src32_r = ((src_color[2] & 0x03) << 22) | ((src_color[1] & 0xf0) << 14) | ((src_color[1] & 0x30) << 12);
  366. uint32_t src32_rb = src32_r | src_b;
  367. uint32_t src32_g = ((src_color[1] & 0x0f) << 4) | ((src_color[0] & 0xc0) >> 2) | ((src_color[0] & 0xc0) >> 6);
  368. uint32_t src32_ag = src32_g | ((uint32_t)src_a << 16) ;
  369. if (src_a >= 255) {
  370. return (src32_ag << 8) | src32_rb;
  371. } else {
  372. uint32_t dest32_rb = src32_rb * src_a + (dest_color & 0x00FF00FF) * (255 - src_a);
  373. uint32_t dest32_ag = src32_ag * src_a + ((dest_color & 0xFF00FF00) >> 8) * (255 - src_a);
  374. return ((dest32_rb & 0xFF00FF00) >> 8) | (dest32_ag & 0xFF00FF00);
  375. }
  376. }
  377. }
  378. /*
  379. * @brief blend argb1555 over rgb565
  380. *
  381. * @param dest_color dest rgb565 value
  382. * @param src_color src argb1555 value
  383. *
  384. * @retval rgb565 color value
  385. */
  386. static ALWAYS_INLINE uint16_t blend_argb1555_over_rgb565(uint16_t dest_color, uint16_t src_color)
  387. {
  388. if (src_color & 0x8000) {
  389. return (src_color & 0x3f) | ((src_color & 0xffe0) << 1);
  390. } else {
  391. return dest_color;
  392. }
  393. }
  394. /*
  395. * @brief blend argb1555 over argb8888
  396. *
  397. * @param dest_color dest argb8888 value
  398. * @param src_color src argb1555 value
  399. *
  400. * @retval argb8888 color value
  401. */
  402. static ALWAYS_INLINE uint32_t blend_argb1555_over_argb8888(uint32_t dest_color, uint16_t src_color)
  403. {
  404. if (src_color & 0x8000) {
  405. return ((src_color & 0x1f) << 3) | (src_color & 0x7) | /* b */
  406. ((src_color & 0x3e0) << 6) | ((src_color & 0xe0) << 3) | /* g */
  407. ((src_color & 0x7c00) << 9) | ((src_color & 0x1c00) << 6) | /* r */
  408. 0xff000000;
  409. } else {
  410. return dest_color;
  411. }
  412. }
  413. /*
  414. * @brief blend argb8888 over rgb565
  415. *
  416. * @param dest_color dest rgb565 value
  417. * @param src_color src argb8888 value
  418. *
  419. * @retval rgb565 color value
  420. */
  421. static ALWAYS_INLINE uint16_t blend_argb8888_over_rgb565(uint16_t dest_color, uint32_t src_color)
  422. {
  423. uint8_t src_a = src_color >> 24;
  424. if (src_a <= 0) {
  425. return dest_color;
  426. } else if (src_a >= 255) {
  427. return ((src_color & 0xf80000) >> 8) | ((src_color & 0x00fc00) >> 5) |
  428. ((src_color & 0x0000f8) >> 3);
  429. } else {
  430. return mix_argb8888_over_rgb565(dest_color, src_color);
  431. }
  432. }
  433. /*
  434. * @brief blend argb8888 over argb8888
  435. *
  436. * @param dest_color dest argb8888 value
  437. * @param src_color src argb8888 value
  438. *
  439. * @retval argb8888 color value
  440. */
  441. static ALWAYS_INLINE uint32_t blend_argb8888_over_argb8888(uint32_t dest_color, uint32_t src_color)
  442. {
  443. uint8_t src_a = src_color >> 24;
  444. if (src_a <= 0) {
  445. return dest_color;
  446. } else if (src_a >= 255) {
  447. return src_color;
  448. } else {
  449. return mix_argb8888_over_argb8888(dest_color, src_color);
  450. }
  451. }
  452. /*******************************************************************************
  453. * pixel filtering
  454. ******************************************************************************/
  455. /*
  456. * @brief rgb565 bilinear filtering with lossy precition distance grid
  457. *
  458. * c00 | c10
  459. * ----|----
  460. * c01 | c11
  461. *
  462. * @param c00 color value at (0, 0)
  463. * @param c10 color value at (1, 0)
  464. * @param c01 color value at (0, 1)
  465. * @param c11 color value at (1, 1)
  466. * @param x_tap filter tap coefficient in x direction
  467. * @param y_tap filter tap coefficient in y direction
  468. * @param tap_bits bits of filter tap coefficient, must not greater than 6
  469. *
  470. * @retval rgb565 color value
  471. */
  472. static ALWAYS_INLINE uint16_t bilinear_rgb565_fast_m6(
  473. uint16_t c00, uint16_t c10, uint16_t c01, uint16_t c11,
  474. int16_t x_tap, int16_t y_tap, int16_t tap_bits)
  475. {
  476. uint32_t pm11 = (x_tap * y_tap) >> tap_bits;
  477. uint32_t pm10 = x_tap - pm11;
  478. uint32_t pm01 = y_tap - pm11;
  479. uint32_t pm00 = (1 << tap_bits) - pm01 - pm10 - pm11;
  480. uint32_t rb = (c00 & 0xf81f) * pm00;
  481. uint32_t g = (c00 & 0x07e0) * pm00;
  482. rb += (c10 & 0xf81f) * pm10;
  483. g += (c10 & 0x07e0) * pm10;
  484. rb += (c01 & 0xf81f) * pm01;
  485. g += (c01 & 0x07e0) * pm01;
  486. rb += (c11 & 0xf81f) * pm11;
  487. g += (c11 & 0x07e0) * pm11;
  488. return ((rb >> tap_bits) & 0xf81f) | ((g >> tap_bits) & 0x07e0);
  489. }
  490. /*
  491. * @brief argb8565 bilinear filtering with lossy precition distance grid
  492. *
  493. * c00 | c10
  494. * ----|----
  495. * c01 | c11
  496. *
  497. * @param result store the result
  498. * @param c00 color value at (0, 0)
  499. * @param c10 color value at (1, 0)
  500. * @param c01 color value at (0, 1)
  501. * @param c11 color value at (1, 1)
  502. * @param x_tap filter tap coefficient in x direction
  503. * @param y_tap filter tap coefficient in y direction
  504. * @param tap_bits bits of filter tap coefficient, must not greater than 6
  505. *
  506. * @retval N/A
  507. */
  508. static ALWAYS_INLINE void bilinear_argb8565_fast_m6(
  509. uint8_t result[3],
  510. const uint8_t c00[3], const uint8_t c10[3],
  511. const uint8_t c01[3], const uint8_t c11[3],
  512. int16_t x_tap, int16_t y_tap, int16_t tap_bits)
  513. {
  514. uint32_t pm11 = (x_tap * y_tap) >> tap_bits;
  515. uint32_t pm10 = x_tap - pm11;
  516. uint32_t pm01 = y_tap - pm11;
  517. uint32_t pm00 = (1 << tap_bits) - pm01 - pm10 - pm11;
  518. uint32_t c16 = ((uint16_t)c00[1] << 8) | c00[0];
  519. uint32_t rb = (c16 & 0xf81f) * pm00;
  520. uint32_t g = (c16 & 0x07e0) * pm00;
  521. uint32_t a = c00[2] * pm00;
  522. c16 = ((uint16_t)c10[1] << 8) | c10[0];
  523. rb += (c16 & 0xf81f) * pm10;
  524. g += (c16 & 0x07e0) * pm10;
  525. a += c10[2] * pm10;
  526. c16 = ((uint16_t)c01[1] << 8) | c01[0];
  527. rb += (c16 & 0xf81f) * pm01;
  528. g += (c16 & 0x07e0) * pm01;
  529. a += c01[2] * pm01;
  530. c16 = ((uint16_t)c11[1] << 8) | c11[0];
  531. rb += (c16 & 0xf81f) * pm11;
  532. g += (c16 & 0x07e0) * pm11;
  533. a += c11[2] * pm11;
  534. c16 = ((rb >> tap_bits) & 0xf81f) | ((g >> tap_bits) & 0x07e0);
  535. result[0] = c16 & 0xff;
  536. result[1] = c16 >> 8;
  537. result[2] = a >> tap_bits;
  538. }
  539. /*
  540. * @brief argb6666 bilinear filtering with lossy precition distance grid
  541. *
  542. * c00 | c10
  543. * ----|----
  544. * c01 | c11
  545. *
  546. * @param result store the result
  547. * @param c00 color value at (0, 0)
  548. * @param c10 color value at (1, 0)
  549. * @param c01 color value at (0, 1)
  550. * @param c11 color value at (1, 1)
  551. * @param x_tap filter tap coefficient in x direction
  552. * @param y_tap filter tap coefficient in y direction
  553. * @param tap_bits bits of filter tap coefficient, must not greater than 6
  554. *
  555. * @retval N/A
  556. */
  557. static ALWAYS_INLINE void bilinear_argb6666_fast_m6(
  558. uint8_t result[3],
  559. const uint8_t c00[3], const uint8_t c10[3],
  560. const uint8_t c01[3], const uint8_t c11[3],
  561. int16_t x_tap, int16_t y_tap, int16_t tap_bits)
  562. {
  563. uint32_t pm11 = (x_tap * y_tap) >> tap_bits;
  564. uint32_t pm10 = x_tap - pm11;
  565. uint32_t pm01 = y_tap - pm11;
  566. uint32_t pm00 = (1 << tap_bits) - pm01 - pm10 - pm11;
  567. uint32_t c32 = ((uint32_t)c00[2] << 16) | ((uint32_t)c00[1] << 8) | c00[0];
  568. uint32_t rb = (c32 & 0x03f03f) * pm00;
  569. uint32_t ag = (c32 & 0xfc0fc0) * pm00;
  570. c32 = ((uint32_t)c10[2] << 16) | ((uint32_t)c10[1] << 8) | c10[0];
  571. rb += (c32 & 0x03f03f) * pm10;
  572. ag += (c32 & 0xfc0fc0) * pm10;
  573. c32 = ((uint32_t)c01[2] << 16) | ((uint32_t)c01[1] << 8) | c01[0];
  574. rb += (c32 & 0x03f03f) * pm01;
  575. ag += (c32 & 0xfc0fc0) * pm01;
  576. c32 = ((uint32_t)c11[2] << 16) | ((uint32_t)c11[1] << 8) | c11[0];
  577. rb += (c32 & 0x03f03f) * pm11;
  578. ag += (c32 & 0xfc0fc0) * pm11;
  579. c32 = ((rb >> tap_bits) & 0x03f03f) | ((ag >> tap_bits) & 0xfc0fc0);
  580. result[0] = c32 & 0xff;
  581. result[1] = (c32 >> 8) & 0xff;
  582. result[2] = (c32 >> 16) & 0xff;
  583. }
  584. /*
  585. * @brief argb8888 bilinear filtering with lossy precition distance grid
  586. *
  587. * c00 | c10
  588. * ----|----
  589. * c01 | c11
  590. *
  591. * @param c00 color value at (0, 0)
  592. * @param c10 color value at (1, 0)
  593. * @param c01 color value at (0, 1)
  594. * @param c11 color value at (1, 1)
  595. * @param x_tap filter tap coefficient in x direction
  596. * @param y_tap filter tap coefficient in y direction
  597. * @param tap_bits bits of filter tap coefficient, must not greater than 8
  598. *
  599. * @retval argb8888 color value
  600. */
  601. static ALWAYS_INLINE uint32_t bilinear_argb8888_fast_m8(
  602. uint32_t c00, uint32_t c10, uint32_t c01, uint32_t c11,
  603. int16_t x_tap, int16_t y_tap, int16_t tap_bits)
  604. {
  605. uint32_t pm11 = ((uint32_t)x_tap * y_tap) >> tap_bits;
  606. uint32_t pm10 = x_tap - pm11;
  607. uint32_t pm01 = y_tap - pm11;
  608. uint32_t pm00 = (1 << tap_bits) - pm01 - pm10 - pm11;
  609. uint32_t rb = (c00 & 0x00FF00FF) * pm00;
  610. uint32_t ag = ((c00 & 0xFF00FF00) >> tap_bits) * pm00;
  611. rb += (c10 & 0x00FF00FF) * pm10;
  612. ag += ((c10 & 0xFF00FF00) >> tap_bits) * pm10;
  613. rb += (c01 & 0x00FF00FF) * pm01;
  614. ag += ((c01 & 0xFF00FF00) >> tap_bits) * pm01;
  615. rb += (c11 & 0x00FF00FF) * pm11;
  616. ag += ((c11 & 0xFF00FF00) >> tap_bits) * pm11;
  617. return ((rb >> tap_bits) & 0x00FF00FF) | (ag & 0xFF00FF00);
  618. }
  619. /*
  620. * @brief rgb888 (r[23:16], g[15:8], b[7:0]) bilinear filtering with lossy precition distance grid
  621. *
  622. * c00 | c10
  623. * ----|----
  624. * c01 | c11
  625. *
  626. * @param c00 color value at (0, 0)
  627. * @param c10 color value at (1, 0)
  628. * @param c01 color value at (0, 1)
  629. * @param c11 color value at (1, 1)
  630. * @param x_tap filter tap coefficient in x direction
  631. * @param y_tap filter tap coefficient in y direction
  632. * @param tap_bits bits of filter tap coefficient, must not greater than 8
  633. *
  634. * @retval rgb888 color value (lower 24bits)
  635. */
  636. static ALWAYS_INLINE uint32_t bilinear_rgb888_fast_m8(
  637. const uint8_t *c00, const uint8_t *c10, const uint8_t *c01, const uint8_t *c11,
  638. int16_t x_tap, int16_t y_tap, int16_t tap_bits)
  639. {
  640. uint32_t pm11 = ((uint32_t)x_tap * y_tap) >> tap_bits;
  641. uint32_t pm10 = x_tap - pm11;
  642. uint32_t pm01 = y_tap - pm11;
  643. uint32_t pm00 = (1 << tap_bits) - pm01 - pm10 - pm11;
  644. uint32_t rb = (c00[0] | (c00[2] << 16)) * pm00;
  645. uint16_t ag = c00[1] * pm00;
  646. rb += (c10[0] | (c10[2] << 16)) * pm10;
  647. ag += c10[1] * pm10;
  648. rb += (c01[0] | (c01[2] << 16)) * pm01;
  649. ag += c01[1] * pm01;
  650. rb += (c11[0] | (c11[2] << 16)) * pm11;
  651. ag += c11[1] * pm11;
  652. return ((rb >> tap_bits) & 0x00FF00FF) | ((ag >> tap_bits) << 8);
  653. }
  654. /*
  655. * @brief A8 bilinear filtering with lossy precition distance grid
  656. *
  657. * c00 | c10
  658. * ----|----
  659. * c01 | c11
  660. *
  661. * @param c00 color value at (0, 0)
  662. * @param c10 color value at (1, 0)
  663. * @param c01 color value at (0, 1)
  664. * @param c11 color value at (1, 1)
  665. * @param x_tap filter tap coefficient in x direction
  666. * @param y_tap filter tap coefficient in y direction
  667. * @param tap_bits bits of filter tap coefficient, must not greater than 8
  668. *
  669. * @retval A8 color value
  670. */
  671. static ALWAYS_INLINE uint8_t bilinear_a8_fast_m8(
  672. uint8_t c00, uint8_t c10, uint8_t c01, uint8_t c11,
  673. int16_t x_tap, int16_t y_tap, int16_t tap_bits)
  674. {
  675. uint32_t pm11 = ((uint32_t)x_tap * y_tap) >> tap_bits;
  676. uint32_t pm10 = x_tap - pm11;
  677. uint32_t pm01 = y_tap - pm11;
  678. uint32_t pm00 = (1 << tap_bits) - pm01 - pm10 - pm11;
  679. uint32_t alpha = c00 * pm00;
  680. alpha += c10 * pm10;
  681. alpha += c01 * pm01;
  682. alpha += c11 * pm11;
  683. return (alpha >> tap_bits);
  684. }
  685. /*
  686. * @brief blend a const color over rgb565 image
  687. *
  688. * @param dst address of dst image
  689. * @param src_color constant color (ARGB8888) of src
  690. * @param dst_pitch stride in bytes of dst image
  691. * @param src_pitch stride in bytes of src image
  692. * @param w width in pixels of blend area
  693. * @param h height in pixels of blend area
  694. * @param opa global opa of src
  695. *
  696. * @retval N/A
  697. */
  698. void sw_blend_color_over_rgb565(void *dst, uint32_t src_color,
  699. uint16_t dst_pitch, uint16_t w, uint16_t h);
  700. /*
  701. * @brief blend a const color over rgb888 image
  702. *
  703. * @param dst address of dst image
  704. * @param src_color constant color (ARGB8888) of src
  705. * @param dst_pitch stride in bytes of dst image
  706. * @param src_pitch stride in bytes of src image
  707. * @param w width in pixels of blend area
  708. * @param h height in pixels of blend area
  709. * @param opa global opa of src
  710. *
  711. * @retval N/A
  712. */
  713. void sw_blend_color_over_rgb888(void *dst, uint32_t src_color,
  714. uint16_t dst_pitch, uint16_t w, uint16_t h);
  715. /*
  716. * @brief blend a const color over argb8888 image
  717. *
  718. * @param dst address of dst image
  719. * @param src_color constant color (ARGB8888) of src
  720. * @param dst_pitch stride in bytes of dst image
  721. * @param src_pitch stride in bytes of src image
  722. * @param w width in pixels of blend area
  723. * @param h height in pixels of blend area
  724. * @param opa global opa of src
  725. *
  726. * @retval N/A
  727. */
  728. void sw_blend_color_over_argb8888(void *dst, uint32_t src_color,
  729. uint16_t dst_pitch, uint16_t w, uint16_t h);
  730. /*
  731. * @brief blend a A8 image over rgb565 image
  732. *
  733. * @param dst address of dst image
  734. * @param src address of src image
  735. * @param src_color constant color (ARGB8888) of src
  736. * @param dst_pitch stride in bytes of dst image
  737. * @param src_pitch stride in bytes of src image
  738. * @param w width in pixels of blend area
  739. * @param h height in pixels of blend area
  740. * @param opa global opa of src
  741. *
  742. * @retval N/A
  743. */
  744. void sw_blend_a8_over_rgb565(void *dst, const void *src, uint32_t src_color,
  745. uint16_t dst_pitch, uint16_t src_pitch, uint16_t w, uint16_t h);
  746. /*
  747. * @brief blend a A8 image over rgb888 image
  748. *
  749. * @param dst address of dst image
  750. * @param src address of src image
  751. * @param src_color constant color (ARGB8888) of src
  752. * @param dst_pitch stride in bytes of dst image
  753. * @param src_pitch stride in bytes of src image
  754. * @param w width in pixels of blend area
  755. * @param h height in pixels of blend area
  756. * @param opa global opa of src
  757. *
  758. * @retval N/A
  759. */
  760. void sw_blend_a8_over_rgb888(void *dst, const void *src, uint32_t src_color,
  761. uint16_t dst_pitch, uint16_t src_pitch, uint16_t w, uint16_t h);
  762. /*
  763. * @brief blend a A8 image over argb8888 image
  764. *
  765. * @param dst address of dst image
  766. * @param src address of src image
  767. * @param src_color constant color (ARGB8888) of src
  768. * @param dst_pitch stride in bytes of dst image
  769. * @param src_pitch stride in bytes of src image
  770. * @param w width in pixels of blend area
  771. * @param h height in pixels of blend area
  772. * @param opa global opa of src
  773. *
  774. * @retval N/A
  775. */
  776. void sw_blend_a8_over_argb8888(void *dst, const void *src, uint32_t src_color,
  777. uint16_t dst_pitch, uint16_t src_pitch, uint16_t w, uint16_t h);
  778. /*
  779. * @brief blend a A4 (big endian) image over rgb565 image
  780. *
  781. * @param dst address of dst image
  782. * @param src address of src image
  783. * @param src_color constant color (ARGB8888) of src
  784. * @param dst_pitch stride in bytes of dst image
  785. * @param src_pitch stride in bytes of src image
  786. * @param src_bofs src address bit offset
  787. * @param w width in pixels of blend area
  788. * @param h height in pixels of blend area
  789. * @param opa global opa of src
  790. *
  791. * @retval N/A
  792. */
  793. void sw_blend_a4_over_rgb565(void *dst, const void *src, uint32_t src_color,
  794. uint16_t dst_pitch, uint16_t src_pitch, uint8_t src_bofs,
  795. uint16_t w, uint16_t h);
  796. /*
  797. * @brief blend a A4 (big endian) image over rgb888 image
  798. *
  799. * @param dst address of dst image
  800. * @param src address of src image
  801. * @param src_color constant color (ARGB8888) of src
  802. * @param dst_pitch stride in bytes of dst image
  803. * @param src_pitch stride in bytes of src image
  804. * @param src_bofs src address bit offset
  805. * @param w width in pixels of blend area
  806. * @param h height in pixels of blend area
  807. * @param opa global opa of src
  808. *
  809. * @retval N/A
  810. */
  811. void sw_blend_a4_over_rgb888(void *dst, const void *src, uint32_t src_color,
  812. uint16_t dst_pitch, uint16_t src_pitch, uint8_t src_bofs,
  813. uint16_t w, uint16_t h);
  814. /*
  815. * @brief blend a A4 (big endian) image over argb8888 image
  816. *
  817. * @param dst address of dst image
  818. * @param src address of src image
  819. * @param src_color constant color (ARGB8888) of src
  820. * @param dst_pitch stride in bytes of dst image
  821. * @param src_pitch stride in bytes of src image
  822. * @param src_bofs src address bit offset
  823. * @param w width in pixels of blend area
  824. * @param h height in pixels of blend area
  825. * @param opa global opa of src
  826. *
  827. * @retval N/A
  828. */
  829. void sw_blend_a4_over_argb8888(void *dst, const void *src, uint32_t src_color,
  830. uint16_t dst_pitch, uint16_t src_pitch, uint8_t src_bofs,
  831. uint16_t w, uint16_t h);
  832. /*
  833. * @brief blend a A2 (big endian) image over rgb565 image
  834. *
  835. * @param dst address of dst image
  836. * @param src address of src image
  837. * @param src_color constant color (ARGB8888) of src
  838. * @param dst_pitch stride in bytes of dst image
  839. * @param src_pitch stride in bytes of src image
  840. * @param src_bofs src address bit offset
  841. * @param w width in pixels of blend area
  842. * @param h height in pixels of blend area
  843. * @param opa global opa of src
  844. *
  845. * @retval N/A
  846. */
  847. void sw_blend_a2_over_rgb565(void *dst, const void *src, uint32_t src_color,
  848. uint16_t dst_pitch, uint16_t src_pitch, uint8_t src_bofs,
  849. uint16_t w, uint16_t h);
  850. /*
  851. * @brief blend a A2 (big endian) image over rgb888 image
  852. *
  853. * @param dst address of dst image
  854. * @param src address of src image
  855. * @param src_color constant color (ARGB8888) of src
  856. * @param dst_pitch stride in bytes of dst image
  857. * @param src_pitch stride in bytes of src image
  858. * @param src_bofs src address bit offset
  859. * @param w width in pixels of blend area
  860. * @param h height in pixels of blend area
  861. * @param opa global opa of src
  862. *
  863. * @retval N/A
  864. */
  865. void sw_blend_a2_over_rgb888(void *dst, const void *src, uint32_t src_color,
  866. uint16_t dst_pitch, uint16_t src_pitch, uint8_t src_bofs,
  867. uint16_t w, uint16_t h);
  868. /*
  869. * @brief blend a A2 (big endian) image over argb8888 image
  870. *
  871. * @param dst address of dst image
  872. * @param src address of src image
  873. * @param src_color constant color (ARGB8888) of src
  874. * @param dst_pitch stride in bytes of dst image
  875. * @param src_pitch stride in bytes of src image
  876. * @param src_bofs src address bit offset
  877. * @param w width in pixels of blend area
  878. * @param h height in pixels of blend area
  879. * @param opa global opa of src
  880. *
  881. * @retval N/A
  882. */
  883. void sw_blend_a2_over_argb8888(void *dst, const void *src, uint32_t src_color,
  884. uint16_t dst_pitch, uint16_t src_pitch, uint8_t src_bofs,
  885. uint16_t w, uint16_t h);
  886. /*
  887. * @brief blend a A1 (big endian) image over rgb565 image
  888. *
  889. * @param dst address of dst image
  890. * @param src address of src image
  891. * @param src_color constant color (ARGB8888) of src
  892. * @param dst_pitch stride in bytes of dst image
  893. * @param src_pitch stride in bytes of src image
  894. * @param src_bofs src address bit offset
  895. * @param w width in pixels of blend area
  896. * @param h height in pixels of blend area
  897. * @param opa global opa of src
  898. *
  899. * @retval N/A
  900. */
  901. void sw_blend_a1_over_rgb565(void *dst, const void *src, uint32_t src_color,
  902. uint16_t dst_pitch, uint16_t src_pitch, uint8_t src_bofs,
  903. uint16_t w, uint16_t h);
  904. /*
  905. * @brief blend a A1 (big endian) image over rgb888 image
  906. *
  907. * @param dst address of dst image
  908. * @param src address of src image
  909. * @param src_color constant color (ARGB8888) of src
  910. * @param dst_pitch stride in bytes of dst image
  911. * @param src_pitch stride in bytes of src image
  912. * @param src_bofs src address bit offset
  913. * @param w width in pixels of blend area
  914. * @param h height in pixels of blend area
  915. * @param opa global opa of src
  916. *
  917. * @retval N/A
  918. */
  919. void sw_blend_a1_over_rgb888(void *dst, const void *src, uint32_t src_color,
  920. uint16_t dst_pitch, uint16_t src_pitch, uint8_t src_bofs,
  921. uint16_t w, uint16_t h);
  922. /*
  923. * @brief blend a A1 (big endian) image over argb8888 image
  924. *
  925. * @param dst address of dst image
  926. * @param src address of src image
  927. * @param src_color constant color (ARGB8888) of src
  928. * @param dst_pitch stride in bytes of dst image
  929. * @param src_pitch stride in bytes of src image
  930. * @param src_bofs src address bit offset
  931. * @param w width in pixels of blend area
  932. * @param h height in pixels of blend area
  933. * @param opa global opa of src
  934. *
  935. * @retval N/A
  936. */
  937. void sw_blend_a1_over_argb8888(void *dst, const void *src, uint32_t src_color,
  938. uint16_t dst_pitch, uint16_t src_pitch, uint8_t src_bofs,
  939. uint16_t w, uint16_t h);
  940. /*
  941. * @brief blend an index8 image over rgb565 image
  942. *
  943. * @param dst address of dst image
  944. * @param src address of src image'
  945. * @param src_clut address of src clut (ARGB8888 color lookup table)
  946. * @param dst_pitch stride in bytes of dst image
  947. * @param src_pitch stride in bytes of src image
  948. * @param w width in pixels of blend area
  949. * @param h height in pixels of blend area
  950. *
  951. * @retval N/A
  952. */
  953. void sw_blend_index8_over_rgb565(void *dst, const void *src, const uint32_t *src_clut,
  954. uint16_t dst_pitch, uint16_t src_pitch, uint16_t w, uint16_t h);
  955. /*
  956. * @brief blend an index8 image over rgb888 image
  957. *
  958. * @param dst address of dst image
  959. * @param src address of src image
  960. * @param src_clut address of src clut (ARGB8888 color lookup table)
  961. * @param dst_pitch stride in bytes of dst image
  962. * @param src_pitch stride in bytes of src image
  963. * @param w width in pixels of blend area
  964. * @param h height in pixels of blend area
  965. *
  966. * @retval N/A
  967. */
  968. void sw_blend_index8_over_rgb888(void *dst, const void *src, const uint32_t *src_clut,
  969. uint16_t dst_pitch, uint16_t src_pitch, uint16_t w, uint16_t h);
  970. /*
  971. * @brief blend an index8 image over argb8888 image
  972. *
  973. * @param dst address of dst image
  974. * @param src address of src image
  975. * @param src_clut address of src clut (ARGB8888 color lookup table)
  976. * @param dst_pitch stride in bytes of dst image
  977. * @param src_pitch stride in bytes of src image
  978. * @param w width in pixels of blend area
  979. * @param h height in pixels of blend area
  980. *
  981. * @retval N/A
  982. */
  983. void sw_blend_index8_over_argb8888(void *dst, const void *src, const uint32_t *src_clut,
  984. uint16_t dst_pitch, uint16_t src_pitch, uint16_t w, uint16_t h);
  985. /*
  986. * @brief blend an index4 (big endian) image over rgb565 image
  987. *
  988. * @param dst address of dst image
  989. * @param src address of src image
  990. * @param src_clut address of src clut (ARGB8888 color lookup table)
  991. * @param dst_pitch stride in bytes of dst image
  992. * @param src_pitch stride in bytes of src image
  993. * @param src_bofs src address bit offset
  994. * @param w width in pixels of blend area
  995. * @param h height in pixels of blend area
  996. *
  997. * @retval N/A
  998. */
  999. void sw_blend_index4_over_rgb565(void *dst, const void *src, const uint32_t *src_clut,
  1000. uint16_t dst_pitch, uint16_t src_pitch, uint8_t src_bofs, uint16_t w, uint16_t h);
  1001. /*
  1002. * @brief blend an index4 (big endian) image over rgb888 image
  1003. *
  1004. * @param dst address of dst image
  1005. * @param src address of src image
  1006. * @param src_clut address of src clut (ARGB8888 color lookup table)
  1007. * @param dst_pitch stride in bytes of dst image
  1008. * @param src_pitch stride in bytes of src image
  1009. * @param src_bofs src address bit offset
  1010. * @param w width in pixels of blend area
  1011. * @param h height in pixels of blend area
  1012. *
  1013. * @retval N/A
  1014. */
  1015. void sw_blend_index4_over_rgb888(void *dst, const void *src, const uint32_t *src_clut,
  1016. uint16_t dst_pitch, uint16_t src_pitch, uint8_t src_bofs, uint16_t w, uint16_t h);
  1017. /*
  1018. * @brief blend an index4 (big endian) image over argb8888 image
  1019. *
  1020. * @param dst address of dst image
  1021. * @param src address of src image
  1022. * @param src_clut address of src clut (ARGB8888 color lookup table)
  1023. * @param dst_pitch stride in bytes of dst image
  1024. * @param src_pitch stride in bytes of src image
  1025. * @param src_bofs src address bit offset
  1026. * @param w width in pixels of blend area
  1027. * @param h height in pixels of blend area
  1028. *
  1029. * @retval N/A
  1030. */
  1031. void sw_blend_index4_over_argb8888(void *dst, const void *src, const uint32_t *src_clut,
  1032. uint16_t dst_pitch, uint16_t src_pitch, uint8_t src_bofs, uint16_t w, uint16_t h);
  1033. /*
  1034. * @brief blend an index2 (big endian) image over rgb565 image
  1035. *
  1036. * @param dst address of dst image
  1037. * @param src address of src image
  1038. * @param src_clut address of src clut (ARGB8888 color lookup table)
  1039. * @param dst_pitch stride in bytes of dst image
  1040. * @param src_pitch stride in bytes of src image
  1041. * @param src_bofs src address bit offset
  1042. * @param w width in pixels of blend area
  1043. * @param h height in pixels of blend area
  1044. *
  1045. * @retval N/A
  1046. */
  1047. void sw_blend_index2_over_rgb565(void *dst, const void *src, const uint32_t *src_clut,
  1048. uint16_t dst_pitch, uint16_t src_pitch, uint8_t src_bofs, uint16_t w, uint16_t h);
  1049. /*
  1050. * @brief blend an index2 (big endian) image over rgb888 image
  1051. *
  1052. * @param dst address of dst image
  1053. * @param src address of src image
  1054. * @param src_clut address of src clut (ARGB8888 color lookup table)
  1055. * @param dst_pitch stride in bytes of dst image
  1056. * @param src_pitch stride in bytes of src image
  1057. * @param src_bofs src address bit offset
  1058. * @param w width in pixels of blend area
  1059. * @param h height in pixels of blend area
  1060. *
  1061. * @retval N/A
  1062. */
  1063. void sw_blend_index2_over_rgb888(void *dst, const void *src, const uint32_t *src_clut,
  1064. uint16_t dst_pitch, uint16_t src_pitch, uint8_t src_bofs, uint16_t w, uint16_t h);
  1065. /*
  1066. * @brief blend an index2 (big endian) image over argb8888 image
  1067. *
  1068. * @param dst address of dst image
  1069. * @param src address of src image
  1070. * @param src_clut address of src clut (ARGB8888 color lookup table)
  1071. * @param dst_pitch stride in bytes of dst image
  1072. * @param src_pitch stride in bytes of src image
  1073. * @param src_bofs src address bit offset
  1074. * @param w width in pixels of blend area
  1075. * @param h height in pixels of blend area
  1076. *
  1077. * @retval N/A
  1078. */
  1079. void sw_blend_index2_over_argb8888(void *dst, const void *src, const uint32_t *src_clut,
  1080. uint16_t dst_pitch, uint16_t src_pitch, uint8_t src_bofs, uint16_t w, uint16_t h);
  1081. /*
  1082. * @brief blend an index1 (big endian) image over rgb565 image
  1083. *
  1084. * @param dst address of dst image
  1085. * @param src address of src image
  1086. * @param src_clut address of src clut (ARGB8888 color lookup table)
  1087. * @param dst_pitch stride in bytes of dst image
  1088. * @param src_pitch stride in bytes of src image
  1089. * @param src_bofs src address bit offset
  1090. * @param w width in pixels of blend area
  1091. * @param h height in pixels of blend area
  1092. *
  1093. * @retval N/A
  1094. */
  1095. void sw_blend_index1_over_rgb565(void *dst, const void *src, const uint32_t *src_clut,
  1096. uint16_t dst_pitch, uint16_t src_pitch, uint8_t src_bofs, uint16_t w, uint16_t h);
  1097. /*
  1098. * @brief blend an index1 (big endian) image over rgb888 image
  1099. *
  1100. * @param dst address of dst image
  1101. * @param src address of src image
  1102. * @param src_clut address of src clut (ARGB8888 color lookup table)
  1103. * @param dst_pitch stride in bytes of dst image
  1104. * @param src_pitch stride in bytes of src image
  1105. * @param src_bofs src address bit offset
  1106. * @param w width in pixels of blend area
  1107. * @param h height in pixels of blend area
  1108. *
  1109. * @retval N/A
  1110. */
  1111. void sw_blend_index1_over_rgb888(void *dst, const void *src, const uint32_t *src_clut,
  1112. uint16_t dst_pitch, uint16_t src_pitch, uint8_t src_bofs, uint16_t w, uint16_t h);
  1113. /*
  1114. * @brief blend an index1 (big endian) image over argb8888 image
  1115. *
  1116. * @param dst address of dst image
  1117. * @param src address of src image
  1118. * @param src_clut address of src clut (ARGB8888 color lookup table)
  1119. * @param dst_pitch stride in bytes of dst image
  1120. * @param src_pitch stride in bytes of src image
  1121. * @param src_bofs src address bit offset
  1122. * @param w width in pixels of blend area
  1123. * @param h height in pixels of blend area
  1124. *
  1125. * @retval N/A
  1126. */
  1127. void sw_blend_index1_over_argb8888(void *dst, const void *src, const uint32_t *src_clut,
  1128. uint16_t dst_pitch, uint16_t src_pitch, uint8_t src_bofs, uint16_t w, uint16_t h);
  1129. /*
  1130. * @brief blend an rgb565a8 image over rgb565 image
  1131. *
  1132. * @param dst address of dst image
  1133. * @param src address of src image
  1134. * @param src_opa address of src opa image
  1135. * @param dst_pitch stride in bytes of dst image
  1136. * @param src_pitch stride in bytes of src image
  1137. * @param src_opa_pitch stride in bytes of src opa image
  1138. * @param w width in pixels of blend area
  1139. * @param h height in pixels of blend area
  1140. *
  1141. * @retval N/A
  1142. */
  1143. void sw_blend_rgb565a8_over_rgb565(void *dst, const void *src, const void *src_opa,
  1144. uint16_t dst_pitch, uint16_t src_pitch, uint16_t src_opa_pitch, uint16_t w, uint16_t h);
  1145. /*
  1146. * @brief blend an rgb565a8 image over rgb888 image
  1147. *
  1148. * @param dst address of dst image
  1149. * @param src address of src image
  1150. * @param src_opa address of src opa image
  1151. * @param dst_pitch stride in bytes of dst image
  1152. * @param src_pitch stride in bytes of src image
  1153. * @param src_opa_pitch stride in bytes of src opa image
  1154. * @param w width in pixels of blend area
  1155. * @param h height in pixels of blend area
  1156. *
  1157. * @retval N/A
  1158. */
  1159. void sw_blend_rgb565a8_over_rgb888(void *dst, const void *src, const void *src_opa,
  1160. uint16_t dst_pitch, uint16_t src_pitch, uint16_t src_opa_pitch, uint16_t w, uint16_t h);
  1161. /*
  1162. * @brief blend an rgb565a8 image over argb8888 image
  1163. *
  1164. * @param dst address of dst image
  1165. * @param src address of src image
  1166. * @param src_opa address of src opa image
  1167. * @param dst_pitch stride in bytes of dst image
  1168. * @param src_pitch stride in bytes of src image
  1169. * @param src_opa_pitch stride in bytes of src opa image
  1170. * @param w width in pixels of blend area
  1171. * @param h height in pixels of blend area
  1172. *
  1173. * @retval N/A
  1174. */
  1175. void sw_blend_rgb565a8_over_argb8888(void *dst, const void *src, const void *src_opa,
  1176. uint16_t dst_pitch, uint16_t src_pitch, uint16_t src_opa_pitch, uint16_t w, uint16_t h);
  1177. /*
  1178. * @brief blend an argb8565 image over rgb565 image
  1179. *
  1180. * @param dst address of dst image
  1181. * @param src address of src image
  1182. * @param dst_pitch stride in bytes of dst image
  1183. * @param src_pitch stride in bytes of src image
  1184. * @param w width in pixels of blend area
  1185. * @param h height in pixels of blend area
  1186. *
  1187. * @retval N/A
  1188. */
  1189. void sw_blend_argb8565_over_rgb565(void *dst, const void *src,
  1190. uint16_t dst_pitch, uint16_t src_pitch, uint16_t w, uint16_t h);
  1191. /*
  1192. * @brief blend an argb8565 image over rgb888 image
  1193. *
  1194. * @param dst address of dst image
  1195. * @param src address of src image
  1196. * @param dst_pitch stride in bytes of dst image
  1197. * @param src_pitch stride in bytes of src image
  1198. * @param w width in pixels of blend area
  1199. * @param h height in pixels of blend area
  1200. *
  1201. * @retval N/A
  1202. */
  1203. void sw_blend_argb8565_over_rgb888(void *dst, const void *src,
  1204. uint16_t dst_pitch, uint16_t src_pitch, uint16_t w, uint16_t h);
  1205. /*
  1206. * @brief blend an argb8565 image over argb8888 image
  1207. *
  1208. * @param dst address of dst image
  1209. * @param src address of src image
  1210. * @param dst_pitch stride in bytes of dst image
  1211. * @param src_pitch stride in bytes of src image
  1212. * @param w width in pixels of blend area
  1213. * @param h height in pixels of blend area
  1214. *
  1215. * @retval N/A
  1216. */
  1217. void sw_blend_argb8565_over_argb8888(void *dst, const void *src,
  1218. uint16_t dst_pitch, uint16_t src_pitch, uint16_t w, uint16_t h);
  1219. /*
  1220. * @brief blend an argb6666 image over rgb565 image
  1221. *
  1222. * @param dst address of dst image
  1223. * @param src address of src image
  1224. * @param dst_pitch stride in bytes of dst image
  1225. * @param src_pitch stride in bytes of src image
  1226. * @param w width in pixels of blend area
  1227. * @param h height in pixels of blend area
  1228. *
  1229. * @retval N/A
  1230. */
  1231. void sw_blend_argb6666_over_rgb565(void *dst, const void *src,
  1232. uint16_t dst_pitch, uint16_t src_pitch, uint16_t w, uint16_t h);
  1233. /*
  1234. * @brief blend an argb6666 image over rgb888 image
  1235. *
  1236. * @param dst address of dst image
  1237. * @param src address of src image
  1238. * @param dst_pitch stride in bytes of dst image
  1239. * @param src_pitch stride in bytes of src image
  1240. * @param w width in pixels of blend area
  1241. * @param h height in pixels of blend area
  1242. *
  1243. * @retval N/A
  1244. */
  1245. void sw_blend_argb6666_over_rgb888(void *dst, const void *src,
  1246. uint16_t dst_pitch, uint16_t src_pitch, uint16_t w, uint16_t h);
  1247. /*
  1248. * @brief blend an argb6666 image over argb8888 image
  1249. *
  1250. * @param dst address of dst image
  1251. * @param src address of src image
  1252. * @param dst_pitch stride in bytes of dst image
  1253. * @param src_pitch stride in bytes of src image
  1254. * @param w width in pixels of blend area
  1255. * @param h height in pixels of blend area
  1256. *
  1257. * @retval N/A
  1258. */
  1259. void sw_blend_argb6666_over_argb8888(void *dst, const void *src,
  1260. uint16_t dst_pitch, uint16_t src_pitch, uint16_t w, uint16_t h);
  1261. /*
  1262. * @brief blend an argb1555 image over rgb565 image
  1263. *
  1264. * @param dst address of dst image
  1265. * @param src address of src image
  1266. * @param dst_pitch stride in bytes of dst image
  1267. * @param src_pitch stride in bytes of src image
  1268. * @param w width in pixels of blend area
  1269. * @param h height in pixels of blend area
  1270. *
  1271. * @retval N/A
  1272. */
  1273. void sw_blend_argb1555_over_rgb565(void *dst, const void *src,
  1274. uint16_t dst_pitch, uint16_t src_pitch, uint16_t w, uint16_t h);
  1275. /*
  1276. * @brief blend an argb1555 image over rgb888 image
  1277. *
  1278. * @param dst address of dst image
  1279. * @param src address of src image
  1280. * @param dst_pitch stride in bytes of dst image
  1281. * @param src_pitch stride in bytes of src image
  1282. * @param w width in pixels of blend area
  1283. * @param h height in pixels of blend area
  1284. *
  1285. * @retval N/A
  1286. */
  1287. void sw_blend_argb1555_over_rgb888(void *dst, const void *src,
  1288. uint16_t dst_pitch, uint16_t src_pitch, uint16_t w, uint16_t h);
  1289. /*
  1290. * @brief blend an argb1555 image over argb8888 image
  1291. *
  1292. * @param dst address of dst image
  1293. * @param src address of src image
  1294. * @param dst_pitch stride in bytes of dst image
  1295. * @param src_pitch stride in bytes of src image
  1296. * @param w width in pixels of blend area
  1297. * @param h height in pixels of blend area
  1298. *
  1299. * @retval N/A
  1300. */
  1301. void sw_blend_argb1555_over_argb8888(void *dst, const void *src,
  1302. uint16_t dst_pitch, uint16_t src_pitch, uint16_t w, uint16_t h);
  1303. /*
  1304. * @brief blend an argb8888 image over rgb565 image
  1305. *
  1306. * @param dst address of dst image
  1307. * @param src address of src image
  1308. * @param dst_pitch stride in bytes of dst image
  1309. * @param src_pitch stride in bytes of src image
  1310. * @param w width in pixels of blend area
  1311. * @param h height in pixels of blend area
  1312. *
  1313. * @retval N/A
  1314. */
  1315. void sw_blend_argb8888_over_rgb565(void *dst, const void *src,
  1316. uint16_t dst_pitch, uint16_t src_pitch, uint16_t w, uint16_t h);
  1317. /*
  1318. * @brief blend an argb8888 image over rgb888 image
  1319. *
  1320. * @param dst address of dst image
  1321. * @param src address of src image
  1322. * @param dst_pitch stride in bytes of dst image
  1323. * @param src_pitch stride in bytes of src image
  1324. * @param w width in pixels of blend area
  1325. * @param h height in pixels of blend area
  1326. *
  1327. * @retval N/A
  1328. */
  1329. void sw_blend_argb8888_over_rgb888(void *dst, const void *src,
  1330. uint16_t dst_pitch, uint16_t src_pitch, uint16_t w, uint16_t h);
  1331. /*
  1332. * @brief blend an argb8888 image over argb8888 image
  1333. *
  1334. * @param dst address of dst image
  1335. * @param src address of src image
  1336. * @param dst_pitch stride in bytes of dst image
  1337. * @param src_pitch stride in bytes of src image
  1338. * @param w width in pixels of blend area
  1339. * @param h height in pixels of blend area
  1340. *
  1341. * @retval N/A
  1342. */
  1343. void sw_blend_argb8888_over_argb8888(void *dst, const void *src,
  1344. uint16_t dst_pitch, uint16_t src_pitch, uint16_t w, uint16_t h);
  1345. #ifdef __cplusplus
  1346. }
  1347. #endif
  1348. /**
  1349. * @}
  1350. */
  1351. #endif /* ZEPHYR_FRAMEWORK_INCLUDE_DISPLAY_SW_DRAW_H_ */