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; }
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; }