void skin_draw_header_text(Skin *skin, char *text, SDL_Surface *target) { lcd_draw_string(&skin->font1, text, target, gmu_widget_get_pos_x(&skin->header, 1), gmu_widget_get_pos_y(&skin->header, 0) + (gmu_widget_get_height(&skin->header, 0) - skin->font1_char_height) / 2); }
void skin_draw_footer_text(Skin *skin, char *text, SDL_Surface *target) { int len = skin_textarea_get_characters_per_line(skin); lcd_draw_string_with_highlight(&skin->font1, &skin->font2, text, 0, target, gmu_widget_get_pos_x(&skin->footer, 1), gmu_widget_get_pos_y(&skin->footer, 0) + (gmu_widget_get_height(&skin->footer, 0) - skin->font1_char_height) / 2, len, RENDER_CROP); }
void cover_viewer_scroll_down(CoverViewer *cv) { SDL_Surface *cover = cover_image_get_image(&cv->ci); if (cv->hide_text && cover != NULL) { if (cv->y_offset < cover->h - gmu_widget_get_height((GmuWidget *)&cv->skin->lv, 1) - 10) cv->y_offset += 10; } else if (!cv->hide_text) { text_browser_scroll_down(&cv->tb); } }
static void skin_update_widget(Skin *skin, GmuWidget *gw, SDL_Surface *display, SDL_Surface *buffer) { SDL_Rect srect, drect; srect.x = gmu_widget_get_pos_x(gw, 0); srect.y = gmu_widget_get_pos_y(gw, 0); srect.w = gmu_widget_get_width(gw, 0); srect.h = gmu_widget_get_height(gw, 0); drect.x = srect.x; drect.y = srect.y; SDL_BlitSurface(buffer, &srect, display, &drect); SDL_UpdateRects(display, 1, &drect); }
void skin_draw_scroll_arrow_down(Skin *skin, SDL_Surface *target) { SDL_Rect srect, drect; int ox = gmu_widget_get_pos_x(&skin->lv, 1); int oy = gmu_widget_get_pos_y(&skin->lv, 1); srect.w = skin->arrow_down->w; srect.h = skin->arrow_down->h; srect.x = 0; srect.y = 0; drect.x = ox + gmu_widget_get_width(&skin->lv, 1) - skin->arrow_down->w; drect.y = oy + gmu_widget_get_height(&skin->lv, 1) - skin->arrow_down->h; drect.w = 1; drect.h = 1; if (skin->arrow_down) SDL_BlitSurface(skin->arrow_down, &srect, target, &drect); }
static void skin_draw_widget(Skin *skin, GmuWidget *gw, SDL_Surface *buffer) { SDL_Rect srect, drect; /* if necessary, draw the widget to the offscreen */ if (skin_init_offscreen(skin, buffer)) { gmu_widget_draw(&skin->display, skin->buffer); gmu_widget_draw(&skin->header, skin->buffer); gmu_widget_draw(&skin->lv, skin->buffer); gmu_widget_draw(&skin->footer, skin->buffer); } srect.x = gmu_widget_get_pos_x(gw, 0); srect.y = gmu_widget_get_pos_y(gw, 0); srect.w = gmu_widget_get_width(gw, 0); srect.h = gmu_widget_get_height(gw, 0); drect.x = srect.x; drect.y = srect.y; SDL_BlitSurface(skin->buffer, &srect, buffer, &drect); }
void cover_viewer_load_artwork(CoverViewer *cv, TrackInfo *ti, char *audio_file, char *image_file_pattern, int *ready_flag) { static char last_cover_path[256] = ""; cv->y_offset = 0; if (!cv->large) cover_image_set_target_size(&cv->ci, gmu_widget_get_width((GmuWidget *)&cv->skin->lv, 1) / 2, gmu_widget_get_height((GmuWidget *)&cv->skin->lv, 1)); else cover_image_set_target_size(&cv->ci, gmu_widget_get_width((GmuWidget *)&cv->skin->lv, 1), -1); /* Try to load image embedded in tag: */ if (cv->try_to_load_embedded_cover == EMBEDDED_COVER_FIRST && ti->image.data != NULL) { cover_image_load_image_from_memory(&cv->ci, ti->image.data, ti->image.data_size, ti->image.mime_type, ready_flag); last_cover_path[0] = '\0'; ti->has_cover_artwork = 1; } else if (audio_file != NULL && strlen(audio_file) < 256) { char *fn = get_file_matching_given_pattern_alloc(audio_file, image_file_pattern); if (fn) { ti->has_cover_artwork = 1; if (strncmp(fn, last_cover_path, 255) != 0) { wdprintf(V_INFO, "coverviewer", "Loading %s\n", fn); cover_image_load_image_from_file(&cv->ci, fn, ready_flag); wdprintf(V_DEBUG, "coverviewer", "Ok. Loading in progress...\n"); strncpy(last_cover_path, fn, 255); last_cover_path[255] = '\0'; } else { wdprintf(V_INFO, "coverviewer", "Cover file already loaded. No need to reload the file.\n"); } free(fn); } else { ti->has_cover_artwork = 0; if (cover_image_free_image(&cv->ci)) last_cover_path[0] = '\0'; } } else if (cv->try_to_load_embedded_cover == EMBEDDED_COVER_LAST && ti->image.data != NULL) { cover_image_load_image_from_memory(&cv->ci, ti->image.data, ti->image.data_size, ti->image.mime_type, ready_flag); last_cover_path[0] = '\0'; } }
int skin_textarea_get_number_of_lines(Skin *skin) { return gmu_widget_get_height((GmuWidget *)&skin->lv, 1) / (skin->font2_char_height+1); }
void cover_viewer_show(CoverViewer *cv, SDL_Surface *target, TrackInfo *ti) { SDL_Rect srect, drect; int text_x_offset = 5; int chars_per_line = (skin_textarea_get_characters_per_line((Skin *)cv->skin) < 256 ? skin_textarea_get_characters_per_line((Skin *)cv->skin) : 255); SDL_Surface *cover = cover_image_get_image(&cv->ci); int ax = gmu_widget_get_pos_x((GmuWidget *)&cv->skin->lv, 1); int ay = gmu_widget_get_pos_y((GmuWidget *)&cv->skin->lv, 1); int aw = gmu_widget_get_width((GmuWidget *)&cv->skin->lv, 1); int ah = gmu_widget_get_height((GmuWidget *)&cv->skin->lv, 1); if (cover != NULL && !cv->hide_cover && trackinfo_has_cover_artwork(ti)) { if (!cv->large) { if (cv->small_cover_align == ALIGN_LEFT) { text_browser_set_pos_x(&cv->tb, ax + aw / 2); } else { text_browser_set_pos_x(&cv->tb, ax); } if (!cv->hide_text) { chars_per_line = chars_per_line / 2 - 1; text_browser_set_chars_per_line(&cv->tb, chars_per_line); switch (cv->small_cover_align) { case ALIGN_LEFT: drect.x = ax; drect.y = ay + ah / 2 - cover->h / 2; text_x_offset = cover->w + 5; break; case ALIGN_RIGHT: drect.x = ax + aw - cover->w; drect.y = ay + ah / 2 - cover->h / 2; text_x_offset = 0; break; } text_browser_set_pos_x(&cv->tb, ax + text_x_offset); text_browser_draw(&cv->tb, target); } else { drect.x = ax + aw / 2 - cover->w / 2; drect.y = ay + ah / 2 - cover->h / 2; } if (cover->w <= aw && cover->h <= ah) SDL_BlitSurface(cover, NULL, target, &drect); } else { text_browser_set_pos_x(&cv->tb, ax); text_browser_set_chars_per_line(&cv->tb, chars_per_line); drect.x = ax; drect.y = ay; srect.x = 0; srect.y = cv->y_offset; srect.w = aw; srect.h = ah; text_x_offset = 5; SDL_BlitSurface(cover, &srect, target, &drect); if (!cv->hide_text) text_browser_draw(&cv->tb, target); } } else { text_browser_set_pos_x(&cv->tb, ax); text_browser_set_chars_per_line(&cv->tb, chars_per_line); if (!cv->hide_text) text_browser_draw(&cv->tb, target); } /* Draw spectrum analyzer */ if (cv->spectrum_analyzer) { Uint32 color = SDL_MapRGB(target->format, 0, 70, 255); int i, barwidth = aw / 20; int16_t *amplitudes; static int16_t amplitudes_smoothed[8]; SDL_Rect dstrect; dstrect.w = barwidth; dstrect.h = 20; dstrect.x = cv->hide_text ? ax + aw / 2 - aw / 4 : ax + aw / 2; if (audio_spectrum_read_lock()) { amplitudes = audio_spectrum_get_current_amplitudes(); for (i = 0; i < 8; i++) { int16_t a = amplitudes[i] / 327 + 2; dstrect.x += barwidth+1; if (amplitudes_smoothed[i] < a) amplitudes_smoothed[i] = a; amplitudes_smoothed[i] = amplitudes_smoothed[i] > 70 ? 70 : amplitudes_smoothed[i]; dstrect.h = amplitudes_smoothed[i]; dstrect.y = ay + ah / 2 + 25 - amplitudes_smoothed[i]; SDL_FillRect(target, &dstrect, color); amplitudes_smoothed[i] -= (15-i); if (amplitudes_smoothed[i] < 2) amplitudes_smoothed[i] = 2; } audio_spectrum_read_unlock(); } } if (cv->hide_text && !cv->hide_cover && !cv->spectrum_analyzer) skin_draw_header_text((Skin *)cv->skin, "Track info (Cover only)", target); else if (cv->hide_cover && !cv->hide_text && !cv->spectrum_analyzer) skin_draw_header_text((Skin *)cv->skin, "Track info (Text only)", target); else if (cv->hide_cover && cv->hide_text && cv->spectrum_analyzer) skin_draw_header_text((Skin *)cv->skin, "Track info (Spectrum analyzer only)", target); else if (cv->hide_text && cv->hide_cover && !cv->spectrum_analyzer) skin_draw_header_text((Skin *)cv->skin, "Track info (showing nothing)", target); else if (cv->hide_text && !cv->hide_cover && cv->spectrum_analyzer) skin_draw_header_text((Skin *)cv->skin, "Track info (Cover + Spectrum analyzer)", target); else if (!cv->hide_text && cv->hide_cover && cv->spectrum_analyzer) skin_draw_header_text((Skin *)cv->skin, "Track info (Text + Spectrum analyzer)", target); else if (!cv->hide_text && !cv->hide_cover && !cv->spectrum_analyzer) skin_draw_header_text((Skin *)cv->skin, "Track info (Text + Cover)", target); }