/** * gs_appstream_refine_add_screenshots: */ static void gs_appstream_refine_add_screenshots (GsApp *app, AsApp *item) { AsScreenshot *ss; GPtrArray *images_as; GPtrArray *screenshots_as; guint i; /* do we have any to add */ screenshots_as = as_app_get_screenshots (item); if (screenshots_as->len == 0) return; /* does the app already have some */ gs_app_add_kudo (app, GS_APP_KUDO_HAS_SCREENSHOTS); if (gs_app_get_screenshots(app)->len > 0) return; /* add any we know */ for (i = 0; i < screenshots_as->len && i < GS_APPSTREAM_MAX_SCREENSHOTS; i++) { ss = g_ptr_array_index (screenshots_as, i); images_as = as_screenshot_get_images (ss); if (images_as->len == 0) continue; if (as_screenshot_get_kind (ss) == AS_SCREENSHOT_KIND_UNKNOWN) continue; gs_app_add_screenshot (app, ss); } }
/** * as_app_validate_screenshots: **/ static void as_app_validate_screenshots (AsApp *app, AsAppValidateHelper *helper) { AsScreenshot *ss; GPtrArray *screenshots; gboolean screenshot_has_default = FALSE; guint number_screenshots_max = 5; guint number_screenshots_min = 1; guint i; /* relax the requirements a bit */ if ((helper->flags & AS_APP_VALIDATE_FLAG_RELAX) > 0) { number_screenshots_max = 10; number_screenshots_min = 0; } /* metainfo doesn't require any screenshots */ if (as_app_get_source_kind (app) == AS_APP_SOURCE_KIND_METAINFO) number_screenshots_min = 0; /* only for AppData and AppStream */ if (as_app_get_source_kind (app) == AS_APP_SOURCE_KIND_DESKTOP) return; screenshots = as_app_get_screenshots (app); if (screenshots->len < number_screenshots_min) { ai_app_validate_add (helper->probs, AS_PROBLEM_KIND_STYLE_INCORRECT, "Not enough <screenshot> tags"); } if (screenshots->len > number_screenshots_max) { ai_app_validate_add (helper->probs, AS_PROBLEM_KIND_STYLE_INCORRECT, "Too many <screenshot> tags"); } for (i = 0; i < screenshots->len; i++) { ss = g_ptr_array_index (screenshots, i); as_app_validate_screenshot (ss, helper); if (as_screenshot_get_kind (ss) == AS_SCREENSHOT_KIND_DEFAULT) { if (screenshot_has_default) { ai_app_validate_add (helper->probs, AS_PROBLEM_KIND_MARKUP_INVALID, "<screenshot> has more than one default"); } screenshot_has_default = TRUE; continue; } } if (screenshots->len > 0 && !screenshot_has_default) { ai_app_validate_add (helper->probs, AS_PROBLEM_KIND_MARKUP_INVALID, "<screenshots> has no default <screenshot>"); } }
/** * gs_appstream_are_screenshots_perfect: */ static gboolean gs_appstream_are_screenshots_perfect (AsApp *app) { AsImage *image; AsScreenshot *screenshot; GPtrArray *screenshots; guint height; guint i; guint width; screenshots = as_app_get_screenshots (app); if (screenshots->len == 0) return FALSE; for (i = 0; i < screenshots->len; i++) { /* get the source image as the thumbs will be resized & padded */ screenshot = g_ptr_array_index (screenshots, i); image = as_screenshot_get_source (screenshot); if (image == NULL) return FALSE; width = as_image_get_width (image); height = as_image_get_height (image); /* too small */ if (width < AS_IMAGE_LARGE_WIDTH || height < AS_IMAGE_LARGE_HEIGHT) return FALSE; /* too large */ if (width > AS_IMAGE_LARGE_WIDTH * 2 || height > AS_IMAGE_LARGE_HEIGHT * 2) return FALSE; /* not 16:9 */ if ((width / 16) * 9 != height) return FALSE; } return TRUE; }
static void as_app_validate_screenshots (AsApp *app, AsAppValidateHelper *helper) { AsFormat *format; AsScreenshot *ss; GPtrArray *screenshots; gboolean screenshot_has_default = FALSE; guint number_screenshots_max = 25; guint number_screenshots_min = 1; guint i; /* relax the requirements a bit */ if ((helper->flags & AS_APP_VALIDATE_FLAG_RELAX) > 0) { number_screenshots_max = 10; number_screenshots_min = 0; } /* firmware does not need screenshots */ if (as_app_get_kind (app) == AS_APP_KIND_FIRMWARE || as_app_get_kind (app) == AS_APP_KIND_DRIVER || as_app_get_kind (app) == AS_APP_KIND_RUNTIME || as_app_get_kind (app) == AS_APP_KIND_ADDON || as_app_get_kind (app) == AS_APP_KIND_LOCALIZATION) number_screenshots_min = 0; /* metainfo and inf do not require any screenshots */ format = as_app_get_format_default (app); if (as_format_get_kind (format) == AS_FORMAT_KIND_METAINFO) number_screenshots_min = 0; /* only for AppData and AppStream */ if (as_format_get_kind (format) == AS_FORMAT_KIND_DESKTOP) return; screenshots = as_app_get_screenshots (app); if (screenshots->len < number_screenshots_min) { ai_app_validate_add (helper, AS_PROBLEM_KIND_STYLE_INCORRECT, "Not enough <screenshot> tags, minimum is %u", number_screenshots_min); } if (screenshots->len > number_screenshots_max) { ai_app_validate_add (helper, AS_PROBLEM_KIND_STYLE_INCORRECT, "Too many <screenshot> tags, maximum is %u", number_screenshots_max); } for (i = 0; i < screenshots->len; i++) { ss = g_ptr_array_index (screenshots, i); as_app_validate_screenshot (ss, helper); if (as_screenshot_get_kind (ss) == AS_SCREENSHOT_KIND_DEFAULT) { if (screenshot_has_default) { ai_app_validate_add (helper, AS_PROBLEM_KIND_MARKUP_INVALID, "<screenshot> has more than one default"); } screenshot_has_default = TRUE; continue; } } if (screenshots->len > 0 && !screenshot_has_default) { ai_app_validate_add (helper, AS_PROBLEM_KIND_MARKUP_INVALID, "<screenshots> has no default <screenshot>"); } }