From 3373ea4c0cf7267d351826ad56e38c58f1ba0c9d Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Sun, 24 Dec 2023 01:12:08 +0800 Subject: [PATCH] font_outline_punch_through: implement punch through This enables alpha blending for both font_outline and font_outline_punch_through. I have also experimented more with 16-gray vs 256-gray--I have not decided which between monochrome, 16-gray, or 256-gray I like the most. Perhaps a better test might be to test hanzi. --- dejavusansmono.data | Bin 34712 -> 18328 bytes dejavusansmono_mono.data | Bin 6040 -> 2968 bytes example/font_outline.cpp | 53 +++---- example/font_outline_punch_through.cpp | 186 +++++++++++++++---------- holly/core.cpp | 3 +- holly/ta_fifo_polygon_converter.cpp | 7 + holly/ta_fifo_polygon_converter.hpp | 1 + palette.hpp | 50 +++++++ 8 files changed, 187 insertions(+), 113 deletions(-) create mode 100644 palette.hpp diff --git a/dejavusansmono.data b/dejavusansmono.data index e61fec3d6890212c74d5446e447319b8d70f9490..d25d936fe167b833fecd675dccd3b99807d55e63 100644 GIT binary patch literal 18328 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 Y1vfmk*=+w>fo$!6wSxQ)rmgY+3r+PS-~a#s literal 34712 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 diff --git a/dejavusansmono_mono.data b/dejavusansmono_mono.data index 7e234c583bdd9ae0e5fd97a2700c1249a8f2a50e..9dea48d39264508c0e2102b72665d68f6ffceec4 100644 GIT binary patch literal 2968 zcmZuz-)mb{9RJ>PZ`+gfHoe&f%i7uAq}kfBqUnm;>e701TUebw2#N|0tZWKCh;t6f zuxrmrv$g@5-9X$xls@=Bhy+Z3Chw zt->L=hSA9tMJzuy@c3#r1+?_^4cJx)DmkTL(GNJ*{onS4S8>x58f3 z={Wgy(SROU0lHWK*9+gx{p&`b{9KohJ48o)+za$7s^yj5qiofKVR{E;wpV&z<%qIS zRr>5yxjuRij6n`^DpmV;49}xk*FqP3eIfLdBX7^P>aRbbwm$T;xwhv5bjJg9eVEE- z+v5S;sQ`b&0saQjtCptcdyrnoY&6dEa6pWBK<|%XuA1|+>4c9vMkyaR6kyBidRm*) zQ1uL|KG(RR0Dt@FkngOj8=*Nr9>A&LQD@0pdv}E2mN56t_dzVc-zjMW4S8`p|b4QgybqxTov5S{)X><(suZI*&R!8}1xJubQ7*Pr#fW zfo*dg`vY>`kDQzP!s}wxawd9nFK&$+!n15euS%--)pOoWQ$BwqGz49{*Zb0*?gO80 zKYi-s4kDK@VyN{r#$}(52jmy0b3WY}%yLUpPfudjG_o3Il5npz>-tFL%)B~8^-hEp zxW>D#e5TBM%ydzER`Ndc!XH{fj%hub1pY#|gg6nGg`O(LD|o|M7MtL|2bRvo1da&dc`uV>Tc#ZaU@x$Z9g*J*~6x$z~#G|l8AxnzVR zX7aw=ZTly*(_fHxDTIANPEyD;4+8~^^A6PI?vAO@tl!kI&cDqSU)jmRdCiC-~xNy z8aR;6>rCg?NtyL9p=m(Fay7{muF_8|n`PE|F1veuom<&!G&isF^jK z_O2WNKEtILWCivYFgaFWTIi0GaBnKK6XNE)9+FmEEa&G#l9$DDcKVWQ*kVN#HMiBy ztcX=DUAD(GAvGywSu4tGQo2H0m21*}aoSL^P=6~fROh5$xPvsK~0osYK{&QqRq^Gf~|x()pN zlL^XO5EAS*+JR>&Pk)Bg+aNEju!mo8@I(_^orhb2`VxQK0-XDnd;9m7_yJr$G`M6X zG@yNZV+BA{U-NZ^rLQnKSVB~O-{jUlr9aH=L&{$pw^x*1+pPUAUMt{BDaCK{QcS%e J1^#NO^*<`pp3?vT literal 6040 zcmaKve~2Ad701u*O>xHh-jYX?w=t|Bmgr+zx)yY;v;Io;Q!_b(U0+8Ne>gPc6!9_ zB>ftdF+TPr{b@?}62?sC-ltzptwE?O-d{7a#sfo{9+7<#aXbjSQQ0Z_-PF3DKwYuj z+{jp>-%qXk8f>Qh`{P~m@Ar00TjpIq2=}Ef?V<-E; zr?4)|=J2;U3tt%KWmNVW=9`S|tMuoov;QpSnLLBv7~1hUMZwm!`*>ZG=vNRm>wX({ z58<5i$5hU7jlTrn6c6IFKOFlU{Tyo?uk+W`_%rl8WRKK)&gMM!S^5L^@^~$4?9S5H zYCFw~4DDXH%X|s_3}eUV`#Sojj}FCSoB0;$yQsBsyR-E2)EcL#i>?-p`S%j?%sz8$ zjV~`^K9AiKH=Y~De$K5!CUk&@FCh^~6ec5u- z!{!yssZQxwM<&h>s7=*MY8`n}1ukNCt7&e@VrE#6zf&34}Gv_x?)XsmU|ib zo{GtX{~Myy>pej#R4oduksIQu+j>H)L}g&@SMkwgE7merIhb5K_GmsfvZXA=mMVq# z=O3{mS5|-v89zehb*bSKWr(*Btr0e&QnuUZ5w1kojuK^rM+F`j()SU>fGh0BMHw3H z+O?kfk_?zvda(ETFv`SeF<-OF_qKW>X72Z)SH+zV`XbI(!0$4b&aI2Mydvgr{1dG~ zg{6N}#MJ?Nh1wAD`rD1(FH|YwKIYrmVSAO!V!*GxH_duPf1xA~TLgQV+`#yyB`|@n z%Ai^n^GR!{zbeCWb--F;y~Ot|{9!#Q_!A&M*BXYuVWms~&RCCl{6d%9tB1y%26?C@0zg7V#s(*y6Xpg6~`!aSD3Mv>ew}~U#<+L;W|%2QLLylC9ZDa5W3g$*TSv_%|jO<&s)d zMEy6y#Ku}h?=Y8X|7qpGGJIQ7LP^q}6+L^}$Z$=fcX+M-tX}TU8WFrDkrprO`$N7Y zQ6zreS3_QrS`iAD^zt%}ThNhO)=WJOUh8mvSWm9zqd<(>r5#jp48JcRrAF?6755?CHcIzo zMLTder`Wt{6na@nRfHxz!RR=4-zxOBfqtX2XgB6-7Jh)luG9>FH)>X^xATn!_#-wt ztXHdB+1is}c^P*^9IDHk%;0`)TRO0(JniF#0T=7b%*v)AwkWo?Cvi2QnY0I7c9>UW-nyK!-mT)c z0=M!ZUuQ<6v$)xym$(a<6EtLIDms!GCw{mm86Rg}0DhejEgDAuk}bjGbZRiRNwv2pJ!iX{4mtJ!u>Decpm z)c!q*jo`9WMuCmw+oWbR1u!nw+`3)pQ9?E6s7vM+(W-jv|**fWWWmv1x}daTmVtR8|Q`uJdOQwuoC`LwH zmbe8*zGXsQQ1gP)$d@SmnrWT6*Cu8=J6E%e3u%2XDc;QV$|BxfakcAk8{c}rZ92?X z9dmwbFEyfO^&Z&vyS^3Yp~rB7ztJTW@9WHh*`_;wi!K~+-rk8?mi=WtsxLniB&KGJ zN44273C#i;%XObQv3~4nv6Q>(&bm`Lz<%tmNQ9kMTZfGN#rbZ-kwSiB;%bI{u_qKZ zI;LvK`%>Z7<@z4z_vO(8#(IT+k9WYa#hZq_v>D&ZYkms*QO}>Zy+V+89_)BMn;!DE zOR=3bZ)3dM1na2m!G1e;J=9l?FZ&Vl*Mx+-BXP}O+USBU3>VV-N7-wdvUqGWu z`AiKN&r3>Y=zve7@uhfjHu?y+Psr`Bws%p5uZrkyV@&t8$JsBo2HR<|!Q89Rp6c-f z#z`4tY+zLH4wi+z!B>|<#>Pst;R8LG@Fp7L#(XfokhrD}^gJJ89ATTqUc*!>QE=q|^ qce9zVBus4eVzZv>;5415PdENxIzH`Q<8Ox() = polygon; @@ -117,17 +119,17 @@ uint32_t transform2(ta_parameter_writer& parameter, auto polygon = global_polygon_type_0(texture_address); polygon.parameter_control_word = para_control::para_type::polygon_or_modifier_volume - | para_control::list_type::opaque + | para_control::list_type::translucent | obj_control::col_type::packed_color | obj_control::texture; - polygon.tsp_instruction_word = tsp_instruction_word::src_alpha_instr::one + polygon.tsp_instruction_word = tsp_instruction_word::src_alpha_instr::src_alpha | tsp_instruction_word::dst_alpha_instr::zero | tsp_instruction_word::fog_control::no_fog | tsp_instruction_word::texture_u_size::from_int(texture_width) | tsp_instruction_word::texture_v_size::from_int(texture_height); - polygon.texture_control_word = texture_control_word::pixel_format::_8bpp_palette + polygon.texture_control_word = texture_control_word::pixel_format::_4bpp_palette | texture_control_word::scan_order::twiddled | texture_control_word::texture_address(texture_address / 8); parameter.append() = polygon; @@ -139,8 +141,8 @@ uint32_t transform2(ta_parameter_writer& parameter, float y = strip_vertices[i].y; float z = strip_vertices[i].z; - x *= 128.f; - y *= 256.f; + x *= static_cast(texture_width); + y *= static_cast(texture_height); x += 50.f; y += 50.f; z = 1.f / (z + 9.f); @@ -179,28 +181,11 @@ void inflate_font(const uint32_t * src, auto mem = reinterpret_cast(texture_memory64); auto texture = reinterpret_cast(mem->texture); - twiddle::texture3<8, 8>(texture, reinterpret_cast(src), + twiddle::texture3<4, 8>(texture, reinterpret_cast(src), stride, curve_end_ix); } -template -void palette_data() -{ - static_assert(C >= 2); - constexpr int increment = 256 / C; - - holly.PAL_RAM_CTRL = pal_ram_ctrl::pixel_format::rgb565; - - // generate a palette with `C` shades of grey, - // ranging in intensity from rgb565(0, 0, 0) to rgb565(31, 63, 31) - for (int i = 0; i < 256; i += increment) { - holly.PALETTE_RAM[i / increment] = ((i >> 3) << 11) - | ((i >> 2) << 5) - | ((i >> 3) << 0); - } -} - uint32_t _ta_parameter_buf[((32 * 10 * 17) + 32) / 4]; void main() @@ -226,7 +211,7 @@ void main() inflate_font(texture, font->texture_stride, font->max_z_curve_ix); - palette_data<256>(); + palette_data<16>(); // The address of `ta_parameter_buf` must be a multiple of 32 bytes. // This is mandatory for ch2-dma to the ta fifo polygon converter. @@ -234,13 +219,13 @@ void main() constexpr uint32_t ta_alloc = ta_alloc_ctrl::pt_opb::no_list | ta_alloc_ctrl::tm_opb::no_list - | ta_alloc_ctrl::t_opb::no_list + | ta_alloc_ctrl::t_opb::_16x4byte | ta_alloc_ctrl::om_opb::no_list - | ta_alloc_ctrl::o_opb::_16x4byte; + | ta_alloc_ctrl::o_opb::no_list; - constexpr struct opb_size opb_size = { .opaque = 16 * 4 + constexpr struct opb_size opb_size = { .opaque = 0 , .opaque_modifier = 0 - , .translucent = 0 + , .translucent = 16 * 4 , .translucent_modifier = 0 , .punch_through = 0 }; @@ -266,10 +251,8 @@ void main() auto parameter = ta_parameter_writer(ta_parameter_buf); - /* transform2(parameter, font->texture_width, font->texture_height); - */ transform(parameter, font->texture_width, font->texture_height, @@ -288,7 +271,7 @@ void main() parameter.append() = global_end_of_list(); ta_polygon_converter_transfer(ta_parameter_buf, parameter.offset); - ta_wait_opaque_list(); + ta_wait_translucent_list(); core_start_render(frame_ix, num_frames); diff --git a/example/font_outline_punch_through.cpp b/example/font_outline_punch_through.cpp index 30f1a05..4544b0a 100644 --- a/example/font_outline_punch_through.cpp +++ b/example/font_outline_punch_through.cpp @@ -15,6 +15,7 @@ #include "holly/ta_bits.hpp" #include "twiddle.hpp" #include "serial.hpp" +#include "palette.hpp" #include "font/font.hpp" #include "dejavusansmono_mono.hpp" @@ -39,11 +40,11 @@ const struct vertex strip_vertices[4] = { constexpr uint32_t strip_length = (sizeof (strip_vertices)) / (sizeof (struct vertex)); uint32_t transform(ta_parameter_writer& parameter, - const uint32_t texture_width, uint32_t texture_height, - const uint32_t first_char_code, - const glyph * glyphs, - const char * s, const uint32_t len, - const uint32_t y_offset) + const uint32_t texture_width, uint32_t texture_height, + const uint32_t first_char_code, + const glyph * glyphs, + const char * s, const uint32_t len, + const uint32_t y_offset) { uint32_t texture_address = (offsetof (struct texture_memory_alloc, texture)); @@ -59,19 +60,20 @@ uint32_t transform(ta_parameter_writer& parameter, auto polygon = global_polygon_type_0(texture_address); polygon.parameter_control_word = para_control::para_type::polygon_or_modifier_volume - | para_control::list_type::opaque - | obj_control::col_type::packed_color - | obj_control::texture; + | para_control::list_type::punch_through + | obj_control::col_type::packed_color + | obj_control::texture; - polygon.tsp_instruction_word = tsp_instruction_word::src_alpha_instr::one - | tsp_instruction_word::dst_alpha_instr::zero - | tsp_instruction_word::fog_control::no_fog - | tsp_instruction_word::texture_u_size::from_int(texture_width) - | tsp_instruction_word::texture_v_size::from_int(texture_height); + polygon.tsp_instruction_word = tsp_instruction_word::src_alpha_instr::src_alpha + | tsp_instruction_word::dst_alpha_instr::one + | tsp_instruction_word::fog_control::no_fog + //| tsp_instruction_word::use_alpha + | tsp_instruction_word::texture_u_size::from_int(texture_width) + | tsp_instruction_word::texture_v_size::from_int(texture_height); polygon.texture_control_word = texture_control_word::pixel_format::_4bpp_palette - | texture_control_word::scan_order::twiddled - | texture_control_word::texture_address(texture_address / 8); + | texture_control_word::scan_order::twiddled + | texture_control_word::texture_address(texture_address / 8); parameter.append() = polygon; for (uint32_t i = 0; i < strip_length; i++) { @@ -98,10 +100,10 @@ uint32_t transform(ta_parameter_writer& parameter, v = v / static_cast(texture_height); parameter.append() = - vertex_polygon_type_3(x, y, z, - u, v, - 0x00000000, // base_color - end_of_strip); + vertex_polygon_type_3(x, y, z, + u, v, + 0x00000000, // base_color + end_of_strip); } advance += glyph.metrics.horiAdvance; @@ -110,6 +112,53 @@ uint32_t transform(ta_parameter_writer& parameter, return parameter.offset; } +uint32_t transform2(ta_parameter_writer& parameter, + const uint32_t texture_width, uint32_t texture_height) +{ + uint32_t texture_address = (offsetof (struct texture_memory_alloc, texture)); + + auto polygon = global_polygon_type_0(texture_address); + polygon.parameter_control_word = para_control::para_type::polygon_or_modifier_volume + | para_control::list_type::opaque + | obj_control::col_type::packed_color + | obj_control::texture; + + polygon.tsp_instruction_word = tsp_instruction_word::src_alpha_instr::src_alpha + | tsp_instruction_word::dst_alpha_instr::zero + | tsp_instruction_word::fog_control::no_fog + | tsp_instruction_word::texture_u_size::from_int(texture_width) + | tsp_instruction_word::texture_v_size::from_int(texture_height); + + polygon.texture_control_word = texture_control_word::pixel_format::_4bpp_palette + | texture_control_word::scan_order::twiddled + | texture_control_word::texture_address(texture_address / 8); + parameter.append() = polygon; + + for (uint32_t i = 0; i < strip_length; i++) { + bool end_of_strip = i == strip_length - 1; + + float x = strip_vertices[i].x; + float y = strip_vertices[i].y; + float z = strip_vertices[i].z; + + x *= static_cast(texture_width); + y *= static_cast(texture_height); + x += 50.f; + y += 50.f; + z = 1.f / (z + 9.f); + + float u = strip_vertices[i].u; + float v = strip_vertices[i].v; + + parameter.append() = + vertex_polygon_type_3(x, y, z, + u, v, + 0x00000000, // base_color + end_of_strip); + } + + return parameter.offset; +} void init_texture_memory(const struct opb_size& opb_size) { @@ -118,11 +167,11 @@ void init_texture_memory(const struct opb_size& opb_size) background_parameter(mem->background, 0xff0000ff); region_array2(mem->region_array, - (offsetof (struct texture_memory_alloc, object_list)), - 640 / 32, // width - 480 / 32, // height - opb_size - ); + (offsetof (struct texture_memory_alloc, object_list)), + 640 / 32, // width + 480 / 32, // height + opb_size + ); } constexpr inline uint32_t b(uint32_t v, uint32_t n) @@ -131,38 +180,15 @@ constexpr inline uint32_t b(uint32_t v, uint32_t n) } void inflate_font(const uint32_t * src, - const uint32_t stride, - const uint32_t curve_end_ix) + const uint32_t stride, + const uint32_t curve_end_ix) { auto mem = reinterpret_cast(texture_memory64); auto texture = reinterpret_cast(mem->texture); twiddle::texture3<4, 1>(texture, reinterpret_cast(src), - stride, - curve_end_ix); -} - -template -void palette_data() -{ - static_assert(C >= 2); - constexpr int increment = 256 / C; - - holly.PAL_RAM_CTRL = pal_ram_ctrl::pixel_format::rgb565; - - // generate a palette with `C` shades of grey, - // ranging in intensity from rgb565(0, 0, 0) to rgb565(31, 63, 31) - for (int i = 0; i < 256; i += increment) { - holly.PALETTE_RAM[i / increment] = ((i >> 3) << 11) - | ((i >> 2) << 5) - | ((i >> 3) << 0); - } -} - -void palette_data_mono() -{ - holly.PALETTE_RAM[0] = 0; - holly.PALETTE_RAM[1] = 0xffff; + stride, + curve_end_ix); } uint32_t _ta_parameter_buf[((32 * 10 * 17) + 32) / 4]; @@ -187,33 +213,34 @@ void main() */ inflate_font(texture, - font->texture_stride, - font->max_z_curve_ix); - palette_data_mono(); + font->texture_stride, + font->max_z_curve_ix); + palette_data<2>(); // The address of `ta_parameter_buf` must be a multiple of 32 bytes. // This is mandatory for ch2-dma to the ta fifo polygon converter. uint32_t * ta_parameter_buf = align_32byte(_ta_parameter_buf); - constexpr uint32_t ta_alloc = ta_alloc_ctrl::pt_opb::no_list - | ta_alloc_ctrl::tm_opb::no_list - | ta_alloc_ctrl::t_opb::no_list - | ta_alloc_ctrl::om_opb::no_list + constexpr uint32_t ta_alloc = ta_alloc_ctrl::pt_opb::_16x4byte + | ta_alloc_ctrl::tm_opb::no_list + | ta_alloc_ctrl::t_opb::no_list + | ta_alloc_ctrl::om_opb::no_list | ta_alloc_ctrl::o_opb::_16x4byte; constexpr struct opb_size opb_size = { .opaque = 16 * 4 - , .opaque_modifier = 0 - , .translucent = 0 - , .translucent_modifier = 0 - , .punch_through = 0 - }; + , .opaque_modifier = 0 + , .translucent = 0 + , .translucent_modifier = 0 + , .punch_through = 16 * 4 + }; constexpr uint32_t tiles = (640 / 32) * (320 / 32); holly.SOFTRESET = softreset::pipeline_soft_reset - | softreset::ta_soft_reset; + | softreset::ta_soft_reset; holly.SOFTRESET = 0; + holly.PT_ALPHA_REF = 0x1; core_init(); init_texture_memory(opb_size); @@ -225,28 +252,33 @@ void main() while (true) { ta_polygon_converter_init(opb_size.total() * tiles, ta_alloc, - 640, 480); + 640, 480); auto parameter = ta_parameter_writer(ta_parameter_buf); - transform(parameter, - font->texture_width, font->texture_height, - font->first_char_code, - glyphs, - ana, 17, - font->glyph_height * 0); + transform2(parameter, + font->texture_width, font->texture_height); + + parameter.append() = global_end_of_list(); transform(parameter, - font->texture_width, font->texture_height, - font->first_char_code, - glyphs, - cabal, 26, - font->glyph_height * 1); + font->texture_width, font->texture_height, + font->first_char_code, + glyphs, + ana, 17, + font->glyph_height * 0); + + transform(parameter, + font->texture_width, font->texture_height, + font->first_char_code, + glyphs, + cabal, 26, + font->glyph_height * 1); parameter.append() = global_end_of_list(); ta_polygon_converter_transfer(ta_parameter_buf, parameter.offset); - ta_wait_opaque_list(); + ta_wait_punch_through_list(); core_start_render(frame_ix, num_frames); diff --git a/holly/core.cpp b/holly/core.cpp index 9c06e1c..f7584fe 100644 --- a/holly/core.cpp +++ b/holly/core.cpp @@ -13,7 +13,8 @@ void core_init() { - holly.ISP_FEED_CFG = isp_feed_cfg::cache_size_for_translucency(0x200); + holly.ISP_FEED_CFG = isp_feed_cfg::cache_size_for_translucency(0x200) + | isp_feed_cfg::punch_through_chunk_size(0x200); holly.FPU_SHAD_SCALE = fpu_shad_scale::scale_factor_for_shadows(1); holly.FPU_CULL_VAL = _i(1.f); diff --git a/holly/ta_fifo_polygon_converter.cpp b/holly/ta_fifo_polygon_converter.cpp index eab3737..61c5ef7 100644 --- a/holly/ta_fifo_polygon_converter.cpp +++ b/holly/ta_fifo_polygon_converter.cpp @@ -114,3 +114,10 @@ void ta_wait_translucent_list() system.ISTNRM = ISTNRM__END_OF_TRANSFERRING_TRANSLUCENT_LIST; } + +void ta_wait_punch_through_list() +{ + while ((system.ISTNRM & ISTNRM__END_OF_TRANSFERRING_PUNCH_THROUGH_LIST) == 0); + + system.ISTNRM = ISTNRM__END_OF_TRANSFERRING_PUNCH_THROUGH_LIST; +} diff --git a/holly/ta_fifo_polygon_converter.hpp b/holly/ta_fifo_polygon_converter.hpp index 52bbd01..58a26e5 100644 --- a/holly/ta_fifo_polygon_converter.hpp +++ b/holly/ta_fifo_polygon_converter.hpp @@ -11,3 +11,4 @@ void ta_polygon_converter_cont(uint32_t ol_base_offset, void ta_polygon_converter_transfer(volatile uint32_t * buf, uint32_t size); void ta_wait_opaque_list(); void ta_wait_translucent_list(); +void ta_wait_punch_through_list(); diff --git a/palette.hpp b/palette.hpp new file mode 100644 index 0000000..5086296 --- /dev/null +++ b/palette.hpp @@ -0,0 +1,50 @@ +#pragma once + +constexpr inline uint16_t rgb565(uint8_t r, uint8_t g, uint8_t b) +{ + return ((r >> 3) << 11) | ((g >> 2) << 5) | ((b >> 3) << 0); +} + +constexpr inline uint16_t grey565(uint8_t i) +{ + return ((i >> 3) << 11) | ((i >> 2) << 5) | ((i >> 3) << 0); +} + +constexpr inline uint16_t argb4444(uint8_t i) +{ + return (i << 12) | (15 << 8) | (15 << 4) | (15 << 0); +} + +template +void palette_data(); + +template <> +void palette_data<255>() +{ + holly.PAL_RAM_CTRL = pal_ram_ctrl::pixel_format::rgb565; + + // ranging in intensity from rgb565(0, 0, 0) to rgb565(31, 63, 31) + for (int i = 0; i < 256; i += 1) { + holly.PALETTE_RAM[i] = grey565(i); + } +} + +template <> +void palette_data<16>() +{ + holly.PAL_RAM_CTRL = pal_ram_ctrl::pixel_format::argb4444; + + // ranging in intensity from rgb565(0, 0, 0) to rgb565(31, 63, 31) + for (uint32_t i = 0; i < 16; i++) { + holly.PALETTE_RAM[i] = argb4444(i); + } +} + +template <> +void palette_data<2>() +{ + holly.PAL_RAM_CTRL = pal_ram_ctrl::pixel_format::argb1555; + + holly.PALETTE_RAM[0] = 0x0000; + holly.PALETTE_RAM[1] = 0xffff; +}