vg_lite_image.c 64 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431
  1. /****************************************************************************
  2. *
  3. * Copyright 2012 - 2023 Vivante Corporation, Santa Clara, California.
  4. * All Rights Reserved.
  5. *
  6. * Permission is hereby granted, free of charge, to any person obtaining
  7. * a copy of this software and associated documentation files (the
  8. * 'Software'), to deal in the Software without restriction, including
  9. * without limitation the rights to use, copy, modify, merge, publish,
  10. * distribute, sub license, and/or sell copies of the Software, and to
  11. * permit persons to whom the Software is furnished to do so, subject
  12. * to the following conditions:
  13. *
  14. * The above copyright notice and this permission notice (including the
  15. * next paragraph) shall be included in all copies or substantial
  16. * portions of the Software.
  17. *
  18. * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
  19. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  20. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  21. * IN NO EVENT SHALL VIVANTE AND/OR ITS SUPPLIERS BE LIABLE FOR ANY
  22. * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  23. * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  24. * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  25. *
  26. *****************************************************************************/
  27. #include "vg_lite_context.h"
  28. #define MATRIX_FP_ABS(x) (((x) < 0) ? -(x) : (x))
  29. #define MATRIX_FP_EPS 2.2204460492503131e-14
  30. extern vg_lite_matrix_t identity_mtx;
  31. /* Get the plane memory pointer and strides info. */
  32. static uint32_t get_buffer_planes(vg_lite_buffer_t *buffer,
  33. uint8_t **memory,
  34. uint32_t *strides)
  35. {
  36. uint32_t count = 1;
  37. switch (buffer->format) {
  38. case VG_LITE_RGBA8888:
  39. case VG_LITE_BGRA8888:
  40. case VG_LITE_RGBX8888:
  41. case VG_LITE_BGRX8888:
  42. case VG_LITE_RGB565:
  43. case VG_LITE_BGR565:
  44. case VG_LITE_RGBA4444:
  45. case VG_LITE_BGRA4444:
  46. case VG_LITE_BGRA5551:
  47. case VG_LITE_A8:
  48. case VG_LITE_L8:
  49. case VG_LITE_A4:
  50. case VG_LITE_INDEX_1:
  51. case VG_LITE_INDEX_2:
  52. case VG_LITE_INDEX_4:
  53. case VG_LITE_INDEX_8:
  54. case VG_LITE_YUYV:
  55. case VG_LITE_YUY2:
  56. case VG_LITE_RGBA2222:
  57. count = 1;
  58. memory[0] = (uint8_t *)buffer->memory;
  59. memory[1] = memory[2] = ((uint8_t*)0);
  60. strides[0] = buffer->stride;
  61. strides[1] = strides[2] = 0;
  62. break;
  63. case VG_LITE_NV12:
  64. case VG_LITE_NV16:
  65. case VG_LITE_NV24:
  66. case VG_LITE_NV24_TILED:
  67. count = 2;
  68. memory[0] = (uint8_t *)buffer->memory;
  69. memory[1] = (uint8_t *)buffer->yuv.uv_memory;
  70. memory[2] = 0;
  71. strides[0] = buffer->stride;
  72. strides[1] = buffer->yuv.uv_stride;
  73. strides[2] = 0;
  74. break;
  75. case VG_LITE_AYUY2:
  76. count = 2;
  77. memory[0] = (uint8_t *)buffer->memory;
  78. memory[1] = 0;
  79. memory[2] = (uint8_t *)buffer->yuv.v_memory;
  80. strides[0] = buffer->stride;
  81. strides[1] = 0;
  82. strides[2] = buffer->yuv.alpha_stride;
  83. break;
  84. case VG_LITE_ANV12:
  85. count = 3;
  86. memory[0] = (uint8_t *)buffer->memory;
  87. memory[1] = (uint8_t *)buffer->yuv.uv_memory;
  88. memory[2] = (uint8_t *)buffer->yuv.v_memory;
  89. strides[0] = buffer->stride;
  90. strides[1] = buffer->yuv.uv_stride;
  91. strides[2] = buffer->yuv.alpha_stride;
  92. break;
  93. case VG_LITE_YV12:
  94. case VG_LITE_YV24:
  95. case VG_LITE_YV16:
  96. count = 3;
  97. memory[0] = (uint8_t *)buffer->memory;
  98. memory[1] = (uint8_t *)buffer->yuv.uv_memory;
  99. memory[2] = (uint8_t *)buffer->yuv.v_memory;
  100. strides[0] = buffer->stride;
  101. strides[1] = buffer->yuv.uv_stride;
  102. strides[2] = buffer->yuv.v_stride;
  103. break;
  104. case VG_LITE_YUY2_TILED:
  105. case VG_LITE_NV12_TILED:
  106. case VG_LITE_ANV12_TILED:
  107. case VG_LITE_AYUY2_TILED:
  108. default:
  109. count = 0;
  110. break;
  111. }
  112. return count;
  113. }
  114. vg_lite_error_t vg_lite_upload_buffer(vg_lite_buffer_t *buffer,
  115. vg_lite_uint8_t *data[3],
  116. vg_lite_uint32_t stride[3])
  117. {
  118. #if DUMP_API
  119. FUNC_DUMP(vg_lite_upload_buffer)(buffer, data, stride);
  120. #endif
  121. vg_lite_error_t error = VG_LITE_SUCCESS;
  122. int32_t plane_count;
  123. uint8_t *buffer_memory[3] = {((uint8_t*)0)};
  124. uint32_t buffer_strides[3] = {0};
  125. uint8_t *pdata;
  126. int32_t i, j;
  127. #if gcFEATURE_VG_TRACE_API
  128. VGLITE_LOG("vg_lite_upload_buffer %p %p %p\n", buffer, data, stride);
  129. #endif
  130. /* Get buffer memory info. */
  131. plane_count = get_buffer_planes(buffer, buffer_memory, buffer_strides);
  132. if (plane_count > 0 && plane_count <= 3) {
  133. /* Copy the data to buffer. */
  134. for (i = 0; i < plane_count; i++) {
  135. pdata = data[i];
  136. for (j = 0; j < buffer->height; j++) {
  137. memcpy(buffer_memory[i], pdata, buffer_strides[i]);
  138. buffer_memory[i] += buffer_strides[i];
  139. pdata += stride[i];
  140. }
  141. }
  142. }
  143. else {
  144. error = VG_LITE_INVALID_ARGUMENT;
  145. }
  146. return error;
  147. }
  148. static vg_lite_error_t swap(float* a, float* b)
  149. {
  150. float temp;
  151. if (a == NULL || b == NULL)
  152. return VG_LITE_INVALID_ARGUMENT;
  153. temp = *a;
  154. *a = *b;
  155. *b = temp;
  156. return VG_LITE_SUCCESS;
  157. }
  158. vg_lite_error_t vg_lite_get_transform_matrix(vg_lite_float_point4_t src, vg_lite_float_point4_t dst, vg_lite_matrix_t* mat)
  159. {
  160. float a[8][8], b[9], A[64];
  161. int i, j, k, m = 8, n = 1;
  162. int astep = 8, bstep = 1;
  163. float d;
  164. #if gcFEATURE_VG_TRACE_API
  165. VGLITE_LOG("vg_lite_get_transform_matrix %p %p %p\n", src, dst, mat);
  166. #endif
  167. if (src == NULL || dst == NULL || mat == NULL)
  168. return VG_LITE_INVALID_ARGUMENT;
  169. for (i = 0; i < 4; ++i)
  170. {
  171. a[i][0] = a[i + 4][3] = (float)src[i].x;
  172. a[i][1] = a[i + 4][4] = (float)src[i].y;
  173. a[i][2] = a[i + 4][5] = 1.0f;
  174. a[i][3] = a[i][4] = a[i][5] =
  175. a[i + 4][0] = a[i + 4][1] = a[i + 4][2] = 0.0f;
  176. a[i][6] = (float)(-src[i].x * dst[i].x);
  177. a[i][7] = (float)(-src[i].y * dst[i].x);
  178. a[i + 4][6] = (float)(-src[i].x * dst[i].y);
  179. a[i + 4][7] = (float)(-src[i].y * dst[i].y);
  180. b[i] = (float)dst[i].x;
  181. b[i + 4] = (float)dst[i].y;
  182. }
  183. for (i = 0; i < 8; ++i)
  184. {
  185. for (j = 0; j < 8; ++j)
  186. {
  187. A[8 * i + j] = a[i][j];
  188. }
  189. }
  190. for (i = 0; i < m; i++)
  191. {
  192. k = i;
  193. for (j = i + 1; j < m; j++)
  194. if (MATRIX_FP_ABS(A[j * astep + i]) > MATRIX_FP_ABS(A[k * astep + i]))
  195. k = j;
  196. if (MATRIX_FP_ABS(A[k * astep + i]) < MATRIX_FP_EPS)
  197. return VG_LITE_INVALID_ARGUMENT;
  198. if (k != i)
  199. {
  200. for (j = i; j < m; j++)
  201. swap(&A[i * astep + j], &A[k * astep + j]);
  202. for (j = 0; j < n; j++)
  203. swap(&b[i * bstep + j], &b[k * bstep + j]);
  204. }
  205. d = -1 / A[i * astep + i];
  206. for (j = i + 1; j < m; j++)
  207. {
  208. float alpha = A[j * astep + i] * d;
  209. for (k = i + 1; k < m; k++)
  210. A[j * astep + k] += alpha * A[i * astep + k];
  211. for (k = 0; k < n; k++)
  212. b[j * bstep + k] += alpha * b[i * bstep + k];
  213. }
  214. }
  215. for (i = m - 1; i >= 0; i--)
  216. for (j = 0; j < n; j++)
  217. {
  218. float s = b[i * bstep + j];
  219. for (k = i + 1; k < m; k++)
  220. s -= A[i * astep + k] * b[k * bstep + j];
  221. b[i * bstep + j] = s / A[i * astep + i];
  222. }
  223. b[8] = 1;
  224. for (i = 0; i < 3; ++i)
  225. {
  226. for (j = 0; j < 3; ++j)
  227. {
  228. mat->m[i][j] = b[i * 3 + j];
  229. }
  230. }
  231. return VG_LITE_SUCCESS;
  232. }
  233. vg_lite_error_t vg_lite_set_scissor(vg_lite_int32_t x, vg_lite_int32_t y, vg_lite_int32_t right, vg_lite_int32_t bottom)
  234. {
  235. #if DUMP_API
  236. FUNC_DUMP(vg_lite_set_scissor)(x, y, right, bottom);
  237. #endif
  238. #if gcFEATURE_VG_SCISSOR
  239. vg_lite_error_t error = VG_LITE_SUCCESS;
  240. #if gcFEATURE_VG_TRACE_API
  241. VGLITE_LOG("vg_lite_set_scissor %d %d %d %d\n", x, y, right, bottom);
  242. #endif
  243. /* Save scissor Box States. */
  244. s_context.scissor[0] = x;
  245. s_context.scissor[1] = y;
  246. s_context.scissor[2] = right;
  247. s_context.scissor[3] = bottom;
  248. /* Scissor dirty. */
  249. s_context.scissor_dirty = 1;
  250. s_context.scissor_set = 1;
  251. return error;
  252. #else
  253. return VG_LITE_NOT_SUPPORT;
  254. #endif
  255. }
  256. vg_lite_error_t vg_lite_enable_scissor()
  257. {
  258. #if DUMP_API
  259. FUNC_DUMP(vg_lite_enable_scissor)();
  260. #endif
  261. #if gcFEATURE_VG_MASK
  262. #if gcFEATURE_VG_TRACE_API
  263. VGLITE_LOG("vg_lite_enable_scissor\n");
  264. #endif
  265. /* Enable scissor Mode. */
  266. if (!s_context.scissor_enable) {
  267. s_context.scissor_enable = 1 << 4;
  268. s_context.scissor_dirty = 1;
  269. }
  270. return VG_LITE_SUCCESS;
  271. #else
  272. /* Noop */
  273. return VG_LITE_SUCCESS;
  274. #endif
  275. }
  276. vg_lite_error_t vg_lite_disable_scissor()
  277. {
  278. #if DUMP_API
  279. FUNC_DUMP(vg_lite_disable_scissor)();
  280. #endif
  281. #if gcFEATURE_VG_MASK
  282. #if gcFEATURE_VG_TRACE_API
  283. VGLITE_LOG("vg_lite_disable_scissor\n");
  284. #endif
  285. /* Disable scissor Mode. */
  286. if (s_context.scissor_enable) {
  287. s_context.scissor_enable = 0;
  288. s_context.scissor_dirty = 1;
  289. }
  290. return VG_LITE_SUCCESS;
  291. #else
  292. /* Noop */
  293. return VG_LITE_SUCCESS;
  294. #endif
  295. }
  296. vg_lite_error_t vg_lite_set_CLUT(vg_lite_uint32_t count, vg_lite_uint32_t* colors)
  297. {
  298. #if gcFEATURE_VG_IM_INDEX_FORMAT
  299. vg_lite_error_t error = VG_LITE_SUCCESS;
  300. uint32_t addr = 0x0B00;
  301. #if gcFEATURE_VG_TRACE_API
  302. VGLITE_LOG("vg_lite_set_CLUT %d %p\n", count, colors);
  303. #endif
  304. #if gcFEATURE_VG_NEW_IMAGE_INDEX
  305. {
  306. switch (count) {
  307. case 256:
  308. case 16:
  309. case 4:
  310. case 2:
  311. addr = 0x0B00;
  312. break;
  313. default:
  314. error = VG_LITE_INVALID_ARGUMENT;
  315. return error;
  316. break;
  317. }
  318. }
  319. #else
  320. {
  321. switch (count) {
  322. case 256:
  323. addr = 0x0B00;
  324. break;
  325. case 16:
  326. addr = 0x0AA0;
  327. break;
  328. case 4:
  329. addr = 0x0A9C;
  330. break;
  331. case 2:
  332. addr = 0x0A98;
  333. break;
  334. default:
  335. error = VG_LITE_INVALID_ARGUMENT;
  336. return error;
  337. break;
  338. }
  339. }
  340. #endif
  341. VG_LITE_RETURN_ERROR(push_clut(&s_context, addr, count, (uint32_t*)colors));
  342. return error;
  343. #else
  344. return VG_LITE_NOT_SUPPORT;
  345. #endif
  346. }
  347. vg_lite_error_t vg_lite_source_global_alpha(vg_lite_global_alpha_t alpha_mode, vg_lite_uint8_t alpha_value)
  348. {
  349. #if DUMP_API
  350. FUNC_DUMP(vg_lite_source_global_alpha)(alpha_mode, alpha_value);
  351. #endif
  352. #if gcFEATURE_VG_GLOBAL_ALPHA
  353. uint32_t image_alpha_mode;
  354. uint32_t image_alpha_value;
  355. #if gcFEATURE_VG_TRACE_API
  356. VGLITE_LOG("vg_lite_source_global_alpha %d %d\n", alpha_mode, alpha_value);
  357. #endif
  358. image_alpha_mode = (uint8_t)alpha_mode;
  359. image_alpha_value = alpha_value << 2;
  360. s_context.src_alpha_mode = image_alpha_mode;
  361. s_context.src_alpha_value = image_alpha_value;
  362. return VG_LITE_SUCCESS;
  363. #else
  364. return VG_LITE_NOT_SUPPORT;
  365. #endif
  366. }
  367. vg_lite_error_t vg_lite_dest_global_alpha(vg_lite_global_alpha_t alpha_mode, vg_lite_uint8_t alpha_value)
  368. {
  369. #if DUMP_API
  370. FUNC_DUMP(vg_lite_dest_global_alpha)(alpha_mode, alpha_value);
  371. #endif
  372. #if gcFEATURE_VG_GLOBAL_ALPHA
  373. uint32_t dest_alpha_mode;
  374. uint32_t dest_alpha_value;
  375. #if gcFEATURE_VG_TRACE_API
  376. VGLITE_LOG("vg_lite_dest_global_alpha %d %d\n", alpha_mode, alpha_value);
  377. #endif
  378. dest_alpha_mode = (alpha_mode == VG_LITE_NORMAL) ? 0 : (alpha_mode == VG_LITE_GLOBAL) ? 0x00000400 : 0x00000800;
  379. dest_alpha_value = alpha_value << 12;
  380. s_context.dst_alpha_mode = dest_alpha_mode;
  381. s_context.dst_alpha_value = dest_alpha_value;
  382. return VG_LITE_SUCCESS;
  383. #else
  384. return VG_LITE_NOT_SUPPORT;
  385. #endif
  386. }
  387. vg_lite_error_t vg_lite_set_color_key(vg_lite_color_key4_t colorkey)
  388. {
  389. #if DUMP_API
  390. FUNC_DUMP(vg_lite_set_color_key)(colorkey);
  391. #endif
  392. #if gcFEATURE_VG_COLOR_KEY
  393. uint8_t i;
  394. uint32_t value_low = 0;
  395. uint32_t value_high = 0;
  396. uint8_t r, g, b, a, e;
  397. vg_lite_error_t error = VG_LITE_SUCCESS;
  398. #if gcFEATURE_VG_TRACE_API
  399. VGLITE_LOG("vg_lite_set_color_key %p\n", colorkey);
  400. #endif
  401. /* Set color key states. */
  402. for (i = 0; i < 4; i++)
  403. {
  404. /* Set gcregVGPEColorKeyLow. Layout "E/R/G/B". */
  405. r = colorkey[i].low_r;
  406. g = colorkey[i].low_g;
  407. b = colorkey[i].low_b;
  408. e = colorkey[i].enable;
  409. value_low = (e << 24) | (r << 16) | (g << 8) | b;
  410. VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A90 + i, value_low));
  411. /* Set gcregVGPEColorKeyHigh. Layout "A/R/G/B". */
  412. r = colorkey[i].hign_r;
  413. g = colorkey[i].hign_g;
  414. b = colorkey[i].hign_b;
  415. a = colorkey[i].alpha;
  416. value_high = (a << 24) | (r << 16) | (g << 8) | b;
  417. VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A94 + i, value_high));
  418. }
  419. return error;
  420. #else
  421. return VG_LITE_NOT_SUPPORT;
  422. #endif
  423. }
  424. vg_lite_error_t vg_lite_enable_dither()
  425. {
  426. #if DUMP_API
  427. FUNC_DUMP(vg_lite_enable_dither)();
  428. #endif
  429. #if gcFEATURE_VG_DITHER
  430. vg_lite_error_t error = VG_LITE_SUCCESS;
  431. uint32_t table_low = 0x7B48F3C0;
  432. uint32_t table_high = 0x596AD1E2;
  433. #if gcFEATURE_VG_TRACE_API
  434. VGLITE_LOG("vg_lite_enable_dither\n");
  435. #endif
  436. VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A5A, table_low));
  437. VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A5B, table_high));
  438. return error;
  439. #else
  440. return VG_LITE_NOT_SUPPORT;
  441. #endif
  442. }
  443. vg_lite_error_t vg_lite_disable_dither()
  444. {
  445. #if DUMP_API
  446. FUNC_DUMP(vg_lite_disable_dither)();
  447. #endif
  448. #if gcFEATURE_VG_DITHER
  449. vg_lite_error_t error = VG_LITE_SUCCESS;
  450. #if gcFEATURE_VG_TRACE_API
  451. VGLITE_LOG("vg_lite_disable_dither\n");
  452. #endif
  453. VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A5A, 0xFFFFFFFF));
  454. VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A5B, 0xFFFFFFFF));
  455. return error;
  456. #else
  457. return VG_LITE_NOT_SUPPORT;
  458. #endif
  459. }
  460. vg_lite_error_t vg_lite_enable_masklayer()
  461. {
  462. #if DUMP_API
  463. FUNC_DUMP(vg_lite_enable_masklayer)();
  464. #endif
  465. #if gcFEATURE_VG_MASK
  466. vg_lite_error_t error = VG_LITE_SUCCESS;
  467. #if gcFEATURE_VG_TRACE_API
  468. VGLITE_LOG("vg_lite_enable_masklayer\n");
  469. #endif
  470. s_context.enable_mask = (1 << 20);
  471. return error;
  472. #else
  473. return VG_LITE_NOT_SUPPORT;
  474. #endif
  475. }
  476. vg_lite_error_t vg_lite_disable_masklayer()
  477. {
  478. #if DUMP_API
  479. FUNC_DUMP(vg_lite_disable_masklayer)();
  480. #endif
  481. #if gcFEATURE_VG_MASK
  482. vg_lite_error_t error = VG_LITE_SUCCESS;
  483. #if gcFEATURE_VG_TRACE_API
  484. VGLITE_LOG("vg_lite_disable_masklayer\n");
  485. #endif
  486. s_context.enable_mask = 0;
  487. return error;
  488. #else
  489. return VG_LITE_NOT_SUPPORT;
  490. #endif
  491. }
  492. vg_lite_error_t vg_lite_create_masklayer(vg_lite_buffer_t* masklayer, vg_lite_uint32_t width, vg_lite_uint32_t height)
  493. {
  494. #if DUMP_API
  495. FUNC_DUMP(vg_lite_create_masklayer)(masklayer, width, height);
  496. #endif
  497. #if gcFEATURE_VG_MASK
  498. vg_lite_error_t error = VG_LITE_SUCCESS;
  499. #if gcFEATURE_VG_TRACE_API
  500. VGLITE_LOG("vg_lite_create_masklayer %p %d %d\n", masklayer, width, height);
  501. #endif
  502. memset(masklayer, 0, sizeof(vg_lite_buffer_t));
  503. masklayer->width = width;
  504. masklayer->height = height;
  505. masklayer->format = VG_LITE_A8;
  506. VG_LITE_RETURN_ERROR(vg_lite_allocate(masklayer));
  507. VG_LITE_RETURN_ERROR(vg_lite_clear(masklayer, NULL, 0xFF << 24));
  508. return error;
  509. #else
  510. return VG_LITE_NOT_SUPPORT;
  511. #endif
  512. }
  513. vg_lite_error_t vg_lite_fill_masklayer(vg_lite_buffer_t* masklayer, vg_lite_rectangle_t* rect, vg_lite_uint8_t value)
  514. {
  515. #if DUMP_API
  516. FUNC_DUMP(vg_lite_fill_masklayer)(masklayer, rect, value);
  517. #endif
  518. #if gcFEATURE_VG_MASK
  519. vg_lite_error_t error = VG_LITE_SUCCESS;
  520. #if gcFEATURE_VG_TRACE_API
  521. VGLITE_LOG("vg_lite_fill_masklayer %p %p %d\n", masklayer, rect, value);
  522. #endif
  523. error = vg_lite_clear(masklayer, rect, value << 24);
  524. return error;
  525. #else
  526. return VG_LITE_NOT_SUPPORT;
  527. #endif
  528. }
  529. vg_lite_error_t vg_lite_blend_masklayer(
  530. vg_lite_buffer_t* dst_masklayer,
  531. vg_lite_buffer_t* src_masklayer,
  532. vg_lite_mask_operation_t operation,
  533. vg_lite_rectangle_t* rect
  534. )
  535. {
  536. #if DUMP_API
  537. FUNC_DUMP(vg_lite_blend_masklayer)(dst_masklayer, src_masklayer, operation, rect);
  538. #endif
  539. #if gcFEATURE_VG_MASK
  540. vg_lite_error_t error = VG_LITE_SUCCESS;
  541. vg_lite_matrix_t matrix;
  542. vg_lite_filter_t filter = VG_LITE_FILTER_POINT;
  543. vg_lite_rectangle_t area = *rect;
  544. #if gcFEATURE_VG_TRACE_API
  545. VGLITE_LOG("vg_lite_blend_masklayer %p %p %d %p\n", dst_masklayer, src_masklayer, operation, rect);
  546. #endif
  547. vg_lite_identity(&matrix);
  548. vg_lite_translate((vg_lite_float_t)rect->x, (vg_lite_float_t)rect->y, &matrix);
  549. switch (operation)
  550. {
  551. case VG_LITE_CLEAR_MASK:
  552. VG_LITE_RETURN_ERROR(vg_lite_clear(dst_masklayer, &area, 0x0));
  553. break;
  554. case VG_LITE_FILL_MASK:
  555. VG_LITE_RETURN_ERROR(vg_lite_clear(dst_masklayer, &area, 0xFF << 24));
  556. break;
  557. case VG_LITE_SET_MASK:
  558. area.x = 0;
  559. area.y = 0;
  560. VG_LITE_RETURN_ERROR(vg_lite_blit_rect(dst_masklayer, src_masklayer, &area, &matrix, VG_LITE_BLEND_NONE, 0, filter));
  561. break;
  562. case VG_LITE_UNION_MASK:
  563. area.x = 0;
  564. area.y = 0;
  565. VG_LITE_RETURN_ERROR(vg_lite_blit_rect(dst_masklayer, src_masklayer, &area, &matrix, VG_LITE_BLEND_SCREEN, 0, filter));
  566. break;
  567. case VG_LITE_INTERSECT_MASK:
  568. area.x = 0;
  569. area.y = 0;
  570. VG_LITE_RETURN_ERROR(vg_lite_blit_rect(dst_masklayer, src_masklayer, &area, &matrix, VG_LITE_BLEND_DST_IN, 0, filter));
  571. break;
  572. case VG_LITE_SUBTRACT_MASK:
  573. area.x = 0;
  574. area.y = 0;
  575. VG_LITE_RETURN_ERROR(vg_lite_blit_rect(dst_masklayer, src_masklayer, &area, &matrix, VG_LITE_BLEND_SUBTRACT, 0, filter));
  576. break;
  577. default:
  578. break;
  579. }
  580. return error;
  581. #else
  582. return VG_LITE_NOT_SUPPORT;
  583. #endif
  584. }
  585. vg_lite_error_t vg_lite_set_masklayer(vg_lite_buffer_t* masklayer)
  586. {
  587. #if DUMP_API
  588. FUNC_DUMP(vg_lite_set_masklayer)(masklayer);
  589. #endif
  590. #if gcFEATURE_VG_MASK
  591. vg_lite_error_t error = VG_LITE_SUCCESS;
  592. #if gcFEATURE_VG_TRACE_API
  593. VGLITE_LOG("vg_lite_set_masklayer %p\n", masklayer);
  594. #endif
  595. VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A14, masklayer->address));
  596. VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A15, masklayer->stride));
  597. VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1B, 0x00000010));
  598. return error;
  599. #else
  600. return VG_LITE_NOT_SUPPORT;
  601. #endif
  602. }
  603. vg_lite_error_t vg_lite_render_masklayer(
  604. vg_lite_buffer_t* masklayer,
  605. vg_lite_mask_operation_t operation,
  606. vg_lite_path_t* path,
  607. vg_lite_fill_t fill_rule,
  608. vg_lite_color_t color,
  609. vg_lite_matrix_t* matrix
  610. )
  611. {
  612. #if DUMP_API
  613. FUNC_DUMP(vg_lite_render_masklayer)(masklayer, operation, path, fill_rule, color, matrix);
  614. #endif
  615. #if gcFEATURE_VG_MASK
  616. vg_lite_error_t error = VG_LITE_SUCCESS;
  617. #if gcFEATURE_VG_TRACE_API
  618. VGLITE_LOG("vg_lite_render_masklayer %p %d %p %d %d %p\n", masklayer, operation, path, fill_rule, color, matrix);
  619. #endif
  620. if (!matrix) {
  621. matrix = &identity_mtx;
  622. }
  623. switch (operation)
  624. {
  625. case VG_LITE_CLEAR_MASK:
  626. VG_LITE_RETURN_ERROR(vg_lite_draw(masklayer, path, fill_rule, matrix, VG_LITE_BLEND_NONE, 0));
  627. break;
  628. case VG_LITE_FILL_MASK:
  629. VG_LITE_RETURN_ERROR(vg_lite_draw(masklayer, path, fill_rule, matrix, VG_LITE_BLEND_NONE, 0xFF << 24));
  630. break;
  631. case VG_LITE_SET_MASK:
  632. VG_LITE_RETURN_ERROR(vg_lite_draw(masklayer, path, fill_rule, matrix, VG_LITE_BLEND_NONE, color << 24));
  633. break;
  634. case VG_LITE_UNION_MASK:
  635. VG_LITE_RETURN_ERROR(vg_lite_draw(masklayer, path, fill_rule, matrix, VG_LITE_BLEND_SCREEN, color << 24));
  636. break;
  637. case VG_LITE_INTERSECT_MASK:
  638. VG_LITE_RETURN_ERROR(vg_lite_draw(masklayer, path, fill_rule, matrix, VG_LITE_BLEND_DST_IN, color << 24));
  639. break;
  640. case VG_LITE_SUBTRACT_MASK:
  641. VG_LITE_RETURN_ERROR(vg_lite_draw(masklayer, path, fill_rule, matrix, VG_LITE_BLEND_SUBTRACT, color << 24));
  642. break;
  643. default:
  644. break;
  645. }
  646. return error;
  647. #else
  648. return VG_LITE_NOT_SUPPORT;
  649. #endif
  650. }
  651. vg_lite_error_t vg_lite_destroy_masklayer(vg_lite_buffer_t* masklayer)
  652. {
  653. #if DUMP_API
  654. FUNC_DUMP(vg_lite_destroy_masklayer)(masklayer);
  655. #endif
  656. #if gcFEATURE_VG_MASK
  657. vg_lite_error_t error = VG_LITE_SUCCESS;
  658. #if gcFEATURE_VG_TRACE_API
  659. VGLITE_LOG("vg_lite_destroy_masklayer %p\n", masklayer);
  660. #endif
  661. VG_LITE_RETURN_ERROR(vg_lite_free(masklayer));
  662. return error;
  663. #else
  664. return VG_LITE_NOT_SUPPORT;
  665. #endif
  666. }
  667. vg_lite_error_t vg_lite_set_pixel_matrix(vg_lite_pixel_matrix_t matrix, vg_lite_pixel_channel_enable_t* channel)
  668. {
  669. #if DUMP_API
  670. FUNC_DUMP(vg_lite_set_pixel_matrix)(matrix, channel);
  671. #endif
  672. #if gcFEATURE_VG_PIXEL_MATRIX
  673. vg_lite_error_t error = VG_LITE_SUCCESS;
  674. short pix_matrix[20] = { 0 };
  675. int i = 0;
  676. #if gcFEATURE_VG_TRACE_API
  677. VGLITE_LOG("vg_lite_set_pixel_matrix %p (%d %d %d %d)\n", matrix, channel->enable_a, channel->enable_b, channel->enable_g, channel->enable_r);
  678. #endif
  679. s_context.matrix_enable = (channel->enable_a ? (1 << 17) : 0) |
  680. (channel->enable_r ? (1 << 23) : 0) |
  681. (channel->enable_g ? (1 << 22) : 0) |
  682. (channel->enable_b ? (1 << 21) : 0);
  683. if (s_context.matrix_enable)
  684. {
  685. for (i = 0; i < 20; i++) {
  686. if (matrix[i] > 127.0f || matrix[i] < -128.0f) {
  687. return VG_LITE_INVALID_ARGUMENT;
  688. }
  689. pix_matrix[i] = (short)(matrix[i] * 256);
  690. VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0ADE + i, pix_matrix[i]));
  691. }
  692. }
  693. return error;
  694. #else
  695. return VG_LITE_NOT_SUPPORT;
  696. #endif
  697. }
  698. vg_lite_error_t vg_lite_gaussian_filter(vg_lite_float_t w0, vg_lite_float_t w1, vg_lite_float_t w2)
  699. {
  700. #if DUMP_API
  701. FUNC_DUMP(vg_lite_gaussian_filter)(w0, w1, w2);
  702. #endif
  703. #if gcFEATURE_VG_GAUSSIAN_BLUR
  704. vg_lite_error_t error = VG_LITE_SUCCESS;
  705. #if gcFEATURE_VG_TRACE_API
  706. VGLITE_LOG("vg_lite_gaussian_filter %f %f %f\n", w0, w1, w2);
  707. #endif
  708. VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0AD2 + 1, (uint32_t)(w0 * 256)));
  709. VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0AD4 + 1, (uint32_t)(w1 * 256)));
  710. VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0AD6 + 1, (uint32_t)(w2 * 256)));
  711. return error;
  712. #else
  713. return VG_LITE_NOT_SUPPORT;
  714. #endif
  715. }
  716. vg_lite_error_t vg_lite_scissor_rects(vg_lite_buffer_t *target, vg_lite_uint32_t nums, vg_lite_rectangle_t rect[])
  717. {
  718. #if DUMP_API
  719. FUNC_DUMP(vg_lite_scissor_rects)(target, nums, rect);
  720. #endif
  721. #if gcFEATURE_VG_MASK
  722. vg_lite_error_t error = VG_LITE_SUCCESS;
  723. vg_lite_rectangle_t rect_clamp, rect_draw;
  724. vg_lite_int32_t left_x, right_x, left_len, middle_len, right_len, stride, j, max_x, max_y;
  725. vg_lite_uint8_t alpha;
  726. vg_lite_uint32_t i;
  727. #if gcFEATURE_VG_TRACE_API
  728. VGLITE_LOG("vg_lite_scissor_rects %d %p\n", nums, rect);
  729. for (i = 0; i < nums; i++) {
  730. VGLITE_LOG(" Rect(%d, %d, %d, %d)\n", rect[i].x, rect[i].y, rect[i].width, rect[i].height);
  731. }
  732. #endif
  733. /* Record scissor enable flag and disable scissor. */
  734. vg_lite_uint8_t enable = s_context.scissor_enable;
  735. s_context.scissor_enable = 0;
  736. /* Free the old scissor layer if its size is too small for target */
  737. if (s_context.scissor_layer &&
  738. (s_context.scissor_layer->width < ((target->width + 7) / 8) || s_context.scissor_layer->height < target->height))
  739. {
  740. vg_lite_free(s_context.scissor_layer);
  741. vg_lite_os_free(s_context.scissor_layer);
  742. s_context.scissor_layer = NULL;
  743. }
  744. /* Allocate if scissor layer is NULL */
  745. if (s_context.scissor_layer == NULL) {
  746. s_context.scissor_layer = (vg_lite_buffer_t *)vg_lite_os_malloc(sizeof(vg_lite_buffer_t));
  747. if (!s_context.scissor_layer) {
  748. return VG_LITE_OUT_OF_RESOURCES;
  749. }
  750. memset(s_context.scissor_layer, 0, sizeof(vg_lite_buffer_t));
  751. s_context.scissor_layer->scissor_buffer = 1;
  752. s_context.scissor_layer->width = (target->width + 7) / 8;
  753. s_context.scissor_layer->height = target->height;
  754. s_context.scissor_layer->format = VG_LITE_A8;
  755. VG_LITE_RETURN_ERROR(vg_lite_allocate(s_context.scissor_layer));
  756. }
  757. s_context.scissor_layer->scissor_buffer = 1;
  758. /* Clear scissor layer*/
  759. VG_LITE_RETURN_ERROR(vg_lite_clear(s_context.scissor_layer, NULL, 0x00000000));
  760. vg_lite_finish();
  761. max_x = s_context.scissor_layer->width * 8;
  762. max_y = s_context.scissor_layer->height;
  763. /* Draw rectangle to scissor layer, one bit data of scissor layer corresponds to one pixel. */
  764. for (i = 0; i < nums; ++i) {
  765. /* Clamp the rect */
  766. memcpy(&rect_clamp, &rect[i], sizeof(vg_lite_rectangle_t));
  767. {
  768. if (rect_clamp.x < 0 || rect_clamp.y < 0) {
  769. rect_clamp.width += rect_clamp.x;
  770. rect_clamp.height += rect_clamp.y;
  771. rect_clamp.x = rect_clamp.y = 0;
  772. }
  773. if (rect_clamp.x >= max_x || rect_clamp.y >= max_y || rect_clamp.width <= 0 || rect_clamp.height <= 0) {
  774. rect_clamp.x = rect_clamp.y = rect_clamp.width = rect_clamp.height = 0;
  775. }
  776. if (rect_clamp.x + rect_clamp.width > max_x) {
  777. rect_clamp.width = max_x - rect_clamp.x;
  778. }
  779. if (rect_clamp.y + rect_clamp.height > max_y) {
  780. rect_clamp.height = max_y - rect_clamp.y;
  781. }
  782. }
  783. if (((rect_clamp.x + rect_clamp.width) >> 3) == (rect_clamp.x >> 3)) {
  784. rect_draw.x = rect_clamp.x / 8;
  785. rect_draw.y = rect_clamp.y;
  786. rect_draw.width = 1;
  787. rect_draw.height = rect_clamp.height;
  788. alpha = (uint8_t)(((uint8_t)(0xff >> (8 - rect_clamp.width))) << (rect_clamp.x % 8));
  789. stride = s_context.scissor_layer->stride;
  790. for (j = rect_draw.y; j < rect_draw.height + rect_draw.y; ++j) {
  791. ((vg_lite_uint8_t*)s_context.scissor_layer->memory)[j * stride + rect_draw.x] |= alpha;
  792. }
  793. }
  794. else {
  795. /* Split the rect */
  796. left_x = (rect_clamp.x % 8 == 0) ? rect_clamp.x : ((rect_clamp.x + 7) & 0xFFFFFFF8);
  797. right_x = (rect_clamp.x + rect_clamp.width) & 0xFFFFFFF8;
  798. middle_len = right_x - left_x;
  799. left_len = left_x - rect_clamp.x;
  800. right_len = rect_clamp.x + rect_clamp.width - right_x;
  801. /* Draw left rect */
  802. if (left_len) {
  803. rect_draw.x = rect_clamp.x / 8;
  804. rect_draw.y = rect_clamp.y;
  805. rect_draw.width = 1;
  806. rect_draw.height = rect_clamp.height;
  807. alpha = (uint8_t)(0xff << (8 - left_len));
  808. stride = s_context.scissor_layer->stride;
  809. for (j = rect_draw.y; j < rect_draw.height + rect_draw.y; ++j) {
  810. ((vg_lite_uint8_t*)s_context.scissor_layer->memory)[j * stride + rect_draw.x] |= alpha;
  811. }
  812. }
  813. /* Draw middle rect */
  814. if (middle_len) {
  815. rect_draw.x = left_x / 8;
  816. rect_draw.y = rect_clamp.y;
  817. rect_draw.width = middle_len / 8;
  818. rect_draw.height = rect_clamp.height;
  819. VG_LITE_RETURN_ERROR(vg_lite_clear(s_context.scissor_layer, &rect_draw, 0xFFFFFFFF));
  820. vg_lite_finish();
  821. }
  822. /* Draw right rect */
  823. if (right_len) {
  824. rect_draw.x = (rect_clamp.x + rect_clamp.width - right_len) / 8;
  825. rect_draw.y = rect_clamp.y;
  826. rect_draw.width = 1;
  827. rect_draw.height = rect_clamp.height;
  828. alpha = (uint8_t)(0xff >> (8 - right_len));
  829. stride = s_context.scissor_layer->stride;
  830. for (j = rect_draw.y; j < rect_draw.height + rect_draw.y; ++j) {
  831. ((vg_lite_uint8_t*)s_context.scissor_layer->memory)[j * stride + rect_draw.x] |= alpha;
  832. }
  833. }
  834. }
  835. }
  836. VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A16, s_context.scissor_layer->address));
  837. VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A17, s_context.scissor_layer->stride));
  838. VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1B, 0x00000100));
  839. vg_lite_finish();
  840. s_context.scissor_enable = enable;
  841. s_context.scissor_dirty = 1;
  842. return error;
  843. #else
  844. return VG_LITE_NOT_SUPPORT;
  845. #endif
  846. }
  847. vg_lite_error_t vg_lite_set_mirror(vg_lite_orientation_t orientation)
  848. {
  849. #if DUMP_API
  850. FUNC_DUMP(vg_lite_set_mirror)(orientation);
  851. #endif
  852. #if gcFEATURE_VG_MIRROR
  853. vg_lite_error_t error = VG_LITE_SUCCESS;
  854. #if gcFEATURE_VG_TRACE_API
  855. VGLITE_LOG("vg_lite_set_mirror %d\n", orientation);
  856. #endif
  857. s_context.mirror_orient = orientation;
  858. s_context.mirror_dirty = 1;
  859. return error;
  860. #else
  861. return VG_LITE_NOT_SUPPORT;
  862. #endif
  863. }
  864. vg_lite_error_t vg_lite_set_gamma(vg_lite_gamma_conversion_t gamma_value)
  865. {
  866. #if DUMP_API
  867. FUNC_DUMP(vg_lite_set_gamma)(gamma_value);
  868. #endif
  869. #if gcFEATURE_VG_GAMMA
  870. vg_lite_error_t error = VG_LITE_SUCCESS;
  871. #if gcFEATURE_VG_TRACE_API
  872. VGLITE_LOG("vg_lite_set_gamma %d\n", gamma_value);
  873. #endif
  874. s_context.gamma_value = gamma_value << 12;
  875. s_context.gamma_dirty = 1;
  876. return error;
  877. #else
  878. return VG_LITE_NOT_SUPPORT;
  879. #endif
  880. }
  881. /* Set s_context.gamma_value base on target buffer */
  882. vg_lite_void set_gamma_dest_only(vg_lite_buffer_t *target, vg_lite_int32_t stencil)
  883. {
  884. uint32_t gamma_value = 0;
  885. /* Set gamma configuration of source buffer */
  886. /* Openvg paintcolor defaults to SRGB */
  887. s_context.gamma_src = 1;
  888. /* Set gamma configuration of dst buffer */
  889. if ((target->format >= OPENVG_lRGBX_8888 && target->format <= OPENVG_A_4) ||
  890. (target->format >= OPENVG_lXRGB_8888 && target->format <= OPENVG_lARGB_8888_PRE) ||
  891. (target->format >= OPENVG_lBGRX_8888 && target->format <= OPENVG_lBGRA_8888_PRE) ||
  892. (target->format >= OPENVG_lXBGR_8888 && target->format <= OPENVG_lABGR_8888_PRE) ||
  893. (target->format >= OPENVG_lRGBX_8888_PRE && target->format <= OPENVG_lRGBA_4444_PRE))
  894. {
  895. s_context.gamma_dst = 0;
  896. }
  897. else
  898. {
  899. s_context.gamma_dst = 1;
  900. }
  901. if (s_context.gamma_src == 0 && s_context.gamma_dst == 1)
  902. {
  903. gamma_value = 0x00002000;
  904. }
  905. else if (s_context.gamma_src == 1 && s_context.gamma_dst == 0)
  906. {
  907. gamma_value = 0x00001000;
  908. }
  909. else
  910. {
  911. gamma_value = 0x00000000;
  912. }
  913. if (stencil && target->image_mode == VG_LITE_STENCIL_MODE)
  914. {
  915. s_context.gamma_stencil = gamma_value;
  916. gamma_value = 0x00000000;
  917. }
  918. if (s_context.gamma_dirty == 0 && gamma_value != s_context.gamma_value)
  919. {
  920. s_context.gamma_value = gamma_value;
  921. s_context.gamma_dirty = 1;
  922. }
  923. }
  924. /* Set s_context.gamma_value base on source and target buffers */
  925. vg_lite_void get_st_gamma_src_dest(vg_lite_buffer_t *source, vg_lite_buffer_t *target)
  926. {
  927. uint32_t gamma_value = 0;
  928. /* Set gamma configuration of source buffer */
  929. if ((source->format >= OPENVG_lRGBX_8888 && source->format <= OPENVG_A_4) ||
  930. (source->format >= OPENVG_lXRGB_8888 && source->format <= OPENVG_lARGB_8888_PRE) ||
  931. (source->format >= OPENVG_lBGRX_8888 && source->format <= OPENVG_lBGRA_8888_PRE) ||
  932. (source->format >= OPENVG_lXBGR_8888 && source->format <= OPENVG_lABGR_8888_PRE) ||
  933. (source->format >= OPENVG_lRGBX_8888_PRE && source->format <= OPENVG_lRGBA_4444_PRE))
  934. {
  935. s_context.gamma_src = 0;
  936. }
  937. else
  938. {
  939. s_context.gamma_src = 1;
  940. }
  941. /* Set gamma configuration of dst buffer */
  942. if ((target->format >= OPENVG_lRGBX_8888 && target->format <= OPENVG_A_4) ||
  943. (target->format >= OPENVG_lXRGB_8888 && target->format <= OPENVG_lARGB_8888_PRE) ||
  944. (target->format >= OPENVG_lBGRX_8888 && target->format <= OPENVG_lBGRA_8888_PRE) ||
  945. (target->format >= OPENVG_lXBGR_8888 && target->format <= OPENVG_lABGR_8888_PRE) ||
  946. (target->format >= OPENVG_lRGBX_8888_PRE && target->format <= OPENVG_lRGBA_4444_PRE))
  947. {
  948. s_context.gamma_dst = 0;
  949. }
  950. else
  951. {
  952. s_context.gamma_dst = 1;
  953. }
  954. if (s_context.gamma_src == 0 && s_context.gamma_dst == 1)
  955. {
  956. gamma_value = 0x00002000;
  957. }
  958. else if (s_context.gamma_src == 1 && s_context.gamma_dst == 0)
  959. {
  960. gamma_value = 0x00001000;
  961. }
  962. else
  963. {
  964. gamma_value = 0x00000000;
  965. }
  966. if (source->image_mode == VG_LITE_STENCIL_MODE)
  967. {
  968. if (source->paintType == VG_LITE_PAINT_PATTERN
  969. || source->paintType == VG_LITE_PAINT_RADIAL_GRADIENT
  970. || source->paintType == VG_LITE_PAINT_LINEAR_GRADIENT) {
  971. gamma_value = s_context.gamma_stencil;
  972. }
  973. else if (source->paintType == VG_LITE_PAINT_COLOR && s_context.gamma_dst == 0) {
  974. gamma_value = 0x00001000;
  975. }
  976. else {
  977. gamma_value = 0x00000000;
  978. }
  979. }
  980. if (s_context.gamma_dirty == 0 && gamma_value != s_context.gamma_value)
  981. {
  982. s_context.gamma_value = gamma_value;
  983. s_context.gamma_dirty = 1;
  984. }
  985. }
  986. /* Set s_context.gamma_value base on source and target buffers */
  987. vg_lite_void save_st_gamma_src_dest(vg_lite_buffer_t *source, vg_lite_buffer_t *target)
  988. {
  989. uint32_t gamma_value = 0;
  990. /* Set gamma configuration of source buffer */
  991. if ((source->format >= OPENVG_lRGBX_8888 && source->format <= OPENVG_A_4) ||
  992. (source->format >= OPENVG_lXRGB_8888 && source->format <= OPENVG_lARGB_8888_PRE) ||
  993. (source->format >= OPENVG_lBGRX_8888 && source->format <= OPENVG_lBGRA_8888_PRE) ||
  994. (source->format >= OPENVG_lXBGR_8888 && source->format <= OPENVG_lABGR_8888_PRE) ||
  995. (source->format >= OPENVG_lRGBX_8888_PRE && source->format <= OPENVG_lRGBA_4444_PRE))
  996. {
  997. s_context.gamma_src = 0;
  998. }
  999. else
  1000. {
  1001. s_context.gamma_src = 1;
  1002. }
  1003. /* Set gamma configuration of dst buffer */
  1004. if ((target->format >= OPENVG_lRGBX_8888 && target->format <= OPENVG_A_4) ||
  1005. (target->format >= OPENVG_lXRGB_8888 && target->format <= OPENVG_lARGB_8888_PRE) ||
  1006. (target->format >= OPENVG_lBGRX_8888 && target->format <= OPENVG_lBGRA_8888_PRE) ||
  1007. (target->format >= OPENVG_lXBGR_8888 && target->format <= OPENVG_lABGR_8888_PRE) ||
  1008. (target->format >= OPENVG_lRGBX_8888_PRE && target->format <= OPENVG_lRGBA_4444_PRE))
  1009. {
  1010. s_context.gamma_dst = 0;
  1011. }
  1012. else
  1013. {
  1014. s_context.gamma_dst = 1;
  1015. }
  1016. if (s_context.gamma_src == 0 && s_context.gamma_dst == 1)
  1017. {
  1018. gamma_value = 0x00002000;
  1019. }
  1020. else if (s_context.gamma_src == 1 && s_context.gamma_dst == 0)
  1021. {
  1022. gamma_value = 0x00001000;
  1023. }
  1024. else
  1025. {
  1026. gamma_value = 0x00000000;
  1027. }
  1028. if (target->image_mode == VG_LITE_STENCIL_MODE)
  1029. {
  1030. s_context.gamma_stencil = gamma_value;
  1031. gamma_value = 0x00000000;
  1032. }
  1033. if (s_context.gamma_dirty == 0 && gamma_value != s_context.gamma_value)
  1034. {
  1035. s_context.gamma_value = gamma_value;
  1036. s_context.gamma_dirty = 1;
  1037. }
  1038. }
  1039. vg_lite_error_t vg_lite_enable_color_transform()
  1040. {
  1041. #if DUMP_API
  1042. FUNC_DUMP(vg_lite_enable_color_transform)();
  1043. #endif
  1044. #if gcFEATURE_VG_COLOR_TRANSFORMATION
  1045. vg_lite_error_t error = VG_LITE_SUCCESS;
  1046. #if gcFEATURE_VG_TRACE_API
  1047. VGLITE_LOG("vg_lite_enable_color_transform\n");
  1048. #endif
  1049. s_context.color_transform = (1 << 16);
  1050. return error;
  1051. #else
  1052. return VG_LITE_NOT_SUPPORT;
  1053. #endif
  1054. }
  1055. vg_lite_error_t vg_lite_disable_color_transform()
  1056. {
  1057. #if DUMP_API
  1058. FUNC_DUMP(vg_lite_disable_color_transform)();
  1059. #endif
  1060. #if gcFEATURE_VG_COLOR_TRANSFORMATION
  1061. vg_lite_error_t error = VG_LITE_SUCCESS;
  1062. #if gcFEATURE_VG_TRACE_API
  1063. VGLITE_LOG("vg_lite_disable_color_transform\n");
  1064. #endif
  1065. s_context.color_transform = 0;
  1066. return error;
  1067. #else
  1068. return VG_LITE_NOT_SUPPORT;
  1069. #endif
  1070. }
  1071. vg_lite_error_t vg_lite_set_color_transform(vg_lite_color_transform_t* values)
  1072. {
  1073. #if DUMP_API
  1074. FUNC_DUMP(vg_lite_enable_color_transform)();
  1075. #endif
  1076. #if gcFEATURE_VG_COLOR_TRANSFORMATION
  1077. vg_lite_error_t error = VG_LITE_SUCCESS;
  1078. vg_lite_float_t* color_transformations = (vg_lite_float_t*)values;
  1079. int color_elements = 0;
  1080. short temp_transform[8] = { 0 };
  1081. uint32_t final_transform[8] = { 0 };
  1082. #if gcFEATURE_VG_TRACE_API
  1083. VGLITE_LOG("vg_lite_set_color_transform %p\n", values);
  1084. #endif
  1085. for (color_elements = 0; color_elements < 8; color_elements++) {
  1086. if (color_elements % 2) {
  1087. color_transformations[color_elements] = CLAMP(color_transformations[color_elements], -1.0f, 1.0f);
  1088. }
  1089. else {
  1090. color_transformations[color_elements] = CLAMP(color_transformations[color_elements], -127.0f, 127.0f);
  1091. }
  1092. temp_transform[color_elements] = (short)(color_transformations[color_elements] * 256);
  1093. final_transform[color_elements] = (uint32_t)temp_transform[color_elements] & 0x0000FFFF;
  1094. }
  1095. VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A0C, final_transform[2] | final_transform[3] << 16));
  1096. VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A0D, final_transform[4] | final_transform[5] << 16));
  1097. VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A0E, final_transform[6] | final_transform[7] << 16));
  1098. VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A0F, final_transform[0] | final_transform[1] << 16));
  1099. return error;
  1100. #else
  1101. return VG_LITE_NOT_SUPPORT;
  1102. #endif
  1103. }
  1104. #if !gcFEATURE_VG_LVGL_SUPPORT
  1105. typedef struct {
  1106. float r;
  1107. float g;
  1108. float b;
  1109. float a;
  1110. } Color;
  1111. int colorToInt(float c, int maxc)
  1112. {
  1113. return MIN(MAX((int)floor(c * (float)maxc + 0.5f), 0), maxc);
  1114. }
  1115. float intToColor(unsigned int i, unsigned int maxi)
  1116. {
  1117. return (float)(i & maxi) / (float)maxi;
  1118. }
  1119. Color readPixel(vg_lite_buffer_t* src, int x, int y)
  1120. {
  1121. unsigned int p = 0;
  1122. Color c;
  1123. uint8_t* scanline = (uint8_t*)src->memory + y * src->stride;
  1124. uint8_t bitsPerPixel = 0;
  1125. int rb = 0;
  1126. int gb = 0;
  1127. int bb = 0;
  1128. int ab = 0;
  1129. int rs = 0;
  1130. int gs = 0;
  1131. int bs = 0;
  1132. int as = 0;
  1133. switch (src->format) {
  1134. case VG_LITE_A8:
  1135. case VG_LITE_L8:
  1136. ab = 8;
  1137. bitsPerPixel = 8;
  1138. break;
  1139. case VG_LITE_ABGR4444:
  1140. rs = 12;
  1141. gs = 8;
  1142. bs = 4;
  1143. as = 0;
  1144. rb = 4;
  1145. gb = 4;
  1146. bb = 4;
  1147. ab = 4;
  1148. bitsPerPixel = 16;
  1149. break;
  1150. case VG_LITE_ARGB4444:
  1151. bs = 12;
  1152. gs = 8;
  1153. rs = 4;
  1154. as = 0;
  1155. rb = 4;
  1156. gb = 4;
  1157. bb = 4;
  1158. ab = 4;
  1159. bitsPerPixel = 16;
  1160. break;
  1161. case VG_LITE_RGBA4444:
  1162. as = 12;
  1163. bs = 8;
  1164. gs = 4;
  1165. rs = 0;
  1166. rb = 4;
  1167. gb = 4;
  1168. bb = 4;
  1169. ab = 4;
  1170. bitsPerPixel = 16;
  1171. break;
  1172. case VG_LITE_BGRA4444:
  1173. as = 12;
  1174. rs = 8;
  1175. gs = 4;
  1176. bs = 0;
  1177. rb = 4;
  1178. gb = 4;
  1179. bb = 4;
  1180. ab = 4;
  1181. bitsPerPixel = 16;
  1182. break;
  1183. case VG_LITE_RGB565:
  1184. rs = 0;
  1185. gs = 5;
  1186. bs = 11;
  1187. as = 0;
  1188. rb = 5;
  1189. gb = 6;
  1190. bb = 5;
  1191. ab = 0;
  1192. bitsPerPixel = 16;
  1193. break;
  1194. case VG_LITE_BGR565:
  1195. rs = 11;
  1196. gs = 5;
  1197. bs = 0;
  1198. as = 0;
  1199. rb = 5;
  1200. gb = 6;
  1201. bb = 5;
  1202. ab = 0;
  1203. bitsPerPixel = 16;
  1204. break;
  1205. case VG_LITE_ABGR8888:
  1206. case VG_LITE_XBGR8888:
  1207. rs = 24;
  1208. gs = 16;
  1209. bs = 8;
  1210. as = 0;
  1211. rb = 8;
  1212. gb = 8;
  1213. bb = 8;
  1214. ab = 8;
  1215. bitsPerPixel = 32;
  1216. break;
  1217. case VG_LITE_ARGB8888:
  1218. case VG_LITE_XRGB8888:
  1219. rs = 8;
  1220. gs = 16;
  1221. bs = 24;
  1222. as = 0;
  1223. rb = 8;
  1224. gb = 8;
  1225. bb = 8;
  1226. ab = 8;
  1227. bitsPerPixel = 32;
  1228. break;
  1229. case VG_LITE_RGBA8888:
  1230. case VG_LITE_RGBX8888:
  1231. rs = 0;
  1232. gs = 8;
  1233. bs = 16;
  1234. as = 24;
  1235. rb = 8;
  1236. gb = 8;
  1237. bb = 8;
  1238. ab = 8;
  1239. bitsPerPixel = 32;
  1240. break;
  1241. case VG_LITE_BGRA8888:
  1242. case VG_LITE_BGRX8888:
  1243. rs = 16;
  1244. gs = 8;
  1245. bs = 0;
  1246. as = 24;
  1247. rb = 8;
  1248. gb = 8;
  1249. bb = 8;
  1250. ab = 8;
  1251. bitsPerPixel = 32;
  1252. break;
  1253. case VG_LITE_ABGR1555:
  1254. rs = 11;
  1255. gs = 6;
  1256. bs = 1;
  1257. as = 0;
  1258. rb = 5;
  1259. gb = 5;
  1260. bb = 5;
  1261. ab = 1;
  1262. bitsPerPixel = 16;
  1263. break;
  1264. case VG_LITE_RGBA5551:
  1265. rs = 0;
  1266. gs = 5;
  1267. bs = 10;
  1268. as = 15;
  1269. rb = 5;
  1270. gb = 5;
  1271. bb = 5;
  1272. ab = 1;
  1273. bitsPerPixel = 16;
  1274. break;
  1275. case VG_LITE_ARGB1555:
  1276. rs = 1;
  1277. gs = 6;
  1278. bs = 11;
  1279. as = 0;
  1280. rb = 5;
  1281. gb = 5;
  1282. bb = 5;
  1283. ab = 1;
  1284. bitsPerPixel = 16;
  1285. break;
  1286. case VG_LITE_BGRA5551:
  1287. rs = 10;
  1288. gs = 5;
  1289. bs = 0;
  1290. as = 15;
  1291. rb = 5;
  1292. gb = 5;
  1293. bb = 5;
  1294. ab = 1;
  1295. bitsPerPixel = 16;
  1296. break;
  1297. case VG_LITE_BGRA2222:
  1298. rs = 4;
  1299. gs = 2;
  1300. bs = 0;
  1301. as = 6;
  1302. rb = 2;
  1303. gb = 2;
  1304. bb = 2;
  1305. ab = 2;
  1306. bitsPerPixel = 8;
  1307. break;
  1308. case VG_LITE_RGBA2222:
  1309. rs = 0;
  1310. gs = 2;
  1311. bs = 4;
  1312. as = 6;
  1313. rb = 2;
  1314. gb = 2;
  1315. bb = 2;
  1316. ab = 2;
  1317. bitsPerPixel = 8;
  1318. break;
  1319. case VG_LITE_ABGR2222:
  1320. rs = 6;
  1321. gs = 4;
  1322. bs = 2;
  1323. as = 0;
  1324. rb = 2;
  1325. gb = 2;
  1326. bb = 2;
  1327. ab = 2;
  1328. bitsPerPixel = 8;
  1329. break;
  1330. case VG_LITE_ARGB2222:
  1331. rs = 2;
  1332. gs = 4;
  1333. bs = 6;
  1334. as = 0;
  1335. rb = 2;
  1336. gb = 2;
  1337. bb = 2;
  1338. ab = 2;
  1339. bitsPerPixel = 8;
  1340. break;
  1341. default:
  1342. break;
  1343. }
  1344. switch (bitsPerPixel)
  1345. {
  1346. case 32:
  1347. {
  1348. uint32_t* s = (((uint32_t*)scanline) + x);
  1349. p = (unsigned int)*s;
  1350. break;
  1351. }
  1352. case 16:
  1353. {
  1354. uint16_t* s = ((uint16_t*)scanline) + x;
  1355. p = (unsigned int)*s;
  1356. break;
  1357. }
  1358. case 8:
  1359. {
  1360. uint8_t* s = ((uint8_t*)scanline) + x;
  1361. p = (unsigned int)*s;
  1362. break;
  1363. }
  1364. case 4:
  1365. {
  1366. uint8_t* s = ((uint8_t*)scanline) + (x >> 1);
  1367. p = (unsigned int)(*s >> ((x & 1) << 2)) & 0xf;
  1368. break;
  1369. }
  1370. case 2:
  1371. {
  1372. uint8_t* s = ((uint8_t*)scanline) + (x >> 2);
  1373. p = (unsigned int)(*s >> ((x & 3) << 1)) & 0x3;
  1374. break;
  1375. }
  1376. default:
  1377. {
  1378. uint8_t* s = ((uint8_t*)scanline) + (x >> 3);
  1379. p = (unsigned int)(*s >> (x & 7)) & 0x1;
  1380. break;
  1381. }
  1382. }
  1383. //rgba
  1384. c.r = rb ? intToColor(p >> rs, (1 << rb) - 1) : (float)1.0f;
  1385. c.g = gb ? intToColor(p >> gs, (1 << gb) - 1) : (float)1.0f;
  1386. c.b = bb ? intToColor(p >> bs, (1 << bb) - 1) : (float)1.0f;
  1387. c.a = ab ? intToColor(p >> as, (1 << ab) - 1) : (float)1.0f;
  1388. return c;
  1389. }
  1390. void writePixel(vg_lite_buffer_t* temp, int x, int y, Color* c)
  1391. {
  1392. uint8_t bitsPerPixel = 0;
  1393. int rb = 0;
  1394. int gb = 0;
  1395. int bb = 0;
  1396. int ab = 0;
  1397. int rs = 0;
  1398. int gs = 0;
  1399. int bs = 0;
  1400. int as = 0;
  1401. switch (temp->format) {
  1402. case VG_LITE_A8:
  1403. case VG_LITE_L8:
  1404. ab = 8;
  1405. bitsPerPixel = 8;
  1406. break;
  1407. case VG_LITE_ABGR4444:
  1408. rs = 12;
  1409. gs = 8;
  1410. bs = 4;
  1411. as = 0;
  1412. rb = 4;
  1413. gb = 4;
  1414. bb = 4;
  1415. ab = 4;
  1416. bitsPerPixel = 16;
  1417. break;
  1418. case VG_LITE_ARGB4444:
  1419. bs = 12;
  1420. gs = 8;
  1421. rs = 4;
  1422. as = 0;
  1423. rb = 4;
  1424. gb = 4;
  1425. bb = 4;
  1426. ab = 4;
  1427. bitsPerPixel = 16;
  1428. break;
  1429. case VG_LITE_RGBA4444:
  1430. as = 12;
  1431. bs = 8;
  1432. gs = 4;
  1433. rs = 0;
  1434. rb = 4;
  1435. gb = 4;
  1436. bb = 4;
  1437. ab = 4;
  1438. bitsPerPixel = 16;
  1439. break;
  1440. case VG_LITE_BGRA4444:
  1441. as = 12;
  1442. rs = 8;
  1443. gs = 4;
  1444. bs = 0;
  1445. rb = 4;
  1446. gb = 4;
  1447. bb = 4;
  1448. ab = 4;
  1449. bitsPerPixel = 16;
  1450. break;
  1451. case VG_LITE_RGB565:
  1452. rs = 0;
  1453. gs = 5;
  1454. bs = 11;
  1455. as = 0;
  1456. rb = 5;
  1457. gb = 6;
  1458. bb = 5;
  1459. ab = 0;
  1460. bitsPerPixel = 16;
  1461. break;
  1462. case VG_LITE_BGR565:
  1463. rs = 11;
  1464. gs = 5;
  1465. bs = 0;
  1466. as = 0;
  1467. rb = 5;
  1468. gb = 6;
  1469. bb = 5;
  1470. ab = 0;
  1471. bitsPerPixel = 16;
  1472. break;
  1473. case VG_LITE_ABGR8888:
  1474. case VG_LITE_XBGR8888:
  1475. rs = 24;
  1476. gs = 16;
  1477. bs = 8;
  1478. as = 0;
  1479. rb = 8;
  1480. gb = 8;
  1481. bb = 8;
  1482. ab = 8;
  1483. bitsPerPixel = 32;
  1484. break;
  1485. case VG_LITE_ARGB8888:
  1486. case VG_LITE_XRGB8888:
  1487. rs = 8;
  1488. gs = 16;
  1489. bs = 24;
  1490. as = 0;
  1491. rb = 8;
  1492. gb = 8;
  1493. bb = 8;
  1494. ab = 8;
  1495. bitsPerPixel = 32;
  1496. break;
  1497. case VG_LITE_RGBA8888:
  1498. case VG_LITE_RGBX8888:
  1499. rs = 0;
  1500. gs = 8;
  1501. bs = 16;
  1502. as = 24;
  1503. rb = 8;
  1504. gb = 8;
  1505. bb = 8;
  1506. ab = 8;
  1507. bitsPerPixel = 32;
  1508. break;
  1509. case VG_LITE_BGRA8888:
  1510. case VG_LITE_BGRX8888:
  1511. rs = 16;
  1512. gs = 8;
  1513. bs = 0;
  1514. as = 24;
  1515. rb = 8;
  1516. gb = 8;
  1517. bb = 8;
  1518. ab = 8;
  1519. bitsPerPixel = 32;
  1520. break;
  1521. case VG_LITE_ABGR1555:
  1522. rs = 11;
  1523. gs = 6;
  1524. bs = 1;
  1525. as = 0;
  1526. rb = 5;
  1527. gb = 5;
  1528. bb = 5;
  1529. ab = 1;
  1530. bitsPerPixel = 16;
  1531. break;
  1532. case VG_LITE_RGBA5551:
  1533. rs = 0;
  1534. gs = 5;
  1535. bs = 10;
  1536. as = 15;
  1537. rb = 5;
  1538. gb = 5;
  1539. bb = 5;
  1540. ab = 1;
  1541. bitsPerPixel = 16;
  1542. break;
  1543. case VG_LITE_ARGB1555:
  1544. rs = 1;
  1545. gs = 6;
  1546. bs = 11;
  1547. as = 0;
  1548. rb = 5;
  1549. gb = 5;
  1550. bb = 5;
  1551. ab = 1;
  1552. bitsPerPixel = 16;
  1553. break;
  1554. case VG_LITE_BGRA5551:
  1555. rs = 10;
  1556. gs = 5;
  1557. bs = 0;
  1558. as = 15;
  1559. rb = 5;
  1560. gb = 5;
  1561. bb = 5;
  1562. ab = 1;
  1563. bitsPerPixel = 16;
  1564. break;
  1565. case VG_LITE_BGRA2222:
  1566. rs = 4;
  1567. gs = 2;
  1568. bs = 0;
  1569. as = 6;
  1570. rb = 2;
  1571. gb = 2;
  1572. bb = 2;
  1573. ab = 2;
  1574. bitsPerPixel = 8;
  1575. break;
  1576. case VG_LITE_RGBA2222:
  1577. rs = 0;
  1578. gs = 2;
  1579. bs = 4;
  1580. as = 6;
  1581. rb = 2;
  1582. gb = 2;
  1583. bb = 2;
  1584. ab = 2;
  1585. bitsPerPixel = 8;
  1586. break;
  1587. case VG_LITE_ABGR2222:
  1588. rs = 6;
  1589. gs = 4;
  1590. bs = 2;
  1591. as = 0;
  1592. rb = 2;
  1593. gb = 2;
  1594. bb = 2;
  1595. ab = 2;
  1596. bitsPerPixel = 8;
  1597. break;
  1598. case VG_LITE_ARGB2222:
  1599. rs = 2;
  1600. gs = 4;
  1601. bs = 6;
  1602. as = 0;
  1603. rb = 2;
  1604. gb = 2;
  1605. bb = 2;
  1606. ab = 2;
  1607. bitsPerPixel = 8;
  1608. break;
  1609. default:
  1610. break;
  1611. }
  1612. unsigned int cr = rb ? colorToInt(c->r, (1 << rb) - 1) : 0;
  1613. unsigned int cg = gb ? colorToInt(c->g, (1 << gb) - 1) : 0;
  1614. unsigned int cb = bb ? colorToInt(c->b, (1 << bb) - 1) : 0;
  1615. unsigned int ca = ab ? colorToInt(c->a, (1 << ab) - 1) : 0;
  1616. unsigned int p = (cr << rs) | (cg << gs) | (cb << bs) | (ca << as);
  1617. char* scanline = (char*)temp->memory + y * temp->stride;
  1618. switch (bitsPerPixel)
  1619. {
  1620. case 32:
  1621. {
  1622. uint32_t* s = ((uint32_t*)scanline) + x;
  1623. *s = (uint32_t)p;
  1624. break;
  1625. }
  1626. case 16:
  1627. {
  1628. uint16_t* s = ((uint16_t*)scanline) + x;
  1629. *s = (uint16_t)p;
  1630. break;
  1631. }
  1632. case 8:
  1633. {
  1634. char* s = ((char*)scanline) + x;
  1635. *s = (char)p;
  1636. break;
  1637. }
  1638. case 4:
  1639. {
  1640. char* s = ((char*)scanline) + (x >> 1);
  1641. *s = (char)((p << ((x & 1) << 2)) | ((unsigned int)*s & ~(0xf << ((x & 1) << 2))));
  1642. break;
  1643. }
  1644. case 2:
  1645. {
  1646. char* s = ((char*)scanline) + (x >> 2);
  1647. *s = (char)((p << ((x & 3) << 1)) | ((unsigned int)*s & ~(0x3 << ((x & 3) << 1))));
  1648. break;
  1649. }
  1650. default:
  1651. {
  1652. break;
  1653. }
  1654. }
  1655. }
  1656. vg_lite_void setup_lvgl_image(vg_lite_buffer_t* dst, vg_lite_buffer_t* src, vg_lite_buffer_t* lvgl_buf, vg_lite_blend_t operation)
  1657. {
  1658. Color c_src, c_dst, c_temp;
  1659. /* copy source region to tmp dst */
  1660. for (int j = 0; j < src->height; j++)
  1661. {
  1662. for (int i = 0; i < src->width; i++)
  1663. {
  1664. c_src = readPixel(src, i, j);
  1665. c_dst = readPixel(dst, i, j);
  1666. switch (operation)
  1667. {
  1668. case VG_LITE_BLEND_NORMAL_LVGL:
  1669. c_temp.a = c_src.a;
  1670. c_temp.r = c_src.a * c_src.r;
  1671. c_temp.g = c_src.a * c_src.g;
  1672. c_temp.b = c_src.a * c_src.b;
  1673. break;
  1674. case VG_LITE_BLEND_ADDITIVE_LVGL:
  1675. c_temp.a = c_src.a;
  1676. c_temp.r = (c_src.r + c_dst.r) * c_src.a;
  1677. c_temp.g = (c_src.g + c_dst.g) * c_src.a;
  1678. c_temp.b = (c_src.b + c_dst.b) * c_src.a;
  1679. break;
  1680. case VG_LITE_BLEND_SUBTRACT_LVGL:
  1681. c_temp.a = c_src.a;
  1682. c_temp.r = c_src.r < c_dst.r ? (c_dst.r - c_src.r) * c_src.a : 0;
  1683. c_temp.g = c_src.g < c_dst.g ? (c_dst.g - c_src.g) * c_src.a : 0;
  1684. c_temp.b = c_src.b < c_dst.b ? (c_dst.b - c_src.b) * c_src.a : 0;
  1685. break;
  1686. case VG_LITE_BLEND_MULTIPLY_LVGL:
  1687. c_temp.a = c_src.a;
  1688. c_temp.r = c_src.r * c_dst.r * c_src.a;
  1689. c_temp.g = c_src.g * c_dst.g * c_src.a;
  1690. c_temp.b = c_src.b * c_dst.b * c_src.a;
  1691. break;
  1692. default:
  1693. break;
  1694. }
  1695. if (lvgl_buf) {
  1696. writePixel(lvgl_buf, i, j, &c_temp);
  1697. }
  1698. #if !gcFEATURE_VG_GLOBAL_ALPHA
  1699. c_dst.a = 1.0;
  1700. writePixel(dst, i, j, &c_dst);
  1701. #endif
  1702. }
  1703. }
  1704. return;
  1705. }
  1706. #endif /* !gcFEATURE_VG_LVGL_SUPPORT */
  1707. /****************** FLEXA Support ***************/
  1708. vg_lite_error_t vg_lite_flexa_enable()
  1709. {
  1710. #if DUMP_API
  1711. FUNC_DUMP(vg_lite_flexa_enable)();
  1712. #endif
  1713. #if gcFEATURE_VG_FLEXA
  1714. vg_lite_error_t error = VG_LITE_SUCCESS;
  1715. vg_lite_kernel_info_t data;
  1716. uint32_t reset_bit;
  1717. vg_lite_kernel_flexa_info_t flexa_data;
  1718. #if gcFEATURE_VG_TRACE_API
  1719. VGLITE_LOG("vg_lite_flexa_enable\n");
  1720. #endif
  1721. flexa_data.sbi_mode = s_context.sbi_mode = 0x1;
  1722. flexa_data.sync_mode = s_context.sync_mode = BIT(14);
  1723. flexa_data.flexa_mode = s_context.flexa_mode = 0x1;
  1724. flexa_data.segment_address = s_context.segment_address;
  1725. flexa_data.segment_count = s_context.segment_count;
  1726. flexa_data.segment_size = s_context.segment_size;
  1727. flexa_data.stream_id = s_context.stream_id;
  1728. flexa_data.start_flag = s_context.start_flag = BIT(9);
  1729. flexa_data.stop_flag = s_context.stop_flag = BIT(11);
  1730. flexa_data.reset_flag = s_context.reset_flag = BIT(10);
  1731. /* set sync mode */
  1732. VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_FLEXA_ENABLE, &flexa_data));
  1733. /* check if reset is complete */
  1734. data.addr = 0x03600;
  1735. VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_CHECK, &data));
  1736. reset_bit = data.reg;
  1737. if (reset_bit == 1) {
  1738. error = VG_LITE_TIMEOUT;
  1739. return error;
  1740. }
  1741. s_context.flexa_dirty = 1;
  1742. return error;
  1743. #else
  1744. return VG_LITE_NOT_SUPPORT;
  1745. #endif
  1746. }
  1747. vg_lite_error_t vg_lite_flexa_set_stream(vg_lite_uint8_t stream_id)
  1748. {
  1749. #if DUMP_API
  1750. FUNC_DUMP(vg_lite_flexa_set_stream)(stream_id);
  1751. #endif
  1752. #if gcFEATURE_VG_FLEXA
  1753. vg_lite_error_t error = VG_LITE_SUCCESS;
  1754. #if gcFEATURE_VG_TRACE_API
  1755. VGLITE_LOG("vg_lite_flexa_set_stream %d\n", stream_id);
  1756. #endif
  1757. s_context.stream_id = stream_id << 1;
  1758. return error;
  1759. #else
  1760. return VG_LITE_NOT_SUPPORT;
  1761. #endif
  1762. }
  1763. vg_lite_error_t vg_lite_flexa_bg_buffer(vg_lite_uint8_t stream_id, vg_lite_buffer_t* buffer, vg_lite_uint32_t bg_seg_count, vg_lite_uint32_t bg_seg_size)
  1764. {
  1765. #if DUMP_API
  1766. FUNC_DUMP(vg_lite_flexa_bg_buffer)(stream_id, buffer, bg_seg_count, bg_seg_size);
  1767. #endif
  1768. #if gcFEATURE_VG_FLEXA
  1769. vg_lite_error_t error = VG_LITE_SUCCESS;
  1770. vg_lite_kernel_flexa_info_t flexa_data;
  1771. #if gcFEATURE_VG_TRACE_API
  1772. VGLITE_LOG("vg_lite_flexa_bg_buffer %d %p %d %d\n", stream_id, buffer, bg_seg_count, bg_seg_size);
  1773. #endif
  1774. flexa_data.sbi_mode = s_context.sbi_mode;
  1775. flexa_data.segment_address = s_context.segment_address = buffer->address;
  1776. flexa_data.segment_count = s_context.segment_count = bg_seg_count;
  1777. flexa_data.segment_size = s_context.segment_size = bg_seg_size;
  1778. flexa_data.stream_id = s_context.stream_id;
  1779. flexa_data.start_flag = s_context.start_flag;
  1780. flexa_data.stop_flag = s_context.stop_flag;
  1781. flexa_data.reset_flag = s_context.reset_flag;
  1782. VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_FLEXA_SET_BACKGROUND_ADDRESS, &flexa_data));
  1783. return error;
  1784. #else
  1785. return VG_LITE_NOT_SUPPORT;
  1786. #endif
  1787. }
  1788. vg_lite_error_t vg_lite_flexa_stop_frame()
  1789. {
  1790. #if DUMP_API
  1791. FUNC_DUMP(vg_lite_flexa_stop_frame)();
  1792. #endif
  1793. #if gcFEATURE_VG_FLEXA
  1794. vg_lite_error_t error = VG_LITE_SUCCESS;
  1795. vg_lite_kernel_flexa_info_t flexa_data;
  1796. #if gcFEATURE_VG_TRACE_API
  1797. VGLITE_LOG("vg_lite_flexa_stop_frame\n");
  1798. #endif
  1799. flexa_data.stop_flag = s_context.stop_flag = BIT(11);
  1800. flexa_data.stream_id = s_context.stream_id;
  1801. flexa_data.sbi_mode = s_context.sbi_mode;
  1802. VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_FLEXA_STOP_FRAME, &flexa_data));
  1803. return error;
  1804. #else
  1805. return VG_LITE_NOT_SUPPORT;
  1806. #endif
  1807. }
  1808. vg_lite_error_t vg_lite_flexa_disable()
  1809. {
  1810. #if DUMP_API
  1811. FUNC_DUMP(vg_lite_flexa_disable)();
  1812. #endif
  1813. #if gcFEATURE_VG_FLEXA
  1814. vg_lite_error_t error = VG_LITE_SUCCESS;
  1815. vg_lite_kernel_flexa_info_t flexa_data;
  1816. vg_lite_kernel_info_t data;
  1817. uint32_t reset_bit;
  1818. #if gcFEATURE_VG_TRACE_API
  1819. VGLITE_LOG("vg_lite_flexa_disable\n");
  1820. #endif
  1821. flexa_data.flexa_mode = s_context.flexa_mode = 0x0;
  1822. flexa_data.sync_mode = s_context.sync_mode = BIT(2);
  1823. flexa_data.stream_id = s_context.stream_id = 0;
  1824. flexa_data.sbi_mode = s_context.sbi_mode = 0x0;
  1825. flexa_data.start_flag = s_context.start_flag = 0x0;
  1826. flexa_data.stop_flag = s_context.stop_flag = 0x0;
  1827. flexa_data.reset_flag = s_context.reset_flag = 0x0;
  1828. VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_FLEXA_DISABLE, &flexa_data));
  1829. /* check if reset is complete */
  1830. data.addr = 0x03600;
  1831. VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_CHECK, &data));
  1832. reset_bit = data.reg;
  1833. if (reset_bit == 1) {
  1834. error = VG_LITE_TIMEOUT;
  1835. return error;
  1836. }
  1837. s_context.flexa_dirty = 1;
  1838. return error;
  1839. #else
  1840. return VG_LITE_NOT_SUPPORT;
  1841. #endif
  1842. }
  1843. /****************** FAST_CLEAR implementation. ***************/
  1844. #if gcFEATURE_VG_IM_FASTCLEAR
  1845. static vg_lite_error_t _free_fc_buffer(vg_lite_fc_buffer_t* buffer)
  1846. {
  1847. vg_lite_error_t error;
  1848. vg_lite_kernel_free_t free;
  1849. if (buffer == NULL)
  1850. return VG_LITE_INVALID_ARGUMENT;
  1851. /* Make sure we have a valid memory handle. */
  1852. if (buffer->handle) {
  1853. /* Free the buffer. */
  1854. free.memory_handle = buffer->handle;
  1855. VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_FREE, &free));
  1856. /* Mark the buffer as freed. */
  1857. buffer->handle = NULL;
  1858. buffer->memory = NULL;
  1859. }
  1860. return VG_LITE_SUCCESS;
  1861. }
  1862. static vg_lite_error_t convert_color(vg_lite_buffer_format_t format, uint32_t value, uint32_t* result, int* bpp)
  1863. {
  1864. vg_lite_error_t error = VG_LITE_SUCCESS;
  1865. uint32_t r, g, b, a;
  1866. int Bpp = 0;
  1867. r = B(value);
  1868. g = G(value);
  1869. b = R(value);
  1870. a = A(value);
  1871. do {
  1872. switch (format) {
  1873. case VG_LITE_RGBA8888:
  1874. *result = ARGB(a, b, g, r);
  1875. Bpp = 32;
  1876. break;
  1877. case VG_LITE_BGRA8888:
  1878. *result = ARGB(a, r, g, b);
  1879. Bpp = 32;
  1880. break;
  1881. case VG_LITE_RGBX8888:
  1882. *result = ARGB(0xff, b, g, r);
  1883. Bpp = 32;
  1884. break;
  1885. case VG_LITE_BGRX8888:
  1886. *result = ARGB(0xff, r, g, b);
  1887. Bpp = 32;
  1888. break;
  1889. case VG_LITE_RGBA4444:
  1890. *result = ARGB4(a, b, g, r);
  1891. Bpp = 16;
  1892. break;
  1893. case VG_LITE_BGRA4444:
  1894. *result = ARGB4(a, r, g, b);
  1895. Bpp = 16;
  1896. break;
  1897. case VG_LITE_RGB565:
  1898. *result = ((b & 0xf8) << 8) |
  1899. ((g & 0xfc) << 3) |
  1900. ((r & 0xf8) >> 3);
  1901. Bpp = 16;
  1902. break;
  1903. case VG_LITE_BGR565:
  1904. *result = ((r & 0xf8) << 8) |
  1905. ((g & 0xfc) << 3) |
  1906. ((b & 0xf8) >> 3);
  1907. Bpp = 16;
  1908. break;
  1909. case VG_LITE_BGRA5551:
  1910. *result = ((b & 0xf8) << 8) |
  1911. ((g & 0xf8) << 3) |
  1912. ((r & 0xf8) >> 2) |
  1913. ((a & 0x80) >> 7);
  1914. Bpp = 16;
  1915. break;
  1916. case VG_LITE_A8:
  1917. *result = ARGB(a, a, a, a);
  1918. Bpp = 8;
  1919. break;
  1920. case VG_LITE_L8:
  1921. *result = ARGB(r, r, r, r);
  1922. Bpp = 8;
  1923. break;
  1924. default:
  1925. error = VG_LITE_NOT_SUPPORT;
  1926. break;
  1927. }
  1928. } while (0);
  1929. if (bpp != NULL) {
  1930. *bpp = Bpp;
  1931. }
  1932. if (Bpp == 16) {
  1933. *result = ((*result) << 16) | (*result);
  1934. }
  1935. return error;
  1936. }
  1937. /* Fill Target buffer by FC buffer. Only used in cmodel/fpga for verification. */
  1938. #if defined(DEBUG) || defined(_DEBUG)
  1939. static vg_lite_error_t fill_fc_target(vg_lite_buffer_t* target, vg_lite_buffer_t* fcb)
  1940. {
  1941. vg_lite_error_t error = VG_LITE_SUCCESS;
  1942. uint8_t* fc = (uint8_t*)fcb->memory;
  1943. uint16_t* target16;
  1944. uint32_t* target32;
  1945. uint8_t* target8;
  1946. uint32_t clear32;
  1947. int byte_done = 0;
  1948. int i, j, k;
  1949. int bpp;
  1950. do {
  1951. convert_color(target->format, target->fc_buffer[0].color, &clear32, &bpp);
  1952. if (bpp == 32) {
  1953. target32 = (uint32_t*)target->memory;
  1954. for (i = 0; i < fcb->width; i++) {
  1955. for (j = 0; j < 8; j++) { /* Loop the bits*/
  1956. if (!(((*fc) >> j) & 1)) {
  1957. for (k = 0; k < 64 / 4; k++) {
  1958. target32[k] = clear32;
  1959. byte_done += 4;
  1960. if (byte_done >= target->stride * target->height) {
  1961. return error;
  1962. }
  1963. }
  1964. }
  1965. target32 += 64 / 4;
  1966. }
  1967. fc++;
  1968. }
  1969. }
  1970. else if (bpp == 16) {
  1971. target16 = (uint16_t*)target->memory;
  1972. for (i = 0; i < fcb->width; i++) {
  1973. for (j = 0; j < 8; j++) { /* Loop the bits*/
  1974. if (!(((*fc) >> j) & 1)) {
  1975. for (k = 0; k < 64 / 2; k++) {
  1976. target16[k] = (uint16_t)clear32;
  1977. byte_done += 2;
  1978. if (byte_done >= target->stride * target->height) {
  1979. return error;
  1980. }
  1981. }
  1982. }
  1983. target16 += 64 / 2;
  1984. }
  1985. fc++;
  1986. }
  1987. }
  1988. else if (bpp == 8) {
  1989. target8 = (uint8_t*)target->memory;
  1990. for (i = 0; i < fcb->width; i++) {
  1991. for (j = 0; j < 8; j++) { /* Loop the bits*/
  1992. if (!(((*fc) >> j) & 1)) {
  1993. for (k = 0; k < 64; k++) {
  1994. target8[k] = (uint8_t)clear32;
  1995. byte_done++;
  1996. if (byte_done >= target->stride * target->height) {
  1997. return error;
  1998. }
  1999. }
  2000. }
  2001. target8 += 64;
  2002. }
  2003. fc++;
  2004. }
  2005. }
  2006. } while (0);
  2007. return error;
  2008. }
  2009. #endif
  2010. /* Update the fast_clear buffer when render target switched. */
  2011. static vg_lite_error_t update_fc_buffer(vg_lite_buffer_t* target)
  2012. {
  2013. int rt_bytes;
  2014. vg_lite_error_t error = VG_LITE_SUCCESS;
  2015. vg_lite_context_t* context = GET_CONTEXT();
  2016. vg_lite_kernel_allocate_t allocate;
  2017. do {
  2018. if (target == NULL) {
  2019. error = VG_LITE_INVALID_ARGUMENT;
  2020. break;
  2021. }
  2022. rt_bytes = target->stride * target->height;
  2023. rt_bytes = VG_LITE_ALIGN(rt_bytes, (FC_BIT_TO_BYTES * 2));
  2024. rt_bytes = rt_bytes / FC_BIT_TO_BYTES / 2;
  2025. /* Only allocate new buffer when the allocated is not big enough. Yes*/
  2026. if (rt_bytes > target->fc_buffer[0].stride) {
  2027. _free_fc_buffer(&target->fc_buffer[0]);
  2028. target->fc_buffer[0].width = rt_bytes; /* The actually used bytes. */
  2029. rt_bytes = VG_LITE_ALIGN(rt_bytes, FC_BURST_BYTES); /* The allocated aligned bytes. */
  2030. target->fc_buffer[0].stride = rt_bytes;
  2031. target->fc_buffer[0].height = 1;
  2032. allocate.bytes = rt_bytes;
  2033. allocate.contiguous = 1;
  2034. VG_LITE_BREAK_ERROR(vg_lite_kernel(VG_LITE_ALLOCATE, &allocate));
  2035. target->fc_buffer[0].handle = allocate.memory_handle;
  2036. target->fc_buffer[0].memory = allocate.memory;
  2037. target->fc_buffer[0].address = allocate.memory_gpu;
  2038. }
  2039. else {
  2040. /* Just update the fc buffer size. */
  2041. target->fc_buffer[0].width = rt_bytes;
  2042. }
  2043. memset(target->fc_buffer[0].memory, 0xff, target->fc_buffer[0].stride);
  2044. VG_LITE_RETURN_ERROR(push_state(context, 0x0A9A, target->fc_buffer[0].address)); /* FC buffer address. */
  2045. } while (0);
  2046. return error;
  2047. }
  2048. /* Update FC registers and clear FC buffer. */
  2049. static vg_lite_error_t clear_fc(vg_lite_fc_buffer_t* buffer, uint32_t value)
  2050. {
  2051. vg_lite_error_t error = VG_LITE_SUCCESS;
  2052. vg_lite_context_t* context = GET_CONTEXT();
  2053. uint32_t bytes_to_clear;
  2054. if (buffer == NULL)
  2055. return VG_LITE_INVALID_ARGUMENT;
  2056. bytes_to_clear = buffer->stride / FC_BURST_BYTES;
  2057. buffer->color = value;
  2058. do {
  2059. VG_LITE_BREAK_ERROR(push_state(context, 0x0A9B, value)); /* FC clear value. */
  2060. VG_LITE_BREAK_ERROR(push_state(context, 0x0AB0, 0x80000000 | bytes_to_clear)); /* FC clear command. */
  2061. } while (0);
  2062. return error;
  2063. }
  2064. #if VG_TARGET_FC_DUMP
  2065. static int fc_buf_dump(vg_lite_buffer_t* target, vg_lite_buffer_t* fcb)
  2066. {
  2067. int error = VG_LITE_SUCCESS;
  2068. uint8_t* fc = (uint8_t*)fcb->memory;
  2069. uint8_t* target8;
  2070. int byte_done = 0;
  2071. int target_bytes;
  2072. int i, j;
  2073. static unsigned s_cnt;
  2074. unsigned cnt = s_cnt;
  2075. FILE* fpFCBuf;
  2076. FILE* fpTargetBuf;
  2077. FILE* fpTargetBufInfo;
  2078. char buf[256];
  2079. s_cnt++;
  2080. sprintf(buf, "gc555.fc_buf.f%04d.txt", cnt);
  2081. fpFCBuf = fopen(buf, "wt");
  2082. if (NULL == fpFCBuf) {
  2083. fprintf(stderr, "[Warning] Open file \'%s\' fail.\n", buf);
  2084. return -1;
  2085. }
  2086. sprintf(buf, "gc555.target_buf_info.f%04d.txt", cnt);
  2087. fpTargetBufInfo = fopen(buf, "wt");
  2088. if (NULL == fpTargetBufInfo) {
  2089. fprintf(stderr, "[Warning] Open file \'%s\' fail.\n", buf);
  2090. fclose(fpFCBuf);
  2091. return -1;
  2092. }
  2093. else {
  2094. fprintf(fpTargetBufInfo, "%-12s: %d\n", "format", target->format);
  2095. fprintf(fpTargetBufInfo, "%-12s: %d\n", "tiled", target->tiled);
  2096. fprintf(fpTargetBufInfo, "%-12s: %d\n", "width", target->width);
  2097. fprintf(fpTargetBufInfo, "%-12s: %d\n", "height", target->height);
  2098. fprintf(fpTargetBufInfo, "%-12s: %d\n", "stride", target->stride);
  2099. fclose(fpTargetBufInfo);
  2100. }
  2101. sprintf(buf, "gc555.target_buf.f%04d.txt", cnt);
  2102. fpTargetBuf = fopen(buf, "wt");
  2103. if (NULL == fpTargetBuf) {
  2104. fprintf(stderr, "[Warning] Open file \'%s\' fail.\n", buf);
  2105. fclose(fpFCBuf);
  2106. return -1;
  2107. }
  2108. /* Dump FC buffer & Dump target buffer */
  2109. target8 = (uint8_t*)target->memory;
  2110. target_bytes = target->stride * target->height;
  2111. for (i = 0; i < fcb->width; ++i)
  2112. {
  2113. fprintf(fpFCBuf, "%02x\n", fc[i]);
  2114. /* 1 byte of fc related with 512 bytes of target buffer */
  2115. for (j = 0; j < 128; ++j) {
  2116. fprintf(fpTargetBuf, "%02x", byte_done < target_bytes ? target8[0] : 0);
  2117. byte_done++;
  2118. fprintf(fpTargetBuf, "%02x", byte_done < target_bytes ? target8[1] : 0);
  2119. byte_done++;
  2120. fprintf(fpTargetBuf, "%02x", byte_done < target_bytes ? target8[2] : 0);
  2121. byte_done++;
  2122. fprintf(fpTargetBuf, "%02x\n", byte_done < target_bytes ? target8[3] : 0);
  2123. byte_done++;
  2124. target8 += 4;
  2125. }
  2126. }
  2127. fclose(fpFCBuf);
  2128. fclose(fpTargetBuf);
  2129. return error;
  2130. }
  2131. #endif /* VG_TARGET_FC_DUMP */
  2132. #endif /* gcFEATURE_VG_IM_FASTCLEAR */