From ee6ef15e677fd3168b4a0d221175fbf0ecd96ff5 Mon Sep 17 00:00:00 2001 From: Doug Zongker Date: Tue, 11 Mar 2014 08:42:09 -0700 Subject: [PATCH] remove pixelflinger from healthd The minui library has changed to no longer use libpixelflinger. It also offers a more efficient way of storing and loading frames of animation; use it to represent the battery-full state images. Also removes the unused battery_charge.png image. Bug: 12131110 Change-Id: I6cc8b19f36a806c99cda30cc47b5968daf6b333b --- healthd/Android.mk | 2 +- healthd/healthd_mode_charger.cpp | 42 ++++++++++++++---------------- healthd/images/battery_0.png | Bin 1295 -> 0 bytes healthd/images/battery_1.png | Bin 1290 -> 0 bytes healthd/images/battery_2.png | Bin 1289 -> 0 bytes healthd/images/battery_3.png | Bin 1291 -> 0 bytes healthd/images/battery_4.png | Bin 1288 -> 0 bytes healthd/images/battery_5.png | Bin 1267 -> 0 bytes healthd/images/battery_charge.png | Bin 2475 -> 0 bytes healthd/images/battery_fail.png | Bin 1805 -> 1368 bytes healthd/images/battery_scale.png | Bin 0 -> 463 bytes 11 files changed, 21 insertions(+), 23 deletions(-) delete mode 100644 healthd/images/battery_0.png delete mode 100644 healthd/images/battery_1.png delete mode 100644 healthd/images/battery_2.png delete mode 100644 healthd/images/battery_3.png delete mode 100644 healthd/images/battery_4.png delete mode 100644 healthd/images/battery_5.png delete mode 100644 healthd/images/battery_charge.png create mode 100644 healthd/images/battery_scale.png diff --git a/healthd/Android.mk b/healthd/Android.mk index 5cd5ce186..715c2ed79 100644 --- a/healthd/Android.mk +++ b/healthd/Android.mk @@ -36,7 +36,7 @@ endif LOCAL_C_INCLUDES := bootable/recovery -LOCAL_STATIC_LIBRARIES := libbatteryservice libbinder libminui libpixelflinger_static libpng libz libutils libstdc++ libcutils liblog libm libc +LOCAL_STATIC_LIBRARIES := libbatteryservice libbinder libminui libpng libz libutils libstdc++ libcutils liblog libm libc ifeq ($(strip $(BOARD_CHARGER_ENABLE_SUSPEND)),true) LOCAL_STATIC_LIBRARIES += libsuspend diff --git a/healthd/healthd_mode_charger.cpp b/healthd/healthd_mode_charger.cpp index 33a179bf8..fc3ac67c4 100644 --- a/healthd/healthd_mode_charger.cpp +++ b/healthd/healthd_mode_charger.cpp @@ -81,7 +81,6 @@ struct key_state { }; struct frame { - const char *name; int disp_time; int min_capacity; bool level_only; @@ -119,42 +118,36 @@ struct charger { static struct frame batt_anim_frames[] = { { - .name = "charger/battery_0", .disp_time = 750, .min_capacity = 0, .level_only = false, .surface = NULL, }, { - .name = "charger/battery_1", .disp_time = 750, .min_capacity = 20, .level_only = false, .surface = NULL, }, { - .name = "charger/battery_2", .disp_time = 750, .min_capacity = 40, .level_only = false, .surface = NULL, }, { - .name = "charger/battery_3", .disp_time = 750, .min_capacity = 60, .level_only = false, .surface = NULL, }, { - .name = "charger/battery_4", .disp_time = 750, .min_capacity = 80, .level_only = true, .surface = NULL, }, { - .name = "charger/battery_5", .disp_time = 750, .min_capacity = BATTERY_FULL_THRESH, .level_only = false, @@ -188,8 +181,8 @@ static int64_t curr_time_ms(void) static void clear_screen(void) { gr_color(0, 0, 0, 255); - gr_fill(0, 0, gr_fb_width(), gr_fb_height()); -}; + gr_clear(); +} #define MAX_KLOG_WRITE_BUF_SZ 256 @@ -317,8 +310,8 @@ static void draw_battery(struct charger *charger) if (batt_anim->num_frames != 0) { draw_surface_centered(charger, frame->surface); - LOGV("drawing frame #%d name=%s min_cap=%d time=%d\n", - batt_anim->cur_frame, frame->name, frame->min_capacity, + LOGV("drawing frame #%d min_cap=%d time=%d\n", + batt_anim->cur_frame, frame->min_capacity, frame->disp_time); } } @@ -655,22 +648,27 @@ void healthd_mode_charger_init(struct healthd_config *config) ret = res_create_surface("charger/battery_fail", &charger->surf_unknown); if (ret < 0) { - LOGE("Cannot load image\n"); + LOGE("Cannot load battery_fail image\n"); charger->surf_unknown = NULL; } charger->batt_anim = &battery_animation; - for (i = 0; i < charger->batt_anim->num_frames; i++) { - struct frame *frame = &charger->batt_anim->frames[i]; - - ret = res_create_surface(frame->name, &frame->surface); - if (ret < 0) { - LOGE("Cannot load image %s\n", frame->name); - /* TODO: free the already allocated surfaces... */ - charger->batt_anim->num_frames = 0; - charger->batt_anim->num_cycles = 1; - break; + gr_surface* scale_frames; + int scale_count; + ret = res_create_multi_surface("charger/battery_scale", &scale_count, &scale_frames); + if (ret < 0) { + LOGE("Cannot load battery_scale image\n"); + charger->batt_anim->num_frames = 0; + charger->batt_anim->num_cycles = 1; + } else if (scale_count != charger->batt_anim->num_frames) { + LOGE("battery_scale image has unexpected frame count (%d, expected %d)\n", + scale_count, charger->batt_anim->num_frames); + charger->batt_anim->num_frames = 0; + charger->batt_anim->num_cycles = 1; + } else { + for (i = 0; i < charger->batt_anim->num_frames; i++) { + charger->batt_anim->frames[i].surface = scale_frames[i]; } } diff --git a/healthd/images/battery_0.png b/healthd/images/battery_0.png deleted file mode 100644 index 2347074b2afa90258cc394af4f8a48c5b577c755..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1295 zcmcIkKWNlY7*DHKtsE$*UOq17MX!FP9)l0jz zPJ)9jij&nz5IZ^PpsV0e5ky?v6hv@zQv6=-u68IL1Oxf<{``L5_xry0z1*6byqFmr z8e|wIQ=2dv@J---aikyYw~@0de9jPamP`i=q-{l*(VSo&vo+6J#0_jYtJmM)QHD9N z;5KK;Z2huo2VTyim|Wt8z-E}yu_UzYB}~|Pyy*I6?#Ihl9P2t|Zbqu3dZ^=;JFynw z>9xtGy|!d44mWmz9Zghl;9+91iMQ;>YEtG>zbcIBGS9Ioge;Z0j;PuC6srdjW~Cg; z+Ng-wqL35v1zDEQvmz1@k3?P&vx2PVMHL~o`*08~au(EvQSHWpS($4Q5~@7kZntyo zd@hIO&N>fXK$HKCzOl9}o9D7&x{gHzaQ0v(%$CAFPlv2TD6BcwxQ1Pz6CNsCG-8|je z?#~Q8zj5-a*;i<-4`k*Zj$b@@|9<(&28;nP0J}iR45hnZDIVQ>&plFi>jHE J##ZIp#vef`mCXPE diff --git a/healthd/images/battery_1.png b/healthd/images/battery_1.png deleted file mode 100644 index cd34620efabbf29a097ac19bd232291063b8683e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1290 zcmcgsO=#0l9M7f`oetbV!3i^F;0M^|B~6)0 zfd>y>ybQs^{J3r>MNs@0qM#s*9d_{G!J{a{ivvB(m#&>Vj3FKjm*4rI8?rrcAez!@ZCHr@QNM`{h`xh`U25)sOn@0xGL6BqZG)gk;84hhPq>`q-6s zu$>@w6pVa7>d&4LHQNlU0VeF54rUWXdx!6++Au`qARIER1hw+)B}E!~g1QjRf~+IM zqR~C>!oKmIyf!|p2|Cqrnr!z)EMP*UlD;`&d7_`7D!L*b2g@`?Rv>6NL9IL0pY0`O z+l6E_3_==+0W!vfnFz=8{3((J44?r^Gi-?A#Rw|`Kvq8rTXXe-m{ZbKTX>eBiU>I( zO_$5%a5)mT-65J01R>C1*$_sAyfF)@e#r9LY6=SUG}myDVOwONs1DjCl%TMu>mis< zHoGBgdDTSWl+nKG&`cQ6rWwRlL3=0%|G2Rw+RKkQkj_ERF1Z>$k3w6GjB~fWp#X@z z5zo2?J`{CCv9*#3EtF9b6y6EzhAsj*CGdPQ6=PU77H1fN0fLZ9MWX=3WiFnsX>7%n z(@K=*;#>*{62ss&niAr&5J|=*j!O!1jhnGNq*@xR*)_1;DmSt%SCn0-BHPW|_DHP) zdW$x)y`t@qa$l6ps+wU1^Wb>aqg9}5j6yx_+9p}auV`#xA4KDTVR#PkEC}M3_@pGn zW3q(3kMTgDs$BhFazBf zrRg-$@~CrqS7>pzp@l1cJJGeX;c#VR`RDuBM{h@FWnmuyTi+BY1+a$Al9T_1a&6#FSM$P~^xxZGyFV~dN6g&VkFLL1{T{qdnN*K5 IpS(2n8&m_I_W%F@ diff --git a/healthd/images/battery_2.png b/healthd/images/battery_2.png deleted file mode 100644 index 3e4095e8fd8435d6ddf86cc696897fc7b99f3e96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1289 zcmcIkOK8+U7>@OUR#q*DXb&<((2Kj7q`R9<=vuQ$)~>p>ZdYupqG>YihHV}uQ#UON zK2AO^3W7I_cv2JuMbLwK^dbv_U`6oYK}GCI^d!z~cWZ?rC>Y4h{FCqd{>S{2^Zk9h zV(p#n48z0sZNmB>9`HtS%?J>qSl$Q%1;-deC1hBW$DgBa zhFLmlmk04+aj$H8PQsv=MCAB{%`n|Pk#Cq)guw_Jv)wE^`}he9Y%9wiOci0#S5d|8 zoeI#vRA1Sgs+y9;_Ur)NkxT>}gbffm<8CNNS+=1olQrGuSkQprYL=Y~YOvT3R4+gv zm4I;*rXfi43BD^SisE)4Kpt{X;CLa2!7xjtf~J(Cna^+U zt$GU9>-%FLCpx|z-Lvicrg!3*>6@8{_dC|CJyd;txazzZ`f+6T)SU-kFWmmnJFT4C zP^nLMoL&*HPb;gFl`|`1!`p6kD9>(Ct1kE7ymoT@(&Yp3nU_n32|CYo-rsqSqL+74 z^a5IgUvG<17!hrYQ6yDg{&$pD7r&f*|7Pgo|Iq#|oU2pIHZqfI`TF+jSJu&=Q$g?3 J?&gl2{RyH~os<9o diff --git a/healthd/images/battery_3.png b/healthd/images/battery_3.png deleted file mode 100644 index 08c155125de2f5585717f7532f71cf091daad71e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1291 zcmb_cO>5LZ7)~qJQd>}jN{f^bv6s4=Nt)ekV%K&zN$sjz+ua3=A849Po6zRNWa_5% zqSlLo2lb?gcoICQ7d@y*y^5E5P^5xCK#PikCUAJs!CA_g+^&g6NX_ha74`H|s0 zZ7rQG6h*b=hSUO{Bm6#UZp7oe?k*Wm9Y`BPMQ;L?^#D>C(;J6$&e11f0qW-LiD$5n zqSj5=r7<*?-!B`U6W0kQ9yvZ{Q&eAnbGIRxkrqWC`sImMAt#|>X z6LAnTKoZbNF3$A|qA2d9dB6b{@GQs2I8pB9WdP{f!(eZLIUyI+!J03;N;4KhzRa@a zayee^jeEf)%Sn<%GtH z0vjKSKCODjj00ViQ_~Fo5;tvA28t$$VpdCXJfBQ)oWuc1(zHYZfRrMn2J0HDag{+e zr2=$#zgr*2&=S|l; zV8rr}7h0ZAE5!tz*A3exYjQl*Y*iT8C!skQcn)2uuWYa4A0$$M<3s_7JRo^z#B4@N zC6x@0J}Cl;sd3GJsTqrdVM%lR(Jb{X+=0YgX??s{xjfLtHzvSW<9koXEsAQ`l~XgN zXleNk*YcEZ9T<&$nEP40w&nHh;?cdM+ukmm{?vSV$Bx+DS4*c3Y}mT_&V!ftj^qwE zwsqbgm~XmB3D%jWwnH~F8wG1|X|&520WWT@?-Z;%_x876y8iIT@{{LRtz#PqsaTkDvVoi&mS+ diff --git a/healthd/images/battery_4.png b/healthd/images/battery_4.png deleted file mode 100644 index 3a678da09f2c2357845be6077c5a8cccc366b265..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1288 zcmd5+O-K|`93KtEETJfbJj5`Dm)e~-vmf)3o6gSc>O!lsF0^!r#+kS7pfhipdAg%` zQBQX1CPW>iTZg2BR1{(KafmK@2*g9TAS&>Z5Y(YJ>#lha51ksA_xbz%{vYrE-qOg> zKu3F5J4I0)xk0T!`hfh;+nP!HwdcG{x^p;F!lS5+tGWj%#YAI}&e{4nEI{3yx%D3Q zQq-}sRV?9B{;F&sJF176Xkfd9O;NplfvX!65YuCD+;URP&Wm-1w#*cBEs+O#SA`X8 zaMpvPvqME=cEXTMrtb>f8^}b!hFGTqd(!dcAjQ;lWik$zS%$7b@I;E)bE=ddp;hET zIuQjC10(^RV7De7T%Snx!6Ju9V+T$XbPto;^|%pwwurI z3p;*2Q6yz-pt~#=1*~m{an;a1F2KKT9E$dfGcIHc&_`3ALC&Mx-5`_P9c?HC5^v;T z&mxDSPin}RvY~@>T8be%QPVPIpk^dNNN189&nHEWlQkzCRK%a zpA>+^)Vb!r9hV&dr#LI*?hG7@t%5N;lrENr}vkh$o(hcm5sI=mv`o3clWUU zA!((h1|~`^UGd6%O_CtzTSL{5(tJ?<|Dk+YpK1rx+aIT}JBV(FZ&NNaq^+iJF8l#2 C&z`CP diff --git a/healthd/images/battery_5.png b/healthd/images/battery_5.png deleted file mode 100644 index d8dc40e8766812587fa10bae814976e5a112adc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1267 zcmd5+O>5LZ7*1;|Qr(LO!6GGOK|Hw0Om?%`#I9{N$=U_CmhD29UNlW+yP-`cCQ~A{nM%)B#sp6C6Tck*Cv_DX7O ze2ih3RAt7f(K)8?ixb0i{C0jqrPEnrHpo0~lC~8hMsx5IVk@4tjB3bo)^EN>lMHjL z>DC*hQN60#*yF7P!^d7g*$gu|6$h5Rf(W~WmR-Nd{oH%Wv943(7Njbu20CiFGaDhA z-SL;;E!D63gf1%T~89Q77DO|@o}`@ZO^$h8OwR6%IB+k89A z<8WDkilQVMqL`tGOtkJ3E6(^)dZ1vS$PV3rxY%bCMQaJKks?PU?WN!a)#|>mAN31G zOD4otAV3}no|oj+MMtED{)TZVI;yV+NT{I*uZ1=}k7jy6rnNiTQ39mVsMkW59*VVU zV0+C&KB*W*j(*`C*HM9PDzaQM^H3D?1qc-g6vZ?p34ns0E0hNshjI0?QIhhYYyw4t zkdBh66m%t9DrmV}Nzn(~iXRcnx6#0_Oa1n_=8;@g50OQ1SjTvE&;fHTOmNh~0jtkT zY}K+|KUpWo)63RCp?eEC|Y+_(;E}gtMTQl^pRnP(iKCi$M3#(wA3qbig`*# zPXE3zKk{~yS^V)S9Xwn($7lC0-G2XJZ)f)Uc-_ww7j6i`&}PnO0{wHNNZb zHt!Gj%;{urdvtua2OJ&GweEHqClezfQG=2Wu>WJqo97F6h8Q^U>+{aDO*Z)rRm@rA IN$JMDKgU>+O#lD@ diff --git a/healthd/images/battery_charge.png b/healthd/images/battery_charge.png deleted file mode 100644 index b501933a08e9c56a2a6bc89a6261f3da301caaea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2475 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 diff --git a/healthd/images/battery_scale.png b/healthd/images/battery_scale.png new file mode 100644 index 0000000000000000000000000000000000000000..2ae8f0fd7e501b439dfdda2486e87b5b6ba54d4d GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^6$}h4F)YkL)?y2fOF)W0z$e5NNdE_cGeBT$Z2VW? zhXYWEqr^3$#H}bXH?^3-EdIluXABIC>7Fi*Ar*{ouWjUPFc5LQ$ibIjR>1Oo{yDpZ zkD(PUbHblHSzOJ3yzSqP;+p8r{wSS&VJwS%r6qE2CEePR$&A8`zGMI9c!Z8v_tB({ zJN8ED+GWr@W0<{uUMo>-b#d#tU^Fmzy85}Sb4q9e0C{iTuK)l5 literal 0 HcmV?d00001