From cd64a7531b34268ca743cddb811ffdd661519e2e Mon Sep 17 00:00:00 2001 From: Firefly Date: Mon, 31 Aug 2015 10:42:47 +0800 Subject: [PATCH] [system/core] healthd: charger: use images to display current capacity text Add images to make up the value of capacity to make the size of text bigger. Also adds support display capacity text on four direction: - if the resolution of charging animation image is horizontal, the capacity text display on the top of charging animation image, but on the bottom if CHARGER_CAPACITY_TEXT_ROTATE_180 is selected; - and if the resolution of charging animation image is vertical, the capacity text display on the right of charing animation image, but on the left if CHARGER_CAPACITY_TEXT_ROTATE_180 is selected. Signed-off-by: Firefly --- system/core/healthd/healthd_mode_charger.cpp | 223 +++++++++++++++++- .../healthd/images/capacity_text_bottom.png | Bin 0 -> 5348 bytes .../healthd/images/capacity_text_left.png | Bin 0 -> 5236 bytes .../healthd/images/capacity_text_right.png | Bin 0 -> 5166 bytes .../core/healthd/images/capacity_text_top.png | Bin 0 -> 5326 bytes 5 files changed, 218 insertions(+), 5 deletions(-) create mode 100644 system/core/healthd/images/capacity_text_bottom.png create mode 100644 system/core/healthd/images/capacity_text_left.png create mode 100644 system/core/healthd/images/capacity_text_right.png create mode 100644 system/core/healthd/images/capacity_text_top.png diff --git a/system/core/healthd/healthd_mode_charger.cpp b/system/core/healthd/healthd_mode_charger.cpp index 33d83f80ff..6b584dc2d2 100644 --- a/system/core/healthd/healthd_mode_charger.cpp +++ b/system/core/healthd/healthd_mode_charger.cpp @@ -77,6 +77,13 @@ char *locale; #define LOGW(x...) do { KLOG_WARNING("charger", x); } while (0) #define LOGV(x...) do { KLOG_DEBUG("charger", x); } while (0) +/* if w0 < w1, return a negative number */ +#define GET_CENTER_POS(w0, w1) (((w0) - (w1)) / 2) + +#ifndef CHARGER_CAPACITY_TEXT +#define CHARGER_CAPACITY_TEXT /* remove it if not want to display capacity */ +#endif + struct key_state { bool pending; bool down; @@ -92,6 +99,16 @@ struct frame { gr_surface surface; }; +struct capacity_text { + const char *name; + int text_count; + int width; + int height; + int cheight; + + gr_surface surface; +}; + struct animation { bool run; @@ -174,6 +191,41 @@ static struct animation battery_animation = { .capacity = 0, }; +static struct capacity_text batt_cap_text[] = { + { + .name = "charger/capacity_text_top", + .text_count = 11, + .width = 18, /* width and height will be update after load resource */ + .height = 352, + .cheight = 32, + .surface = NULL, + }, + { + .name = "charger/capacity_text_bottom", + .text_count = 11, + .width = 18, /* width and height will be update after load resource */ + .height = 352, + .cheight = 32, + .surface = NULL, + }, + { + .name = "charger/capacity_text_right", + .text_count = 11, + .width = 32, /* width and height will be update after load resource */ + .height = 198, + .cheight = 18, + .surface = NULL, + }, + { + .name = "charger/capacity_text_left", + .text_count = 11, + .width = 32, /* width and height will be update after load resource */ + .height = 198, + .cheight = 18, + .surface = NULL, + }, +}; + static struct charger charger_state; static struct healthd_config *healthd_config; static struct android::BatteryProperties *batt_prop; @@ -261,6 +313,11 @@ static int request_suspend(bool /*enable*/) } #endif +static bool outside(int x, int y) +{ + return x < 0 || x >= gr_fb_width() || y < 0 || y >= gr_fb_height(); +} + static int draw_text(const char *str, int x, int y) { int str_len_px = gr_measure(str); @@ -279,7 +336,12 @@ static void android_green(void) gr_color(0xa4, 0xc6, 0x39, 255); } -static int draw_charger_capacity(struct charger *charger, int x, int y, int w) +#ifdef CHARGER_CAPACITY_TEXT + +#ifdef CHARGER_CAPACITY_TEXT_USE_FONT +#define SPACING 10 +static int draw_charger_capacity(struct charger *charger, + int x, int y, int w, int h) { int clen; int font_w; @@ -288,13 +350,142 @@ static int draw_charger_capacity(struct charger *charger, int x, int y, int w) clen = snprintf(str, sizeof(str) - 1, "%d%%", batt_anim->capacity); font_w = clen * gr_get_font_cwidth(); - if (font_w < w) - x += (w - font_w) / 2; + x += GET_CENTER_POS(w, font_w); gr_color(255, 255, 255, 255); LOGV("drawing capacity %s xpos=%d ypos=%d\n", str, x, y); - return draw_text(str, x, y) + 10; + return draw_text(str, x, y) + SPACING; } +#else /* default use images */ +#define SPACING 20 +static int draw_charger_capacity(struct charger *charger, + int x, int y, int w, int h) +{ + int c_w; + int c_h; + int c_x; + int c_y; + int clen; + int i; + int index[4] = {0}; + struct animation *batt_anim = charger->batt_anim; + int capacity = batt_anim->capacity; + struct capacity_text *cap_text; + + if (capacity == 100) { + index[0] = 1; + index[1] = 0; + index[2] = 0; + index[3] = 10; /* '%' */ + clen = 4; + } else if (capacity > 9) { + index[0] = capacity / 10; + index[1] = capacity % 10; + index[2] = 10; + clen = 3; + } else { + index[0] = capacity % 10; + index[1] = 10; + clen = 2; + } + + if (w <= h) { +#ifdef CHARGER_CAPACITY_TEXT_ROTATE_180 /* on the bottom */ + cap_text = &batt_cap_text[1]; + if (!cap_text->surface) + return y; + + c_w = cap_text->width; + c_h = cap_text->cheight; + c_x = x + GET_CENTER_POS(w, c_w * clen); + c_y = GET_CENTER_POS(gr_fb_height(), h + c_h + SPACING) + h + SPACING; + + if (outside(c_x, c_y) || outside(c_x + c_w * clen, c_y + c_h)) { + LOGE("drawing outside %dx%d+%d+%d\n", c_x, c_y, c_w * clen, c_h); + return y; + } + + for (i = clen - 1; i >= 0; i--) { + LOGV("drawing text %d,%dx%d+%d+%d\n", index[i], c_w, c_h, c_x, c_y); + gr_blit(cap_text->surface, 0, c_h * index[i], c_w, c_h, c_x, c_y); + c_x += c_w; + } + + return c_y - h - SPACING; +#else /* default on the top */ + cap_text = &batt_cap_text[0]; + if (!cap_text->surface) + return y; + + c_w = cap_text->width; + c_h = cap_text->cheight; + c_x = x + GET_CENTER_POS(w, c_w * clen); + c_y = GET_CENTER_POS(gr_fb_height(), h + c_h + SPACING); + + if (outside(c_x, c_y) || outside(c_x + c_w * clen, c_y + c_h)) { + LOGE("drawing outside %dx%d+%d+%d\n", c_x, c_y, c_w * clen, c_h); + return y; + } + + for (i = 0; i < clen; i++) { + LOGV("drawing text %d,%dx%d+%d+%d\n", index[i], c_w, c_h, c_x, c_y); + gr_blit(cap_text->surface, 0, c_h * index[i], c_w, c_h, c_x, c_y); + c_x += c_w; + } + + return c_y + c_h + SPACING; +#endif + } else { +#ifdef CHARGER_CAPACITY_TEXT_ROTATE_180 /* on the left */ + cap_text = &batt_cap_text[3]; + if (!cap_text->surface) + return x; + + c_w = cap_text->width; + c_h = cap_text->cheight; + c_x = GET_CENTER_POS(gr_fb_width(), w + c_w + SPACING); + c_y = y + GET_CENTER_POS(h, c_h * clen); + + if (outside(c_x, c_y) || outside(c_x + c_w, c_y + c_h * clen)) { + LOGE("drawing outside %dx%d+%d+%d\n", c_x, c_y, c_w, c_h * clen); + return x; + } + + for (i = clen - 1; i >= 0; i--) { + LOGV("drawing text %d,%dx%d+%d+%d\n", index[i], c_w, c_h, c_x, c_y); + gr_blit(cap_text->surface, 0, c_h * index[i], c_w, c_h, c_x, c_y); + c_y += c_h; + } + + return c_x + c_w + SPACING; +#else /* the capacity text display on the right of charging icon by default */ + cap_text = &batt_cap_text[2]; + if (!cap_text->surface) + return x; + + c_w = cap_text->width; + c_h = cap_text->cheight; + c_x = GET_CENTER_POS(gr_fb_width(), w + c_w + SPACING) + w + SPACING; + c_y = y + GET_CENTER_POS(h, c_h * clen); + + if (outside(c_x, c_y) || outside (c_x + c_w, c_y + c_h * clen)) { + LOGE("drawing outside %dx%d+%d+%d\n", c_x, c_y, c_w, c_h * clen); + return x; + } + + for (i = 0; i < clen; i++) { + LOGV("drawing text %d,%dx%d+%d+%d\n", index[i], c_w, c_h, c_x, c_y); + gr_blit(cap_text->surface, 0, c_h * index[i], c_w, c_h, c_x, c_y); + c_y += c_h; + } + + return c_x - w - SPACING; +#endif + } +} +#endif + +#endif /* returns the last y-offset of where the surface ends */ static int draw_surface_centered(struct charger *charger, gr_surface surface) @@ -309,8 +500,13 @@ static int draw_surface_centered(struct charger *charger, gr_surface surface) x = (gr_fb_width() - w) / 2 ; y = (gr_fb_height() - h) / 2 ; +#ifdef CHARGER_CAPACITY_TEXT /* drawing capacity text */ - y = draw_charger_capacity(charger, x, y, w); + if (w <= h) + y = draw_charger_capacity(charger, x, y, w, h); + else /* capacity text display on the right of battery icon */ + x = draw_charger_capacity(charger, x, y, w, h); +#endif LOGV("drawing surface %dx%d+%d+%d\n", w, h, x, y); gr_blit(surface, 0, 0, w, h, x, y); @@ -727,6 +923,23 @@ void healthd_mode_charger_init(struct healthd_config* config) } } +#ifdef CHARGER_CAPACITY_TEXT + for (i = 0; i < 4; i++) { + struct capacity_text *cap_text = &batt_cap_text[i]; + + ret = res_create_display_surface(cap_text->name, &cap_text->surface); + if (ret < 0) { + LOGE("Cannot load image %s\n", cap_text->name); + cap_text->surface = NULL; + break; + } + cap_text->width = gr_get_width(cap_text->surface); + cap_text->height = gr_get_height(cap_text->surface); + if (cap_text->text_count > 0) + cap_text->cheight = cap_text->height / cap_text->text_count; + } +#endif + ev_sync_key_state(set_key_callback, charger); charger->next_screen_transition = -1; diff --git a/system/core/healthd/images/capacity_text_bottom.png b/system/core/healthd/images/capacity_text_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..8e62b75dae762879b12a8f1d10f8412ee99bdb97 GIT binary patch literal 5348 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 literal 0 HcmV?d00001 diff --git a/system/core/healthd/images/capacity_text_top.png b/system/core/healthd/images/capacity_text_top.png new file mode 100644 index 0000000000000000000000000000000000000000..0f2eba8df99d38f375bd8fffd5e253b014d933e2 GIT binary patch literal 5326 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 literal 0 HcmV?d00001