PageRenderTime 32ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/bb_waze_code/src/agg/include/agg_pixfmt_rgb_packed.h

http://github.com/meirtsvi/WazeWP7
C Header | 1318 lines | 1066 code | 172 blank | 80 comment | 19 complexity | 2b3cec525834749139eb6da41a90261d MD5 | raw file
Possible License(s): BSD-3-Clause, GPL-2.0, LGPL-2.1
  1. //----------------------------------------------------------------------------
  2. // Anti-Grain Geometry (AGG) - Version 2.5
  3. // A high quality rendering engine for C++
  4. // Copyright (C) 2002-2006 Maxim Shemanarev
  5. // Contact: mcseem@antigrain.com
  6. // mcseemagg@yahoo.com
  7. // http://antigrain.com
  8. //
  9. // AGG is free software; you can redistribute it and/or
  10. // modify it under the terms of the GNU General Public License
  11. // as published by the Free Software Foundation; either version 2
  12. // of the License, or (at your option) any later version.
  13. //
  14. // AGG is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. // GNU General Public License for more details.
  18. //
  19. // You should have received a copy of the GNU General Public License
  20. // along with AGG; if not, write to the Free Software
  21. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  22. // MA 02110-1301, USA.
  23. //----------------------------------------------------------------------------
  24. //
  25. // Adaptation for high precision colors has been sponsored by
  26. // Liberty Technology Systems, Inc., visit http://lib-sys.com
  27. //
  28. // Liberty Technology Systems, Inc. is the provider of
  29. // PostScript and PDF technology for software developers.
  30. //
  31. //----------------------------------------------------------------------------
  32. #ifndef AGG_PIXFMT_RGB_PACKED_INCLUDED
  33. #define AGG_PIXFMT_RGB_PACKED_INCLUDED
  34. #include <string.h>
  35. #include "agg_basics.h"
  36. #include "agg_color_rgba.h"
  37. #include "agg_rendering_buffer.h"
  38. namespace agg
  39. {
  40. //=========================================================blender_rgb555
  41. struct blender_rgb555
  42. {
  43. typedef rgba8 color_type;
  44. typedef color_type::value_type value_type;
  45. typedef color_type::calc_type calc_type;
  46. typedef int16u pixel_type;
  47. static AGG_INLINE void blend_pix(pixel_type* p,
  48. unsigned cr, unsigned cg, unsigned cb,
  49. unsigned alpha,
  50. unsigned)
  51. {
  52. pixel_type rgb = *p;
  53. calc_type r = (rgb >> 7) & 0xF8;
  54. calc_type g = (rgb >> 2) & 0xF8;
  55. calc_type b = (rgb << 3) & 0xF8;
  56. *p = (pixel_type)
  57. (((((cr - r) * alpha + (r << 8)) >> 1) & 0x7C00) |
  58. ((((cg - g) * alpha + (g << 8)) >> 6) & 0x03E0) |
  59. (((cb - b) * alpha + (b << 8)) >> 11) | 0x8000);
  60. }
  61. static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)
  62. {
  63. return (pixel_type)(((r & 0xF8) << 7) |
  64. ((g & 0xF8) << 2) |
  65. (b >> 3) | 0x8000);
  66. }
  67. static AGG_INLINE color_type make_color(pixel_type p)
  68. {
  69. return color_type((p >> 7) & 0xF8,
  70. (p >> 2) & 0xF8,
  71. (p << 3) & 0xF8);
  72. }
  73. };
  74. //=====================================================blender_rgb555_pre
  75. struct blender_rgb555_pre
  76. {
  77. typedef rgba8 color_type;
  78. typedef color_type::value_type value_type;
  79. typedef color_type::calc_type calc_type;
  80. typedef int16u pixel_type;
  81. static AGG_INLINE void blend_pix(pixel_type* p,
  82. unsigned cr, unsigned cg, unsigned cb,
  83. unsigned alpha,
  84. unsigned cover)
  85. {
  86. alpha = color_type::base_mask - alpha;
  87. pixel_type rgb = *p;
  88. calc_type r = (rgb >> 7) & 0xF8;
  89. calc_type g = (rgb >> 2) & 0xF8;
  90. calc_type b = (rgb << 3) & 0xF8;
  91. *p = (pixel_type)
  92. ((((r * alpha + cr * cover) >> 1) & 0x7C00) |
  93. (((g * alpha + cg * cover) >> 6) & 0x03E0) |
  94. ((b * alpha + cb * cover) >> 11) | 0x8000);
  95. }
  96. static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)
  97. {
  98. return (pixel_type)(((r & 0xF8) << 7) |
  99. ((g & 0xF8) << 2) |
  100. (b >> 3) | 0x8000);
  101. }
  102. static AGG_INLINE color_type make_color(pixel_type p)
  103. {
  104. return color_type((p >> 7) & 0xF8,
  105. (p >> 2) & 0xF8,
  106. (p << 3) & 0xF8);
  107. }
  108. };
  109. //=====================================================blender_rgb555_gamma
  110. template<class Gamma> class blender_rgb555_gamma
  111. {
  112. public:
  113. typedef rgba8 color_type;
  114. typedef color_type::value_type value_type;
  115. typedef color_type::calc_type calc_type;
  116. typedef int16u pixel_type;
  117. typedef Gamma gamma_type;
  118. blender_rgb555_gamma() : m_gamma(0) {}
  119. void gamma(const gamma_type& g) { m_gamma = &g; }
  120. AGG_INLINE void blend_pix(pixel_type* p,
  121. unsigned cr, unsigned cg, unsigned cb,
  122. unsigned alpha,
  123. unsigned)
  124. {
  125. pixel_type rgb = *p;
  126. calc_type r = m_gamma->dir((rgb >> 7) & 0xF8);
  127. calc_type g = m_gamma->dir((rgb >> 2) & 0xF8);
  128. calc_type b = m_gamma->dir((rgb << 3) & 0xF8);
  129. *p = (pixel_type)
  130. (((m_gamma->inv(((m_gamma->dir(cr) - r) * alpha + (r << 8)) >> 8) << 7) & 0x7C00) |
  131. ((m_gamma->inv(((m_gamma->dir(cg) - g) * alpha + (g << 8)) >> 8) << 2) & 0x03E0) |
  132. (m_gamma->inv(((m_gamma->dir(cb) - b) * alpha + (b << 8)) >> 8) >> 3) | 0x8000);
  133. }
  134. static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)
  135. {
  136. return (pixel_type)(((r & 0xF8) << 7) |
  137. ((g & 0xF8) << 2) |
  138. (b >> 3) | 0x8000);
  139. }
  140. static AGG_INLINE color_type make_color(pixel_type p)
  141. {
  142. return color_type((p >> 7) & 0xF8,
  143. (p >> 2) & 0xF8,
  144. (p << 3) & 0xF8);
  145. }
  146. private:
  147. const Gamma* m_gamma;
  148. };
  149. //=========================================================blender_rgb565
  150. struct blender_rgb565
  151. {
  152. typedef rgba8 color_type;
  153. typedef color_type::value_type value_type;
  154. typedef color_type::calc_type calc_type;
  155. typedef int16u pixel_type;
  156. static AGG_INLINE void blend_pix(pixel_type* p,
  157. unsigned cr, unsigned cg, unsigned cb,
  158. unsigned alpha,
  159. unsigned)
  160. {
  161. pixel_type rgb = *p;
  162. calc_type r = (rgb >> 8) & 0xF8;
  163. calc_type g = (rgb >> 3) & 0xFC;
  164. calc_type b = (rgb << 3) & 0xF8;
  165. *p = (pixel_type)
  166. (((((cr - r) * alpha + (r << 8)) ) & 0xF800) |
  167. ((((cg - g) * alpha + (g << 8)) >> 5) & 0x07E0) |
  168. (((cb - b) * alpha + (b << 8)) >> 11));
  169. }
  170. static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)
  171. {
  172. return (pixel_type)(((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3));
  173. }
  174. static AGG_INLINE color_type make_color(pixel_type p)
  175. {
  176. return color_type((p >> 8) & 0xF8,
  177. (p >> 3) & 0xFC,
  178. (p << 3) & 0xF8);
  179. }
  180. };
  181. //=====================================================blender_rgb565_pre
  182. struct blender_rgb565_pre
  183. {
  184. typedef rgba8 color_type;
  185. typedef color_type::value_type value_type;
  186. typedef color_type::calc_type calc_type;
  187. typedef int16u pixel_type;
  188. static AGG_INLINE void blend_pix(pixel_type* p,
  189. unsigned cr, unsigned cg, unsigned cb,
  190. unsigned alpha,
  191. unsigned cover)
  192. {
  193. alpha = color_type::base_mask - alpha;
  194. pixel_type rgb = *p;
  195. calc_type r = (rgb >> 8) & 0xF8;
  196. calc_type g = (rgb >> 3) & 0xFC;
  197. calc_type b = (rgb << 3) & 0xF8;
  198. *p = (pixel_type)
  199. ((((r * alpha + cr * cover) ) & 0xF800) |
  200. (((g * alpha + cg * cover) >> 5 ) & 0x07E0) |
  201. ((b * alpha + cb * cover) >> 11));
  202. }
  203. static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)
  204. {
  205. return (pixel_type)(((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3));
  206. }
  207. static AGG_INLINE color_type make_color(pixel_type p)
  208. {
  209. return color_type((p >> 8) & 0xF8,
  210. (p >> 3) & 0xFC,
  211. (p << 3) & 0xF8);
  212. }
  213. };
  214. //=====================================================blender_rgb565_gamma
  215. template<class Gamma> class blender_rgb565_gamma
  216. {
  217. public:
  218. typedef rgba8 color_type;
  219. typedef color_type::value_type value_type;
  220. typedef color_type::calc_type calc_type;
  221. typedef int16u pixel_type;
  222. typedef Gamma gamma_type;
  223. blender_rgb565_gamma() : m_gamma(0) {}
  224. void gamma(const gamma_type& g) { m_gamma = &g; }
  225. AGG_INLINE void blend_pix(pixel_type* p,
  226. unsigned cr, unsigned cg, unsigned cb,
  227. unsigned alpha,
  228. unsigned)
  229. {
  230. pixel_type rgb = *p;
  231. calc_type r = m_gamma->dir((rgb >> 8) & 0xF8);
  232. calc_type g = m_gamma->dir((rgb >> 3) & 0xFC);
  233. calc_type b = m_gamma->dir((rgb << 3) & 0xF8);
  234. *p = (pixel_type)
  235. (((m_gamma->inv(((m_gamma->dir(cr) - r) * alpha + (r << 8)) >> 8) << 8) & 0xF800) |
  236. ((m_gamma->inv(((m_gamma->dir(cg) - g) * alpha + (g << 8)) >> 8) << 3) & 0x07E0) |
  237. (m_gamma->inv(((m_gamma->dir(cb) - b) * alpha + (b << 8)) >> 8) >> 3));
  238. }
  239. static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)
  240. {
  241. return (pixel_type)(((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3));
  242. }
  243. static AGG_INLINE color_type make_color(pixel_type p)
  244. {
  245. return color_type((p >> 8) & 0xF8,
  246. (p >> 3) & 0xFC,
  247. (p << 3) & 0xF8);
  248. }
  249. private:
  250. const Gamma* m_gamma;
  251. };
  252. //=====================================================blender_rgbAAA
  253. struct blender_rgbAAA
  254. {
  255. typedef rgba16 color_type;
  256. typedef color_type::value_type value_type;
  257. typedef color_type::calc_type calc_type;
  258. typedef int32u pixel_type;
  259. static AGG_INLINE void blend_pix(pixel_type* p,
  260. unsigned cr, unsigned cg, unsigned cb,
  261. unsigned alpha,
  262. unsigned)
  263. {
  264. pixel_type rgb = *p;
  265. calc_type r = (rgb >> 14) & 0xFFC0;
  266. calc_type g = (rgb >> 4) & 0xFFC0;
  267. calc_type b = (rgb << 6) & 0xFFC0;
  268. *p = (pixel_type)
  269. (((((cr - r) * alpha + (r << 16)) >> 2) & 0x3FF00000) |
  270. ((((cg - g) * alpha + (g << 16)) >> 12) & 0x000FFC00) |
  271. (((cb - b) * alpha + (b << 16)) >> 22) | 0xC0000000);
  272. }
  273. static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)
  274. {
  275. return (pixel_type)(((r & 0xFFC0) << 14) |
  276. ((g & 0xFFC0) << 4) |
  277. (b >> 6) | 0xC0000000);
  278. }
  279. static AGG_INLINE color_type make_color(pixel_type p)
  280. {
  281. return color_type((p >> 14) & 0xFFC0,
  282. (p >> 4) & 0xFFC0,
  283. (p << 6) & 0xFFC0);
  284. }
  285. };
  286. //==================================================blender_rgbAAA_pre
  287. struct blender_rgbAAA_pre
  288. {
  289. typedef rgba16 color_type;
  290. typedef color_type::value_type value_type;
  291. typedef color_type::calc_type calc_type;
  292. typedef int32u pixel_type;
  293. static AGG_INLINE void blend_pix(pixel_type* p,
  294. unsigned cr, unsigned cg, unsigned cb,
  295. unsigned alpha,
  296. unsigned cover)
  297. {
  298. alpha = color_type::base_mask - alpha;
  299. cover = (cover + 1) << (color_type::base_shift - 8);
  300. pixel_type rgb = *p;
  301. calc_type r = (rgb >> 14) & 0xFFC0;
  302. calc_type g = (rgb >> 4) & 0xFFC0;
  303. calc_type b = (rgb << 6) & 0xFFC0;
  304. *p = (pixel_type)
  305. ((((r * alpha + cr * cover) >> 2) & 0x3FF00000) |
  306. (((g * alpha + cg * cover) >> 12) & 0x000FFC00) |
  307. ((b * alpha + cb * cover) >> 22) | 0xC0000000);
  308. }
  309. static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)
  310. {
  311. return (pixel_type)(((r & 0xFFC0) << 14) |
  312. ((g & 0xFFC0) << 4) |
  313. (b >> 6) | 0xC0000000);
  314. }
  315. static AGG_INLINE color_type make_color(pixel_type p)
  316. {
  317. return color_type((p >> 14) & 0xFFC0,
  318. (p >> 4) & 0xFFC0,
  319. (p << 6) & 0xFFC0);
  320. }
  321. };
  322. //=================================================blender_rgbAAA_gamma
  323. template<class Gamma> class blender_rgbAAA_gamma
  324. {
  325. public:
  326. typedef rgba16 color_type;
  327. typedef color_type::value_type value_type;
  328. typedef color_type::calc_type calc_type;
  329. typedef int32u pixel_type;
  330. typedef Gamma gamma_type;
  331. blender_rgbAAA_gamma() : m_gamma(0) {}
  332. void gamma(const gamma_type& g) { m_gamma = &g; }
  333. AGG_INLINE void blend_pix(pixel_type* p,
  334. unsigned cr, unsigned cg, unsigned cb,
  335. unsigned alpha,
  336. unsigned)
  337. {
  338. pixel_type rgb = *p;
  339. calc_type r = m_gamma->dir((rgb >> 14) & 0xFFC0);
  340. calc_type g = m_gamma->dir((rgb >> 4) & 0xFFC0);
  341. calc_type b = m_gamma->dir((rgb << 6) & 0xFFC0);
  342. *p = (pixel_type)
  343. (((m_gamma->inv(((m_gamma->dir(cr) - r) * alpha + (r << 16)) >> 16) << 14) & 0x3FF00000) |
  344. ((m_gamma->inv(((m_gamma->dir(cg) - g) * alpha + (g << 16)) >> 16) << 4 ) & 0x000FFC00) |
  345. (m_gamma->inv(((m_gamma->dir(cb) - b) * alpha + (b << 16)) >> 16) >> 6 ) | 0xC0000000);
  346. }
  347. static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)
  348. {
  349. return (pixel_type)(((r & 0xFFC0) << 14) |
  350. ((g & 0xFFC0) << 4) |
  351. (b >> 6) | 0xC0000000);
  352. }
  353. static AGG_INLINE color_type make_color(pixel_type p)
  354. {
  355. return color_type((p >> 14) & 0xFFC0,
  356. (p >> 4) & 0xFFC0,
  357. (p << 6) & 0xFFC0);
  358. }
  359. private:
  360. const Gamma* m_gamma;
  361. };
  362. //=====================================================blender_bgrAAA
  363. struct blender_bgrAAA
  364. {
  365. typedef rgba16 color_type;
  366. typedef color_type::value_type value_type;
  367. typedef color_type::calc_type calc_type;
  368. typedef int32u pixel_type;
  369. static AGG_INLINE void blend_pix(pixel_type* p,
  370. unsigned cr, unsigned cg, unsigned cb,
  371. unsigned alpha,
  372. unsigned)
  373. {
  374. pixel_type bgr = *p;
  375. calc_type b = (bgr >> 14) & 0xFFC0;
  376. calc_type g = (bgr >> 4) & 0xFFC0;
  377. calc_type r = (bgr << 6) & 0xFFC0;
  378. *p = (pixel_type)
  379. (((((cb - b) * alpha + (b << 16)) >> 2) & 0x3FF00000) |
  380. ((((cg - g) * alpha + (g << 16)) >> 12) & 0x000FFC00) |
  381. (((cr - r) * alpha + (r << 16)) >> 22) | 0xC0000000);
  382. }
  383. static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)
  384. {
  385. return (pixel_type)(((b & 0xFFC0) << 14) |
  386. ((g & 0xFFC0) << 4) |
  387. (r >> 6) | 0xC0000000);
  388. }
  389. static AGG_INLINE color_type make_color(pixel_type p)
  390. {
  391. return color_type((p << 6) & 0xFFC0,
  392. (p >> 4) & 0xFFC0,
  393. (p >> 14) & 0xFFC0);
  394. }
  395. };
  396. //=================================================blender_bgrAAA_pre
  397. struct blender_bgrAAA_pre
  398. {
  399. typedef rgba16 color_type;
  400. typedef color_type::value_type value_type;
  401. typedef color_type::calc_type calc_type;
  402. typedef int32u pixel_type;
  403. static AGG_INLINE void blend_pix(pixel_type* p,
  404. unsigned cr, unsigned cg, unsigned cb,
  405. unsigned alpha,
  406. unsigned cover)
  407. {
  408. alpha = color_type::base_mask - alpha;
  409. cover = (cover + 1) << (color_type::base_shift - 8);
  410. pixel_type bgr = *p;
  411. calc_type b = (bgr >> 14) & 0xFFC0;
  412. calc_type g = (bgr >> 4) & 0xFFC0;
  413. calc_type r = (bgr << 6) & 0xFFC0;
  414. *p = (pixel_type)
  415. ((((b * alpha + cb * cover) >> 2) & 0x3FF00000) |
  416. (((g * alpha + cg * cover) >> 12) & 0x000FFC00) |
  417. ((r * alpha + cr * cover) >> 22) | 0xC0000000);
  418. }
  419. static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)
  420. {
  421. return (pixel_type)(((b & 0xFFC0) << 14) |
  422. ((g & 0xFFC0) << 4) |
  423. (r >> 6) | 0xC0000000);
  424. }
  425. static AGG_INLINE color_type make_color(pixel_type p)
  426. {
  427. return color_type((p << 6) & 0xFFC0,
  428. (p >> 4) & 0xFFC0,
  429. (p >> 14) & 0xFFC0);
  430. }
  431. };
  432. //=================================================blender_bgrAAA_gamma
  433. template<class Gamma> class blender_bgrAAA_gamma
  434. {
  435. public:
  436. typedef rgba16 color_type;
  437. typedef color_type::value_type value_type;
  438. typedef color_type::calc_type calc_type;
  439. typedef int32u pixel_type;
  440. typedef Gamma gamma_type;
  441. blender_bgrAAA_gamma() : m_gamma(0) {}
  442. void gamma(const gamma_type& g) { m_gamma = &g; }
  443. AGG_INLINE void blend_pix(pixel_type* p,
  444. unsigned cr, unsigned cg, unsigned cb,
  445. unsigned alpha,
  446. unsigned)
  447. {
  448. pixel_type bgr = *p;
  449. calc_type b = m_gamma->dir((bgr >> 14) & 0xFFC0);
  450. calc_type g = m_gamma->dir((bgr >> 4) & 0xFFC0);
  451. calc_type r = m_gamma->dir((bgr << 6) & 0xFFC0);
  452. *p = (pixel_type)
  453. (((m_gamma->inv(((m_gamma->dir(cb) - b) * alpha + (b << 16)) >> 16) << 14) & 0x3FF00000) |
  454. ((m_gamma->inv(((m_gamma->dir(cg) - g) * alpha + (g << 16)) >> 16) << 4 ) & 0x000FFC00) |
  455. (m_gamma->inv(((m_gamma->dir(cr) - r) * alpha + (r << 16)) >> 16) >> 6 ) | 0xC0000000);
  456. }
  457. static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)
  458. {
  459. return (pixel_type)(((b & 0xFFC0) << 14) |
  460. ((g & 0xFFC0) << 4) |
  461. (r >> 6) | 0xC0000000);
  462. }
  463. static AGG_INLINE color_type make_color(pixel_type p)
  464. {
  465. return color_type((p << 6) & 0xFFC0,
  466. (p >> 4) & 0xFFC0,
  467. (p >> 14) & 0xFFC0);
  468. }
  469. private:
  470. const Gamma* m_gamma;
  471. };
  472. //=====================================================blender_rgbBBA
  473. struct blender_rgbBBA
  474. {
  475. typedef rgba16 color_type;
  476. typedef color_type::value_type value_type;
  477. typedef color_type::calc_type calc_type;
  478. typedef int32u pixel_type;
  479. static AGG_INLINE void blend_pix(pixel_type* p,
  480. unsigned cr, unsigned cg, unsigned cb,
  481. unsigned alpha,
  482. unsigned)
  483. {
  484. pixel_type rgb = *p;
  485. calc_type r = (rgb >> 16) & 0xFFE0;
  486. calc_type g = (rgb >> 5) & 0xFFE0;
  487. calc_type b = (rgb << 6) & 0xFFC0;
  488. *p = (pixel_type)
  489. (((((cr - r) * alpha + (r << 16)) ) & 0xFFE00000) |
  490. ((((cg - g) * alpha + (g << 16)) >> 11) & 0x001FFC00) |
  491. (((cb - b) * alpha + (b << 16)) >> 22));
  492. }
  493. static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)
  494. {
  495. return (pixel_type)(((r & 0xFFE0) << 16) | ((g & 0xFFE0) << 5) | (b >> 6));
  496. }
  497. static AGG_INLINE color_type make_color(pixel_type p)
  498. {
  499. return color_type((p >> 16) & 0xFFE0,
  500. (p >> 5) & 0xFFE0,
  501. (p << 6) & 0xFFC0);
  502. }
  503. };
  504. //=================================================blender_rgbBBA_pre
  505. struct blender_rgbBBA_pre
  506. {
  507. typedef rgba16 color_type;
  508. typedef color_type::value_type value_type;
  509. typedef color_type::calc_type calc_type;
  510. typedef int32u pixel_type;
  511. static AGG_INLINE void blend_pix(pixel_type* p,
  512. unsigned cr, unsigned cg, unsigned cb,
  513. unsigned alpha,
  514. unsigned cover)
  515. {
  516. alpha = color_type::base_mask - alpha;
  517. cover = (cover + 1) << (color_type::base_shift - 8);
  518. pixel_type rgb = *p;
  519. calc_type r = (rgb >> 16) & 0xFFE0;
  520. calc_type g = (rgb >> 5) & 0xFFE0;
  521. calc_type b = (rgb << 6) & 0xFFC0;
  522. *p = (pixel_type)
  523. ((((r * alpha + cr * cover) ) & 0xFFE00000) |
  524. (((g * alpha + cg * cover) >> 11) & 0x001FFC00) |
  525. ((b * alpha + cb * cover) >> 22));
  526. }
  527. static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)
  528. {
  529. return (pixel_type)(((r & 0xFFE0) << 16) | ((g & 0xFFE0) << 5) | (b >> 6));
  530. }
  531. static AGG_INLINE color_type make_color(pixel_type p)
  532. {
  533. return color_type((p >> 16) & 0xFFE0,
  534. (p >> 5) & 0xFFE0,
  535. (p << 6) & 0xFFC0);
  536. }
  537. };
  538. //=================================================blender_rgbBBA_gamma
  539. template<class Gamma> class blender_rgbBBA_gamma
  540. {
  541. public:
  542. typedef rgba16 color_type;
  543. typedef color_type::value_type value_type;
  544. typedef color_type::calc_type calc_type;
  545. typedef int32u pixel_type;
  546. typedef Gamma gamma_type;
  547. blender_rgbBBA_gamma() : m_gamma(0) {}
  548. void gamma(const gamma_type& g) { m_gamma = &g; }
  549. AGG_INLINE void blend_pix(pixel_type* p,
  550. unsigned cr, unsigned cg, unsigned cb,
  551. unsigned alpha,
  552. unsigned)
  553. {
  554. pixel_type rgb = *p;
  555. calc_type r = m_gamma->dir((rgb >> 16) & 0xFFE0);
  556. calc_type g = m_gamma->dir((rgb >> 5) & 0xFFE0);
  557. calc_type b = m_gamma->dir((rgb << 6) & 0xFFC0);
  558. *p = (pixel_type)
  559. (((m_gamma->inv(((m_gamma->dir(cr) - r) * alpha + (r << 16)) >> 16) << 16) & 0xFFE00000) |
  560. ((m_gamma->inv(((m_gamma->dir(cg) - g) * alpha + (g << 16)) >> 16) << 5 ) & 0x001FFC00) |
  561. (m_gamma->inv(((m_gamma->dir(cb) - b) * alpha + (b << 16)) >> 16) >> 6 ));
  562. }
  563. static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)
  564. {
  565. return (pixel_type)(((r & 0xFFE0) << 16) | ((g & 0xFFE0) << 5) | (b >> 6));
  566. }
  567. static AGG_INLINE color_type make_color(pixel_type p)
  568. {
  569. return color_type((p >> 16) & 0xFFE0,
  570. (p >> 5) & 0xFFE0,
  571. (p << 6) & 0xFFC0);
  572. }
  573. private:
  574. const Gamma* m_gamma;
  575. };
  576. //=====================================================blender_bgrABB
  577. struct blender_bgrABB
  578. {
  579. typedef rgba16 color_type;
  580. typedef color_type::value_type value_type;
  581. typedef color_type::calc_type calc_type;
  582. typedef int32u pixel_type;
  583. static AGG_INLINE void blend_pix(pixel_type* p,
  584. unsigned cr, unsigned cg, unsigned cb,
  585. unsigned alpha,
  586. unsigned)
  587. {
  588. pixel_type bgr = *p;
  589. calc_type b = (bgr >> 16) & 0xFFC0;
  590. calc_type g = (bgr >> 6) & 0xFFE0;
  591. calc_type r = (bgr << 5) & 0xFFE0;
  592. *p = (pixel_type)
  593. (((((cb - b) * alpha + (b << 16)) ) & 0xFFC00000) |
  594. ((((cg - g) * alpha + (g << 16)) >> 10) & 0x003FF800) |
  595. (((cr - r) * alpha + (r << 16)) >> 21));
  596. }
  597. static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)
  598. {
  599. return (pixel_type)(((b & 0xFFC0) << 16) | ((g & 0xFFE0) << 6) | (r >> 5));
  600. }
  601. static AGG_INLINE color_type make_color(pixel_type p)
  602. {
  603. return color_type((p << 5) & 0xFFE0,
  604. (p >> 6) & 0xFFE0,
  605. (p >> 16) & 0xFFC0);
  606. }
  607. };
  608. //=================================================blender_bgrABB_pre
  609. struct blender_bgrABB_pre
  610. {
  611. typedef rgba16 color_type;
  612. typedef color_type::value_type value_type;
  613. typedef color_type::calc_type calc_type;
  614. typedef int32u pixel_type;
  615. static AGG_INLINE void blend_pix(pixel_type* p,
  616. unsigned cr, unsigned cg, unsigned cb,
  617. unsigned alpha,
  618. unsigned cover)
  619. {
  620. alpha = color_type::base_mask - alpha;
  621. cover = (cover + 1) << (color_type::base_shift - 8);
  622. pixel_type bgr = *p;
  623. calc_type b = (bgr >> 16) & 0xFFC0;
  624. calc_type g = (bgr >> 6) & 0xFFE0;
  625. calc_type r = (bgr << 5) & 0xFFE0;
  626. *p = (pixel_type)
  627. ((((b * alpha + cb * cover) ) & 0xFFC00000) |
  628. (((g * alpha + cg * cover) >> 10) & 0x003FF800) |
  629. ((r * alpha + cr * cover) >> 21));
  630. }
  631. static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)
  632. {
  633. return (pixel_type)(((b & 0xFFC0) << 16) | ((g & 0xFFE0) << 6) | (r >> 5));
  634. }
  635. static AGG_INLINE color_type make_color(pixel_type p)
  636. {
  637. return color_type((p << 5) & 0xFFE0,
  638. (p >> 6) & 0xFFE0,
  639. (p >> 16) & 0xFFC0);
  640. }
  641. };
  642. //=================================================blender_bgrABB_gamma
  643. template<class Gamma> class blender_bgrABB_gamma
  644. {
  645. public:
  646. typedef rgba16 color_type;
  647. typedef color_type::value_type value_type;
  648. typedef color_type::calc_type calc_type;
  649. typedef int32u pixel_type;
  650. typedef Gamma gamma_type;
  651. blender_bgrABB_gamma() : m_gamma(0) {}
  652. void gamma(const gamma_type& g) { m_gamma = &g; }
  653. AGG_INLINE void blend_pix(pixel_type* p,
  654. unsigned cr, unsigned cg, unsigned cb,
  655. unsigned alpha,
  656. unsigned)
  657. {
  658. pixel_type bgr = *p;
  659. calc_type b = m_gamma->dir((bgr >> 16) & 0xFFC0);
  660. calc_type g = m_gamma->dir((bgr >> 6) & 0xFFE0);
  661. calc_type r = m_gamma->dir((bgr << 5) & 0xFFE0);
  662. *p = (pixel_type)
  663. (((m_gamma->inv(((m_gamma->dir(cb) - b) * alpha + (b << 16)) >> 16) << 16) & 0xFFC00000) |
  664. ((m_gamma->inv(((m_gamma->dir(cg) - g) * alpha + (g << 16)) >> 16) << 6 ) & 0x003FF800) |
  665. (m_gamma->inv(((m_gamma->dir(cr) - r) * alpha + (r << 16)) >> 16) >> 5 ));
  666. }
  667. static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)
  668. {
  669. return (pixel_type)(((b & 0xFFC0) << 16) | ((g & 0xFFE0) << 6) | (r >> 5));
  670. }
  671. static AGG_INLINE color_type make_color(pixel_type p)
  672. {
  673. return color_type((p << 5) & 0xFFE0,
  674. (p >> 6) & 0xFFE0,
  675. (p >> 16) & 0xFFC0);
  676. }
  677. private:
  678. const Gamma* m_gamma;
  679. };
  680. //===========================================pixfmt_alpha_blend_rgb_packed
  681. template<class Blender, class RenBuf> class pixfmt_alpha_blend_rgb_packed
  682. {
  683. public:
  684. typedef RenBuf rbuf_type;
  685. typedef typename rbuf_type::row_data row_data;
  686. typedef Blender blender_type;
  687. typedef typename blender_type::color_type color_type;
  688. typedef typename blender_type::pixel_type pixel_type;
  689. typedef int order_type; // A fake one
  690. typedef typename color_type::value_type value_type;
  691. typedef typename color_type::calc_type calc_type;
  692. enum base_scale_e
  693. {
  694. base_shift = color_type::base_shift,
  695. base_scale = color_type::base_scale,
  696. base_mask = color_type::base_mask,
  697. pix_width = sizeof(pixel_type)
  698. };
  699. private:
  700. //--------------------------------------------------------------------
  701. AGG_INLINE void copy_or_blend_pix(pixel_type* p, const color_type& c, unsigned cover)
  702. {
  703. if (c.a)
  704. {
  705. calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8;
  706. if(alpha == base_mask)
  707. {
  708. *p = m_blender.make_pix(c.r, c.g, c.b);
  709. }
  710. else
  711. {
  712. m_blender.blend_pix(p, c.r, c.g, c.b, alpha, cover);
  713. }
  714. }
  715. }
  716. public:
  717. //--------------------------------------------------------------------
  718. explicit pixfmt_alpha_blend_rgb_packed(rbuf_type& rb) : m_rbuf(&rb) {}
  719. void attach(rbuf_type& rb) { m_rbuf = &rb; }
  720. //--------------------------------------------------------------------
  721. template<class PixFmt>
  722. bool attach(PixFmt& pixf, int x1, int y1, int x2, int y2)
  723. {
  724. rect_i r(x1, y1, x2, y2);
  725. if(r.clip(rect_i(0, 0, pixf.width()-1, pixf.height()-1)))
  726. {
  727. int stride = pixf.stride();
  728. m_rbuf->attach(pixf.pix_ptr(r.x1, stride < 0 ? r.y2 : r.y1),
  729. (r.x2 - r.x1) + 1,
  730. (r.y2 - r.y1) + 1,
  731. stride);
  732. return true;
  733. }
  734. return false;
  735. }
  736. Blender& blender() { return m_blender; }
  737. //--------------------------------------------------------------------
  738. AGG_INLINE unsigned width() const { return m_rbuf->width(); }
  739. AGG_INLINE unsigned height() const { return m_rbuf->height(); }
  740. AGG_INLINE int stride() const { return m_rbuf->stride(); }
  741. //--------------------------------------------------------------------
  742. AGG_INLINE int8u* row_ptr(int y) { return m_rbuf->row_ptr(y); }
  743. AGG_INLINE const int8u* row_ptr(int y) const { return m_rbuf->row_ptr(y); }
  744. AGG_INLINE row_data row(int y) const { return m_rbuf->row(y); }
  745. //--------------------------------------------------------------------
  746. AGG_INLINE int8u* pix_ptr(int x, int y)
  747. {
  748. return m_rbuf->row_ptr(y) + x * pix_width;
  749. }
  750. AGG_INLINE const int8u* pix_ptr(int x, int y) const
  751. {
  752. return m_rbuf->row_ptr(y) + x * pix_width;
  753. }
  754. //--------------------------------------------------------------------
  755. AGG_INLINE void make_pix(int8u* p, const color_type& c)
  756. {
  757. *(pixel_type*)p = m_blender.make_pix(c.r, c.g, c.b);
  758. }
  759. //--------------------------------------------------------------------
  760. AGG_INLINE color_type pixel(int x, int y) const
  761. {
  762. return m_blender.make_color(((pixel_type*)m_rbuf->row_ptr(y))[x]);
  763. }
  764. //--------------------------------------------------------------------
  765. AGG_INLINE void copy_pixel(int x, int y, const color_type& c)
  766. {
  767. ((pixel_type*)
  768. m_rbuf->row_ptr(x, y, 1))[x] =
  769. m_blender.make_pix(c.r, c.g, c.b);
  770. }
  771. //--------------------------------------------------------------------
  772. AGG_INLINE void blend_pixel(int x, int y, const color_type& c, int8u cover)
  773. {
  774. copy_or_blend_pix((pixel_type*)m_rbuf->row_ptr(x, y, 1) + x, c, cover);
  775. }
  776. //--------------------------------------------------------------------
  777. AGG_INLINE void copy_hline(int x, int y,
  778. unsigned len,
  779. const color_type& c)
  780. {
  781. pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y, len) + x;
  782. pixel_type v = m_blender.make_pix(c.r, c.g, c.b);
  783. do
  784. {
  785. *p++ = v;
  786. }
  787. while(--len);
  788. }
  789. //--------------------------------------------------------------------
  790. AGG_INLINE void copy_vline(int x, int y,
  791. unsigned len,
  792. const color_type& c)
  793. {
  794. pixel_type v = m_blender.make_pix(c.r, c.g, c.b);
  795. do
  796. {
  797. pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y++, 1) + x;
  798. *p = v;
  799. }
  800. while(--len);
  801. }
  802. //--------------------------------------------------------------------
  803. void blend_hline(int x, int y,
  804. unsigned len,
  805. const color_type& c,
  806. int8u cover)
  807. {
  808. if (c.a)
  809. {
  810. pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y, len) + x;
  811. calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8;
  812. if(alpha == base_mask)
  813. {
  814. pixel_type v = m_blender.make_pix(c.r, c.g, c.b);
  815. do
  816. {
  817. *p++ = v;
  818. }
  819. while(--len);
  820. }
  821. else
  822. {
  823. do
  824. {
  825. m_blender.blend_pix(p, c.r, c.g, c.b, alpha, cover);
  826. ++p;
  827. }
  828. while(--len);
  829. }
  830. }
  831. }
  832. //--------------------------------------------------------------------
  833. void blend_vline(int x, int y,
  834. unsigned len,
  835. const color_type& c,
  836. int8u cover)
  837. {
  838. if (c.a)
  839. {
  840. calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8;
  841. if(alpha == base_mask)
  842. {
  843. pixel_type v = m_blender.make_pix(c.r, c.g, c.b);
  844. do
  845. {
  846. ((pixel_type*)m_rbuf->row_ptr(x, y++, 1))[x] = v;
  847. }
  848. while(--len);
  849. }
  850. else
  851. {
  852. do
  853. {
  854. m_blender.blend_pix(
  855. (pixel_type*)m_rbuf->row_ptr(x, y++, 1),
  856. c.r, c.g, c.b, alpha, cover);
  857. }
  858. while(--len);
  859. }
  860. }
  861. }
  862. //--------------------------------------------------------------------
  863. void blend_solid_hspan(int x, int y,
  864. unsigned len,
  865. const color_type& c,
  866. const int8u* covers)
  867. {
  868. pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y, len) + x;
  869. do
  870. {
  871. copy_or_blend_pix(p, c, *covers++);
  872. ++p;
  873. }
  874. while(--len);
  875. }
  876. //--------------------------------------------------------------------
  877. void blend_solid_vspan(int x, int y,
  878. unsigned len,
  879. const color_type& c,
  880. const int8u* covers)
  881. {
  882. do
  883. {
  884. copy_or_blend_pix((pixel_type*)m_rbuf->row_ptr(x, y++, 1) + x,
  885. c, *covers++);
  886. }
  887. while(--len);
  888. }
  889. //--------------------------------------------------------------------
  890. void copy_color_hspan(int x, int y,
  891. unsigned len,
  892. const color_type* colors)
  893. {
  894. pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y, len) + x;
  895. do
  896. {
  897. *p++ = m_blender.make_pix(colors->r, colors->g, colors->b);
  898. ++colors;
  899. }
  900. while(--len);
  901. }
  902. //--------------------------------------------------------------------
  903. void copy_color_vspan(int x, int y,
  904. unsigned len,
  905. const color_type* colors)
  906. {
  907. do
  908. {
  909. pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y++, 1) + x;
  910. *p = m_blender.make_pix(colors->r, colors->g, colors->b);
  911. ++colors;
  912. }
  913. while(--len);
  914. }
  915. //--------------------------------------------------------------------
  916. void blend_color_hspan(int x, int y,
  917. unsigned len,
  918. const color_type* colors,
  919. const int8u* covers,
  920. int8u cover)
  921. {
  922. pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y, len) + x;
  923. do
  924. {
  925. copy_or_blend_pix(p++, *colors++, covers ? *covers++ : cover);
  926. }
  927. while(--len);
  928. }
  929. //--------------------------------------------------------------------
  930. void blend_color_vspan(int x, int y,
  931. unsigned len,
  932. const color_type* colors,
  933. const int8u* covers,
  934. int8u cover)
  935. {
  936. do
  937. {
  938. copy_or_blend_pix((pixel_type*)m_rbuf->row_ptr(x, y++, 1) + x,
  939. *colors++, covers ? *covers++ : cover);
  940. }
  941. while(--len);
  942. }
  943. //--------------------------------------------------------------------
  944. template<class RenBuf2>
  945. void copy_from(const RenBuf2& from,
  946. int xdst, int ydst,
  947. int xsrc, int ysrc,
  948. unsigned len)
  949. {
  950. const int8u* p = from.row_ptr(ysrc);
  951. if(p)
  952. {
  953. memmove(m_rbuf->row_ptr(xdst, ydst, len) + xdst * pix_width,
  954. p + xsrc * pix_width,
  955. len * pix_width);
  956. }
  957. }
  958. //--------------------------------------------------------------------
  959. template<class SrcPixelFormatRenderer>
  960. void blend_from(const SrcPixelFormatRenderer& from,
  961. int xdst, int ydst,
  962. int xsrc, int ysrc,
  963. unsigned len,
  964. int8u cover)
  965. {
  966. typedef typename SrcPixelFormatRenderer::order_type src_order;
  967. const value_type* psrc = (const value_type*)from.row_ptr(ysrc);
  968. if(psrc)
  969. {
  970. psrc += xsrc * 4;
  971. pixel_type* pdst =
  972. (pixel_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst;
  973. do
  974. {
  975. value_type alpha = psrc[src_order::A];
  976. if(alpha)
  977. {
  978. if(alpha == base_mask && cover == 255)
  979. {
  980. *pdst = m_blender.make_pix(psrc[src_order::R],
  981. psrc[src_order::G],
  982. psrc[src_order::B]);
  983. }
  984. else
  985. {
  986. m_blender.blend_pix(pdst,
  987. psrc[src_order::R],
  988. psrc[src_order::G],
  989. psrc[src_order::B],
  990. alpha,
  991. cover);
  992. }
  993. }
  994. psrc += 4;
  995. ++pdst;
  996. }
  997. while(--len);
  998. }
  999. }
  1000. //--------------------------------------------------------------------
  1001. template<class SrcPixelFormatRenderer>
  1002. void blend_from_color(const SrcPixelFormatRenderer& from,
  1003. const color_type& color,
  1004. int xdst, int ydst,
  1005. int xsrc, int ysrc,
  1006. unsigned len,
  1007. int8u cover)
  1008. {
  1009. typedef typename SrcPixelFormatRenderer::value_type src_value_type;
  1010. const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc);
  1011. if(psrc)
  1012. {
  1013. pixel_type* pdst =
  1014. (pixel_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst;
  1015. do
  1016. {
  1017. m_blender.blend_pix(pdst,
  1018. color.r, color.g, color.b, color.a,
  1019. cover);
  1020. ++psrc;
  1021. ++pdst;
  1022. }
  1023. while(--len);
  1024. }
  1025. }
  1026. //--------------------------------------------------------------------
  1027. template<class SrcPixelFormatRenderer>
  1028. void blend_from_lut(const SrcPixelFormatRenderer& from,
  1029. const color_type* color_lut,
  1030. int xdst, int ydst,
  1031. int xsrc, int ysrc,
  1032. unsigned len,
  1033. int8u cover)
  1034. {
  1035. typedef typename SrcPixelFormatRenderer::value_type src_value_type;
  1036. const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc);
  1037. if(psrc)
  1038. {
  1039. pixel_type* pdst =
  1040. (pixel_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst;
  1041. do
  1042. {
  1043. const color_type& color = color_lut[*psrc];
  1044. m_blender.blend_pix(pdst,
  1045. color.r, color.g, color.b, color.a,
  1046. cover);
  1047. ++psrc;
  1048. ++pdst;
  1049. }
  1050. while(--len);
  1051. }
  1052. }
  1053. private:
  1054. rbuf_type* m_rbuf;
  1055. Blender m_blender;
  1056. };
  1057. typedef pixfmt_alpha_blend_rgb_packed<blender_rgb555, rendering_buffer> pixfmt_rgb555; //----pixfmt_rgb555
  1058. typedef pixfmt_alpha_blend_rgb_packed<blender_rgb565, rendering_buffer> pixfmt_rgb565; //----pixfmt_rgb565
  1059. typedef pixfmt_alpha_blend_rgb_packed<blender_rgb555_pre, rendering_buffer> pixfmt_rgb555_pre; //----pixfmt_rgb555_pre
  1060. typedef pixfmt_alpha_blend_rgb_packed<blender_rgb565_pre, rendering_buffer> pixfmt_rgb565_pre; //----pixfmt_rgb565_pre
  1061. typedef pixfmt_alpha_blend_rgb_packed<blender_rgbAAA, rendering_buffer> pixfmt_rgbAAA; //----pixfmt_rgbAAA
  1062. typedef pixfmt_alpha_blend_rgb_packed<blender_bgrAAA, rendering_buffer> pixfmt_bgrAAA; //----pixfmt_bgrAAA
  1063. typedef pixfmt_alpha_blend_rgb_packed<blender_rgbBBA, rendering_buffer> pixfmt_rgbBBA; //----pixfmt_rgbBBA
  1064. typedef pixfmt_alpha_blend_rgb_packed<blender_bgrABB, rendering_buffer> pixfmt_bgrABB; //----pixfmt_bgrABB
  1065. typedef pixfmt_alpha_blend_rgb_packed<blender_rgbAAA_pre, rendering_buffer> pixfmt_rgbAAA_pre; //----pixfmt_rgbAAA_pre
  1066. typedef pixfmt_alpha_blend_rgb_packed<blender_bgrAAA_pre, rendering_buffer> pixfmt_bgrAAA_pre; //----pixfmt_bgrAAA_pre
  1067. typedef pixfmt_alpha_blend_rgb_packed<blender_rgbBBA_pre, rendering_buffer> pixfmt_rgbBBA_pre; //----pixfmt_rgbBBA_pre
  1068. typedef pixfmt_alpha_blend_rgb_packed<blender_bgrABB_pre, rendering_buffer> pixfmt_bgrABB_pre; //----pixfmt_bgrABB_pre
  1069. //-----------------------------------------------------pixfmt_rgb555_gamma
  1070. template<class Gamma> class pixfmt_rgb555_gamma :
  1071. public pixfmt_alpha_blend_rgb_packed<blender_rgb555_gamma<Gamma>,
  1072. rendering_buffer>
  1073. {
  1074. public:
  1075. pixfmt_rgb555_gamma(rendering_buffer& rb, const Gamma& g) :
  1076. pixfmt_alpha_blend_rgb_packed<blender_rgb555_gamma<Gamma>,
  1077. rendering_buffer>(rb)
  1078. {
  1079. this->blender().gamma(g);
  1080. }
  1081. };
  1082. //-----------------------------------------------------pixfmt_rgb565_gamma
  1083. template<class Gamma> class pixfmt_rgb565_gamma :
  1084. public pixfmt_alpha_blend_rgb_packed<blender_rgb565_gamma<Gamma>, rendering_buffer>
  1085. {
  1086. public:
  1087. pixfmt_rgb565_gamma(rendering_buffer& rb, const Gamma& g) :
  1088. pixfmt_alpha_blend_rgb_packed<blender_rgb565_gamma<Gamma>, rendering_buffer>(rb)
  1089. {
  1090. this->blender().gamma(g);
  1091. }
  1092. };
  1093. //-----------------------------------------------------pixfmt_rgbAAA_gamma
  1094. template<class Gamma> class pixfmt_rgbAAA_gamma :
  1095. public pixfmt_alpha_blend_rgb_packed<blender_rgbAAA_gamma<Gamma>,
  1096. rendering_buffer>
  1097. {
  1098. public:
  1099. pixfmt_rgbAAA_gamma(rendering_buffer& rb, const Gamma& g) :
  1100. pixfmt_alpha_blend_rgb_packed<blender_rgbAAA_gamma<Gamma>,
  1101. rendering_buffer>(rb)
  1102. {
  1103. this->blender().gamma(g);
  1104. }
  1105. };
  1106. //-----------------------------------------------------pixfmt_bgrAAA_gamma
  1107. template<class Gamma> class pixfmt_bgrAAA_gamma :
  1108. public pixfmt_alpha_blend_rgb_packed<blender_bgrAAA_gamma<Gamma>,
  1109. rendering_buffer>
  1110. {
  1111. public:
  1112. pixfmt_bgrAAA_gamma(rendering_buffer& rb, const Gamma& g) :
  1113. pixfmt_alpha_blend_rgb_packed<blender_bgrAAA_gamma<Gamma>,
  1114. rendering_buffer>(rb)
  1115. {
  1116. this->blender().gamma(g);
  1117. }
  1118. };
  1119. //-----------------------------------------------------pixfmt_rgbBBA_gamma
  1120. template<class Gamma> class pixfmt_rgbBBA_gamma :
  1121. public pixfmt_alpha_blend_rgb_packed<blender_rgbBBA_gamma<Gamma>,
  1122. rendering_buffer>
  1123. {
  1124. public:
  1125. pixfmt_rgbBBA_gamma(rendering_buffer& rb, const Gamma& g) :
  1126. pixfmt_alpha_blend_rgb_packed<blender_rgbBBA_gamma<Gamma>,
  1127. rendering_buffer>(rb)
  1128. {
  1129. this->blender().gamma(g);
  1130. }
  1131. };
  1132. //-----------------------------------------------------pixfmt_bgrABB_gamma
  1133. template<class Gamma> class pixfmt_bgrABB_gamma :
  1134. public pixfmt_alpha_blend_rgb_packed<blender_bgrABB_gamma<Gamma>,
  1135. rendering_buffer>
  1136. {
  1137. public:
  1138. pixfmt_bgrABB_gamma(rendering_buffer& rb, const Gamma& g) :
  1139. pixfmt_alpha_blend_rgb_packed<blender_bgrABB_gamma<Gamma>,
  1140. rendering_buffer>(rb)
  1141. {
  1142. this->blender().gamma(g);
  1143. }
  1144. };
  1145. }
  1146. #endif