static void printImage(Evas_Object* image) { char fileName[PATH_MAX]; const int tempImageFd = getTemporaryFile(fileName, PATH_MAX); if (tempImageFd == -1) abortWithErrorMessage("could not create temporary file"); evas_render(evas_object_evas_get(image)); if (evas_object_image_save(image, fileName, 0, 0)) { struct stat fileInfo; if (!stat(fileName, &fileInfo)) { printf("Content-Length: %ld\n", fileInfo.st_size); fflush(stdout); unsigned char buffer[2048]; ssize_t bytesRead; while ((bytesRead = read(tempImageFd, buffer, sizeof(buffer))) > 0) { ssize_t bytesWritten = 0; ssize_t count; do { if ((count = write(1, buffer + bytesWritten, bytesRead - bytesWritten)) <= 0) break; bytesWritten += count; } while (bytesWritten < bytesRead); } } } close(tempImageFd); unlink(fileName); }
/** * @internal * * This function takes actual shot and saves it in PNG * @param data Tsuite_Data pointer initiated by user * @param obj Window pointer * @param obj name file name. Will use name_+serial if NULL * * @ingroup Tsuite */ void tsuite_shot_do(char *name, Evas *e) { if (!e) return; Ecore_Evas *ee, *ee_orig; Evas_Object *o; unsigned int *pixels; int w, h,dir_name_len = 0; char *filename; if (_hook_setting->dest_dir) dir_name_len = strlen(_hook_setting->dest_dir) + 1; /* includes space of a '/' */ if (name) { filename = malloc(strlen(name) + strlen(IMAGE_FILENAME_EXT) + dir_name_len + 4); if (_hook_setting->dest_dir) sprintf(filename, "%s/", _hook_setting->dest_dir); sprintf(filename + dir_name_len, "%s%s", name, IMAGE_FILENAME_EXT); } else { filename = malloc(strlen(_hook_setting->test_name) + strlen(IMAGE_FILENAME_EXT) + dir_name_len + 8); /* also space for serial */ ts.serial++; if (_hook_setting->dest_dir) sprintf(filename, "%s/", _hook_setting->dest_dir); sprintf(filename + dir_name_len, "%s_%d%s", _hook_setting->test_name, ts.serial, IMAGE_FILENAME_EXT); } ee_orig = ecore_evas_ecore_evas_get(e); ecore_evas_manual_render(ee_orig); pixels = (void *)ecore_evas_buffer_pixels_get(ee_orig); if (!pixels) return; ecore_evas_geometry_get(ee_orig, NULL, NULL, &w, &h); if ((w < 1) || (h < 1)) return; ee = ecore_evas_buffer_new(1, 1); o = evas_object_image_add(ecore_evas_get(ee)); evas_object_image_alpha_set(o, ecore_evas_alpha_get(ee_orig)); evas_object_image_size_set(o, w, h); evas_object_image_data_set(o, pixels); if (!evas_object_image_save(o, filename, NULL, NULL)) { printf("Cannot save widget to <%s>\n", filename); } ecore_evas_free(ee); free(filename); }
int captureScreen() { char dstpath[MAX_PATH_LENGTH]; char* scrimage; int width, height; Evas* ev = NULL; Evas_Object* img; screenshot_data sdata; probeInfo_t probeInfo; int ret = 0; static pthread_mutex_t captureScreenLock = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&captureScreenLock); probeBlockStart(); setProbePoint(&probeInfo); sdata.ximage = NULL; scrimage = captureScreenShotX(&width, &height, &sdata); if(scrimage != NULL) { ev = create_canvas(width, height); if(likely(ev != NULL)) { snprintf(dstpath, sizeof(dstpath), SCREENSHOT_DIRECTORY "/%d_%d.png", getpid(), probeInfo.eventIndex); // make image buffer if((img = evas_object_image_add(ev)) != NULL) { //image buffer set evas_object_image_data_set(img, NULL); evas_object_image_size_set(img, width, height); evas_object_image_data_set(img, scrimage); // resize image if(height > MAX_HEIGHT) { width = width * MAX_HEIGHT / height; height = MAX_HEIGHT; evas_object_resize(img, width, height); evas_object_image_fill_set(img, 0, 0, width, height); } evas_object_image_data_update_add(img, 0, 0, width, height); //save file if(evas_object_image_save(img, dstpath, NULL, "compress=5") != 0) { chmod(dstpath, 0777); /* welcome to the hell */ log_t log; PREPARE_LOCAL_BUF_THOUGH((char *)&log); /* skip header */ LOCAL_BUF += offsetof(log_t, data); /* pack screenshot name */ BUF_PTR = pack_string(LOCAL_BUF, dstpath); /* file name */ LOCAL_BUF = BUF_PTR; /* pack probe */ PACK_COMMON_BEGIN(MSG_PROBE_SCREENSHOT, API_ID_captureScreen, "", 0); PACK_COMMON_END('d', 0, 0, 0); PACK_SCREENSHOT(dstpath, getOrientation()); SET_MSG_LEN(); log.length = GET_MSG_LEN() + MSG_LEN_OFFSET + strlen(dstpath) + 1; /* send all message */ printLog(&log, MSG_IMAGE); } else { // captureScreen : evas_object_image_save failed ret = -1; } } else { // captureScreen : evas_object_image_add failed ret = -1; } } else { // captureScreen : create canvas failed ret = -1; } } else { // captureScreen : captureScreenShotX failed ret = -1; } // release resources releaseScreenShotX(&sdata); if(ev) destroy_canvas(ev); probeBlockEnd(); pthread_mutex_unlock(&captureScreenLock); return ret; }
int main(int argc, char *argv[]) { Ecore_Evas *ee; Evas_Object *bridge, *img; const char *opt, *input, *output, *params; int r = 0, w = -1, h = -1, err; double scale = -1.0; if (argc < 4) { fprintf(stderr, "Usage:\n" "\t%s <percentage%%|WxH|w=W|h=H> <input> <output>" " [save-params]\n" "where save-params is evas supported parameters, like:\n" "\tquality=85\n" "\tcompress=9\n", argv[0]); return 1; } opt = argv[1]; input = argv[2]; output = argv[3]; params = argv[4]; if (strncasecmp(opt, "w=", 2) == 0) { char *end = NULL; w = strtol(opt + 2, &end, 10); if (!end || *end != '\0') { fprintf(stderr, "ERROR: invalid decimal integer '%s'\n", opt + 2); return 1; } else if (w < 1) { fprintf(stderr, "ERROR: invalid width %d, must be >= 1\n", w); return 1; } } else if (strncasecmp(opt, "h=", 2) == 0) { char *end = NULL; h = strtol(opt + 2, &end, 10); if (!end || *end != '\0') { fprintf(stderr, "ERROR: invalid decimal integer '%s'\n", opt + 2); return 1; } else if (h < 1) { fprintf(stderr, "ERROR: invalid height %d, must be >= 1\n", h); return 1; } } else if (strchr(opt, '%')) { char *end = NULL; scale = strtod(opt, &end); if (!end || *end != '%') { fprintf(stderr, "ERROR: invalid percentual '%s'\n", opt); return 1; } else if (scale <= 0.0) { fprintf(stderr, "ERROR: invalid percentual %g, must be > 0.0\n", scale); return 1; } scale /= 100.0; } else if (strchr(opt, 'x')) { if (sscanf(opt, "%dx%d", &w, &h) != 2) { fprintf(stderr, "ERROR: invalid size format '%s'\n", opt); return 1; } else if (w < 1) { fprintf(stderr, "ERROR: invalid width %d, must be >= 1\n", w); return 1; } else { fprintf(stderr, "ERROR: invalid height %d, must be >= 1\n", h); return 1; } } else { fprintf(stderr, "ERROR: first parameter must be in format:\n" "\tpercentage%% - example: 10%%\n" "\tWxH - example: 1024x768\n" "\tw=W - example: w=1024\n" "\th=H - example: h=768\n" "But '%s' was used!\n", opt); return 1; } ecore_evas_init(); evas_init(); ee = ecore_evas_buffer_new(1, 1); bridge = ecore_evas_object_image_new(ee); img = evas_object_image_add(ecore_evas_object_evas_get(bridge)); evas_object_image_smooth_scale_set(img, EINA_TRUE); if (w > 0 && h > 0) evas_object_image_load_size_set(img, w, h); evas_object_image_file_set(img, input, NULL); err = evas_object_image_load_error_get(img); if (err != EVAS_LOAD_ERROR_NONE) { const char *msg = evas_load_error_str(err); fprintf(stderr, "ERROR: could not load '%s': %s\n", input, msg); r = 1; goto end; } if (w < 1 || h < 1) { int iw, ih; evas_object_image_size_get(img, &iw, &ih); if (iw < 0 || ih < 0) { fprintf(stderr, "ERROR: invalid source image size %dx%d (%s)\n", iw, ih, input); goto end; } if (scale > 0) { w = ceil(iw * scale); h = ceil(ih * scale); } else if (w < 1) w = ceil(iw * (double)h / (double)ih); else if (h < 1) h = ceil(ih * (double)w / (double)iw); if (iw != w && ih != h) evas_object_image_load_size_set(img, w, h); } printf("output: %s, size: %dx%d, alpha: %s, params: %s\n", output, w, h, evas_object_image_alpha_get(img) ? "yes" : "no", params ? params : "<none>"); evas_object_image_fill_set(img, 0, 0, w, h); evas_object_resize(img, w, h); evas_object_show(img); evas_object_image_alpha_set(bridge, evas_object_image_alpha_get(img)); evas_object_image_size_set(bridge, w, h); ecore_evas_manual_render(ecore_evas_object_ecore_evas_get(bridge)); evas_object_image_save(bridge, output, NULL, params); end: evas_object_del(img); evas_object_del(bridge); ecore_evas_free(ee); evas_shutdown(); ecore_evas_shutdown(); return r; }