CAMLprim value caml_SDL_SurfaceGetPixel8(value surface, value x, value y) { Uint8 *pixels = (Uint8 *) SDL_Surface_val(surface)->pixels; int width = SDL_Surface_val(surface)->w; int ofs = (Long_val(y) * width) + Long_val(x); return caml_copy_int32(pixels[ofs]); }
CAMLprim value caml_SDL_SurfaceGetDims(value surface) { CAMLparam1(surface); CAMLlocal1(dims); dims = caml_alloc(2, 0); Store_field(dims, 0, Val_int(SDL_Surface_val(surface)->w)); Store_field(dims, 1, Val_int(SDL_Surface_val(surface)->h)); CAMLreturn(dims); }
CAMLprim value caml_SDL_BlitSurfs( value src, value dst, value _dstrect) { CAMLparam3(src, dst, _dstrect); SDL_Rect dstrect; SDL_Rect_val(&dstrect, _dstrect); int r = SDL_BlitSurface( SDL_Surface_val(src), NULL, SDL_Surface_val(dst), &dstrect); if (r) caml_failwith("Sdlsurface.blit_surfs"); CAMLreturn(Val_unit); }
CAMLprim value caml_SDL_Surface_ba_get_pixels(value surface) { SDL_Surface *surf = SDL_Surface_val(surface); Uint8 bpp = surf->format->BitsPerPixel; int b_flag = 0; long dim = surf->h; switch (bpp) { case 8: dim *= surf->pitch; b_flag |= CAML_BA_UINT8; break; case 16: dim *= surf->pitch / 2; b_flag |= CAML_BA_UINT16; break; case 24: dim *= surf->pitch; b_flag |= CAML_BA_UINT8; break; case 32: dim *= surf->pitch / 4; b_flag |= CAML_BA_INT32; break; case 64: dim *= surf->pitch / 8; b_flag |= CAML_BA_INT64; break; default: caml_failwith("Sdlsurface_ba.get_pixels"); } b_flag |= CAML_BA_C_LAYOUT | CAML_BA_EXTERNAL ; return caml_ba_alloc(b_flag, 1, surf->pixels, &dim); }
CAMLprim value caml_SDL_SaveBMP(value surf, value filename) { int r = SDL_SaveBMP(SDL_Surface_val(surf), String_val(filename)); if (r) caml_failwith("Sdlsurface.save_bmp"); return Val_unit; }
CAMLprim value caml_SDL_BlitSurface( value src, value _srcrect, value dst, value _dstrect) { CAMLparam4(src, _srcrect, dst, _dstrect); CAMLlocal1(ret); SDL_Rect dstrect; SDL_Rect srcrect; SDL_Rect_val(&dstrect, _dstrect); SDL_Rect_val(&srcrect, _srcrect); int r = SDL_BlitSurface( SDL_Surface_val(src), &srcrect, SDL_Surface_val(dst), &dstrect); if (r) caml_failwith("Sdlsurface.blit_surface"); Val_SDL_Rect(ret, &dstrect); CAMLreturn(ret); }
CAMLprim value caml_SDL_Surface_get_pixelformat_t(value surface) { SDL_PixelFormat *pixel_format = SDL_Surface_val(surface)->format; Uint32 format = pixel_format->format; return Val_Sdl_pixelformat_t(format); }
CAMLprim value sdlimagestub_savepng(value surf, value file) { CAMLparam2(surf, file); int ret = IMG_SavePNG( String_val(file), SDL_Surface_val(surf), IMG_COMPRESS_MAX); if(ret != 0) raise_failure(); CAMLreturn(Val_unit); }
CAMLprim value caml_SDL_Surface_Blit_Pixels( value surf, value pixels_buffer) { SDL_Surface *surface = SDL_Surface_val(surf); memcpy(surface->pixels, String_val(pixels_buffer), caml_string_length(pixels_buffer)); return Val_unit; }
CAMLprim value caml_SDL_CreateTextureFromSurface(value renderer, value surface) { SDL_Texture *tex = SDL_CreateTextureFromSurface( SDL_Renderer_val(renderer), SDL_Surface_val(surface)); if (!tex) caml_failwith("Sdltexture.create_from_surface"); return Val_SDL_Texture(tex); }
CAMLprim value caml_SDL_SetColorKey(value surface, value flag, value key) { /* TODO: * You can pass SDL_RLEACCEL to enable RLE accelerated blits. */ int r = SDL_SetColorKey( SDL_Surface_val(surface), Bool_val(flag), Int32_val(key)); if (r) caml_failwith("Sdlsurface.set_color_key"); return Val_unit; }
CAMLprim value caml_SDL_SetSurfaceBlendMode( value surface, value blendMode) { int r = SDL_SetSurfaceBlendMode( SDL_Surface_val(surface), SDL_BlendMode_val(blendMode)); if (r) caml_failwith("Sdlsurface.set_blend_mode"); return Val_unit; }
CAMLprim value caml_SDL_FillRect( value dst, value rect, value color) { SDL_Rect _rect; SDL_Rect_val(&_rect, rect); int r = SDL_FillRect( SDL_Surface_val(dst), &_rect, Int32_val(color)); if (r) caml_failwith("Sdlsurface.fill_rect"); return Val_unit; }
CAMLprim value caml_SDL_Surface_get_pixels(value surface) { SDL_Surface *surf = SDL_Surface_val(surface); unsigned int len = surf->w * surf->h * surf->format->BytesPerPixel; value ml_pixels = caml_alloc_string(len); memcpy(String_val(ml_pixels), surf->pixels, len); return ml_pixels; }
CAMLprim value caml_SDL_FreeSurface(value surf) { SDL_FreeSurface(SDL_Surface_val(surf)); return Val_unit; }
CAMLprim value caml_SDL_SurfacePaletteColors(value surface) { return Val_int( SDL_SurfacePaletteColors(SDL_Surface_val(surface))); }
CAMLprim value caml_SDL_SurfaceHasPalette(value surface) { SDL_bool b = SDL_SurfaceHasPalette(SDL_Surface_val(surface)); return Val_bool(b); }
CAMLprim value caml_SDL_SurfaceGetBitsPerPixel(value surface) { return Val_int( SDL_Surface_val(surface)->format->BitsPerPixel); }
CAMLprim value caml_SDL_SurfaceGetPitch(value surface) { return Val_int(SDL_Surface_val(surface)->pitch); }
CAMLprim value caml_SDL_SurfaceGetHeight(value surface) { return Val_int(SDL_Surface_val(surface)->h); }
CAMLprim value caml_SDL_SurfaceGetWidth(value surface) { return Val_int(SDL_Surface_val(surface)->w); }