int main(int argc, char *argv[]) { struct image_t img_1, img_2; int diff; image_read(argv[1], &img_1); if(argv[2][0] == '1') image_lsbr_rndcode(&img_1, 0.01); image_clone(&img_1, &img_2); image_plusone(&img_2); image_offset(&img_1); image_offset(&img_2); image_write("image_ideal.bmp", &img_1); image_write("image_plusone.bmp", &img_2); return 0; }
int bus_image_method_clone( sd_bus_message *message, void *userdata, sd_bus_error *error) { Image *image = userdata; Manager *m = image->userdata; const char *new_name; int r, read_only; assert(message); assert(image); r = sd_bus_message_read(message, "sb", &new_name, &read_only); if (r < 0) return r; if (!image_name_is_valid(new_name)) return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Image name '%s' is invalid.", new_name); r = bus_verify_polkit_async( message, CAP_SYS_ADMIN, "org.freedesktop.machine1.manage-images", NULL, false, UID_INVALID, &m->polkit_registry, error); if (r < 0) return r; if (r == 0) return 1; /* Will call us back */ r = image_clone(image, new_name, read_only); if (r < 0) return r; return sd_bus_reply_method_return(message, NULL); }
//image conv image_p image_conv(image_p src, int dtype) { image_p dst; uint32_t i,j; uint32_t *src32, *dst32; uint16_t *src16, *dst16; uint8_t r,g,b,a; if(src->dtype == (uint32_t)dtype) return image_clone(src); CHECK_AND_UNSWIZZLE(src); dst = image_create(src->w, src->h, dtype); src32 = (uint32_t*)src->data; dst32 = (uint32_t*)dst->data; src16 = (uint16_t*)src->data; dst16 = (uint16_t*)dst->data; for(i = 0; i < src->h; i++) { for (j = 0; j<src->w; j++) { if(dtype == DISPLAY_PIXEL_FORMAT_8888){ if(src->dtype == DISPLAY_PIXEL_FORMAT_4444){ GET_RGBA_4444(src16[i*src->texw+j],r,g,b,a); dst32[i*dst->texw+j] = MAKE_RGBA_8888(r,g,b,a); } else if(src->dtype == DISPLAY_PIXEL_FORMAT_5551){ GET_RGBA_5551(src16[i*src->texw+j],r,g,b,a); dst32[i*dst->texw+j] = MAKE_RGBA_8888(r,g,b,a); } else if(src->dtype == DISPLAY_PIXEL_FORMAT_565){ GET_RGBA_565(src16[i*src->texw+j],r,g,b,a); dst32[i*dst->texw+j] = MAKE_RGBA_8888(r,g,b,a); } } else if(dtype == DISPLAY_PIXEL_FORMAT_4444){ if(src->dtype == DISPLAY_PIXEL_FORMAT_8888){ GET_RGBA_8888(src32[i*src->texw+j],r,g,b,a); dst16[i*dst->texw+j] = MAKE_RGBA_4444(r,g,b,a); } else if(src->dtype == DISPLAY_PIXEL_FORMAT_5551){ GET_RGBA_5551(src16[i*src->texw+j],r,g,b,a); dst16[i*dst->texw+j] = MAKE_RGBA_4444(r,g,b,a); } else if(src->dtype == DISPLAY_PIXEL_FORMAT_565){ GET_RGBA_565(src16[i*src->texw+j],r,g,b,a); dst16[i*dst->texw+j] = MAKE_RGBA_4444(r,g,b,a); } } else if(dtype == DISPLAY_PIXEL_FORMAT_5551){ if(src->dtype == DISPLAY_PIXEL_FORMAT_8888){ GET_RGBA_8888(src32[i*src->texw+j],r,g,b,a); dst16[i*dst->texw+j] = MAKE_RGBA_5551(r,g,b,a); } else if(src->dtype == DISPLAY_PIXEL_FORMAT_4444){ GET_RGBA_4444(src16[i*src->texw+j],r,g,b,a); dst16[i*dst->texw+j] = MAKE_RGBA_5551(r,g,b,a); } else if(src->dtype == DISPLAY_PIXEL_FORMAT_565){ GET_RGBA_565(src16[i*src->texw+j],r,g,b,a); dst16[i*dst->texw+j] = MAKE_RGBA_5551(r,g,b,a); } } else if(dtype == DISPLAY_PIXEL_FORMAT_565){ if(src->dtype == DISPLAY_PIXEL_FORMAT_8888){ GET_RGBA_8888(src32[i*src->texh+j],r,g,b,a); dst16[i*dst->texh+j] = MAKE_RGBA_565(r,g,b,a); } else if(src->dtype == DISPLAY_PIXEL_FORMAT_4444){ GET_RGBA_4444(src16[i*src->texh+j],r,g,b,a); dst16[i*dst->texh+j] = MAKE_RGBA_565(r,g,b,a); } else if(src->dtype == DISPLAY_PIXEL_FORMAT_5551){ GET_RGBA_5551(src16[i*src->texh+j],r,g,b,a); dst16[i*dst->texh+j] = MAKE_RGBA_565(r,g,b,a); } } } } dst->swizzle = 1; swizzle_swap(dst); CHECK_AND_SWIZZLE(src); return dst; }
int bus_image_method_clone( sd_bus_message *message, void *userdata, sd_bus_error *error) { _cleanup_close_pair_ int errno_pipe_fd[2] = { -1, -1 }; Image *image = userdata; Manager *m = image->userdata; const char *new_name; int r, read_only; pid_t child; assert(message); assert(image); assert(m); if (m->n_operations >= OPERATIONS_MAX) return sd_bus_error_setf(error, SD_BUS_ERROR_LIMITS_EXCEEDED, "Too many ongoing operations."); r = sd_bus_message_read(message, "sb", &new_name, &read_only); if (r < 0) return r; if (!image_name_is_valid(new_name)) return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Image name '%s' is invalid.", new_name); r = bus_verify_polkit_async( message, CAP_SYS_ADMIN, "org.freedesktop.machine1.manage-images", NULL, false, UID_INVALID, &m->polkit_registry, error); if (r < 0) return r; if (r == 0) return 1; /* Will call us back */ if (pipe2(errno_pipe_fd, O_CLOEXEC|O_NONBLOCK) < 0) return sd_bus_error_set_errnof(error, errno, "Failed to create pipe: %m"); child = fork(); if (child < 0) return sd_bus_error_set_errnof(error, errno, "Failed to fork(): %m"); if (child == 0) { errno_pipe_fd[0] = safe_close(errno_pipe_fd[0]); r = image_clone(image, new_name, read_only); if (r < 0) { (void) write(errno_pipe_fd[1], &r, sizeof(r)); _exit(EXIT_FAILURE); } _exit(EXIT_SUCCESS); } errno_pipe_fd[1] = safe_close(errno_pipe_fd[1]); r = operation_new(m, NULL, child, message, errno_pipe_fd[0]); if (r < 0) { (void) sigkill_wait(child); return r; } errno_pipe_fd[0] = -1; return 1; }
image_p create_contrast_image(image_p src, int contrast){ uint32 y,x; uint8 recover = 0; image_p pimg; uint16 *p16,*psrc16; uint32 *p32,*psrc32; sint16 r,g,b,a; sint32 col; uint8 colmap[255]; if(contrast<-100 || contrast>100) { nge_print("create_contrast_image arg 'contrast' must between -100 to 100!"); return NULL; } contrast+=100; if(contrast == 100) return image_clone(src); if(src->swizzle ==1){ unswizzle_swap(src); recover = 1; } for(x=0;x<256;x++){ if(contrast < 100){ colmap[x] = max(0, min((int)(x - 128) * (contrast / 100) + 128, 255)); } else{ colmap[x] = max(0, min((int)(x - 128) * ((contrast - 100) * 1.28) + 128, 255)); } } pimg = image_create(src->w, src->h, src->dtype); for(y=0;y<src->h;y++) { for(x=0;x<src->w;x++){ if(src->dtype == DISPLAY_PIXEL_FORMAT_8888) { p32 = (uint32 *)pimg->data + y*src->texw; psrc32 = (uint32 *)src->data + y*src->texw; } else { p16 = (uint16 *)pimg->data + y*src->texw; psrc16 = (uint16 *)src->data + y*src->texw; } if(src->dtype == DISPLAY_PIXEL_FORMAT_4444){ col = *(psrc16 + x); GET_RGBA_4444(col, r,g,b,a); if(a > 0) { r = colmap[r]; g = colmap[g]; b = colmap[b]; } *(p16 + x) = MAKE_RGBA_4444(r,g,b,a); } } } if(recover) swizzle_swap(src); return pimg; }
image_p image_conv(image_p src, int dtype) { image_p dst; uint8 recover = 0; uint32 i,j; uint32 *src32, *dst32; uint16 *src16, *dst16; uint8 r,g,b,a; if(src->dtype == dtype) return image_clone(src); if(src->swizzle ==1){ unswizzle_swap(src); recover = 1; } dst = image_create(src->w, src->h, dtype); src32 = (uint32*)src->data; dst32 = (uint32*)dst->data; src16 = (uint16*)src->data; dst16 = (uint16*)dst->data; for(i = 0; i < src->h; i++) { for (j = 0; j<src->w; j++) { if(dtype == DISPLAY_PIXEL_FORMAT_8888){ if(src->dtype == DISPLAY_PIXEL_FORMAT_4444){ GET_RGBA_4444(src16[i*src->texw+j],r,g,b,a); dst32[i*dst->texw+j] = MAKE_RGBA_8888(r,g,b,a); } else if(src->dtype == DISPLAY_PIXEL_FORMAT_5551){ GET_RGBA_5551(src16[i*src->texw+j],r,g,b,a); dst32[i*dst->texw+j] = MAKE_RGBA_8888(r,g,b,a); } else if(src->dtype == DISPLAY_PIXEL_FORMAT_565){ GET_RGBA_565(src16[i*src->texw+j],r,g,b,a); dst32[i*dst->texw+j] = MAKE_RGBA_8888(r,g,b,a); } } else if(dtype == DISPLAY_PIXEL_FORMAT_4444){ if(src->dtype == DISPLAY_PIXEL_FORMAT_8888){ GET_RGBA_8888(src32[i*src->texw+j],r,g,b,a); dst16[i*dst->texw+j] = MAKE_RGBA_4444(r,g,b,a); } else if(src->dtype == DISPLAY_PIXEL_FORMAT_5551){ GET_RGBA_5551(src16[i*src->texw+j],r,g,b,a); dst16[i*dst->texw+j] = MAKE_RGBA_4444(r,g,b,a); } else if(src->dtype == DISPLAY_PIXEL_FORMAT_565){ GET_RGBA_565(src16[i*src->texw+j],r,g,b,a); dst16[i*dst->texw+j] = MAKE_RGBA_4444(r,g,b,a); } } else if(dtype == DISPLAY_PIXEL_FORMAT_5551){ if(src->dtype == DISPLAY_PIXEL_FORMAT_8888){ GET_RGBA_8888(src32[i*src->texw+j],r,g,b,a); dst16[i*dst->texw+j] = MAKE_RGBA_5551(r,g,b,a); } else if(src->dtype == DISPLAY_PIXEL_FORMAT_4444){ GET_RGBA_4444(src16[i*src->texw+j],r,g,b,a); dst16[i*dst->texw+j] = MAKE_RGBA_5551(r,g,b,a); } else if(src->dtype == DISPLAY_PIXEL_FORMAT_565){ GET_RGBA_565(src16[i*src->texw+j],r,g,b,a); dst16[i*dst->texw+j] = MAKE_RGBA_5551(r,g,b,a); } } else if(dtype == DISPLAY_PIXEL_FORMAT_565){ if(src->dtype == DISPLAY_PIXEL_FORMAT_8888){ GET_RGBA_8888(src32[i*src->texh+j],r,g,b,a); dst16[i*dst->texh+j] = MAKE_RGBA_565(r,g,b,a); } else if(src->dtype == DISPLAY_PIXEL_FORMAT_4444){ GET_RGBA_4444(src16[i*src->texh+j],r,g,b,a); dst16[i*dst->texh+j] = MAKE_RGBA_565(r,g,b,a); } else if(src->dtype == DISPLAY_PIXEL_FORMAT_5551){ GET_RGBA_5551(src16[i*src->texh+j],r,g,b,a); dst16[i*dst->texh+j] = MAKE_RGBA_565(r,g,b,a); } } } } swizzle_swap(dst); if(recover) swizzle_swap(src); return dst; }
image_p image_rot(image_p src,float angel) { image_p dst; uint8 recover = 0; double sx,rs0,rs1,sy; double rangel; pointf d0,d1,d2,d3,d4; float x1,x2,y1,y2; sint16 xo, yo, wo, ho; uint32 i,j; uint32 *src32, *dst32; uint16 *src16, *dst16; uint16 r,g,b,a; uint16 r2,g2,b2,a2; uint8 smc; float xbx; while(angel > 360.0f) angel-=360.0f; while(angel<0) angel+=360.0f; if(angel == 0) return image_clone(src); if(src->swizzle ==1){ unswizzle_swap(src); recover = 1; } rangel = angel*3.1415926f/180.0f; sx = cos(rangel); rs0 = sin(rangel); rs1 = -sin(rangel); sy = cos(rangel); d0.x = 0; d0.y = 0; d1 = image_rot_pointf(d0, sx, sy, rs0, rs1); d0.x = src->w; d2 = image_rot_pointf(d0, sx, sy, rs0, rs1); d0.y = src->h; d3 = image_rot_pointf(d0, sx, sy, rs0, rs1); d0.x = 0; d4 = image_rot_pointf(d0, sx, sy, rs0, rs1); x1 = min(d1.x, min(d2.x, min(d3.x, d4.x))); x2 = max(d1.x, max(d2.x, max(d3.x, d4.x))); y1 = min(d1.y, min(d2.y, min(d3.y, d4.y))); y2 = max(d1.y, max(d2.y, max(d3.y, d4.y))); xo = x1; yo = y1; wo = x2 - xo; ho = y2 - yo; dst = image_create(wo, ho, src->dtype); src32 = (uint32*)src->data; dst32 = (uint32*)dst->data; src16 = (uint16*)src->data; dst16 = (uint16*)dst->data; for(i = 0; i < dst->h; i++) { for (j = 0; j<dst->w; j++) { d0.x = j; d0.y = i; d0 = image_rot_pointf(d0, sx, sy, rs0, rs1); // easy way smc = 1; r2 = 0; g2 = 0; b2 = 0; a2 = 0; if(src->dtype == DISPLAY_PIXEL_FORMAT_8888){ if((int)d0.y-yo < src->texh && (int)d0.x-xo < src->texw){ //dst16[i*dst->texw+j] = src16[((int)d0.y-yo)*src->texw+(int)d0.x-xo]; GET_RGBA_8888(src32[((int)d0.y-yo)*src->texw+(int)d0.x-xo], r, g, b, a); xbx = 1.0f - ((d0.y-yo) - (int)(d0.y-yo)); r2 = r * xbx; g2 = g * xbx; b2 = b * xbx; a2 = a * xbx; if((int)d0.y-yo+1 < src->texh){ smc++; xbx = 1.0f - xbx; GET_RGBA_8888(src32[((int)d0.y-yo+1)*src->texw+(int)d0.x-xo], r, g, b, a); r2 += r * xbx; g2 += g * xbx; b2 += b * xbx; a2 += a * xbx; } r = min(r2, 255); g = min(g2, 255); b = min(b2, 255); a = min(a2, 255); dst32[i*dst->texw+j] = MAKE_RGBA_8888(r,g,b,a); } } else if(src->dtype == DISPLAY_PIXEL_FORMAT_4444){ if((int)d0.y-yo < src->texh && (int)d0.x-xo < src->texw){ //dst16[i*dst->texw+j] = src16[((int)d0.y-yo)*src->texw+(int)d0.x-xo]; GET_RGBA_4444(src16[((int)d0.y-yo)*src->texw+(int)d0.x-xo], r, g, b, a); xbx = 1.0f - ((d0.y-yo) - (int)(d0.y-yo)); r2 = r * xbx; g2 = g * xbx; b2 = b * xbx; a2 = a * xbx; if((int)d0.y-yo+1 < src->texh){ smc++; xbx = 1.0f - xbx; GET_RGBA_4444(src16[((int)d0.y-yo+1)*src->texw+(int)d0.x-xo], r, g, b, a); r2 += r * xbx; g2 += g * xbx; b2 += b * xbx; a2 += a * xbx; } r = min(r2, 255); g = min(g2, 255); b = min(b2, 255); a = min(a2, 255); dst16[i*dst->texw+j] = MAKE_RGBA_4444(r,g,b,a); } } else if(src->dtype == DISPLAY_PIXEL_FORMAT_5551){ if((int)d0.y-yo < src->texh && (int)d0.x-xo < src->texw){ //dst16[i*dst->texw+j] = src16[((int)d0.y-yo)*src->texw+(int)d0.x-xo]; GET_RGBA_5551(src16[((int)d0.y-yo)*src->texw+(int)d0.x-xo], r, g, b, a); xbx = 1.0f - ((d0.y-yo) - (int)(d0.y-yo)); r2 = r * xbx; g2 = g * xbx; b2 = b * xbx; a2 = a * xbx; if((int)d0.y-yo+1 < src->texh){ smc++; xbx = 1.0f - xbx; GET_RGBA_5551(src16[((int)d0.y-yo+1)*src->texw+(int)d0.x-xo], r, g, b, a); r2 += r * xbx; g2 += g * xbx; b2 += b * xbx; a2 += a * xbx; } r = min(r2, 255); g = min(g2, 255); b = min(b2, 255); a = min(a2, 255); dst16[i*dst->texw+j] = MAKE_RGBA_5551(r,g,b,a); } } else{ if((int)d0.y-yo < src->texh && (int)d0.x-xo < src->texw){ //dst16[i*dst->texw+j] = src16[((int)d0.y-yo)*src->texw+(int)d0.x-xo]; GET_RGBA_565(src16[((int)d0.y-yo)*src->texw+(int)d0.x-xo], r, g, b, a); xbx = 1.0f - ((d0.y-yo) - (int)(d0.y-yo)); r2 = r * xbx; g2 = g * xbx; b2 = b * xbx; a2 = a * xbx; if((int)d0.y-yo+1 < src->texh){ smc++; xbx = 1.0f - xbx; GET_RGBA_565(src16[((int)d0.y-yo+1)*src->texw+(int)d0.x-xo], r, g, b, a); r2 += r * xbx; g2 += g * xbx; b2 += b * xbx; a2 += a * xbx; } r = min(r2, 255); g = min(g2, 255); b = min(b2, 255); a = min(a2, 255); dst16[i*dst->texw+j] = MAKE_RGBA_565(r,g,b,a); } } } } swizzle_swap(dst); if(recover) swizzle_swap(src); return dst; }