From faedebbb4e3f272e60a6257549c4a618ed138772 Mon Sep 17 00:00:00 2001 From: prime31 Date: Sun, 8 Dec 2019 12:30:38 -0800 Subject: [PATCH] sdl: separate sdl module into multiple, dependent submodules --- .github/workflows/ci.yml | 16 +-- Dockerfile.alpine | 2 + vlib/sdl/examples/basic_window/main.v | 31 ++++++ vlib/sdl/examples/tvintris/tvintris.v | 74 +++++++------- vlib/sdl/image/image.v | 44 ++++++++- vlib/sdl/mixer/mixer.v | 101 +++++++++++++++++++ vlib/sdl/sdl.v | 107 +++++++------------- vlib/sdl/ttf/ttf.v | 135 ++++++++++++++++++++++++++ 8 files changed, 391 insertions(+), 119 deletions(-) create mode 100644 vlib/sdl/examples/basic_window/main.v create mode 100644 vlib/sdl/mixer/mixer.v create mode 100644 vlib/sdl/ttf/ttf.v diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a9edbc19bd..ffc6f882f6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,12 +11,12 @@ jobs: uses: actions/checkout@v1 - name: Build V - uses: spytheman/docker_alpine_v@v5.0 + uses: spytheman/docker_alpine_v@v6.0 with: entrypoint: .github/workflows/alpine.build.sh - name: Test V - uses: spytheman/docker_alpine_v@v5.0 + uses: spytheman/docker_alpine_v@v6.0 with: entrypoint: .github/workflows/alpine.test.sh @@ -29,7 +29,7 @@ jobs: node-version: 12.x - name: Install dependencies run: | - brew install freetype glfw openssl postgres + brew install freetype glfw openssl postgres sdl2 sdl2_ttf sdl2_mixer sdl2_image export LIBRARY_PATH="$LIBRARY_PATH:/usr/local/opt/openssl/lib/" - name: Build V run: make && ./v -o v v.v @@ -67,7 +67,7 @@ jobs: with: node-version: 12.x - name: Install dependencies - run: sudo apt-get update; sudo apt-get install --quiet -y postgresql libpq-dev libglfw3 libglfw3-dev libfreetype6-dev libssl-dev sqlite3 libsqlite3-dev + run: sudo apt-get update; sudo apt-get install --quiet -y postgresql libpq-dev libglfw3 libglfw3-dev libfreetype6-dev libssl-dev sqlite3 libsqlite3-dev libsdl2-dev libsdl2-ttf-dev libsdl2-mixer-dev libsdl2-image-dev - name: Build V run: make && ./v -cc gcc -o v v.v - name: Test V @@ -88,7 +88,7 @@ jobs: runs-on: ubuntu-18.04 steps: - name: Install dependencies - run: sudo apt-get update; sudo apt-get install --quiet -y postgresql libpq-dev libglfw3 libglfw3-dev libfreetype6-dev libssl-dev sqlite3 libsqlite3-dev + run: sudo apt-get update; sudo apt-get install --quiet -y postgresql libpq-dev libglfw3 libglfw3-dev libfreetype6-dev libssl-dev sqlite3 libsqlite3-dev libsdl2-dev libsdl2-ttf-dev libsdl2-mixer-dev libsdl2-image-dev - name: Download V run: wget https://github.com/vlang/v/releases/latest/download/v_linux.zip && unzip v_linux.zip && ./v --version - name: Test V @@ -101,7 +101,7 @@ jobs: steps: - name: Install dependencies run: | - brew install freetype glfw openssl + brew install freetype glfw openssl sdl2 sdl2_ttf sdl2_mixer sdl2_image export LIBRARY_PATH="$LIBRARY_PATH:/usr/local/opt/openssl/lib/" - name: Download V run: wget https://github.com/vlang/v/releases/latest/download/v_macos.zip && unzip v_macos.zip && ./v --version @@ -124,7 +124,7 @@ jobs: steps: - uses: actions/checkout@v1 - name: Install dependencies - run: sudo apt-get update; sudo apt-get install --quiet -y libglfw3 libglfw3-dev libfreetype6-dev libssl-dev sqlite3 libsqlite3-dev + run: sudo apt-get update; sudo apt-get install --quiet -y libglfw3 libglfw3-dev libfreetype6-dev libssl-dev sqlite3 libsqlite3-dev libsdl2-dev libsdl2-ttf-dev libsdl2-mixer-dev libsdl2-image-dev - name: Build v run: echo $VFLAGS && make && ./v -o v v.v - name: Test v->c @@ -146,7 +146,7 @@ jobs: with: node-version: 12.x - name: Install dependencies - run: sudo apt-get update; sudo apt-get install --quiet -y musl musl-tools + run: sudo apt-get update; sudo apt-get install --quiet -y musl musl-tools libsdl2-dev libsdl2-ttf-dev libsdl2-mixer-dev libsdl2-image-dev - name: Build v run: echo $VFLAGS && make && ./v -o v v.v - name: Test v binaries diff --git a/Dockerfile.alpine b/Dockerfile.alpine index 3a78edffc5..7ad656177e 100644 --- a/Dockerfile.alpine +++ b/Dockerfile.alpine @@ -15,4 +15,6 @@ RUN apk --no-cache add \ openssl-dev sqlite-dev \ libx11-dev glfw-dev freetype-dev +RUN apk --no-cache add --virtual sdl2deps sdl2-dev sdl2_ttf-dev sdl2_mixer-dev sdl2_image-dev + RUN git clone https://github.com/vlang/v /opt/vlang && make && v --version diff --git a/vlib/sdl/examples/basic_window/main.v b/vlib/sdl/examples/basic_window/main.v new file mode 100644 index 0000000000..920a7f0dfe --- /dev/null +++ b/vlib/sdl/examples/basic_window/main.v @@ -0,0 +1,31 @@ +module main + +import sdl + +fn main() { + C.SDL_Init(C.SDL_INIT_VIDEO) + window := C.SDL_CreateWindow('Hello SDL2', 300, 300, 500, 300, 0) + renderer := C.SDL_CreateRenderer(window, -1, C.SDL_RENDERER_ACCELERATED | C.SDL_RENDERER_PRESENTVSYNC) + + mut should_close := false + for { + ev := sdl.Event{} + for 0 < sdl.poll_event(&ev) { + match int(ev._type) { + C.SDL_QUIT { should_close = true } + else {} + } + } + if should_close { + break + } + + C.SDL_SetRenderDrawColor(renderer, 255, 55, 55, 255) + C.SDL_RenderClear(renderer) + C.SDL_RenderPresent(renderer) + } + + C.SDL_DestroyRenderer(renderer) + C.SDL_DestroyWindow(window) + C.SDL_Quit() +} \ No newline at end of file diff --git a/vlib/sdl/examples/tvintris/tvintris.v b/vlib/sdl/examples/tvintris/tvintris.v index d6838ef566..baaeace4cd 100644 --- a/vlib/sdl/examples/tvintris/tvintris.v +++ b/vlib/sdl/examples/tvintris/tvintris.v @@ -13,7 +13,9 @@ import os import math import sdl import sdl.image as img -[inline] fn sdl_fill_rect(s &sdl.Surface,r &sdl.Rect,c &sdl.Color){sdl.fill_rect(s,r,c)} +import sdl.mixer as mix +import sdl.ttf as ttf +[inline] fn sdl_fill_rect(s &SDL_Surface,r &SDL_Rect,c &SDL_Color){sdl.fill_rect(s,r,c)} const ( Title = 'tVintris' @@ -68,6 +70,11 @@ const ( JHP2RIGHT = 2 ) +const ( + mix_version = mix.version + ttf_version = ttf.version +) + const ( // Tetros' 4 possible states are encoded in binaries BTetros = [ @@ -107,25 +114,22 @@ const ( ] // Each tetro has its unique color Colors = [ - sdl.Color{byte(0), byte(0), byte(0), byte(0)}, // unused ? - sdl.Color{byte(0), byte(0x62), byte(0xc0), byte(0)}, // quad : darkblue 0062c0 - sdl.Color{byte(0xca), byte(0x7d), byte(0x5f), byte(0)}, // tricorn : lightbrown ca7d5f - sdl.Color{byte(0), byte(0xc1), byte(0xbf), byte(0)}, // short topright : lightblue 00c1bf - sdl.Color{byte(0), byte(0xc1), byte(0), byte(0)}, // short topleft : lightgreen 00c100 - sdl.Color{byte(0xbf), byte(0xbe), byte(0), byte(0)}, // long topleft : yellowish bfbe00 - sdl.Color{byte(0xd1), byte(0), byte(0xbf), byte(0)}, // long topright : pink d100bf - sdl.Color{byte(0xd1), byte(0), byte(0), byte(0)}, // longest : lightred d10000 - sdl.Color{byte(0), byte(170), byte(170), byte(0)}, // unused ? + SDL_Color{byte(0), byte(0), byte(0), byte(0)}, // unused ? + SDL_Color{byte(0), byte(0x62), byte(0xc0), byte(0)}, // quad : darkblue 0062c0 + SDL_Color{byte(0xca), byte(0x7d), byte(0x5f), byte(0)}, // tricorn : lightbrown ca7d5f + SDL_Color{byte(0), byte(0xc1), byte(0xbf), byte(0)}, // short topright : lightblue 00c1bf + SDL_Color{byte(0), byte(0xc1), byte(0), byte(0)}, // short topleft : lightgreen 00c100 + SDL_Color{byte(0xbf), byte(0xbe), byte(0), byte(0)}, // long topleft : yellowish bfbe00 + SDL_Color{byte(0xd1), byte(0), byte(0xbf), byte(0)}, // long topright : pink d100bf + SDL_Color{byte(0xd1), byte(0), byte(0), byte(0)}, // longest : lightred d10000 + SDL_Color{byte(0), byte(170), byte(170), byte(0)}, // unused ? ] // Background color - BackgroundColor = sdl.Color{byte(0), byte(0), byte(0), byte(0)} -// BackgroundColor = sdl.Color{byte(255), byte(255), byte(255), byte(0)} + BackgroundColor = SDL_Color{byte(0), byte(0), byte(0), byte(0)} // Foreground color - ForegroundColor = sdl.Color{byte(0), byte(170), byte(170), byte(0)} -// ForegroundColor = sdl.Color{byte(0), byte(0), byte(0), byte(0)} + ForegroundColor = SDL_Color{byte(0), byte(170), byte(170), byte(0)} // Text color - TextColor = sdl.Color{byte(0xca), byte(0x7d), byte(0x5f), byte(0)} -// TextColor = sdl.Color{byte(0), byte(0), byte(0), byte(0)} + TextColor = SDL_Color{byte(0xca), byte(0x7d), byte(0x5f), byte(0)} ) // TODO: type Tetro [TetroSize]struct{ x, y int } @@ -154,7 +158,7 @@ mut: h int window voidptr renderer voidptr - screen &sdl.Surface + screen &SDL_Surface texture voidptr // AUDIO actx AudioContext @@ -162,7 +166,7 @@ mut: jnames [2]string jids [2]int // V logo - v_logo &sdl.Surface + v_logo &SDL_Surface tv_logo voidptr } @@ -238,7 +242,7 @@ fn (sdlc mut SdlContext) set_sdl_context(w int, h int, title string) { sdlc.screen = sdl.create_rgb_surface(0, w, h, bpp, 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000) sdlc.texture = C.SDL_CreateTexture(sdlc.renderer, C.SDL_PIXELFORMAT_ARGB8888, C.SDL_TEXTUREACCESS_STREAMING, w, h) - C.Mix_Init(0) + C.Mix_Init(C.MIX_INIT_MOD) C.atexit(C.Mix_Quit) if C.Mix_OpenAudio(48000,C.MIX_DEFAULT_FORMAT,2,AudioBufSize) < 0 { println('couldn\'t open audio') @@ -375,7 +379,7 @@ fn main() { match int(ev._type) { C.SDL_QUIT { should_close = true } C.SDL_KEYDOWN { - key := int(ev.key.keysym.sym) + key := ev.key.keysym.sym if key == C.SDLK_ESCAPE { should_close = true break @@ -385,7 +389,7 @@ fn main() { } C.SDL_JOYBUTTONDOWN { jb := int(ev.jbutton.button) - joyid := int(ev.jbutton.which) + joyid := ev.jbutton.which // println('JOY BUTTON $jb $joyid') game.handle_jbutton(jb, joyid) game2.handle_jbutton(jb, joyid) @@ -393,7 +397,7 @@ fn main() { C.SDL_JOYHATMOTION { jh := int(ev.jhat.hat) jv := int(ev.jhat.value) - joyid := int(ev.jhat.which) + joyid := ev.jhat.which // println('JOY HAT $jh $jv $joyid') game.handle_jhat(jh, jv, joyid) game2.handle_jhat(jh, jv, joyid) @@ -442,7 +446,7 @@ enum Action { } fn (game mut Game) handle_key(key int) { // global keys - mut action := Action(.idle) + mut action := Action.idle match key { C.SDLK_SPACE { action = .space } game.k_fire { action = .fire } @@ -488,7 +492,7 @@ fn (game mut Game) handle_jbutton(jb int, joyid int) { return } // global buttons - mut action := Action(.idle) + mut action := Action.idle match jb { game.jb_fire { action = .fire } else {} @@ -708,7 +712,7 @@ fn (g &Game) draw_tetro() { } fn (g &Game) draw_block(i, j, color_idx int) { - rect := sdl.Rect {g.ofs_x + (j - 1) * BlockSize, (i - 1) * BlockSize, + rect := SDL_Rect {g.ofs_x + (j - 1) * BlockSize, (i - 1) * BlockSize, BlockSize - 1, BlockSize - 1} col := Colors[color_idx] sdl_fill_rect(g.sdl.screen, &rect, &col) @@ -732,27 +736,27 @@ fn (g &Game) draw_v_logo() { texw := 0 texh := 0 C.SDL_QueryTexture(g.sdl.tv_logo, 0, 0, &texw, &texh) - dstrect := sdl.Rect { (WinWidth / 2) - (texw / 2), 20, texw, texh } + dstrect := SDL_Rect { (WinWidth / 2) - (texw / 2), 20, texw, texh } // Currently we can't seem to use sdl.render_copy when we need to pass a nil pointer (eg: srcrect to be NULL) // sdl.render_copy(g.sdl.renderer, tv_logo, 0, &dstrect) C.SDL_RenderCopy(g.sdl.renderer, g.sdl.tv_logo, voidptr(0), voidptr(&dstrect)) } -fn (g &Game) draw_text(x int, y int, text string, tcol sdl.Color) { +fn (g &Game) draw_text(x int, y int, text string, tcol SDL_Color) { _tcol := C.SDL_Color{tcol.r, tcol.g, tcol.b, tcol.a} tsurf := C.TTF_RenderText_Solid(g.font, text.str, _tcol) ttext := C.SDL_CreateTextureFromSurface(g.sdl.renderer, tsurf) texw := 0 texh := 0 C.SDL_QueryTexture(ttext, 0, 0, &texw, &texh) - dstrect := sdl.Rect { x, y, texw, texh } + dstrect := SDL_Rect { x, y, texw, texh } // sdl.render_copy(g.sdl.renderer, ttext, 0, &dstrect) C.SDL_RenderCopy(g.sdl.renderer, ttext, voidptr(0), voidptr(&dstrect)) C.SDL_DestroyTexture(ttext) sdl.free_surface(tsurf) } -[inline] fn (g &Game) draw_ptext(x int, y int, text string, tcol sdl.Color) { +[inline] fn (g &Game) draw_ptext(x int, y int, text string, tcol SDL_Color) { g.draw_text(g.ofs_x + x, y, text, tcol) } @@ -760,14 +764,14 @@ fn (g &Game) draw_text(x int, y int, text string, tcol sdl.Color) { fn (g &Game) draw_begin() { // println('about to clear') C.SDL_RenderClear(g.sdl.renderer) - mut rect := sdl.Rect {0,0,g.sdl.w,g.sdl.h} - col := sdl.Color{byte(00), byte(00), byte(0), byte(0)} + mut rect := SDL_Rect {0,0,g.sdl.w,g.sdl.h} + col := SDL_Color{byte(00), byte(00), byte(0), byte(0)} // sdl_fill_rect(g.sdl.screen, &rect, BackgroundColor) sdl_fill_rect(g.sdl.screen, &rect, col) - rect = sdl.Rect {BlockSize * FieldWidth + 2,0,2,g.sdl.h} + rect = SDL_Rect {BlockSize * FieldWidth + 2,0,2,g.sdl.h} sdl_fill_rect(g.sdl.screen, &rect, ForegroundColor) - rect = sdl.Rect {WinWidth - BlockSize * FieldWidth - 4,0,2,g.sdl.h} + rect = SDL_Rect {WinWidth - BlockSize * FieldWidth - 4,0,2,g.sdl.h} sdl_fill_rect(g.sdl.screen, &rect, ForegroundColor) mut idx := 0 @@ -778,7 +782,7 @@ fn (g &Game) draw_begin() { } w := BlockSize h := s * 4 * w / 100 - rect = sdl.Rect {(WinWidth - 7 * (w + 1)) / 2 + idx * (w + 1), WinHeight * 3 / 4 - h, w, h} + rect = SDL_Rect {(WinWidth - 7 * (w + 1)) / 2 + idx * (w + 1), WinHeight * 3 / 4 - h, w, h} sdl_fill_rect(g.sdl.screen, &rect, Colors[idx + 1]) idx++ } @@ -831,7 +835,7 @@ fn parse_binary_tetro(t_ int) []Block { for i := 0; i <= 3; i++ { // Get ith digit of t p := int(math.pow(10, 3 - i)) - mut digit := int(t / p) + mut digit := t / p t %= p // Convert the digit to binary for j := 3; j >= 0; j-- { diff --git a/vlib/sdl/image/image.v b/vlib/sdl/image/image.v index fa24fa9c1f..40691a53c0 100644 --- a/vlib/sdl/image/image.v +++ b/vlib/sdl/image/image.v @@ -1,4 +1,5 @@ module image +import sdl #flag linux -lSDL2_image #include @@ -10,10 +11,43 @@ module image ////////////////////////////////////////////////////////// // SDL_Image.h ////////////////////////////////////////////////////////// -//fn C.IMG_Load_RW(logo &sdl.RwOps, free_src int) &sdl.Surface +pub const ( + IMG_INIT_JPG = 0x00000001 + IMG_INIT_PNG = 0x00000002 + IMG_INIT_TIF = 0x00000004 + IMG_INIT_WEBP = 0x00000008 +) + fn C.IMG_Init(flags int) int fn C.IMG_Quit() -fn C.IMG_Load(file byteptr) voidptr + +/* Load an image from an SDL data source. The 'type' may be one of: "BMP", "GIF", "PNG", etc. */ +fn C.IMG_LoadTyped_RW(src &SDL_RWops, freesrc int, _type byteptr) &SDL_Surface +fn C.IMG_Load(file byteptr) &SDL_Surface +fn C.IMG_Load_RW(src &SDL_RWops, freesrc int) &SDL_Surface + +/* Load an image directly into a render texture. */ +fn C.IMG_LoadTexture(renderer &SDL_Renderer, file byteptr) &SDL_Texture +fn C.IMG_LoadTexture_RW(renderer &SDL_Renderer, src &SDL_RWops, freesrc int) &SDL_Texture +fn C.IMG_LoadTextureTyped_RW(renderer &SDL_Renderer, src &SDL_RWops, freesrc int, _type byteptr) &SDL_Texture + +/* Functions to detect a file type, given a seekable source */ +fn C.IMG_isPNG(src &SDL_RWops) int +fn C.IMG_isBMP(src &SDL_RWops) int +fn C.IMG_isJPG(src &SDL_RWops) int +fn C.IMG_isWEBP(src &SDL_RWops) int + +/* Individual loading functions */ +fn C.IMG_LoadPNG_RW(src &SDL_RWops) &SDL_Surface +fn C.IMG_LoadBMP_RW(src &SDL_RWops) &SDL_Surface +fn C.IMG_LoadJPG_RW(src &SDL_RWops) &SDL_Surface +fn C.IMG_LoadWEBP_RW(src &SDL_RWops) &SDL_Surface + +/* Individual saving functions */ +fn C.IMG_SavePNG(surface voidptr, file byteptr) int +fn C.IMG_SavePNG_RW(surface voidptr, dst &SDL_RWops, freedst int) int +fn C.IMG_SaveJPG(surface voidptr, file byteptr) int +fn C.IMG_SaveJPG_RW(surface voidptr, dst &SDL_RWops, freedst int) int pub fn img_init(flags int) int { return C.IMG_Init(flags) @@ -23,7 +57,11 @@ pub fn quit() { C.IMG_Quit() } -pub fn load(file string) &sdl.Surface { +pub fn load(file string) &SDL_Surface { res := C.IMG_Load(file.str) return res } + +pub const ( + version = sdl.version // TODO: remove this hack to mark sdl as used; avoids warning +) diff --git a/vlib/sdl/mixer/mixer.v b/vlib/sdl/mixer/mixer.v new file mode 100644 index 0000000000..8f6db1d615 --- /dev/null +++ b/vlib/sdl/mixer/mixer.v @@ -0,0 +1,101 @@ +module mixer +import sdl + +#include + + +pub const ( + MIX_CHANNEL_POST = -2 + MIX_MAX_VOLUME = C.MIX_MAX_VOLUME + MIX_CHANNELS = 8 + MIX_DEFAULT_FREQUENCY = 22050 + MIX_DEFAULT_FORMAT = C.MIX_DEFAULT_FORMAT + + MIX_INIT_FLAC = 0x00000001 + MIX_INIT_MOD = 0x00000002 + MIX_INIT_MP3 = 0x00000008 + MIX_INIT_OGG = 0x00000010 + MIX_INIT_MID = 0x00000020 + MIX_INIT_OPUS = 0x00000040 +) + +// Structs +// MIX TODO: get this working as a return type +pub struct C.Mix_Chunk { + allocated int + abuf &byte // *UInt8 + alen u32 + volume byte /* Per-sample volume, 0-128 */ +} + +pub struct C.Mix_Music {} + + +// Methods + +// MIX +fn C.Mix_Init(flags int) int +fn C.Mix_OpenAudio(frequency int, format u16, channels int, chunksize int) int +fn C.Mix_CloseAudio() + +fn C.Mix_LoadMUS(file byteptr) voidptr // *Mix_Music +fn C.Mix_LoadMUS_RW(src &SDL_RWops, freesrc int) voidptr // *Mix_Music +fn C.Mix_LoadWAV(file byteptr) voidptr // *Mix_Chunk +fn C.Mix_LoadWAV_RW(src &SDL_RWops, freesrc int) voidptr // *Mix_Chunk + +// Music +fn C.Mix_FadeInMusic(music &Mix_Music, loops int, ms int) int +fn C.Mix_PlayMusic(music &SDL_AudioSpec, loops int) int +fn C.Mix_VolumeMusic(volume int) int +fn C.Mix_PauseMusic() +fn C.Mix_ResumeMusic() +fn C.Mix_RewindMusic() +fn C.Mix_SetMusicPosition(position f64) int +fn C.Mix_PausedMusic() int +fn C.Mix_HaltMusic() int +fn C.Mix_FadeOutMusic(ms int) int +fn C.Mix_HookMusicFinished(cb fn()) +fn C.Mix_FreeMusic(music &Mix_Music) + +// Channels +fn C.Mix_VolumeChunk(chunk &Mix_Chunk, volume int) int +fn C.Mix_PlayChannel(channel int, chunk &Mix_Chunk, loops int) int +fn C.Mix_FadeInChannel(channel int, chunk &Mix_Chunk, loops int, ms int) int +fn C.Mix_PlayChannelTimed(channel int, chunk &Mix_Chunk, loops int, ticks int) int +fn C.Mix_Pause(channel int) +fn C.Mix_Resume(channel int) +fn C.Mix_HaltChannel(channel int) int +fn C.Mix_ExpireChannel(channel int, ticks int) int +fn C.Mix_FadeOutChannel(channel int, ms int) int +fn C.Mix_ChannelFinished(cb fn (int)) +fn C.Mix_Playing(channel int) int +fn C.Mix_Paused(channel int) int +fn C.Mix_GetChunk(channel int) voidptr //Mix_Chunk +fn C.Mix_FreeChunk(chunk &Mix_Chunk) +fn C.Mix_ReserveChannels(num int) int + +// Groups +fn C.Mix_GroupChannel(which int, tag int) int +fn C.Mix_GroupChannels(from int, to int, tag int) int +fn C.Mix_GroupAvailable(tag int) int +fn C.Mix_GroupCount(tag int) int +fn C.Mix_GroupOldest(tag int) int +fn C.Mix_GroupNewer(tag int) int +fn C.Mix_FadeOutGroup(tag int, ms int) int +fn C.Mix_HaltGroup(tag int) int + +// Effects +type EffectFunc fn (int, voidptr, int, voidptr) // int chan, void *stream, int len, void *udata +type EffectDone fn (int, voidptr) // int chan, void *udata + +fn C.Mix_RegisterEffect(channel int, f EffectFunc, d EffectDone, arg voidptr) int +fn C.Mix_UnregisterEffect(channel int, f EffectFunc) int +fn C.Mix_UnregisterAllEffects(channel int) int +fn C.Mix_SetPanning(channel int, left byte, right byte) int +fn C.Mix_SetDistance(channel int, distance byte) int +fn C.Mix_SetPosition(channel int, angle i16, distance byte) int +fn C.Mix_SetReverseStereo(channel int, flip int) int + +pub const ( + version = sdl.version // TODO: remove this hack to mark sdl as used; avoids warning +) diff --git a/vlib/sdl/sdl.v b/vlib/sdl/sdl.v index 5770872778..3ce9c5fc9d 100644 --- a/vlib/sdl/sdl.v +++ b/vlib/sdl/sdl.v @@ -19,19 +19,12 @@ module sdl #flag windows -L/mingw64/lib -lmingw32 -lSDL2main -lSDL2 -lSDL2_ttf -lSDL2_mixer -lSDL2_image #include -#include -#include -//struct C.SDL_Color{ -pub struct Color{ -pub: - r byte /**< Red value 0-255 */ - g byte /**< Green value 0-255 */ - b byte /**< Blue value 0-255 */ - a byte /**< Alpha value 0-255 */ -} -//type Color C.SDL_Color +pub struct C.SDL_RWops {} +pub struct C.SDL_Window {} +pub struct C.SDL_Renderer {} +pub struct C.SDL_Texture {} pub struct C.SDL_Color{ pub: @@ -41,34 +34,30 @@ pub: a byte } -//struct C.SDL_Rect { -pub struct Rect { -pub: - x int /**< number of pixels from left side of screen */ - y int /**< num of pixels from top of screen */ - w int /**< width of rectangle */ - h int /**< height of rectangle */ +pub struct C.SDL_Rect { +pub mut: + x int + y int + w int + h int } -//type Rect C.SDL_Rect -//pub struct C.SDL_Surface { -pub struct Surface { +pub struct C.SDL_Surface { pub: - flags u32 - format voidptr - w int - h int - pitch int - pixels voidptr - userdata voidptr - locked int - lock_data voidptr - clip_rect Rect - map voidptr - refcount int + flags u32 + format voidptr + w int + h int + pitch int + pixels voidptr + userdata voidptr + locked int + lock_data voidptr + clip_rect SDL_Rect + map voidptr + refcount int } -//type Surface C.SDL_Surface -//type Surface Surface + ///////////////////////////////////////////////////////// @@ -116,7 +105,6 @@ pub: */ } -//pub union EventU { pub union Event { pub: _type u32 @@ -126,13 +114,10 @@ pub: jhat JoyHatEvent _pad56 [56]byte } -//type Event EventU -//struct C.SDL_AudioSpec { -pub struct AudioSpec { -pub: -mut: +pub struct C.SDL_AudioSpec { +pub mut: freq int /**< DSP frequency -- samples per second */ format u16 /**< Audio data format */ channels byte /**< Number of channels: 1 mono, 2 stereo */ @@ -166,8 +151,10 @@ fn C.SDL_NumJoysticks() int fn C.SDL_JoystickNameForIndex(device_index int) voidptr fn C.SDL_RenderCopy(renderer voidptr, texture voidptr, srcrect voidptr, dstrect voidptr) int fn C.SDL_CreateWindow(title byteptr, x int, y int, w int, h int, flags u32) voidptr +fn C.SDL_CreateRenderer(window &SDL_Window, index int, flags u32) voidptr fn C.SDL_CreateWindowAndRenderer(width int, height int, window_flags u32, window &voidptr, renderer &voidptr) int fn C.SDL_DestroyWindow(window voidptr) +fn C.SDL_DestroyRenderer(renderer voidptr) fn C.SDL_GetWindowSize(window voidptr, w voidptr, h voidptr) fn C.SDL_SetHint(name byteptr, value byteptr) C.SDL_bool //fn C.SDL_RWFromFile(byteptr, byteptr) &RwOps @@ -175,6 +162,7 @@ fn C.SDL_SetHint(name byteptr, value byteptr) C.SDL_bool fn C.SDL_CreateTextureFromSurface(renderer voidptr, surface voidptr) voidptr fn C.SDL_CreateTexture(renderer voidptr, format u32, access int, w int, h int) voidptr fn C.SDL_FillRect(dst voidptr, dstrect voidptr, color u32) int +fn C.SDL_SetRenderDrawColor(renderer voidptr, r byte, g byte, b byte, a byte) fn C.SDL_RenderPresent(renderer voidptr) fn C.SDL_RenderClear(renderer voidptr) int fn C.SDL_UpdateTexture(texture voidptr, rect voidptr, pixels voidptr, pitch int) int @@ -203,33 +191,6 @@ fn C.SDL_GetPerformanceCounter() u64 fn C.SDL_GetPerformanceFrequency() u64 fn C.SDL_Delay(ms u32) -////////////////////////////////////////////////////////// -// TTF -////////////////////////////////////////////////////////// -fn C.TTF_Init() int -fn C.TTF_Quit() -fn C.TTF_OpenFont(file byteptr, ptsize int) voidptr -fn C.TTF_CloseFont(font voidptr) -//fn C.TTF_RenderText_Solid(voidptr, voidptr, SdlColor) voidptr -fn C.TTF_RenderText_Solid(voidptr, voidptr, C.SDL_Color) voidptr -////////////////////////////////////////////////////////// - -////////////////////////////////////////////////////////// -// MIX -////////////////////////////////////////////////////////// -fn C.Mix_Init(flags int) int -fn C.Mix_OpenAudio(frequency int, format u16, channels int, chunksize int) int -fn C.Mix_LoadMUS(file byteptr) voidptr -fn C.Mix_LoadWAV(file byteptr) voidptr -fn C.Mix_PlayMusic(music voidptr, loops int) int -fn C.Mix_VolumeMusic(volume int) int -fn C.Mix_FreeMusic(music voidptr) -fn C.Mix_CloseAudio() -fn C.Mix_FreeChunk(chunk voidptr) -fn C.Mix_PauseMusic() -fn C.Mix_ResumeMusic() -fn C.Mix_PlayChannel(channel int, chunk voidptr, loops int) int - ////////////////////////////////////////////////////////// // GL ////////////////////////////////////////////////////////// @@ -240,7 +201,7 @@ fn C.SDL_GL_SetSwapInterval(interval int) int fn C.SDL_GL_SwapWindow(window voidptr) fn C.SDL_GL_DeleteContext(context voidptr) -pub fn create_texture_from_surface(renderer voidptr, surface &Surface) voidptr { +pub fn create_texture_from_surface(renderer voidptr, surface &SDL_Surface) voidptr { return C.SDL_CreateTextureFromSurface(renderer, voidptr(surface)) } @@ -252,19 +213,19 @@ pub fn joystick_name_for_index(device_index int) byteptr { return byteptr(C.SDL_JoystickNameForIndex(device_index)) } -pub fn fill_rect(screen &Surface, rect &Rect, _col &Color) { +pub fn fill_rect(screen &SDL_Surface, rect &SDL_Rect, _col &SDL_Color) { col := C.SDL_MapRGB(screen.format, _col.r, _col.g, _col.b) _screen := voidptr(screen) _rect := voidptr(rect) C.SDL_FillRect(_screen, _rect, col) } -pub fn create_rgb_surface(flags u32, width int, height int, depth int, rmask u32, gmask u32, bmask u32, amask u32) &Surface { +pub fn create_rgb_surface(flags u32, width int, height int, depth int, rmask u32, gmask u32, bmask u32, amask u32) &SDL_Surface { res := C.SDL_CreateRGBSurface(flags, width, height, depth, rmask, gmask, bmask, amask) return res } -pub fn render_copy(renderer voidptr, texture voidptr, srcrect &Rect, dstrect &Rect) int { +pub fn render_copy(renderer voidptr, texture voidptr, srcrect &SDL_Rect, dstrect &SDL_Rect) int { _srcrect := voidptr(srcrect) _dstrect := voidptr(dstrect) return C.SDL_RenderCopy(renderer, texture, _srcrect, _dstrect) @@ -278,7 +239,7 @@ pub fn destroy_texture(text voidptr) { C.SDL_DestroyTexture(text) } -pub fn free_surface(surf &Surface) { +pub fn free_surface(surf &SDL_Surface) { _surf := voidptr(surf) C.SDL_FreeSurface(_surf) } diff --git a/vlib/sdl/ttf/ttf.v b/vlib/sdl/ttf/ttf.v new file mode 100644 index 0000000000..8559d49b1c --- /dev/null +++ b/vlib/sdl/ttf/ttf.v @@ -0,0 +1,135 @@ +module ttf + +#include + +[typedef] +struct C.TTF_Font {} + +fn C.TTF_Init() int +fn C.TTF_Quit() + +fn C.TTF_OpenFont(file byteptr, ptsize int) &TTF_Font +fn C.TTF_OpenFontIndex(file byteptr, ptsize int, index i64) &TTF_Font +fn C.TTF_OpenFontRW(src &SDL_RWops, freesrc int, ptsize int) &TTF_Font +fn C.TTF_OpenFontIndexRW(src &SDL_RWops, freesrc int, ptsize int, index i64) &TTF_Font + +/* Set and retrieve the font style */ +const ( + TTF_STYLE_NORMAL = C.TTF_STYLE_NORMAL + TTF_STYLE_BOLD = C.TTF_STYLE_BOLD + TTF_STYLE_ITALIC = C.TTF_STYLE_ITALIC + TTF_STYLE_UNDERLINE = C.TTF_STYLE_UNDERLINE + TTF_STYLE_STRIKETHROUGH = C.TTF_STYLE_STRIKETHROUGH +) +fn C.TTF_GetFontStyle(font &TTF_Font) int +fn C.TTF_SetFontStyle(font &TTF_Font, style int) +fn C.TTF_GetFontOutline(font &TTF_Font) int +fn C.TTF_SetFontOutline(font &TTF_Font, outline int) + +/* Set and retrieve FreeType hinter settings */ +const ( + TTF_HINTING_NORMAL = C.TTF_HINTING_NORMAL + TTF_HINTING_LIGHT = C.TTF_HINTING_LIGHT + TTF_HINTING_MONO = C.TTF_HINTING_MONO + TTF_HINTING_NONE = C.TTF_HINTING_NONE +) +fn C.TTF_GetFontHinting(font &TTF_Font) int +fn C.TTF_SetFontHinting(font &TTF_Font, hinting int) + +/* Get the total height of the font - usually equal to point size */ +fn C.TTF_FontHeight(font &TTF_Font) int + +/* Get the offset from the baseline to the top of the font This is a positive value, relative to the baseline. + */ +fn C.TTF_FontAscent(font &TTF_Font) int + +/* Get the offset from the baseline to the bottom of the font This is a negative value, relative to the baseline. */ +fn C.TTF_FontDescent(font &TTF_Font) int + +/* Get the recommended spacing between lines of text for this font */ +fn C.TTF_FontLineSkip(font &TTF_Font) int + +/* Get/Set whether or not kerning is allowed for this font */ +fn C.TTF_GetFontKerning(font &TTF_Font) int +fn C.TTF_SetFontKerning(font &TTF_Font, allowed int) + +/* Get the kerning size of two glyphs */ +fn C.TTF_GetFontKerningSizeGlyphs(font &TTF_Font, previous_ch u16, ch u16) int + +/* Get the number of faces of the font */ +fn C.TTF_FontFaces(font &TTF_Font) i64 + +/* Get the font face attributes, if any */ +fn C.TTF_FontFaceIsFixedWidth(font &TTF_Font) int +fn C.TTF_FontFaceFamilyName(font &TTF_Font) byteptr +fn C.TTF_FontFaceStyleName(font &TTF_Font) byteptr + +/* Check wether a glyph is provided by the font or not */ +fn C.TTF_GlyphIsProvided(font &TTF_Font, ch u16) int + +/* Get the metrics (dimensions) of a glyph To understand what these metrics mean, here is a useful link: + http://freetype.sourceforge.net/freetype2/docs/tutorial/step2.html + */ +fn C.TTF_GlyphMetrics(font &TTF_Font, ch u16, minx &int, maxx &int, miny &int, maxy &int, advance &int) int + +/* Get the dimensions of a rendered string of text */ +fn C.TTF_SizeText(font &TTF_Font, text byteptr, w &int, h &int) int +fn C.TTF_SizeUTF8(font &TTF_Font, text byteptr, w &int, h &int) int +fn C.TTF_SizeUNICODE(font &TTF_Font, text &u16, w &int, h &int) int + +/* Create an 8-bit palettized surface and render the given text at fast quality with the given font and color. The 0 pixel is the + colorkey, giving a transparent background, and the 1 pixel is set to the text color. + This function returns the new surface, or NULL if there was an error. +*/ +fn C.TTF_RenderText_Solid(font &TTF_Font, text byteptr, fg SDL_Color) &SDL_Surface +fn C.TTF_RenderUTF8_Solid(font &TTF_Font, text byteptr, fg SDL_Color) &SDL_Surface +fn C.TTF_RenderUNICODE_Solid(font &TTF_Font, text &u16, fg SDL_Color) &SDL_Surface + +/* Create an 8-bit palettized surface and render the given glyph at fast quality with the given font and color. The 0 pixel is the + colorkey, giving a transparent background, and the 1 pixel is set to the text color. The glyph is rendered without any padding or + centering in the X direction, and aligned normally in the Y direction. This function returns the new surface, or NULL if there was an error. +*/ +fn C.TTF_RenderGlyph_Solid(font &TTF_Font, ch u16, fg C.SDL_Color) &SDL_Surface + +/* Create an 8-bit palettized surface and render the given text at high quality with the given font and colors. The 0 pixel is background, + while other pixels have varying degrees of the foreground color. This function returns the new surface, or NULL if there was an error. +*/ +fn C.TTF_RenderText_Shaded(font &TTF_Font, text byteptr, fg SDL_Color, bg SDL_Color) &SDL_Surface +fn C.TTF_RenderUTF8_Shaded(font &TTF_Font, text byteptr, fg SDL_Color, bg SDL_Color) &SDL_Surface +fn C.TTF_RenderUNICODE_Shaded(font &TTF_Font, text &u16, fg SDL_Color, bg SDL_Color) &SDL_Surface + +/* Create an 8-bit palettized surface and render the given glyph at high quality with the given font and colors. The 0 pixel is background, + while other pixels have varying degrees of the foreground color. The glyph is rendered without any padding or centering in the X + direction, and aligned normally in the Y direction. This function returns the new surface, or NULL if there was an error. +*/ +fn C.TTF_RenderGlyph_Shaded(font &TTF_Font, ch u16, fg C.SDL_Color) &SDL_Surface + +/* Create a 32-bit ARGB surface and render the given text at high quality, using alpha blending to dither the font with the given color. + This function returns the new surface, or NULL if there was an error. +*/ +fn C.TTF_RenderText_Blended(font &TTF_Font, text byteptr, fg SDL_Color, bg SDL_Color) &SDL_Surface +fn C.TTF_RenderUTF8_Blended(font &TTF_Font, text byteptr, fg SDL_Color, bg SDL_Color) &SDL_Surface +fn C.TTF_RenderUNICODE_Blended(font &TTF_Font, text &u16, fg SDL_Color, bg SDL_Color) &SDL_Surface + + +/* Create a 32-bit ARGB surface and render the given text at high quality, using alpha blending to dither the font with the given color. + Text is wrapped to multiple lines on line endings and on word boundaries if it extends beyond wrapLength in pixels. + This function returns the new surface, or NULL if there was an error. +*/ +fn C.TTF_RenderText_Blended_Wrapped(font &TTF_Font, text byteptr, fg SDL_Color, wrap_length u32) &SDL_Surface +fn C.TTF_RenderUTF8_Blended_Wrapped(font &TTF_Font, text byteptr, fg SDL_Color, wrap_length u32) &SDL_Surface +fn C.TTF_RenderUNICODE_Blended_Wrapped(font &TTF_Font, text &u16, fg SDL_Color, wrap_length u32) &SDL_Surface + +/* Create a 32-bit ARGB surface and render the given glyph at high quality, using alpha blending to dither the font with the given color. + The glyph is rendered without any padding or centering in the X direction, and aligned normally in the Y direction. + This function returns the new surface, or NULL if there was an error. +*/ +fn C.TTF_RenderGlyph_Blended(font &TTF_Font, ch u16, fg C.SDL_Color) &SDL_Surface + +fn C.TTF_WasInit() int + +fn C.TTF_CloseFont(font &TTF_Font) + +pub const ( + version = '0.0.1' +)