示例#1
0
文件: creator.c 项目: gcc-o/PMSI
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;
}
示例#2
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);
}
示例#3
0
//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;
}
示例#4
0
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;
}