int init_resources() { cursor_ns = load_cursor(res_cursor_ns, LOAD_FROM_MEM); cursor_we = load_cursor(res_cursor_we, LOAD_FROM_MEM); cursor_nwse = load_cursor(res_cursor_nwse, LOAD_FROM_MEM); cursor_nesw = load_cursor(res_cursor_nesw, LOAD_FROM_MEM); win_font = init_fontlib(); return 1; }
static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt) { const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; VmncContext * const c = avctx->priv_data; uint8_t *outptr; const uint8_t *src = buf; int dx, dy, w, h, depth, enc, chunks, res, size_left; c->pic.reference = 1; c->pic.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE; if(avctx->reget_buffer(avctx, &c->pic) < 0){ av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n"); return -1; } c->pic.key_frame = 0; c->pic.pict_type = AV_PICTURE_TYPE_P; //restore screen after cursor if(c->screendta) { int i; w = c->cur_w; if(c->width < c->cur_x + w) w = c->width - c->cur_x; h = c->cur_h; if(c->height < c->cur_y + h) h = c->height - c->cur_y; dx = c->cur_x; if(dx < 0) { w += dx; dx = 0; } dy = c->cur_y; if(dy < 0) { h += dy; dy = 0; } if((w > 0) && (h > 0)) { outptr = c->pic.data[0] + dx * c->bpp2 + dy * c->pic.linesize[0]; for(i = 0; i < h; i++) { memcpy(outptr, c->screendta + i * c->cur_w * c->bpp2, w * c->bpp2); outptr += c->pic.linesize[0]; } } } src += 2; chunks = AV_RB16(src); src += 2; while(chunks--) { dx = AV_RB16(src); src += 2; dy = AV_RB16(src); src += 2; w = AV_RB16(src); src += 2; h = AV_RB16(src); src += 2; enc = AV_RB32(src); src += 4; outptr = c->pic.data[0] + dx * c->bpp2 + dy * c->pic.linesize[0]; size_left = buf_size - (src - buf); switch(enc) { case MAGIC_WMVd: // cursor if(size_left < 2 + w * h * c->bpp2 * 2) { av_log(avctx, AV_LOG_ERROR, "Premature end of data! (need %i got %i)\n", 2 + w * h * c->bpp2 * 2, size_left); return -1; } src += 2; c->cur_w = w; c->cur_h = h; c->cur_hx = dx; c->cur_hy = dy; if((c->cur_hx > c->cur_w) || (c->cur_hy > c->cur_h)) { av_log(avctx, AV_LOG_ERROR, "Cursor hot spot is not in image: %ix%i of %ix%i cursor size\n", c->cur_hx, c->cur_hy, c->cur_w, c->cur_h); c->cur_hx = c->cur_hy = 0; } c->curbits = av_realloc(c->curbits, c->cur_w * c->cur_h * c->bpp2); c->curmask = av_realloc(c->curmask, c->cur_w * c->cur_h * c->bpp2); c->screendta = av_realloc(c->screendta, c->cur_w * c->cur_h * c->bpp2); load_cursor(c, src); src += w * h * c->bpp2 * 2; break; case MAGIC_WMVe: // unknown src += 2; break; case MAGIC_WMVf: // update cursor position c->cur_x = dx - c->cur_hx; c->cur_y = dy - c->cur_hy; break; case MAGIC_WMVg: // unknown src += 10; break; case MAGIC_WMVh: // unknown src += 4; break; case MAGIC_WMVi: // ServerInitialization struct c->pic.key_frame = 1; c->pic.pict_type = AV_PICTURE_TYPE_I; depth = *src++; if(depth != c->bpp) { av_log(avctx, AV_LOG_INFO, "Depth mismatch. Container %i bpp, Frame data: %i bpp\n", c->bpp, depth); } src++; c->bigendian = *src++; if(c->bigendian & (~1)) { av_log(avctx, AV_LOG_INFO, "Invalid header: bigendian flag = %i\n", c->bigendian); return -1; } //skip the rest of pixel format data src += 13; break; case MAGIC_WMVj: // unknown src += 2; break; case 0x00000000: // raw rectangle data if((dx + w > c->width) || (dy + h > c->height)) { av_log(avctx, AV_LOG_ERROR, "Incorrect frame size: %ix%i+%ix%i of %ix%i\n", w, h, dx, dy, c->width, c->height); return -1; } if(size_left < w * h * c->bpp2) { av_log(avctx, AV_LOG_ERROR, "Premature end of data! (need %i got %i)\n", w * h * c->bpp2, size_left); return -1; } paint_raw(outptr, w, h, src, c->bpp2, c->bigendian, c->pic.linesize[0]); src += w * h * c->bpp2; break; case 0x00000005: // HexTile encoded rectangle if((dx + w > c->width) || (dy + h > c->height)) { av_log(avctx, AV_LOG_ERROR, "Incorrect frame size: %ix%i+%ix%i of %ix%i\n", w, h, dx, dy, c->width, c->height); return -1; } res = decode_hextile(c, outptr, src, size_left, w, h, c->pic.linesize[0]); if(res < 0) return -1; src += res; break; default: av_log(avctx, AV_LOG_ERROR, "Unsupported block type 0x%08X\n", enc); chunks = 0; // leave chunks decoding loop } } if(c->screendta){ int i; //save screen data before painting cursor w = c->cur_w; if(c->width < c->cur_x + w) w = c->width - c->cur_x; h = c->cur_h; if(c->height < c->cur_y + h) h = c->height - c->cur_y; dx = c->cur_x; if(dx < 0) { w += dx; dx = 0; } dy = c->cur_y; if(dy < 0) { h += dy; dy = 0; } if((w > 0) && (h > 0)) { outptr = c->pic.data[0] + dx * c->bpp2 + dy * c->pic.linesize[0]; for(i = 0; i < h; i++) { memcpy(c->screendta + i * c->cur_w * c->bpp2, outptr, w * c->bpp2); outptr += c->pic.linesize[0]; } outptr = c->pic.data[0]; put_cursor(outptr, c->pic.linesize[0], c, c->cur_x, c->cur_y); } } *data_size = sizeof(AVFrame); *(AVFrame*)data = c->pic; /* always report that the buffer was completely consumed */ return buf_size; }
int main(int argc, char *argv[]) { if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1) { printf("Can't initialize SDL: %s\n", SDL_GetError()); exit(EXIT_FAILURE); } atexit(SDL_Quit); SDL_Surface *screen, *text, *save_message; SDL_Event event; TTF_Font *font; int i, done = 0, mouse_x = 0, mouse_y = 0; unsigned int frames = SDL_GetTicks() + FLIMIT; unsigned int *frame_limit; frame_limit = &frames; int *mouse_x_ptr, *mouse_y_ptr; mouse_x_ptr = &mouse_x; mouse_y_ptr = &mouse_y; int show_save_msg = 0; screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 16, SDL_DOUBLEBUF | SDL_HWSURFACE); //screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 16, SDL_DOUBLEBUF | SDL_FULLSCREEN); if(NULL == screen) { printf("Can't set video mode: %s\n", SDL_GetError()); exit(EXIT_FAILURE); } /* set window title */ SDL_WM_SetCaption("2D SIMULATION", NULL); /* disable cursor */ SDL_ShowCursor(SDL_DISABLE); /* load new cursor */ load_cursor(); /* load the map and fill tiles array */ load_map(); /* load tileset */ load_tileset(); /* load player */ load_player_image(); /* setup font */ TTF_Init(); SDL_Color text_color = {255, 255, 255}; font = TTF_OpenFont("media/fonts/slkscrb.ttf", 8); /* game loop */ while(!done) { while(SDL_PollEvent(&event)) { switch(event.type) { case SDL_QUIT: done = 1; break; case SAVE_EVENT: show_save_msg = 0; //printf("SDL_USEREVENT: %i\n", SAVE_EVENT); break; case SDL_MOUSEMOTION: *mouse_x_ptr = event.motion.x; *mouse_y_ptr = event.motion.y; break; case SDL_MOUSEBUTTONDOWN: switch(event.button.button) { case 1: //destroy_block(screen, event.button.x, event.button.y); input.mleft = 1; break; case 3: //place_block(event.button.x, event.button.y, &player); input.mright = 1; break; default: break; } break; case SDL_MOUSEBUTTONUP: switch(event.button.button) { /* removed because if player falls down, it deletes always the block below the player */ case 1: input.mleft = 0; break; case 3: input.mright = 0; break; default: break; } break; case SDL_KEYDOWN: switch(event.key.keysym.sym) { case SDLK_ESCAPE: done = 1; break; case SDLK_a: input.left = 1; break; case SDLK_d: input.right = 1; break; case SDLK_SPACE: input.jump = 1; break; case SDLK_1: player.selected = DIRT; break; case SDLK_2: player.selected = GRASS; break; case SDLK_3: player.selected = SAND; break; case SDLK_4: player.selected = ROCK; break; case SDLK_5: player.selected = WATER5; break; case SDLK_6: player.selected = OIL; break; case SDLK_F12: save_map(); SDL_AddTimer (2000, msg_event, NULL); show_save_msg = 1; break; default: break; } break; case SDL_KEYUP: switch(event.key.keysym.sym) { case SDLK_a: input.left = 0; break; case SDLK_d: input.right = 0; break; default: break; } break; } } move_player(&player); // and camera move_sand(); simulate_water(); simulate_oil(); place_and_destroy_blocks(screen, event.button.x, event.button.y, &player); //input.mleft = 0; // uncomment for click once to delete one block //input.mright = 0; // uncomment for click once to place one block draw(screen, mouse_x_ptr, mouse_y_ptr, &player, text, font, text_color, show_save_msg, save_message); delay(frame_limit); *frame_limit = SDL_GetTicks() + FLIMIT; } /* free tiles/mass/new_mass array in reverse order */ for(i = 0; i < map.h; i++) { free(map.tiles[i]); free(map.water_mass[i]); free(map.new_water_mass[i]); free(map.oil_mass[i]); free(map.new_oil_mass[i]); } free(map.tiles); free(map.water_mass); free(map.new_water_mass); free(map.oil_mass); free(map.new_oil_mass); SDL_FreeSurface(tileset); SDL_FreeSurface(player_image); SDL_FreeSurface(cursor); SDL_FreeSurface(text); SDL_FreeSurface(save_message); return 0; }