static int hc_image(http_connection_t *hc, const char *remain, void *opaque, http_cmd_t method) { htsbuf_queue_t out; pixmap_t *pm; char errbuf[200]; const char *content; image_meta_t im = {0}; im.im_no_decoding = 1; rstr_t *url = rstr_alloc(remain); pm = backend_imageloader(url, &im, NULL, errbuf, sizeof(errbuf), NULL, NULL, NULL); rstr_release(url); if(pm == NULL) return http_error(hc, 404, "Unable to load image %s : %s", remain, errbuf); if(!pixmap_is_coded(pm)) { pixmap_release(pm); return http_error(hc, 404, "Unable to load image %s : Original data not available", remain); } htsbuf_queue_init(&out, 0); htsbuf_append(&out, pm->pm_data, pm->pm_size); switch(pm->pm_type) { case PIXMAP_JPEG: content = "image/jpeg"; break; case PIXMAP_PNG: content = "image/png"; break; case PIXMAP_GIF: content = "image/gif"; break; default: content = "image"; break; } pixmap_release(pm); return http_send_reply(hc, 0, content, NULL, NULL, 0, &out); }
static int hc_image(http_connection_t *hc, const char *remain, void *opaque, http_cmd_t method) { htsbuf_queue_t out; image_t *img; char errbuf[200]; const char *content; image_meta_t im = {0}; im.im_no_decoding = 1; rstr_t *url; const char *u = http_arg_get_req(hc, "url"); if(u != NULL) { url = rstr_alloc(u); url_deescape(rstr_data(url)); } else { if(remain == NULL) { return 404; } url = rstr_alloc(remain); } img = backend_imageloader(url, &im, NULL, errbuf, sizeof(errbuf), NULL, NULL); rstr_release(url); if(img == NULL) return http_error(hc, 404, "Unable to load image %s : %s", remain, errbuf); const image_component_t *ic = image_find_component(img, IMAGE_CODED); if(ic == NULL) { image_release(img); return http_error(hc, 404, "Unable to load image %s : Original data not available", remain); } const image_component_coded_t *icc = &ic->coded; htsbuf_queue_init(&out, 0); htsbuf_append(&out, buf_cstr(icc->icc_buf), buf_len(icc->icc_buf)); switch(icc->icc_type) { case IMAGE_JPEG: content = "image/jpeg"; break; case IMAGE_PNG: content = "image/png"; break; case IMAGE_GIF: content = "image/gif"; break; default: content = "image"; break; } image_release(img); return http_send_reply(hc, 0, content, NULL, NULL, 0, &out); }
static void sunxi_set_bg(const char *path) { char errbuf[128]; image_meta_t im = {0}; unsigned long args[4] = {0}; pixmap_t *pm; int width = 1280, height = 720; int r; return; // hum im.im_req_width = width; im.im_req_height = height; rstr_t *rpath = rstr_alloc(path); pm = backend_imageloader(rpath, &im, NULL, errbuf, sizeof(errbuf), NULL, NULL, NULL); rstr_release(rpath); if(pm == NULL) { TRACE(TRACE_ERROR, "BG", "Unable to load %s -- %s", path, errbuf); return; } int bpp; switch(pm->pm_type) { case PIXMAP_RGB24: bpp = 3; break; case PIXMAP_BGR32: bpp = 4; break; default: abort(); } size_t tsize = pm->pm_height * pm->pm_linesize; hts_mutex_lock(&sunxi.gfxmem_mutex); uint8_t *dst = tlsf_memalign(sunxi.gfxmem, 1024, tsize); hts_mutex_unlock(&sunxi.gfxmem_mutex); memcpy(dst, pm->pm_pixels, tsize); pixmap_release(pm); __disp_video_fb_t frmbuf; memset(&frmbuf, 0, sizeof(__disp_video_fb_t)); frmbuf.addr[0] = va_to_pa(dst); frmbuf.addr[1] = va_to_pa(dst); frmbuf.addr[2] = va_to_pa(dst); args[1] = DISP_LAYER_WORK_MODE_NORMAL; int hlay = ioctl(sunxi.dispfd, DISP_CMD_LAYER_REQUEST, args); if(hlay == -1) exit(3); __disp_layer_info_t l; memset(&l, 0, sizeof(l)); l.mode = DISP_LAYER_WORK_MODE_NORMAL; l.pipe = 1; l.fb.size.width = pm->pm_linesize / bpp; l.fb.size.height = pm->pm_height; l.fb.addr[0] = frmbuf.addr[0]; l.fb.addr[1] = frmbuf.addr[1]; l.fb.addr[2] = frmbuf.addr[2]; switch(pm->pm_type) { case PIXMAP_RGB24: l.fb.format = DISP_FORMAT_RGB888; l.fb.br_swap = 1; l.fb.mode = DISP_MOD_INTERLEAVED; break; case PIXMAP_BGR32: l.fb.format = DISP_FORMAT_ARGB8888; l.fb.br_swap = 1; l.fb.mode = DISP_MOD_INTERLEAVED; break; default: abort(); } /// l.fb.seq = 0; // l.fb.mode = DISP_MOD_NON_MB_PLANAR; // l.fb.format = DISP_FORMAT_YUV420; l.ck_enable = 0; l.alpha_en = 1; l.alpha_val = 0; l.src_win.x = 0; l.src_win.y = 0; l.src_win.width = width; l.src_win.height = height; l.scn_win.x = 0; l.scn_win.y = 0; l.scn_win.width = width; l.scn_win.height = height; args[1] = hlay; args[2] = (__u32)&l; args[3] = 0; r = ioctl(sunxi.dispfd,DISP_CMD_LAYER_SET_PARA,(void*)args); if(r) perror("ioctl(disphd,DISP_CMD_LAYER_SET_PARA)"); args[1] = hlay; args[2] = 0; r = ioctl(sunxi.dispfd,DISP_CMD_LAYER_OPEN,(void*)args); if(r) perror("ioctl(disphd,DISP_CMD_LAYER_OPEN)"); bg_open = 1; args[1] = hlay; if(ioctl(sunxi.dispfd, DISP_CMD_LAYER_BOTTOM, args)) perror("ioctl(disphd,DISP_CMD_LAYER_BOTTOM)"); bg_layer = hlay; }