示例#1
0
struct imagepacknode * image_pack(struct imagepacknode * node, struct image * image)
{
    struct imagepacknode * rv;

    assert(node != NULL);
    assert(image != NULL);

    assert((node->left == NULL && node->right == NULL) ||
           (node->left != NULL && node->right != NULL)    );

    rv = NULL;
    if(node->left != NULL)
    {   /* Not a leaf. */
        rv = image_pack(node->left, image);
        if(rv == NULL)
            rv = image_pack(node->right, image);
    }
    else
    {   /* Leaf. */
        if(node->image == NULL)
        {   /* Not taken. */
            if(node->w == image->width && node->h == image->height)
            {   /* Perfect fit. */
                rv = node;
                rv->image = image;
            }
            else if(node->w >= image->width && node->h >= image->height)
            {   /* Image fits in here. Split this node in two. */
                if(node->w - image->width > node->h - image->height)
                {   /* More space horizontally. */
                    node->left  = image_pack_new(node->x, node->y, image->width, node->h);
                    node->right = image_pack_new(node->x + image->width, node->y, node->w - image->width, node->h);
                }
                else
                {   /* More space vertically. */
                    node->left  = image_pack_new(node->x, node->y, node->w, image->height);
                    node->right = image_pack_new(node->x, node->y + image->height, node->w, node->h - image->height);
                }

                rv = image_pack(node->left, image);
            }
        }
    }

    return rv;
}
示例#2
0
int main(int argc, char * const* argv)
{
	int ret = 0;
	int c = 0;
	const char* optstring = "d:r:c:";

	
	if(argc < 3||argc > 5) {
		printf("invalid arguments argc==%d\n", argc);
		fprintf(stderr,usage,argv[0],argv[0],argv[0],argv[0]);
		exit(-1);
	}

	ImageDecoderIf_t* pDecoder = AmlImage_Init();

    //for (int i = 1; i < argc; ++i)
    {
        const char* option = argv[1];
        char* const*optarg = argv + 2;

        if(!strcmp("-d", option))//unpack: argv[0] -d <archive> [out dir] 
		{
            const char* amlImg = optarg[0];
            const char* unPackDir = optarg[1];
			if(access(amlImg,F_OK|R_OK) < 0){
				printf("Err:%s is not found! \n",amlImg);
                return __LINE__;
			}
			if(argc == 4)
				ret = image_unpack(amlImg,unPackDir);
			else
				ret = image_unpack(amlImg,NULL);
		}
		else if(!strcmp("-r", option))//pack: argv[0] -r cfgFile workDir targetFile
		{
			if(argc != 5){
				printf("invalid arguments argc==%d\n", argc);
				fprintf(stderr,usage,argv[0],argv[0],argv[0],argv[0]);
				exit(-1);
			}
            const char* cfgFile = optarg[0];
            const char* workdir = optarg[1];
            const char* targetFile = optarg[2];
			if(access(cfgFile,F_OK|R_OK) < 0){
				fprintf(stderr,"Err:%s is not found! \n", cfgFile);
			}
			printf("image_pack cfg: %s\n", cfgFile);

			ret = image_pack(cfgFile, workdir, targetFile);
		}
		else if(!strcmp("-c", option))//check: argv[0] amlImage
		{	
            const char* amlImg = optarg[0];
			if(access(amlImg,F_OK|R_OK) < 0){
				fprintf(stderr,"Err:%s is not found!\n", amlImg);
			}
			FILE *fp = fopen(amlImg,"rb");
			if(image_check((HIMAGE) fp) < 0){
				fprintf(stderr,"the image check fail!!\n");
			}else{
				printf("the image check ok!\n");
			}
			fclose(fp);

		}
		else if(!strcmp("-?", option))
		{
			fprintf(stderr,usage,argv[0],argv[0],argv[0],argv[0]);
			ret = -1;
		}
		else{
			fprintf(stderr,usage,argv[0],argv[0],argv[0],argv[0]);
		}
    }

	AmlImage_Final(pDecoder);
	return ret;
}