From 2778dc4eda9907a6305243a5a70bd14ce20cd84d Mon Sep 17 00:00:00 2001 From: synzr Date: Wed, 15 Oct 2025 17:18:22 +0500 Subject: [PATCH] refactor(layers): layer data API usage --- package.json | 12 ++--- resources/clock_font_big.ttf | Bin 6927 -> 0 bytes resources/clock_font_small.ttf | Bin 4618 -> 0 bytes resources/font_koneko_toro.ttf | Bin 0 -> 4618 bytes resources/font_toro.ttf | Bin 0 -> 6927 bytes src/c/character_layer.c | 43 ++++++++++------- src/c/clock_layer.c | 83 ++++++++++++++++----------------- 7 files changed, 71 insertions(+), 67 deletions(-) delete mode 100644 resources/clock_font_big.ttf delete mode 100644 resources/clock_font_small.ttf create mode 100644 resources/font_koneko_toro.ttf create mode 100644 resources/font_toro.ttf diff --git a/package.json b/package.json index cd6272e..9080e69 100644 --- a/package.json +++ b/package.json @@ -38,14 +38,14 @@ "spaceOptimization": "memory" }, { "type": "font", - "name": "CLOCK_FONT_40", - "file": "clock_font_big.ttf", - "characterRange": "[0-9]" + "name": "FONT_TORO_38", + "file": "font_toro.ttf", + "characterRange": "[0-9:]" }, { "type": "font", - "name": "CLOCK_FONT_28", - "file": "clock_font_small.ttf", - "characterRange": "[0-9]" + "name": "FONT_KONEKO_TORO_28", + "file": "font_koneko_toro.ttf", + "characterRange": "[0-9/WTFSMedhuriaton]" }] } } diff --git a/resources/clock_font_big.ttf b/resources/clock_font_big.ttf deleted file mode 100644 index d40ff81a827e56f376424326d45386abf6a3bd65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6927 zcmeHL+iMh882`=eCdNymuo@*5oKnT25;t*8HniA_qVxj6MA9UPanVg8B)eg=LIfWM z=^xNXDL(YE4|(Wg3xd8DS}2HbLW{4ZZwfvX*Wb5u&SdxOoJ@8TFOi&O&iU@=H{W;8 z?971!U?+SekUls1)dg~tbbrjTV|esr|MhALzn5CfYj@w208Lz{$^W`Pa=Ui~^lF!T)ujPPA+Ph`) z+4LT)~P=JCD#Kx&*ezbq6N%ea9I@pXt^kjj<4*fTb@`_tz@k^#RyTF^=x4#MO#$bY0*10c}XS3=35J zU?hDCk{yL5v=51iFTU-?=kPETU`Pa$*COx&WP+~d5}dVs1I;M}N`lv3_7d?5VSLT8 zgFn%A%Dff1b)nLgO66JQY2{G>fzs95#zktF#d$*5tZDLBp#3)Co&dH}w(}=o*FQkl zU$VZikB-c9LRRZGuG-y5VLv{=A$)|RIF6Id{UAQUXE=)s_y)rmWwBpF6C6@=_L1XD zC1(lh^sUO{=CSFSDM6`GG>%k7>NiTxxvTMQ@mBPmat|@JZK;;F+*GSqQ^WQ0)?AzS zzJ5N%5OKMx-3Kk@&9-f1?$y@5nMb|mZFLCsF>ymXu9K+wt@#hE3ENofChuGHYqc}| zH7`%&=IS-P@lP#55S2Aum1e8fto>W7-bxjspLA>0zY}}zZU3K`Rk!XrE;rihHMcT0 zD`$*q9Gjm_&sRpeytB{9a5w18_|d!5%y;N#v5(VR>t*J#`Fuy$+l;GubKDfq$S}Jx zRnvC1-Kw9t=BWKlx#nM6^>j60*|lrc%a>mKo@@DSM4~tIA7<_ze)iP)H|YI({hIR~ zL?t{Uf6emptr?%c`tO_XHvU~fzxfH8)$*;^Ypd(LRX?JN#MN}Yf+)OAqi$NRN1NUz zkMq;|_vU-nRuOZD=@nzMkJG=g3a_`a^v6C&PF$op=m`k+F1kW4K}t^Aq$P0-Uj`&k zmAWyf=yuX~6rJLi#9eh(Jr*llv#Oa(X7dNl^x;iDeL33|%Ug zir)ERq3mUr21fETH|KJtI$0g#DT}duY4Jv};Pv&UMKAtzPxtko%A6h;%npU~Z-NZ4 dazUGBW@N=SwkTPn)s|!{16vu`%E0E#z$@INKdb-% diff --git a/resources/clock_font_small.ttf b/resources/clock_font_small.ttf deleted file mode 100644 index 4055d07ec39ddb80e69fe669da90395eb177c4dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4618 zcmeHKOKTHR6#gcYrmb!5qV<6f98qYg(56irTX5lvilPWriUm=Frmc`iNh3sXF_eNE z5trgpT)61Mt>D7F4+Q^#dqJdv;9~slYcw}blKP;Ez2VMz-Fwb=&OMpjzyZ(!A1;!| z&z(F$iJHwHNZZby8ydMVmHkN7IOQu>^O*&_b&gSfN%`?y?&j>nGq-mGu@#`bJfF>6 zn>pEcfwpIy>3J&ROU_;LtDO7i^X1A8GTeWkkI`K5Y6cit=KeC}@qDJTfSpLwzMZmH z$mFw!UOeamIz6s=vQS(s<2pu(?~Skvq;mF8zrNgk=o1j90=PBv{IaAM_kI!7@uj{E zF}YgqaS_lG6K3D>wO&YSbV*GYV=+31T&PU?8Kbj%XhA$Cje)Ny7p5Spqp?)&k;2T8 z(}Orn^b-n$tAdMM%4rQf3h)ZC1AZ5UcR6y?jT>R_WI&`+9#u)&y2fBI^($F!|OZ zGoB@_!A}PgcNFbta7K~HespjQB2m~?HF|R@wmsBG?61j6MWI_OJEJ$WvHh>epD-oj zunvB89sgkd?RCz-xwALeEzBkt`x|MWy~#by(VUsA2nCM1-#p*y0rC4-|Gm>(Ub?{< zUPXw=FUoH8rVe)AVZO?{iNbAGK5MtH!+V#Y70!q%HR^(2u7;@+fmC&i(YHqQMBQGX zGqvB!%IF!%_^+Z(XG2HU+nM*52EUmpuK0;zFx!1-`m@mqHM_21?xs>EcOx5W>uvel zx^?LDMpYtMiO*EauJ&)MPIOhaIO66gh68nd7kmtxL&+uAFO(c{4B)6@c{|>UoaPhc zmo(qQ`{{jp6T{(6bVc(q-s+xe-lhJz=Hu9cSDJ6(+xVU46Xf4(z6YD|S=@T#?bPfb zX2lbyvrF^D=?rL|IGy8~Cr+oJdE#`IHBX$*1Dr<@B~A~Md=^k9mqG<&m_inFxWODV zToJu4+TvM0rs=VSMgGeXkvt4z5XsQ9iLat3X&oVwQ6fp>AjUCqzE~=Hlf^>WOI60E zvU4|bnNpRmO7QfG>1=87da>XQ4kJRDdU^#w;r%x~q2l QNLRaRL$gtV|EdCC0f|t9?EnA( diff --git a/resources/font_koneko_toro.ttf b/resources/font_koneko_toro.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0c51d0c1b1597691e63c81275522ba1bb2f81da8 GIT binary patch literal 4618 zcmeHKO=w(I6h800`AL*ERcjIHVvr!NlGK7m=|Zt8l8Pk>wMwBK+DWD)GZQ8gsnEs4 zm8gp@6kN2ss^CJ3xDbCfRl$Xz3m2|L1Q&v!V8xZWe&0FwzMtugMG&Nr3peN7bMN`i zcg{U``YMr#+$yOgGIx0CsVA|5W%qrM6VEKo-hX^?Wd^2stWTZpG&ic98rJayY=hPH z7gsLLUieug`Aww$L%Y>H^ZfE-*Kqa|%m>;q)Lx1&L8ooH-5H#lml$gFCjM-!_f9uO znwQ~!9_vA;d2U1Qk$u>|3+qO=*=cS5di72a{01=}+~{o%?nQ|WeY~ihw zQ-}T#slXs|{^Xyps%+NRDC1P^69`QY^-07*Nw`Xr)Z4kTv0p9wWv^7#K+@$A1MC8J zE3szeQj<7%P`=_(<5G6w>bXac%*Z2PzZEzrDPv~G8xX0@2$I1$i+ZpP%LK%kRZPDW zxdollPvC%UzNYS%JiZqIWb-*vxB_{%?1AML*#*uI$rJLlEX%XflosxyCtHq%Jeb?A_yWH<4eIWn2*Qky5k%g}&}{cXh|77_lUq>X#p?-A|QzyVSi zl`}sNlbxk)h%dHy+8m1EdZ!yy{0cWWgchP?`9-XL%zi3m7nSP7oP2h`3w6>= zH8=II%aq)KY(@;Y!!KmVe;;z4b|7KD9DzB6&S#}d9(dZYpb$7=H60&2rT2CU){y+m zj2*j9*V}%dv9!|Mh0ZZXM)cI!^*mqT!b%UD0dE^P+C+gfYkecmo?EC>s1J}8KX7M^ zfKO?eLcvh(X_kXh@b$VaXPsXbknOZe>O`dUcF2$uH+Vmcq1A*8C!x^T}0WLGHwbd2KL*(LwT+^Uly!+Ds)%9EHT120;%E`bBPrSu}LDjJ75DGCn<&%)hTU}pVUJ!UeM z#}D@ne?@?|%77Tw0hvgpytsykwY0zEvG|5<9_qzt@GigffX|)KRT(~W7^;IIc*dY& zUvTu)8mNVTFm9LcO~F;*TiTCUc4w;u+O)S<s8oKdA)}3z!!kP5uu*1cs)jS z-|%_@`$ex;@H_a9*Q>C9%4plh5y72cKxt>);d3dL4YC z$7KOuoLzi*u0b~N9omyV<{~VsvL);ID(#OsGupE;4r**I4fLdyB2rt@UQVU@52#zk96J-#pvvHV(|p*)Bax!2fGH{x=7Ay~6)rjU3hs RBe!;pI~CZez|CEOzX3L#C_MlG literal 0 HcmV?d00001 diff --git a/resources/font_toro.ttf b/resources/font_toro.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d6b066da001dbfc9e91e9870dba7424c89c5625b GIT binary patch literal 6927 zcmeHLy=xRf6#wnsUAz#z1mhPddZ1#V#HgS_0~!=W37KsBM+bTfKdI`Vd~I+nKY@btlJYysvm?cs;koDEh5(nkman6Q z{LqyTT~BCx#eRI0iqu`Vnf!P5eWPPHr+0Z=3(h0T9mUdM9=Ji)z0F7GSbll}`*D@_ z9h9@<`LROsa?cFV$~m296Q#+UxQ=7Q*DZEID*g43+~Ztx=Nyov0=S*~ao?x;RI5-o z(5K1B2!Bih6|s1HczgzW3aVv%O$Gzl=4)JS2&wBfIuDRS(&e;3#S19;V|XiG0hZ7| zWUh2|x8V%3I2m9_1dGo{kfpO1bca+>vI|blSEXtSfs-H z`ogtWDwXe*FO~NJ3~HBdt2x)Am7I@+o@VU0pBlI)(uaUX>YAPc8$SaX?z@&**=yJ; zgI#&i1U7I7H=`BXu@if+7YA?AAMQzHPog_DvG0h}otwC{}na2-v3X`tXpf&7R|W&TC-!$ z%g;xu;?&%#Rvef1mO3NDYKZVN;~kE(RB@Euny&yYVXG?9)U#BLX*XqaT(tckI3vU8 zMr2L<*{U`2KcOYNYnDBot>`Q*{WY241kp9O>`LS0-cnU%R?8yU7{ADF#J%Qt2dD_o zsFt|0|GP8RcS0X7ugx!xL)oM5MTkAOO_uu@UwVh~Yh3Oq*^N+H} zu1Fo}xS5LUuh-F3jzKwX`;uF;86raRK3@SdwyOomS8|ZV3@8BdG zsY&CG;swt=#S5N?iWfXj6fbyQC|>ZqA&L^p?7b*p1XCy?Pg!d<%^LPg^e$tP_kbmg zBa0(wL%SZ;Un-Y+3nNp-d|6oOStVa8lqav3#UzX5!^6xaX& literal 0 HcmV?d00001 diff --git a/src/c/character_layer.c b/src/c/character_layer.c index 4ab0b18..501ef6b 100644 --- a/src/c/character_layer.c +++ b/src/c/character_layer.c @@ -3,18 +3,23 @@ #define CHARACTER_H 80 #define CHARACTER_STEP 4 +typedef struct CharacterLayerData { + int ticks; + GBitmap *even; + GBitmap *odd; +} CharacterLayerData; + static Layer *s_character_layer; -static GBitmap *s_character_even; -static GBitmap *s_character_odd; -static int s_character_ticks; static void character_layer_update_proc(Layer *layer, GContext *ctx) { + CharacterLayerData *layer_data = layer_get_data(s_character_layer); + // Get the character bitmap. GBitmap *bitmap; - if (s_character_ticks % 2 == 0) { - bitmap = s_character_even; + if (layer_data->ticks % 2 == 0) { + bitmap = layer_data->even; } else { - bitmap = s_character_odd; + bitmap = layer_data->odd; } // Get the position of character bitmap and align it to bottom. @@ -23,7 +28,7 @@ static void character_layer_update_proc(Layer *layer, GContext *ctx) { grect_align(&frame, &frame_inside, GAlignBottom, true); // Move the character. - switch (s_character_ticks) { + switch (layer_data->ticks) { case 1: frame.origin.x += CHARACTER_STEP; // to right break; @@ -38,30 +43,32 @@ static void character_layer_update_proc(Layer *layer, GContext *ctx) { } void character_layer_init(Window *window) { - s_character_ticks = 0; - - s_character_even = gbitmap_create_with_resource(RESOURCE_ID_CHARACTER_EVEN); - s_character_odd = gbitmap_create_with_resource(RESOURCE_ID_CHARACTER_ODD); - Layer *window_root_layer = window_get_root_layer(window); GRect window_bounds = layer_get_unobstructed_bounds(window_root_layer); s_character_layer = - layer_create(GRect(0, window_bounds.size.h - CHARACTER_H, window_bounds.size.w, CHARACTER_H)); - layer_set_update_proc(s_character_layer, character_layer_update_proc); + layer_create_with_data(GRect(0, window_bounds.size.h - CHARACTER_H, window_bounds.size.w, CHARACTER_H), sizeof(CharacterLayerData)); + CharacterLayerData *layer_data = layer_get_data(s_character_layer); + layer_data->even = gbitmap_create_with_resource(RESOURCE_ID_CHARACTER_EVEN); + layer_data->odd = gbitmap_create_with_resource(RESOURCE_ID_CHARACTER_ODD); + layer_data->ticks = 0; + + layer_set_update_proc(s_character_layer, character_layer_update_proc); layer_add_child(window_root_layer, s_character_layer); } void character_layer_tick(void) { - if (++s_character_ticks == 4) { - s_character_ticks = 0; + CharacterLayerData *layer_data = layer_get_data(s_character_layer); + if (++layer_data->ticks == 4) { + layer_data->ticks = 0; } layer_mark_dirty(s_character_layer); } void character_layer_deinit(void) { + CharacterLayerData *layer_data = layer_get_data(s_character_layer); + gbitmap_destroy(layer_data->even); + gbitmap_destroy(layer_data->odd); layer_destroy(s_character_layer); - gbitmap_destroy(s_character_even); - gbitmap_destroy(s_character_odd); } diff --git a/src/c/clock_layer.c b/src/c/clock_layer.c index 576ffde..804f73e 100644 --- a/src/c/clock_layer.c +++ b/src/c/clock_layer.c @@ -1,14 +1,19 @@ #include "clock_layer.h" -#define CLOCK_COMMON_SPACE 2 -#define CLOCK_BETWEEN_HM_SPACE 8 +#define CLOCK_H 40 +#define CLOCK_SPACE 2 +#define CLOCK_OFFSET 4 + +typedef struct ClockLayerData { + GFont font_big; + GFont font_small; +} ClockLayerData; -static GFont s_clock_font_big; -static GFont s_clock_font_small; static Layer *s_clock_layer; -static char s_clock_measure_buffer[4]; static void clock_layer_update_proc(Layer *layer, GContext *ctx) { + ClockLayerData *layer_data = layer_get_data(s_clock_layer); + // Fill a whole layer with the black color. GRect layer_bounds = layer_get_unobstructed_bounds(layer); layer_bounds.origin = GPoint(0, 0); @@ -19,55 +24,46 @@ static void clock_layer_update_proc(Layer *layer, GContext *ctx) { time_t tmp = time(NULL); struct tm *time = localtime(&tmp); - // Drawing the measures. + // Drawing the time and seconds. + static char time_text[6], seconds_text[3] = "00\0"; graphics_context_set_text_color(ctx, GColorWhite); - GSize big_text_size = graphics_text_layout_get_content_size( - "00", s_clock_font_big, layer_bounds, GTextOverflowModeFill, GTextAlignmentLeft); - GSize small_text_size = graphics_text_layout_get_content_size( - "00", s_clock_font_small, layer_bounds, GTextOverflowModeFill, GTextAlignmentLeft); + strftime(time_text, sizeof(time_text), clock_is_24h_style() ? "%H:%M" : "%I:%M", time); + GSize time_text_size = graphics_text_layout_get_content_size( + time_text, layer_data->font_big, layer_bounds, GTextOverflowModeFill, GTextAlignmentLeft); - int clock_w = - (big_text_size.w * 2) + small_text_size.w + CLOCK_COMMON_SPACE + CLOCK_BETWEEN_HM_SPACE; - int clock_w_pad = (layer_bounds.size.w - clock_w) / 2; + seconds_text[0] = seconds_text[1] = '0'; + GSize seconds_text_size = graphics_text_layout_get_content_size( + seconds_text, layer_data->font_small, layer_bounds, GTextOverflowModeFill, GTextAlignmentLeft); + strftime(seconds_text, sizeof(seconds_text), "%S", time); - strftime(s_clock_measure_buffer, sizeof(s_clock_measure_buffer), - clock_is_24h_style() ? "%H" : "%I", time); - graphics_draw_text(ctx, s_clock_measure_buffer, s_clock_font_big, - GRect(clock_w_pad, 1, big_text_size.w, big_text_size.h), - GTextOverflowModeFill, GTextAlignmentLeft, NULL); + GRect timestamp_rect = + GRect(0, 0, time_text_size.w + seconds_text_size.w + CLOCK_SPACE, time_text_size.h); + grect_align(×tamp_rect, &layer_bounds, GAlignCenter, true); + timestamp_rect.origin.y -= CLOCK_OFFSET; - strftime(s_clock_measure_buffer, sizeof(s_clock_measure_buffer), "%M", time); - graphics_draw_text(ctx, s_clock_measure_buffer, s_clock_font_big, - GRect(clock_w_pad + big_text_size.w + CLOCK_BETWEEN_HM_SPACE, 1, - big_text_size.w, big_text_size.h), - GTextOverflowModeFill, GTextAlignmentLeft, NULL); + GRect time_rect = + GRect(timestamp_rect.origin.x, timestamp_rect.origin.y, time_text_size.w, time_text_size.h); + graphics_draw_text(ctx, time_text, layer_data->font_big, time_rect, GTextOverflowModeFill, + GTextAlignmentLeft, NULL); - strftime(s_clock_measure_buffer, sizeof(s_clock_measure_buffer), "%S", time); - graphics_draw_text( - ctx, s_clock_measure_buffer, s_clock_font_small, - GRect(clock_w_pad + (big_text_size.w * 2) + CLOCK_BETWEEN_HM_SPACE + CLOCK_COMMON_SPACE, - small_text_size.h - 13, small_text_size.w, small_text_size.h), - GTextOverflowModeFill, GTextAlignmentLeft, NULL); - - // Draw the colon between hours and minutes; - graphics_context_set_fill_color(ctx, GColorWhite); - - int colon_x = clock_w_pad + big_text_size.w - 2; - graphics_fill_rect(ctx, GRect(colon_x, (big_text_size.h / 4) + 3, 6, 6), 0, GCornerNone); - graphics_fill_rect(ctx, GRect(colon_x, (big_text_size.h / 4) + (big_text_size.h / 2) - 3, 6, 6), - 0, GCornerNone); + GRect seconds_rect = GRect(0, 0, seconds_text_size.w, seconds_text_size.h); + grect_align(&seconds_rect, ×tamp_rect, GAlignBottomRight, true); + graphics_draw_text(ctx, seconds_text, layer_data->font_small, seconds_rect, GTextOverflowModeFill, + GTextAlignmentLeft, NULL); } void clock_layer_init(Window *window, GPoint position) { - s_clock_font_big = fonts_load_custom_font(resource_get_handle(RESOURCE_ID_CLOCK_FONT_40)); - s_clock_font_small = fonts_load_custom_font(resource_get_handle(RESOURCE_ID_CLOCK_FONT_28)); - Layer *window_root_layer = window_get_root_layer(window); GRect window_bounds = layer_get_unobstructed_bounds(window_root_layer); s_clock_layer = - layer_create(GRect(position.x, position.y, window_bounds.size.w - position.x, 40)); + layer_create_with_data(GRect(position.x, position.y, window_bounds.size.w - position.x, CLOCK_H), sizeof(ClockLayerData)); + + ClockLayerData *layer_data = layer_get_data(s_clock_layer); + layer_data->font_big = fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_TORO_38)); + layer_data->font_small = fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_KONEKO_TORO_28)); + layer_set_update_proc(s_clock_layer, clock_layer_update_proc); layer_add_child(window_root_layer, s_clock_layer); } @@ -77,7 +73,8 @@ void clock_layer_tick(void) { } void clock_layer_deinit(void) { + ClockLayerData *layer_data = layer_get_data(s_clock_layer); + fonts_unload_custom_font(layer_data->font_big); + fonts_unload_custom_font(layer_data->font_small); layer_destroy(s_clock_layer); - fonts_unload_custom_font(s_clock_font_big); - fonts_unload_custom_font(s_clock_font_small); }